protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            this.AddResourceToClientDependency("Moriyama.Workflow.Umbraco6.Web.Workflow.Js.Util.js",
                                              ClientDependencyType.Javascript);
            this.AddResourceToClientDependency("Moriyama.Workflow.Umbraco6.Web.Workflow.Js.Config.js",
                                               ClientDependencyType.Javascript);

            var id = Convert.ToInt32(Request["id"]);
            _workflowInstance = TheTransitionService.GetWorkflowInstance(id);

            CannotTransitionLiteral.Text = TheGlobalisationService.GetString("this_workflow_cannot_be_transitioned");
            TransitionButton.Text = TheGlobalisationService.GetString("transition");

            if (!TheTransitionService.CanTransition(_workflowInstance))
            {
                CannotTransitionLiteral.Visible = true;
                TransitionPanel.Visible = false;
                return;
            }

            TransitionDropDownList.DataSource = TheTransitionService.GetTransitions(_workflowInstance);
            TransitionDropDownList.DataTextField = "Value";
            TransitionDropDownList.DataValueField = "Key";

            TransitionDropDownList.DataBind();
        }
        public override void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime)
        {
            base.Run(workflowInstance, runtime);

            var body = Helper.Instance.RenderTemplate(RenderTemplate);
            
            IList<string> files = new List<string>();

            foreach(var nodeId in ((UmbracoWorkflowInstance) workflowInstance).CmsNodes)
            {
                var node = new CMSNode(nodeId);
                if(node.IsMedia())
                {
                    files.Add(IOHelper.MapPath((string) new Media(nodeId).getProperty("umbracoFile").Value));
                }
            }

            var f = new User(From).Email;
            foreach(var r in GetRecipients())
            {
                var mail = new MailMessage(f, r) {Subject = Subject, IsBodyHtml = true, Body = body};

                foreach(var file in files)
                {
                    var attach = new Attachment(file);
                    mail.Attachments.Add(attach);
                }

                var smtpClient = new SmtpClient();
                smtpClient.Send(mail);
            }

            runtime.Transition(workflowInstance, this, "done");
        }
 protected override void AddInstantiatingObjectsToInstance(object sender, IWorkflowInstance inst)
 {
     if(TheHelper.HasProperty(sender, "Id"))
     {
         ((UmbracoWorkflowInstance) inst).CmsNodes.Add(TheHelper.GetProperty<int>(sender, "Id"));
     }
 }
        public void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime)
        {
            // Cast to Umbraco worklow instance.
            var umbracoWorkflowInstance = (UmbracoWorkflowInstance) workflowInstance;

            var count = 0;
            var newCmsNodes = new List<int>();

            foreach(var nodeId in umbracoWorkflowInstance.CmsNodes)
            {
                var n = new CMSNode(nodeId);
                if(!n.IsDocument()) continue;

                var d = new Document(nodeId);
                if (!DocumentTypes.Contains(d.ContentType.Id)) continue;
                
                newCmsNodes.Add(nodeId);
                count++;
            }

            umbracoWorkflowInstance.CmsNodes = newCmsNodes;

            var transition = (count > 0) ? "contains_docs" : "does_not_contain_docs";
            runtime.Transition(workflowInstance, this, transition);
        }
        // Implement the Run method of IRunnableWorkflowTask
        public void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime)
        {
            // In Umbraco the workflowInstance should always be castable to an UmbracoWorkflowInstance
            var wf = (UmbracoWorkflowInstance) workflowInstance;

            // UmbracoWorkflowInstance has a list of node Ids that are associated with the workflow in the CmsNodes property
            foreach(var nodeId in wf.CmsNodes)
            {
                // We'll assume that only documents are attached to this workflow
                var doc = new Document(nodeId);

                var property = doc.getProperty(DocumentTypeProperty);
                
                if (!String.IsNullOrEmpty((string) property.Value)) continue;

                var host = HttpContext.Current.Request.Url.Host;
                var pageUrl = "http://" + host + umbraco.library.NiceUrl(nodeId);

                var shortUrl = API.Bit(BitLyLogin, BitLyApiKey, pageUrl, "Shorten");

                property.Value = shortUrl;
            }
            
            // The run method of a workflow task is responsible for informing the runtime of the outcome.
            // The outcome should be one of the items in the AvailableTransitions list.
            runtime.Transition(workflowInstance, this, "done");
        }
        public void Start(IWorkflowInstance workflowInstance)
        {
            if (workflowInstance.Started)
            {
                LogAndThrow(new WorkflowInstanceAlreadyStartedException(string.Format("Workflow instance '{0}' has already been started", workflowInstance.Id)));
            }

            workflowInstance.Started = true;
            var startTasks = workflowInstance.Tasks.Where(task => task.IsStartTask).ToList();

            if(startTasks.Count == 0)
            {
                LogAndThrow(new WorkflowInstanceHasNoStartTaskException(string.Format("Workflow instance '{0}' does not have a start task", workflowInstance.Id)));
            }

            if(startTasks.Count > 1)
            {
                LogAndThrow(new WorkflowInstanceHasTooManyStartTasksException(string.Format("Workflow instance '{0}' has more than one start task", workflowInstance.Id)));
            }

            workflowInstance.StartTime = DateTime.Now;
            workflowInstance.CurrentTask = startTasks[0];

            if (workflowInstance.CurrentTask is IDelayWorkflowTask)
            {
                ((IDelayWorkflowTask)workflowInstance.CurrentTask).StartTime = DateTime.Now;
            }

            TheWorkflowInstanceRepository.Update(workflowInstance);
        }
        public virtual void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime)
        {
            Instantiator = ((UmbracoWorkflowInstance)workflowInstance).Instantiator;
            CmsNodes = ((UmbracoWorkflowInstance)workflowInstance).CmsNodes;

            Comment = workflowInstance.Comment;
            Flags = workflowInstance.Flags;
            TransitionHistory = workflowInstance.TransitionHistory;
        }
        public override void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime)
        {
            base.Run(workflowInstance, runtime);

            var nodes = ((UmbracoWorkflowInstance) workflowInstance).CmsNodes;

            SendMail(Body + Environment.NewLine + GetAttachmentLinks(nodes));
            runtime.Transition(workflowInstance, this, "done");
        }
        private void EndWorkflow(IWorkflowInstance workflowInstance)
        {
            Log.Info(string.Format("The workflow runtime is ending workflow '{0}' - '{1}'", workflowInstance.Id, workflowInstance.Name));
            Log.Info(string.Join(Environment.NewLine, workflowInstance.TransitionHistory));

            workflowInstance.Ended = true;
            workflowInstance.EndTime = DateTime.Now;
            workflowInstance.CurrentTask = null;  
        }
 public IDictionary<string, string> GetTransitions(IWorkflowInstance workflowInstance)
 {
     var ui = (IWorkflowTaskEntityUi)TheWorkflowEntityUiResolver.Resolve(workflowInstance.CurrentTask);
     var transitons = new Dictionary<string, string>();
     foreach (var transition in workflowInstance.CurrentTask.Transitions)
     {
         transitons.Add(transition.Key, ui.TransitionDescriptions[transition.Key]); 
     }
     return transitons;
 }
        public bool CanTransition(IWorkflowInstance workflowInstance)
        {
            if (workflowInstance.CurrentTask == null)
            {
                return false;
            }

            var task = workflowInstance.CurrentTask;
            return typeof(IDecisionWorkflowTask).IsAssignableFrom(task.GetType());
        }
