Beispiel #1
0
        // Id in IeProjects and GroupProjectId for groups in IeUserGroup should be filled in.
        public WorkflowDiffResult DiffWorkflows(IeWorkflow workflow, IeWorkflow currentWorkflow)
        {
            var result = new WorkflowDiffResult();

            if (workflow == null)
            {
                throw new ArgumentNullException(nameof(workflow));
            }
            if (currentWorkflow == null)
            {
                throw new ArgumentNullException(nameof(currentWorkflow));
            }

            result.IsWorkflowPropertiesChanged = IsWorkflowPropertiesChanged(workflow, currentWorkflow);

            DiffWorkflowEntities(workflow.States, currentWorkflow.States, result.AddedStates,
                                 result.DeletedStates, result.ChangedStates, result.NotFoundStates, result.UnchangedStates);

            var events        = workflow.TransitionEvents?.Select(e => e as IeEvent).ToList();
            var currentEvents = currentWorkflow.TransitionEvents?.Select(e => e as IeEvent).ToList();

            DiffWorkflowEntities(events, currentEvents, result.AddedEvents,
                                 result.DeletedEvents, result.ChangedEvents, result.NotFoundEvents, result.UnchangedEvents);

            events        = workflow.PropertyChangeEvents?.Select(te => te as IeEvent).ToList();
            currentEvents = currentWorkflow.PropertyChangeEvents?.Select(te => te as IeEvent).ToList();
            DiffWorkflowEntities(events, currentEvents, result.AddedEvents,
                                 result.DeletedEvents, result.ChangedEvents, result.NotFoundEvents, result.UnchangedEvents);

            events        = workflow.NewArtifactEvents?.Select(te => te as IeEvent).ToList();
            currentEvents = currentWorkflow.NewArtifactEvents?.Select(te => te as IeEvent).ToList();
            DiffWorkflowEntities(events, currentEvents, result.AddedEvents,
                                 result.DeletedEvents, result.ChangedEvents, result.NotFoundEvents, result.UnchangedEvents);

            DiffProjectArtifactTypes(workflow.Projects, currentWorkflow.Projects, result);
            return(result);
        }
Beispiel #2
0
        private static void DiffProjectArtifactTypes(List <IeProject> projects, List <IeProject> currentProjects, WorkflowDiffResult result)
        {
            var pAtIds = new HashSet <Tuple <int, int> >();

            projects?.Where(p => p.Id.HasValue).ForEach(p =>
            {
                p.ArtifactTypes?.Where(at => at.Id.HasValue)
                .ForEach(at => pAtIds.Add(Tuple.Create(p.Id.Value, at.Id.Value)));
            });
            var cpAtIds = new HashSet <Tuple <int, int> >();

            currentProjects?.Where(p => p.Id.HasValue).ForEach(p =>
            {
                p.ArtifactTypes?.Where(at => at.Id.HasValue)
                .ForEach(at => cpAtIds.Add(Tuple.Create(p.Id.Value, at.Id.Value)));
            });

            // Tuple - item1 is project id, item2 is artifact type id.
            var notSpecifiedAtIds = new HashSet <Tuple <int, int> >();

            projects?.Where(p => p.Id.HasValue).ForEach(p => p.ArtifactTypes?.ForEach(at =>
            {
                // I this case the workflow data validator logs an error.
                if (!at.Id.HasValue)
                {
                    return;
                }

                // A negative artifact type Id means Id is not specified in xml.
                var isSpecifiedInXml = at.Id.GetValueOrDefault() > 0;
                // Make Id positive
                if (!isSpecifiedInXml)
                {
                    at.Id *= -1;
                    notSpecifiedAtIds.Add(Tuple.Create(p.Id.Value, at.Id.Value));
                }

                var colToAddTo = cpAtIds.Contains(Tuple.Create(p.Id.Value, at.Id.Value))
                    ? result.UnchangedProjectArtifactTypes
                    : (isSpecifiedInXml
                        ? result.NotFoundProjectArtifactTypes
                        : result.AddedProjectArtifactTypes);

                colToAddTo.Add(new KeyValuePair <int, IeArtifactType>(p.Id.Value, at));
            }));

            currentProjects?.Where(p => p.Id.HasValue).ForEach(p => p.ArtifactTypes?
                                                               .Where(at => at.Id.HasValue &&
                                                                      !notSpecifiedAtIds.Contains(Tuple.Create(p.Id.Value, at.Id.Value)) &&
                                                                      !pAtIds.Contains(Tuple.Create(p.Id.Value, at.Id.Value)))
                                                               .ForEach(at => result.DeletedProjectArtifactTypes.Add(new KeyValuePair <int, IeArtifactType>(p.Id.Value, at))));
        }