private static IWorkflowNode CompressTree(WorkflowParser.Workflow workflow, ParseAs parseAs)
 {
     if (parseAs == ParseAs.RollUp)
     {
         return(CompressRollUp(workflow.Activities[0] as WorkflowParser.ActivitySequence));
     }
     if (parseAs == ParseAs.Workflow)
     {
         return(new ActivityList(CompressActivityCollection(workflow.Activities).ToArray()));
     }
     throw new NotImplementedException("No logic for parsing that kind of xaml in workflowconstructor");
 }
        public static WorkflowTree Parse(Entity workflow, Dictionary <string, CodeActivity> codeActivites, ParseAs parseAs)
        {
            if (workflow == null || workflow.LogicalName != LogicalNames.Workflow)
            {
                throw new WorkflowException($"Entity had logicalname '{LogicalNames.Workflow}' instead of workflow");
            }
            var parsed        = Parser.Parse(workflow.GetAttributeValue <string>("xaml"));
            var triggerFields = new HashSet <string>();

            if (workflow.GetAttributeValue <string>("triggeronupdateattributelist") != null)
            {
                foreach (var field in workflow.GetAttributeValue <string>("triggeronupdateattributelist").Split(','))
                {
                    triggerFields.Add(field);
                }
            }

            var arguments = parsed.Members.Properties.Where(p => p.Attributes != null).Select(p => ConvertToArgument(p));
            var input     = arguments.Where(a => a.Direction == WorkflowArgument.DirectionType.Input && !a.IsTarget).ToList();
            var output    = arguments.Where(a => a.Direction == WorkflowArgument.DirectionType.Output && !a.IsTarget).ToList();

            return(new WorkflowTree(CompressTree(parsed.Workflow, parseAs),
                                    workflow.GetAttributeValue <bool?>("triggeroncreate"), workflow.GetAttributeValue <bool?>("triggerondelete"),
                                    triggerFields, workflow.GetOptionSetValue <workflow_runas>("runas"), workflow.GetOptionSetValue <Workflow_Scope>("scope"),
                                    workflow.GetOptionSetValue <workflow_stage>("createstage"), workflow.GetOptionSetValue <workflow_stage>("updatestage"),
                                    workflow.GetOptionSetValue <workflow_stage>("deletestage"), workflow.GetOptionSetValue <Workflow_Mode>("mode"),
                                    workflow.GetAttributeValue <EntityReference>("ownerid").Id, workflow.GetAttributeValue <string>("primaryentity"), codeActivites,
                                    input, output));
        }