Example #12
0
        public bool CanTransition(IWorkflowInstance workflowInstance)
        {
            if (workflowInstance.CurrentTask == null)
            {
                return(false);
            }

            var task = workflowInstance.CurrentTask;

            return(typeof(IDecisionWorkflowTask).IsAssignableFrom(task.GetType()));
        }
Example #13
0
        public IDictionary <string, string> GetTransitions(IWorkflowInstance workflowInstance)
        {
            var ui         = (IWorkflowTaskEntityUi)TheWorkflowEntityUiResolver.Resolve(workflowInstance.CurrentTask);
            var transitons = new Dictionary <string, string>();

            foreach (var transition in workflowInstance.CurrentTask.Transitions)
            {
                transitons.Add(transition.Key, ui.TransitionDescriptions[transition.Key]);
            }
            return(transitons);
        }
        public override void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime)
        {
            base.Run(workflowInstance, runtime);

            var nodes = ((UmbracoWorkflowInstance) workflowInstance).CmsNodes;

            var body = Helper.Instance.RenderTemplate(RenderTemplate) + GetAttachmentLinks(nodes);

            SendMail(body);
            runtime.Transition(workflowInstance, this, "done");
        }
Example #15
0
 public void onWorkflowIdle(ref IWorkflowInstance e)
 {
     if (!PluginConfig.enabled)
     {
         return;
     }
     if (PluginConfig.stoponidle)
     {
         stopRecording(e);
     }
 }
Example #16
0
        public override void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime)
        {
            base.Run(workflowInstance, runtime);

            var nodes = ((UmbracoWorkflowInstance)workflowInstance).CmsNodes;

            var body = Helper.Instance.RenderTemplate(RenderTemplate) + GetAttachmentLinks(nodes);

            SendMail(body);
            runtime.Transition(workflowInstance, this, "done");
        }
        private async Task UnlockWorkflowInstance(IWorkflowInstance workflowInstance, CancellationToken cancellationToken)
        {
            ((WorkflowInstanceLock)workflowInstance.Lock).LockedUntil = workflowInstance.Lock.LockedAt;
            var success = await WorkflowEngineBuilder.WorkflowStore
                          .TryUnlockWorkflowInstance(Id, workflowInstance.RootWorkflowInstanceId, workflowInstance.Lock.LockedAt, cancellationToken)
                          .ConfigureAwait(false);

            if (!success)
            {
                Log.Warning("Failed to unlock workflow instance [{workflowInstanceId}] by a [{rootWorkflowInstanceId}]",
                            workflowInstance.Id, workflowInstance.RootWorkflowInstanceId);
            }
        }
        private async Task PopulateWorkflowInstanceWithInternalState(IWorkflowInstance workflowInstance, CancellationToken cancellationToken)
        {
            var workflowInstanceInternal  = (IWorkflowInstanceInternal)workflowInstance;
            var workflowInstanceStateLogs = await WorkflowEngineBuilder.WorkflowStore.GetWorkflowInstanceStateLog(workflowInstance.Id, cancellationToken).ConfigureAwait(false);

            if (null != workflowInstanceStateLogs && workflowInstanceStateLogs.Count > 0)
            {
                foreach (var workflowInstanceStateLog in workflowInstanceStateLogs.OrderBy(s => s.Started))
                {
                    workflowInstanceInternal.VisitedStatesInternal.Add(workflowInstanceStateLog.StateCode);
                }
            }
        }
