static void Main(string[] args) { //========================================================================== // Option 1: Load the process configuration as raw data, i.e. from the database // Then register the known process steps and construct an instance of the runtime. // First register the known process steps LoadProcessStepDefinitions(); // Load the process configuration from the database and instanciate it ProcessInstanceData data = LoadProcessDescriptionFromDatabase(); TransportProcess loadedProcess = TransportProcess.Instanciate(data); //========================================================================== // Option 2: Instanciate a new executable process directly at runtime. var sampleProcess = CreateSampleProcess(); // We set the parameters for the transport process before we can run it. // These parameters are equivalent to those passed in the current TPM implementation via CustomOrder.NewOrder() method. // We can infer the parameters we will need for the process from the used steps. var inferredParameters = ProcessStepDefinition.GetInferredParameters(loadedProcess.Steps.Select(step => step.Definition)); loadedProcess.Parameters[inferredParameters.FirstOrDefault().Name] = 10001010; // Run the state machine. while (true) { loadedProcess.Update(); Thread.Sleep(100); } }
/// <summary> /// Reload the <see cref="ProcessInstance" /> with the specified <see cref="T:Tridion.ContentManager.CoreService.Client.ProcessInstanceData" /> /// </summary> /// <param name="processInstanceData"><see cref="T:Tridion.ContentManager.CoreService.Client.ProcessInstanceData" /></param> protected void Reload(ProcessInstanceData processInstanceData) { if (processInstanceData == null) throw new ArgumentNullException("processInstanceData"); mProcessInstanceData = processInstanceData; base.Reload(processInstanceData); }
/// <summary> /// Initializes a new instance of the <see cref="ProcessInstance"/> class. /// </summary> /// <param name="client"><see cref="T:TcmCoreService.Client" /></param> /// <param name="processInstanceData"><see cref="T:Tridion.ContentManager.CoreService.Client.ProcessInstanceData" /></param> protected ProcessInstance(Client client, ProcessInstanceData processInstanceData) : base(client, processInstanceData) { if (processInstanceData == null) throw new ArgumentNullException("processInstanceData"); mProcessInstanceData = processInstanceData; }
/// <summary> /// Initializes a new instance of the <see cref="ProcessInstance"/> class. /// </summary> /// <param name="client"><see cref="T:TcmCoreService.Client" /></param> /// <param name="processInstanceData"><see cref="T:Tridion.ContentManager.CoreService.Client.ProcessInstanceData" /></param> protected ProcessInstance(Client client, ProcessInstanceData processInstanceData) : base(client, processInstanceData) { if (processInstanceData == null) { throw new ArgumentNullException("processInstanceData"); } mProcessInstanceData = processInstanceData; }
/// <summary> /// Reload the <see cref="ProcessInstance" /> with the specified <see cref="T:Tridion.ContentManager.CoreService.Client.ProcessInstanceData" /> /// </summary> /// <param name="processInstanceData"><see cref="T:Tridion.ContentManager.CoreService.Client.ProcessInstanceData" /></param> protected void Reload(ProcessInstanceData processInstanceData) { if (processInstanceData == null) { throw new ArgumentNullException("processInstanceData"); } mProcessInstanceData = processInstanceData; base.Reload(processInstanceData); }
/// <summary> /// Instanciates a new transport process which implements the logic described in a deserialized instance description. /// </summary> /// <param name="data">The deserialized transport process instance description.</param> /// <returns>The instanciated transport process, or null if an error occured.</returns> public static TransportProcess Instanciate(ProcessInstanceData data) { if (data == null) { throw new ArgumentNullException(nameof(data)); } var result = new TransportProcess(); // Construct states foreach (var stepData in data.Steps) { // Construct the state var step = ProcessStep.Instanciate(stepData); // Add the step to the automaton result.Add(step); } // Construct edges foreach (var edgeData in data.Edges) { Edge edge = new Edge { Source = result.Steps.FirstOrDefault(s => s.Id == edgeData.SourceId), Destination = result.Steps.FirstOrDefault(s => s.Id == edgeData.DestinationId) }; edge.SourceExit = edge.Source?.Definition?.Exits.FirstOrDefault(e => e.Name == edgeData.SourceExit); result.Add(edge); } // Set initial state result.InitialState = result.Steps.FirstOrDefault(s => s.Id == data.InitialStateId); return(result); }
private static ProcessInstanceData LoadProcessDescriptionFromDatabase() { // Configure the transport process // This configuration should be done in the UI and only loaded from the database/file at this point. // No logic is contained in these classes, pure data level. // The setup is only meant to show the usage of the classes. var data = new ProcessInstanceData(); data.Name = "My transport process"; ProcessStepInstanceData dataA, dataB; data.Steps.Add(dataA = new ProcessStepInstanceData() { Id = 1, DefinitionName = "WaitStep" }); dataA.ParameterValues["Duration"] = 12.0; data.Steps.Add(dataB = new ProcessStepInstanceData() { Id = 2, DefinitionName = "DeliverStepDummy" }); data.InitialStateId = dataA.Id; data.Edges.Add(new EdgeData() { SourceId = dataA.Id, DestinationId = dataB.Id, SourceExit = ExitPointDefinition.Default.Name }); data.Edges.Add(new EdgeData() { SourceId = dataB.Id, DestinationId = dataA.Id, SourceExit = "Done" }); data.Edges.Add(new EdgeData() { SourceId = dataB.Id, DestinationId = dataB.Id, SourceExit = "Failed" }); return(data); }
public string ViewWorkflow(GetParameter selectedItem) { ActivityInstanceData activityInstance = Client.Read(selectedItem.ActivityInstanceId, new ReadOptions()) as ActivityInstanceData; if (activityInstance != null) { string currentActivityId = activityInstance.ActivityDefinition.IdRef; ProcessInstanceData processInstance = Client.Read(activityInstance.Process.IdRef, new ReadOptions()) as ProcessInstanceData; if (processInstance != null) { ProcessDefinitionData processDefinition = Client.Read(processInstance.ProcessDefinition.IdRef, new ReadOptions()) as ProcessDefinitionData; ProcessDefinitationDataModel processDefinitationDataModel = new ProcessDefinitationDataModel(); if (processDefinition != null) { processDefinitationDataModel.workflowTitle = processDefinition.Title; processDefinitationDataModel.actions = new List <ProcessInstancesDataModel>(); List <ActivityDefinitionData> listOfActivities = processDefinition.ActivityDefinitions.ToList(); ActivitySequence startActivitySequence = new ActivitySequence { sequenceNumber = 1 }; ProcessInstancesDataModel startProcessInstancesDataModel = new ProcessInstancesDataModel { actionTitle = "", actionType = "Start", actionSequence = 0, actionTypeId = 1, nextSequences = new List <ActivitySequence> { startActivitySequence } }; processDefinitationDataModel.actions.Add(startProcessInstancesDataModel); foreach (ActivityDefinitionData activityDefinitionData in processDefinition.ActivityDefinitions) { ProcessInstancesDataModel processInstancesDataModel = new ProcessInstancesDataModel { actionTitle = activityDefinitionData.Title, isActive = (activityDefinitionData.Id.Equals(currentActivityId)) ? true : false, actionSequence = processDefinition.ActivityDefinitions.ToList().IndexOf(activityDefinitionData) + 1 }; TridionActivityDefinitionData tridionActivityDefinitionData = Client.Read(activityDefinitionData.Id, new ReadOptions()) as TridionActivityDefinitionData; processInstancesDataModel.nextSequences = new List <ActivitySequence>(); if (tridionActivityDefinitionData != null && tridionActivityDefinitionData.Script == "") { if (tridionActivityDefinitionData.NextActivityDefinitions.Count() > 1) { processInstancesDataModel.actionType = "Manual-Decision"; processInstancesDataModel.actionTypeId = 4; foreach (var nextActivity in tridionActivityDefinitionData.NextActivityDefinitions) { foreach (ActivityDefinitionData item in listOfActivities) { if (item.Id.Equals(nextActivity.IdRef)) { int findIndex = listOfActivities.IndexOf(item) + 1; ActivitySequence activitySequence = new ActivitySequence { sequenceNumber = findIndex }; processInstancesDataModel.nextSequences.Add(activitySequence); break; } } } } else { processInstancesDataModel.actionType = "Manual"; processInstancesDataModel.actionTypeId = 3; ActivitySequence activitySequence = new ActivitySequence { sequenceNumber = processInstancesDataModel.actionSequence + 1 }; processInstancesDataModel.nextSequences.Add(activitySequence); } } else { if (tridionActivityDefinitionData != null && tridionActivityDefinitionData.NextActivityDefinitions.Count() > 1) { processInstancesDataModel.actionType = "Automatic-Decision"; processInstancesDataModel.actionTypeId = 6; foreach (var nextActivity in tridionActivityDefinitionData.NextActivityDefinitions) { foreach (ActivityDefinitionData item in listOfActivities) { if (item.Id.Equals(nextActivity.IdRef)) { int findIndex = listOfActivities.IndexOf(item) + 1; ActivitySequence activitySequence = new ActivitySequence { sequenceNumber = findIndex }; processInstancesDataModel.nextSequences.Add(activitySequence); break; } } } } else { processInstancesDataModel.actionType = "Automatic"; processInstancesDataModel.actionTypeId = 5; ActivitySequence activitySequence = new ActivitySequence { sequenceNumber = processInstancesDataModel.actionSequence + 1 }; processInstancesDataModel.nextSequences.Add(activitySequence); } } processDefinitationDataModel.actions.Add(processInstancesDataModel); } ProcessInstancesDataModel sendProcessInstancesDataModel = new ProcessInstancesDataModel { actionTitle = "", actionType = "Stop", actionSequence = listOfActivities.Count() + 1, actionTypeId = 2, nextSequences = new List <ActivitySequence>() }; processDefinitationDataModel.actions.Add(sendProcessInstancesDataModel); } var jsSerializer = new JavaScriptSerializer(); var serializedJson = jsSerializer.Serialize(processDefinitationDataModel); return(serializedJson); } } return(null); }