public void Test_OverrideEventResponse_WithContent() { var response = new OverrideEventResponse { Message = "This is an error message", Success = false }; SimpleBinarizableInstanceTester.TestClass(response, "Custom OverrideEventResponse not same after round trip serialisation"); }
/// <summary> /// Inserts the override event into the site model. /// </summary> public async Task <OverrideEventResponse> ExecuteAsync(OverrideEventRequestArgument arg) { Log.LogInformation($"START Add Override Event Executor: Project={arg.ProjectID}, Asset={arg.AssetID}, Date Range={arg.StartUTC}-{arg.EndUTC}"); var result = new OverrideEventResponse { Success = false }; if (arg.StartUTC >= arg.EndUTC) { result.Message = $"Invalid date range. Start:{arg.StartUTC} End:{arg.EndUTC}"; return(result); } if (string.IsNullOrEmpty(arg.MachineDesignName) && !arg.LayerID.HasValue) { result.Message = "Missing override values"; Log.LogError(result.Message); return(result); } var siteModel = DIContext.Obtain <ISiteModels>().GetSiteModel(arg.ProjectID); if (siteModel == null) { result.Message = $"Failed to locate site model {arg.ProjectID}"; Log.LogError(result.Message); return(result); } lock (siteModel) { var machine = siteModel.Machines.Locate(arg.AssetID); if (machine == null) { result.Message = $"Failed to locate machine {arg.AssetID}"; Log.LogError(result.Message); return(result); } //Test targets exist i.e. we have some machine events to override var machineTargetValues = siteModel.MachinesTargetValues[machine.InternalSiteModelMachineIndex]; if (arg.LayerID.HasValue && machineTargetValues.LayerIDStateEvents.Count() == 0 || !string.IsNullOrEmpty(arg.MachineDesignName) && machineTargetValues.MachineDesignNameIDStateEvents.Count() == 0) { result.Message = "No target values found to override"; Log.LogError(result.Message); return(result); } // Now we should check there are no overlapping override events for a new event in this list if (arg.LayerID.HasValue && !ValidateNewOverrideEventAgainstExistingOverridingEvents(machineTargetValues.LayerOverrideEvents, arg)) { //We are not able to override event as there is already overridden event result.Message = $"Layer override failed event date validation {arg.StartUTC}-{arg.EndUTC}"; Log.LogError(result.Message); return(result); } if (!string.IsNullOrEmpty(arg.MachineDesignName) && !ValidateNewOverrideEventAgainstExistingOverridingEvents(machineTargetValues.DesignOverrideEvents, arg)) { result.Message = $"Design override failed event date validation {arg.StartUTC}-{arg.EndUTC}"; Log.LogError(result.Message); return(result); } Log.LogDebug($"Override event passed validation checks, about to add to list: Project={arg.ProjectID}, Asset={arg.AssetID}, Date Range={arg.StartUTC}-{arg.EndUTC}"); //Override lift if (arg.LayerID.HasValue) { machineTargetValues.LayerOverrideEvents.PutValueAtDate(arg.StartUTC, new OverrideEvent <ushort>(arg.EndUTC, arg.LayerID.Value)); } //Override machine design if (!string.IsNullOrEmpty(arg.MachineDesignName)) { //Try to find corresponding designId var siteModelMachineDesign = siteModel.SiteModelMachineDesigns.Locate(arg.MachineDesignName); if (siteModelMachineDesign == null) { siteModelMachineDesign = siteModel.SiteModelMachineDesigns.CreateNew(arg.MachineDesignName); } machineTargetValues.DesignOverrideEvents.PutValueAtDate(arg.StartUTC, new OverrideEvent <int>(arg.EndUTC, siteModelMachineDesign.Id)); } Log.LogDebug($"Saving override events: Project={arg.ProjectID}, Asset={arg.AssetID}, Date Range={arg.StartUTC}-{arg.EndUTC}"); machineTargetValues.SaveMachineEventsToPersistentStore(storageProxy_Mutable); // Notify the immutable grid listeners that attributes of this site model have changed. Log.LogDebug($"Notifying grid of changes to project {arg.ProjectID}"); var sender = DIContext.Obtain <ISiteModelAttributesChangedEventSender>(); sender.ModelAttributesChanged(SiteModelNotificationEventGridMutability.NotifyImmutable, siteModel.ID, machineTargetValuesChanged: true); result.Success = true; } Log.LogInformation($"END Add Override Event Executor: Project={arg.ProjectID}, Asset={arg.AssetID}, Date Range={arg.StartUTC}-{arg.EndUTC}"); return(result); }
/// <summary> /// Removes the override event from the site model. /// </summary> public async Task <OverrideEventResponse> ExecuteAsync(OverrideEventRequestArgument arg) { Log.LogInformation($"START Remove Override Event Executor: Project={arg.ProjectID}, Asset={arg.AssetID}, Date Range={arg.StartUTC}-{arg.EndUTC}"); var result = new OverrideEventResponse { Success = false }; var siteModel = DIContext.Obtain <ISiteModels>().GetSiteModel(arg.ProjectID); if (siteModel == null) { result.Message = $"Failed to locate site model {arg.ProjectID}"; Log.LogError(result.Message); return(result); } bool changed = false; lock (siteModel) { if (arg.AssetID == Guid.Empty) { //If AssetID not provided, remove all override events for project Log.LogDebug($"Removing override events for all assets in project {arg.ProjectID}"); foreach (var machine in siteModel.Machines) { if (RemoveOverrideEventsForMachine(siteModel, machine, arg)) { changed = true; } } } else { var machine = siteModel.Machines.Locate(arg.AssetID); if (machine == null) { result.Message = $"Failed to locate machine {arg.AssetID}"; Log.LogError(result.Message); return(result); } Log.LogDebug($"Removing override events for asset {arg.AssetID}"); changed = RemoveOverrideEventsForMachine(siteModel, machine, arg); } if (changed) { Log.LogDebug($"Notifying grid of changes to project {arg.ProjectID}"); // Notify the immutable grid listeners that attributes of this site model have changed. var sender = DIContext.Obtain <ISiteModelAttributesChangedEventSender>(); sender.ModelAttributesChanged(SiteModelNotificationEventGridMutability.NotifyImmutable, siteModel.ID, machineTargetValuesChanged: true); } } if (!changed) { result.Message = "No override event(s) found to remove"; } result.Success = changed; Log.LogInformation($"END Remove Override Event Executor: Project={arg.ProjectID}, Asset={arg.AssetID}, Date Range={arg.StartUTC}-{arg.EndUTC}"); return(result); }
public void Test_OverrideEventResponse_Creation() { var response = new OverrideEventResponse(); response.Should().NotBeNull(); }