Example #19
0
 public void StartWorkflow(string appCode, string procName, string dataLocator, int impoLevel = 0, int secret = 0)
 {
     CurrentWorkflow = Build(appCode);
     FlowInstance    = GetNewInstance(appCode, procName, dataLocator, impoLevel, secret);
     using (TransactionScope tran = new TransactionScope())
     {
         CurrentWorkflow.AddInstance(FlowInstance);
         CurrentItem = GetNewWorkItem(CurrentWorkflow.Root, CurrentUser, appCode, FlowInstance.Id);
         FlowInstance.InsertWorkItem(CurrentItem);
         CurrentActivity = CurrentWorkflow.Root;
         tran.Complete();
     }
 }
        private async Task <WorkflowState> CreateGraphAndExecute(WorkflowContext context, IWorkflowLoader loader, IWorkflowContextPersistor instancePersistor, bool isResume = false)
        {
            IWorkflowInstance workflowInstance = loader.LoadWorkflow(context.WorkflowId, context.WorkflowVersion, context
                                                                     , new Controller(instancePersistor, context));
            await workflowInstance.Initialize();

            var state = isResume ? await workflowInstance.Resume() : await workflowInstance.Execute();

            instancePersistor.Save(context);
            return(new WorkflowState()
            {
                Context = context.ToJson(), Id = workflowInstance.Id, State = state
            });
        }
        public ParentToNestedEntityEvent(string code, WorkflowHierarchyEventType hierarchyEventType,
                                         Guid rootWorkflowInstanceId, Guid parentWorkflowInstanceId, IWorkflowInstance workflowInstance, IEntity nestedEntity)
        {
            Guard.ArgumentNotNull(code, nameof(code));
            Guard.ArgumentNotNull(workflowInstance, nameof(workflowInstance));

            Code                     = code;
            Entity                   = nestedEntity;
            HierarchyEventType       = hierarchyEventType;
            ParentWorkflowInstanceId = parentWorkflowInstanceId;
            RootWorkflowInstanceId   = rootWorkflowInstanceId;
            TargetWorkflowInstance   = workflowInstance;
            WorkflowInstanceId       = workflowInstance.Id;
        }
        public void Transition(IWorkflowInstance workflowInstance, string transiton, string comment)
        {
            var task = workflowInstance.CurrentTask;

            if (!task.Transitions.ContainsKey(transiton))
            {
                Log.Warn(string.Format("Transition '{0}' not found for task '{1}' - '{2}'", transiton, task.Name, task.Id));
                return;
            }

            Log.Info(string.Format("Performing transition '{0}' for task '{1}' - '{2}'", transiton, task.Name, task.Id));
            TheWorkflowRuntime.Transition(workflowInstance, task, transiton, comment);
            TheWorkflowRuntime.RunWorkflows();
        }
Example #23
0
        private void stopRecording(IWorkflowInstance e)
        {
            Record r;

            if (!Records.ContainsKey(e._id))
            {
                return;
            }
            r = Records[e._id];
            if (r.IsRecording)
            {
                r.StopRecording();
            }
        }
Example #24
0
        public void Transition(IWorkflowInstance workflowInstance, string transiton, string comment)
        {
            var task = workflowInstance.CurrentTask;

            if (!task.Transitions.ContainsKey(transiton))
            {
                Log.Warn(string.Format("Transition '{0}' not found for task '{1}' - '{2}'", transiton, task.Name, task.Id));
                return;
            }

            Log.Info(string.Format("Performing transition '{0}' for task '{1}' - '{2}'", transiton, task.Name, task.Id));
            TheWorkflowRuntime.Transition(workflowInstance, task, transiton, comment);
            TheWorkflowRuntime.RunWorkflows();
        }
Example #25
0
        public Record stopRecording(IWorkflowInstance e)
        {
            Record r = null;

            if (!Records.ContainsKey(e._id))
            {
                return(r);
            }
            r = Records[e._id];
            if (r.IsRecording)
            {
                r.StopRecording();
            }
            return(r);
        }
Example #26
0
 public void IdleOrComplete(IWorkflowInstance instance, EventArgs e)
 {
     if (string.IsNullOrEmpty(instance.caller))
     {
         return;
     }
     if (!RunWorkflowInstances.ContainsKey(instance.caller))
     {
         return;
     }
     if (instance.isCompleted || instance.Exception != null)
     {
         var _instance = RunWorkflowInstances[instance.caller];
         if (instance.Parameters != null)
         {
             _instance.Result = instance.Parameters;
         }
         else
         {
             _instance.Result = new Dictionary <string, object>();
         }
         RunWorkflowInstances.Remove(instance.caller);
         if (!string.IsNullOrEmpty(instance.errormessage))
         {
             _instance.Error = new Exception(instance.errormessage);
         }
         if (instance.Exception != null)
         {
             _instance.Error = instance.Exception;
         }
         _instance.Pending.Set();
         GenericTools.RunUI(() =>
         {
             // if ran in designer, call IdleOrComplete to break out of debugging and make designer not readonly
             var designer = global.OpenRPAClient.GetWorkflowDesignerByIDOrRelativeFilename(_instance.IDOrRelativeFilename);
             try
             {
                 if (designer != null)
                 {
                     designer.IdleOrComplete(instance, e);
                 }
             }
             catch (Exception)
             {
             }
         });
     }
 }
Example #27
0
        public async Task SaveWorkflowInstance(IWorkflowInstance workflowInstance, CancellationToken cancellationToken = default)
        {
            Guard.ArgumentNotNull(workflowInstance, nameof(workflowInstance));

            var workflowInstanceIdString = workflowInstance.Id.ToIdString();
            var mongoCollection          = MongoDatabase.GetCollection <WorkflowInstanceDto>(Constants.WorkflowInstanceCollectionName);
            var workflowInstanceDto      = mongoCollection.Find(x => x.Id == workflowInstanceIdString).FirstOrDefault();

            if (null == workflowInstanceDto)
            {
                workflowInstanceDto = new WorkflowInstanceDto
                {
                    Id                       = workflowInstance.Id.ToIdString(),
                    Created                  = new BsonDateTime(workflowInstance.Created),
                    CurrentStateCode         = workflowInstance.CurrentStateCode,
                    CurrentStateProgress     = workflowInstance.CurrentStateProgress,
                    EntityId                 = workflowInstance.EntityId,
                    EntityType               = workflowInstance.EntityType,
                    ParentWorkflowInstanceId = workflowInstance.ParentWorkflowInstanceId.ToIdString(),
                    RootWorkflowInstanceId   = workflowInstance.RootWorkflowInstanceId.ToIdString(),
                    WorkflowId               = workflowInstance.WorkflowId.ToIdString(),
                    Lock                     = new WorkflowInstanceLockDto
                    {
                        LockOwner   = workflowInstance.Lock.LockOwner.ToIdString(),
                        LockMode    = workflowInstance.Lock.LockMode,
                        LockedAt    = workflowInstance.Lock.LockedAt,
                        LockedUntil = workflowInstance.Lock.LockedUntil
                    }
                };

                await InsertAsync(mongoCollection, workflowInstanceDto, cancellationToken).ConfigureAwait(false);
            }
            else
            {
                // make sure not to update the whole entity to avoid conflicting updates on [Lock] sub-object
                var updateDefinition = Builders <WorkflowInstanceDto> .Update
                                       .Set(wi => wi.CurrentStateCode, workflowInstance.CurrentStateCode)
                                       .Set(wi => wi.CurrentStateProgress, workflowInstance.CurrentStateProgress)
                                       .Set(wi => wi.EntityId, workflowInstance.EntityId)
                                       .Set(wi => wi.EntityType, workflowInstance.EntityType)
                                       .Set(wi => wi.ParentWorkflowInstanceId, workflowInstance.ParentWorkflowInstanceId.ToIdString())
                                       .Set(wi => wi.RootWorkflowInstanceId, workflowInstance.RootWorkflowInstanceId.ToIdString())
                                       .Set(wi => wi.WorkflowId, workflowInstance.WorkflowId.ToIdString());

                await mongoCollection.UpdateOneAsync(wi => wi.Id == workflowInstanceIdString, updateDefinition, null, cancellationToken).ConfigureAwait(false);
            }
        }
        private WorkflowState CreateGraphAndExecute(WorkflowContext context, IWorkflowLoader loader, IWorkflowContextPersistor instancePersistor, bool isResume = false)
        {
            IWorkflowInstance workflowInstance = loader.LoadWorkflow(context.WorkflowId, context.WorkflowVersion, context
                                                                     , new Controller(instancePersistor, context));

            workflowInstance.Initialize().Wait();
            var state           = isResume ?  workflowInstance.Resume().Result :workflowInstance.Execute().Result;
            var persistentState = instancePersistor.Save(context);

            return(new WorkflowState()
            {
                Context = persistentState.Context,
                Id = persistentState.InstanceId,
                State = state,
                RequiredParameters = context.RequiredParameters.ToArray()
            });
        }
Example #29
0
        public static void RaiseWorkItemEvent(EventStep step, ItemActionType type, IWorkflowInstance instance, IWorkflowItem item)
        {
            string key = KeyTemplate.FormatTo(step.ToString(), type.ToString());

            if (WorkItemEventList.ContainsKey(key))
            {
                try
                {
                    Logger.GetLogger("Workflow").Info("{0}:Raise WorkflowItemEvent:{1}".FormatTo(instance.Id, key));
                    WorkItemEventList[key](instance, item);
                }
                catch (Exception ex)
                {
                    Logger.GetLogger("Workflow").Info("{0}:Raise WorkflowEvent:{1} Error:{2},{3}".FormatTo(instance.Id, key, ex.Message, ex.StackTrace));
                }
            }
        }
Example #30
0
        protected void SetWorkflowInstance(IWorkflowInstance workflowInstance, CancellationToken cancellationToken)
        {
            for (var i = WorkflowInstances.Count - 1; i >= 0; i--)
            {
                if (null == workflowInstance.Entity)
                {
                    break;
                }

                if (WorkflowInstances[i].Entity.EntityType == workflowInstance.Entity.EntityType && WorkflowInstances[i].Entity.EntityId == workflowInstance.Entity.EntityId)
                {
                    WorkflowInstances.RemoveAt(i);
                }
            }

            WorkflowInstances.Add(workflowInstance);
        }
        public void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime)
        {
            // Cast to Umbraco worklow instance.
            var umbracoWorkflowInstance = (UmbracoWorkflowInstance) workflowInstance;

            foreach(var nodeId in umbracoWorkflowInstance.CmsNodes)
            {
                var n = new CMSNode(nodeId);
                if(!n.IsDocument()) continue;

                var d = new Document(nodeId);
                d.Publish(User.GetUser(0));

                umbraco.library.UpdateDocumentCache(d.Id);
            }

            runtime.Transition(workflowInstance, this, "done");
        }
        protected override bool OtherInstancesRunning(IWorkflowInstance workflowInstance, object sender)
        {
            var senderId = (int)TheHelper.GetPropertyValue(sender, "Id");
            var typeName = workflowInstance.GetType().FullName;
            var umbracoWorkflowInstance = (UmbracoWorkflowInstance) workflowInstance;

            // var tenSecondsAgo = DateTime.Now.Subtract(TimeSpan.FromSeconds(10));

            var otherInstances = TheWorkflowInstanceService.ListInstances().Where(
                i => (i.GetType().FullName == typeName)
                    && (((UmbracoWorkflowInstance)i).Instantiator == umbracoWorkflowInstance.Instantiator)
                    && (i.Id != workflowInstance.Id)
                    && (((UmbracoWorkflowInstance)i).CmsNodes.Contains(senderId))
                    // && (i.InstantiationTime > tenSecondsAgo)

            );
            return otherInstances.Count() > 0;
        }
Example #33
0
        public string TransitionInfo(IWorkflowInstance i)
        {
            if (i.CurrentTask == null)
            {
                return("");
            }
            if (!typeof(IDecisionWorkflowTask).IsAssignableFrom(i.CurrentTask.GetType()))
            {
                return("");
            }

            if (!CanTransition(i.CurrentTask) && !_isAdmin)
            {
                return("");
            }
            var decision = (IDecisionWorkflowTask)i.CurrentTask;

            return("<a href='#' class='wfTransition' rel='" + string.Format(decision.TransitionUrl, HttpUtility.UrlEncode(i.Id.ToString())) + "'>" + TheGlobalisationService.GetString("transtion") + "</a>");
        }
        protected override bool OtherInstancesRunning(IWorkflowInstance workflowInstance, object sender)
        {
            var senderId = (int)TheHelper.GetPropertyValue(sender, "Id");
            var typeName = workflowInstance.GetType().FullName;
            var umbracoWorkflowInstance = (UmbracoWorkflowInstance)workflowInstance;

            // var tenSecondsAgo = DateTime.Now.Subtract(TimeSpan.FromSeconds(10));

            var otherInstances = TheWorkflowInstanceService.ListInstances().Where(
                i => (i.GetType().FullName == typeName) &&
                (((UmbracoWorkflowInstance)i).Instantiator == umbracoWorkflowInstance.Instantiator) &&
                (i.Id != workflowInstance.Id) &&
                (((UmbracoWorkflowInstance)i).CmsNodes.Contains(senderId))
                // && (i.InstantiationTime > tenSecondsAgo)

                );

            return(otherInstances.Count() > 0);
        }
Example #35
0
 public void Initialize(IOpenRPAClient client, IWorkflow workflow, IWorkflowInstance instance)
 {
     automation = AutomationUtil.getAutomation();
     //cache = new CacheRequest();
     //cache.TreeScope = FlaUI.Core.Definitions.TreeScope.Element | FlaUI.Core.Definitions.TreeScope.Subtree | FlaUI.Core.Definitions.TreeScope.Parent;
     ////cacheRequest.TreeScope = FlaUI.Core.Definitions.TreeScope.Element;
     //cache.AutomationElementMode = FlaUI.Core.Definitions.AutomationElementMode.None;
     //cache.Add(automation.PropertyLibrary.Element.AutomationId);
     //cache.Add(automation.PropertyLibrary.Element.ProcessId);
     //cache.Add(automation.PropertyLibrary.Element.Name);
     //cache.Add(automation.PropertyLibrary.Element.ClassName);
     //cache.Add(automation.PropertyLibrary.Element.ControlType);
     //cache.Add(automation.PropertyLibrary.Element.LocalizedControlType);
     //cache.Add(automation.PropertyLibrary.Element.FrameworkId);
     //cache.Add(automation.PropertyLibrary.Element.BoundingRectangle);
     //cache.Add(automation.PropertyLibrary.Element.IsPassword);
     //// cache.Add(automation.PropertyLibrary.Element.Parent);
     //cacheObject = cache.Activate();
 }
Example #36
0
        // TODO handle timeout? TimeoutException on this task, and finish preparation in the background and set idle at the end, problem: it shouldn't know about idle!
        // Can be called only after a successful WaitIdleAsync()!
        private async Task PrepareInstanceAsync()
        {
            if (instance != null && instance.WorkflowInstanceState == WorkflowInstanceState.Aborted)
            {
                // We try to restart or reload it from the previous persisted state.
                await grain.LoadWorkflowStateAsync();

                instance = null;
            }
            if (instance == null)
            {
                IWorkflowState workflowState = grain.WorkflowState;
                if (workflowState.InstanceValues == null)
                {
                    // Start, there is no previous persisted state.
                    instance = new WorkflowInstance(this, workflowDefinitionFactory(workflowDefinitionIdentity), workflowDefinitionIdentity);
                    instance.Start(await grain.OnStartAsync(), GetExtensions());
                }
                else
                {
                    // Load previous persisted state.
                    instance = new WorkflowInstance(this, workflowDefinitionFactory(workflowState.WorkflowDefinitionIdentity), workflowState.WorkflowDefinitionIdentity);

                    // TODO If workflowState.WorkflowDefinitionIdentity differs from workflowDefinitionIdentity, we should create a DynamicUpdateMap and update the loaded instance.
                    //      Currently we downgrade the workflowDefinitionIdentity to the loaded value.
                    // NOTE The workflowDefinitionFactory usually yields the same singleton workflow definition (ie. activity) for the same WorkflowDefinitionIdentity,
                    //      what happens with these activity trees during update???
                    // await instance.LoadAsync(workflowState.InstanceValues, GetExtensions(), >>>DynamicUpdateMap: workflowState.WorkflowDefinitionIdentity -> workflowDefinitionIdentity<<<);

                    await instance.LoadAsync(workflowState.InstanceValues, GetExtensions());

                    workflowDefinitionIdentity = workflowState.WorkflowDefinitionIdentity;
                }
            }
            if (instance.WorkflowInstanceState == WorkflowInstanceState.Runnable)
            {
                TaskCompletionSource <object> taskCompletionSource = new TaskCompletionSource <object>();
                await RunInstanceWithActiveTaskCompletionSourceProtectionAsync(taskCompletionSource, ActiveTaskCompletionSource.ProtectionLevel.UnhandledExceptionAndNormalCompletion);

                await taskCompletionSource.Task;
            }
        }
        public static string TransitionInfo(this HtmlHelper helper, IWorkflowInstance i)
        {
            if (i.CurrentTask == null)
            {
                return("");
            }
            if (!typeof(IDecisionWorkflowTask).IsAssignableFrom(i.CurrentTask.GetType()))
            {
                return("");
            }

            if (!CanTransition(i.CurrentTask))
            {
                return("");
            }

            var decision = (IDecisionWorkflowTask)i.CurrentTask;

            return("<a href='" + string.Format(decision.TransitionUrl, HttpUtility.UrlEncode(i.Id.ToString())) + "'>Transition</a>");
        }
Example #38
0
 public void CleanUp(ref IWorkflowInstance e)
 {
     if (!PluginConfig.auto_close)
     {
         return;
     }
     foreach (var sesion in Sessions)
     {
         if (sesion.WorkflowInstanceId == e.InstanceId)
         {
             try
             {
                 GenericTools.RunUI(sesion.Close);
             }
             catch (Exception)
             {
             }
         }
     }
 }
Example #39
0
        protected string AttachmentInfo(IWorkflowInstance i)
        {
            var umbracoWorkflowInstance = (UmbracoWorkflowInstance)i;
            var result = "";

            foreach (var n in umbracoWorkflowInstance.CmsNodes)
            {
                var node = new CMSNode(n);

                if (node.nodeObjectType == Document._objectType)
                {
                    result += "<a href=\"editContent.aspx?id=" + node.Id + "\">" + node.Text + " (" + node.Id + ")</a><br/>";
                }
                else
                {
                    result += node.Text + " (" + node.Id + ")<br/>";
                }
            }
            return(result);
        }
        // Implement the Run method of IRunnableWorkflowTask
        public void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime)
        {
            // In Umbraco the workflowInstance should always be castable to an UmbracoWorkflowInstance
            var wf = (UmbracoWorkflowInstance)workflowInstance;

            var accessToken = new OAuthTokens
            {
                AccessToken       = AccessToken,
                AccessTokenSecret = AccessTokenSecret,
                ConsumerKey       = ConsumerKey,
                ConsumerSecret    = ConsumerSecret
            };

            foreach (var nodeId in wf.CmsNodes)
            {
                // We'll assume that only documents are attached to this workflow
                var doc = new Document(nodeId);

                string pageUrl;

                if (string.IsNullOrEmpty(ShortUrlProperty))
                {
                    // The user hasn't specified a property for a Short URL.
                    var host = HttpContext.Current.Request.Url.Host;
                    pageUrl = "http://" + host + umbraco.library.NiceUrl(nodeId);
                }
                else
                {
                    pageUrl = (string)doc.getProperty(ShortUrlProperty).Value;
                }

                var tweet = string.Format(TweetText, doc.Text, pageUrl);

                // We could do some error checking with the result here....
                var result = TwitterStatus.Update(accessToken, tweet);
            }

            // The run method of a workflow task is responsible for informing the runtime of the outcome.
            // The outcome should be one of the items in the AvailableTransitions list.
            runtime.Transition(workflowInstance, this, "done");
        }
Example #41
0
        public void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime)
        {
            // Cast to Umbraco worklow instance.
            var umbracoWorkflowInstance = (UmbracoWorkflowInstance)workflowInstance;

            foreach (var nodeId in umbracoWorkflowInstance.CmsNodes)
            {
                var n = new CMSNode(nodeId);
                if (!n.IsDocument())
                {
                    continue;
                }

                var d = new Document(nodeId);
                d.Publish(User.GetUser(0));

                umbraco.library.UpdateDocumentCache(d.Id);
            }

            runtime.Transition(workflowInstance, this, "done");
        }
Example #42
0
        private WorkflowBookmarkEntity CreateBookMark(IWorkflowInstance workflowInstance)
        {
            var allowedActions = string.Join(",",
                                             workflowInstance.Current.ActivityTemplate.AllowedActions.Select(p => p.OperationCode.ToString())
                                             .ToList());
            var bookmark = new WorkflowBookmarkEntity()
            {
                BOOKMARK_ID           = Guid.NewGuid().ToString(),
                CREATED_ON            = DateTime.Now,
                LAST_UPDATED_ON       = DateTime.Now,
                CURRENT_ACTIVITY_NAME = workflowInstance.Current.ActivityTemplate.Name,
                NEXT_ACTIVITY_NAME    = FindNextActivityTemplate(workflowInstance.Current.ActivityTemplate).Name,
                ALLOWED_OPERATIONS    = allowedActions,
                FORM_TYPE             = workflowInstance.Form.FormType,
                FORM_ID = workflowInstance.Form.FormId,
                WORKFLOW_INSTANCE_ID = workflowInstance.WorkflowInstanceId,
                USER_ID = workflowInstance.Owner.ApproverId
            };

            return(bookmark);
        }
        // Implement the Run method of IRunnableWorkflowTask
        public void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime)
        {
            // In Umbraco the workflowInstance should always be castable to an UmbracoWorkflowInstance
            var wf = (UmbracoWorkflowInstance)workflowInstance;
            
            var accessToken = new OAuthTokens
            {
                AccessToken = AccessToken,
                AccessTokenSecret = AccessTokenSecret,
                ConsumerKey = ConsumerKey,
                ConsumerSecret = ConsumerSecret
            };

            foreach (var nodeId in wf.CmsNodes)
            {
                // We'll assume that only documents are attached to this workflow
                var doc = new Document(nodeId);

                string pageUrl;

                if(string.IsNullOrEmpty(ShortUrlProperty))
                {
                    // The user hasn't specified a property for a Short URL.
                    var host = HttpContext.Current.Request.Url.Host;
                    pageUrl = "http://" + host + umbraco.library.NiceUrl(nodeId);
                } else
                {
                    pageUrl = (string)doc.getProperty(ShortUrlProperty).Value;
                }

                var tweet = string.Format(TweetText, doc.Text, pageUrl);

                // We could do some error checking with the result here....
                var result = TwitterStatus.Update(accessToken, tweet);
            }

            // The run method of a workflow task is responsible for informing the runtime of the outcome.
            // The outcome should be one of the items in the AvailableTransitions list.
            runtime.Transition(workflowInstance, this, "done");
        }
Example #44
0
        public void OnNotifyIdle()
        {
            bool isTrySetCompleted = activeTaskCompletionSources.TrySetCompleted();

            if (completionState != null)
            {
                if (instance.WorkflowInstanceState == WorkflowInstanceState.Complete)
                {
                    // Completed as expected.
                    instance = null;
                }
                else
                {
                    // Typically aborted after completion due to a persistence failure.
                    completionState = null;
                }
            }
            if (!isTrySetCompleted)
            {
                idle.Set();
            }
        }
Example #45
0
        public string TransitionInfo(IWorkflowInstance i)
        {
            if (i.CurrentTask == null)
            {
                return("");
            }
            if (!(i.CurrentTask is IDecisionWorkflowTask))
            {
                return("");
            }

            var instantiator = ((UmbracoWorkflowInstance)i).Instantiator;

            if (!CanTransition(i.CurrentTask, instantiator) && !_isAdmin)
            {
                return("");
            }

            if (i.CurrentTask is UrlGroupDecisionWorkflowTask)
            {
                var urlTask = (UrlGroupDecisionWorkflowTask)i.CurrentTask;
                var url     = string.IsNullOrEmpty(urlTask.Url) ? "#" : urlTask.Url;

                return("<a href='" + url + "?id=" + HttpUtility.UrlEncode(i.Id.ToString()) + "' target='_blank'>" + TheGlobalisationService.GetString("transtion") + "</a>");
            }

            if (i.CurrentTask is UrlInstantiatorRestartWorkflowTask)
            {
                var urlTask = (UrlInstantiatorRestartWorkflowTask)i.CurrentTask;
                var url     = string.IsNullOrEmpty(urlTask.Url) ? "#" : urlTask.Url;

                return("<a href='" + url + "?id=" + HttpUtility.UrlEncode(i.Id.ToString()) + "' target='_blank'>" + TheGlobalisationService.GetString("restart_workflow") + "</a>");
            }

            var decision = (IDecisionWorkflowTask)i.CurrentTask;

            return("<a href='#' class='wfTransition' rel='" + string.Format(decision.TransitionUrl, HttpUtility.UrlEncode(i.Id.ToString())) + "'>" + TheGlobalisationService.GetString("transtion") + "</a>");
        }
Example #46
0
        public override void Run(IWorkflowInstance workflowInstance, IWorkflowRuntime runtime)
        {
            base.Run(workflowInstance, runtime);

            var body = Helper.Instance.RenderTemplate(RenderTemplate);

            IList <string> files = new List <string>();

            foreach (var nodeId in ((UmbracoWorkflowInstance)workflowInstance).CmsNodes)
            {
                var node = new CMSNode(nodeId);
                if (node.IsMedia())
                {
                    files.Add(IOHelper.MapPath((string)new Media(nodeId).getProperty("umbracoFile").Value));
                }
            }

            var f = new User(From).Email;

            foreach (var r in GetRecipients())
            {
                var mail = new MailMessage(f, r)
                {
                    Subject = Subject, IsBodyHtml = true, Body = body
                };

                foreach (var file in files)
                {
                    var attach = new Attachment(file);
                    mail.Attachments.Add(attach);
                }

                var smtpClient = new SmtpClient();
                smtpClient.Send(mail);
            }

            runtime.Transition(workflowInstance, this, "done");
        }
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            this.AddResourceToClientDependency("FergusonMoriyam.Workflow.Umbraco.Web.Ui.Js.Util.js",
                                              ClientDependencyType.Javascript);
            this.AddResourceToClientDependency("FergusonMoriyam.Workflow.Umbraco.Web.Ui.Js.Config.js",
                                               ClientDependencyType.Javascript);

            // Get a reference to the application spring context and use it to get a reference
            // to the workflow transition service.  If you know spring.net you could
            // Just add your aspx to the config in ~/config/fmworkflow
            var ctx = ContextRegistry.GetContext();
            TheTransitionService = (IWorkflowTaskTransitionService)ctx.GetObject("TransitionService");

            // Get a workflow instance - id is passed on the request.
            var id = Convert.ToInt32(Request["id"]);
            WorkflowInstance = TheTransitionService.GetWorkflowInstance(id);


            // Check that the workflow is able to be transitioned still - someone may have progressed it in the 
            // meantime.
            CannotTransitionLiteral.Text = "This workflow cannot be transitioned";
            if (!TheTransitionService.CanTransition(WorkflowInstance))
            {
                CannotTransitionLiteral.Visible = true;
                return;
            }

            // Bind a list of possible transitions for current workflow task to the dropdown
            // Transitions are just a dictionary of Key = transition ID, Value = Description
            TransitonDropDownList.DataSource = TheTransitionService.GetTransitions(WorkflowInstance);
            TransitonDropDownList.DataTextField = "Value";
            TransitonDropDownList.DataValueField = "Key";
            TransitonDropDownList.DataBind();
        }
 public void Transition(IWorkflowInstance workflowInstance, IWorkflowTask workflowTask, string transitionName)
 {
     Log.Info(string.Format("The workflow runtime is transitioning {0} - {1} '{2}' - '{3}'", workflowTask.Name, transitionName, workflowInstance.Id, workflowInstance.Name));
     Transition(workflowInstance, workflowTask, transitionName, "");
 }
        public string TransitionInfo(IWorkflowInstance i)
        {
            if (i.CurrentTask == null) return "";
            if (!(i.CurrentTask is IDecisionWorkflowTask)) return "";

            var instantiator = ((UmbracoWorkflowInstance) i).Instantiator;

            if (!CanTransition(i.CurrentTask, instantiator) && !_isAdmin)
            {
                return "";
            }

            if (i.CurrentTask is UrlGroupDecisionWorkflowTask)
            {
                var urlTask = (UrlGroupDecisionWorkflowTask)i.CurrentTask;
                var url = string.IsNullOrEmpty(urlTask.Url) ? "#" : urlTask.Url;

                return "<a href='" + url + "?id=" + HttpUtility.UrlEncode(i.Id.ToString()) + "' target='_blank'>" + TheGlobalisationService.GetString("transtion") + "</a>";
            }

            if (i.CurrentTask is UrlInstantiatorRestartWorkflowTask)
            {
                var urlTask = (UrlInstantiatorRestartWorkflowTask)i.CurrentTask;
                var url = string.IsNullOrEmpty(urlTask.Url) ? "#" : urlTask.Url;

                return "<a href='" + url + "?id=" + HttpUtility.UrlEncode(i.Id.ToString()) + "' target='_blank'>" + TheGlobalisationService.GetString("restart_workflow") + "</a>";
            }

            var decision = (IDecisionWorkflowTask) i.CurrentTask;
            return "<a href='#' class='wfTransition' rel='"+string.Format(decision.TransitionUrl, HttpUtility.UrlEncode(i.Id.ToString())) +"'>"+ TheGlobalisationService.GetString("transtion") + "</a>";
        }
 public void Update(IWorkflowInstance workflowInstance)
 {
     TheWorkflowInstanceRepository.Update(workflowInstance);
 }
        public void Transition(IWorkflowInstance workflowInstance, IWorkflowTask workflowTask, string transitionName, string comment)
        {
            if (workflowTask.Transitions.Values.Count == 0)
            {
                Log.Warn(string.Format("Ending workflow '{0}' as it has no transitions.", workflowInstance.Id));
                EndWorkflow(workflowInstance);
                TheWorkflowInstanceRepository.Update(workflowInstance);
                return;
            }

            if(!workflowTask.Transitions.ContainsKey(transitionName))
            {
                LogAndThrow(new WorkflowTaskInvalidTransitionException(string.Format("Inavlid transition '{0}' for task '{1}'", transitionName, workflowTask.Name)));
            }

            var transitionGuid = workflowTask.Transitions[transitionName];
            var transitionTask = workflowInstance.Tasks.SingleOrDefault(task => task.Id == transitionGuid);

            if(transitionTask == null)
            {
                LogAndThrow(new WorkflowTaskInvalidTransitionException(string.Format("Can't transition to task '{0}' in workflow '{1}' as it is not found", transitionGuid.ToString(), workflowInstance.Id)));
            }

            Log.Info(string.Format("Transitioning workflow '{0}' - '{1}' from '{2}' to '{3}' using transition '{4}'", workflowInstance.Name, workflowInstance.Id, workflowInstance.CurrentTask.Name, transitionTask.Name, transitionName));

            workflowInstance.TransitionHistory.Add(string.Format("{0} - Transition '{1}' - '{2}' -> '{3}' {4}", DateTime.Now, transitionName, workflowInstance.CurrentTask.Name, transitionTask.Name, comment));

            workflowInstance.CurrentTask = transitionTask;

            if (workflowInstance.CurrentTask is IDelayWorkflowTask)
            {
                ((IDelayWorkflowTask)workflowInstance.CurrentTask).StartTime = DateTime.Now;
            }

            TheWorkflowInstanceRepository.Update(workflowInstance);
        }
 protected abstract void AddInstantiatingObjectsToInstance(object sender, IWorkflowInstance inst);
        protected void Page_Load(object sender, EventArgs e)
        {

            var moduleNodeTypeAliases =
                ConfigurationManager.AppSettings["ModuleNodeTypeAliases"].Split(',')
                    .ToList()
                    .ConvertAll(x => x.ToLower());


            var id = Convert.ToInt32(Request["id"]);
            _workflowInstance = TheWorkflowInstanceService.GetInstance(id);

            var nodes = ((UmbracoWorkflowInstance)_workflowInstance).CmsNodes;

            if (!Page.IsPostBack)
            {
                var nodeDetails = new List<NodeInfo>();

                foreach (var nodeId in nodes)
                {
                    var node = new Content(nodeId);

                    if (!moduleNodeTypeAliases.Contains(node.ContentType.Alias.ToLower()))
                    {
                        var url = umbraco.library.NiceUrl(nodeId);

                        nodeDetails.Add(new NodeInfo
                        {
                            Id = nodeId,
                            PreviewNodeId = nodeId,
                            Name = node.Text,
                            Url = umbraco.library.NiceUrl(nodeId),
                            Approved = true,
                            Comment = string.Empty
                        });
                    }
                    else
                    {
                        var ids = FindReferencesToModule(nodeId, 1050).Distinct();

                        var url = ids.Any() ? umbraco.library.NiceUrl(ids.First()) : "#";

                        nodeDetails.Add(new NodeInfo
                        {
                            Id = nodeId,
                            PreviewNodeId = ids.Any() ? ids.First() : nodeId,
                            Name = "Module " + node.Text,
                            Url = url,
                            Approved = true,
                            Comment = string.Empty,
                            References = string.Join(",", ids)
                        });
                    }
                }

                var json = JsonConvert.SerializeObject(nodeDetails, Formatting.Indented);
                JsonLiteral.Text = json;

                NodeRepeater.DataSource = nodeDetails;
                NodeRepeater.DataBind();
            }
        }
 public void Transition(IWorkflowInstance workflowInstance, string transiton)
 {
     Transition(workflowInstance, transiton, "");
 }
 protected virtual void NotifyInstantiation(IWorkflowInstance inst) { }
        protected string AttachmentInfo(IWorkflowInstance i)
        {
            var umbracoWorkflowInstance = (UmbracoWorkflowInstance)i;
            var result = "";

            foreach(var n in umbracoWorkflowInstance.CmsNodes)
            {
                var node = new CMSNode(n);

                if (node.nodeObjectType == Document._objectType)
                {
                    result += "<a href=\"editContent.aspx?id="+ node.Id+"\">" + node.Text + " (" + node.Id + ")</a><br/>";
                }
                else
                {
                    result += node.Text + " (" + node.Id + ")<br/>";
                }
            }
            return result;
        }
 protected override void NotifyInstantiation(IWorkflowInstance inst)
 {
     BasePage.Current.ClientTools.ShowSpeechBubble(BasePage.speechBubbleIcon.info,  TheGlobalisationService.GetString("workflow_started"), TheGlobalisationService.GetString("workflow") + string.Format(" '{0}'<br/>(Id -> {1}) {2}.", inst.Name, inst.Id, TheGlobalisationService.GetString("was_started")));
 }
 protected abstract bool OtherInstancesRunning(IWorkflowInstance inst, object sender);