public void Serialize_WithClusters_IsDeserializable()
        {
            var spec = new SystemPackaging();

            var package = new Package {
                Name = "P1"
            };
            var cluster1 = new Cluster {
                Name = "C1", Id = "42"
            };

            cluster1.Patterns.Add(new Include {
                Pattern = "*tests*"
            });
            package.Clusters.Add(cluster1);

            spec.Packages.Add(package);

            var newSpec = SpecUtils.Deserialize(SpecUtils.Serialize(spec));

            Assert.That(newSpec.Packages.Count, Is.EqualTo(1));
            Assert.That(newSpec.Packages.Single().Clusters.Count, Is.EqualTo(1));
            Assert.That(newSpec.Packages.Single().Clusters.Single().Includes.Count(), Is.EqualTo(1));
            Assert.That(newSpec.Packages.Single().Clusters.Single().Includes.Single().Pattern, Is.EqualTo("*tests*"));
        }
        private void UpdateSpec(SystemPackaging spec)
        {
            HandleNodeToClusterAssignment(spec);

            HandleRemovedClusters(spec);

            var transformationModule = myPresentation.GetModule <ITransformationModule>();

            HandleClusterRenames(spec, transformationModule.Graph.Clusters);
        }
        public static string Serialize(SystemPackaging spec)
        {
            using (var writer = new StringWriter())
            {
                var settings = new XmlWriterSettings();
                settings.Indent          = true;
                settings.IndentChars     = "    ";
                settings.NewLineChars    = Environment.NewLine;
                settings.NewLineHandling = NewLineHandling.Replace;
                settings.Encoding        = Encoding.UTF8;

                using (var xmlWriter = XmlWriter.Create(writer, settings))
                {
                    XamlWriter.Save(spec, xmlWriter);
                    return(writer.ToString());
                }
            }
        }
        private void HandleClusterRenames(SystemPackaging spec, IEnumerable <Model.Cluster> potentiallyRenamedClusters)
        {
            var specClusters = spec.Packages
                               .SelectMany(p => p.Clusters)
                               .ToList();

            var captions = myPresentation.GetModule <ICaptionModule>();

            foreach (var cluster in potentiallyRenamedClusters)
            {
                var specCluster = specClusters.FirstOrDefault(c => c.Id == cluster.Id);
                if (specCluster == null)
                {
                    // this is a new cluster EMPTY not yet there in spec
                    // -> nothing to do - will be handled once nodes are added to this new cluster
                }
                else
                {
                    specCluster.Name = captions.Get(cluster.Id).DisplayText;
                }
            }
        }
        private void HandleRemovedClusters(SystemPackaging spec)
        {
            var transformationModule = myPresentation.GetModule <ITransformationModule>();
            var transformation       = transformationModule.Items.OfType <DynamicClusterTransformation>().Single();

            var removedExternalClusterIds = transformation.ClusterVisibility
                                            .Where(e => e.Value == false)
                                            .Select(e => e.Key);

            foreach (var clusterId in removedExternalClusterIds)
            {
                foreach (var package in spec.Packages)
                {
                    var cluster = package.Clusters.FirstOrDefault(c => c.Id == clusterId);
                    if (cluster != null)
                    {
                        package.Clusters.Remove(cluster);
                        break;
                    }
                }
            }
        }
        public AnalysisDocument Execute(SystemPackaging config, CancellationToken cancellationToken)
        {
            myConfig            = config;
            myCancellationToken = cancellationToken;

            myRelevantPackages = PackagesToAnalyze.Any()
                ? myConfig.Packages
                                 .Where(p => PackagesToAnalyze.Any(name => p.Name.Equals(name, StringComparison.OrdinalIgnoreCase)))
                                 .ToList()
                : myConfig.Packages;

            myPackageToTypesMap = new Dictionary <string, List <Type> >();

            Load();

            Console.WriteLine("Analyzing ...");

            var edges = Analyze()
                        .Distinct()
                        .ToList();

            Console.WriteLine();

            if (myAssemblyLoader.SkippedAssemblies.Any())
            {
                Console.WriteLine("Skipped assemblies:");
                foreach (var asm in myAssemblyLoader.SkippedAssemblies)
                {
                    Console.WriteLine("  {0}", asm);
                }
                Console.WriteLine();
            }

            Console.WriteLine("Building Graph ...");

            return(GenerateDocument(edges));
        }
        // this will also handle new clusters (but only if they have notes)
        private void HandleNodeToClusterAssignment(SystemPackaging spec)
        {
            var transformationModule = myPresentation.GetModule <ITransformationModule>();
            var transformation       = transformationModule.Items.OfType <DynamicClusterTransformation>().Single();
            var captions             = myPresentation.GetModule <ICaptionModule>();

            var clusters = spec.Packages
                           .SelectMany(p => p.Clusters)
                           .ToList();

            foreach (var entry in transformation.NodeToClusterMapping)
            {
                var clustersMatchingNode = clusters
                                           .Where(c => c.Matches(entry.Key))
                                           .ToList();

                // remove from all (potentially old) clusters
                var clustersToRemoveFrom = clustersMatchingNode
                                           .Where(c => entry.Value == null || c.Id != entry.Value);
                foreach (var cluster in clustersToRemoveFrom)
                {
                    var exactMatch = cluster.Includes.FirstOrDefault(p => p.Pattern == entry.Key);
                    if (exactMatch != null)
                    {
                        cluster.Patterns.Remove(exactMatch);
                    }
                    else
                    {
                        cluster.Patterns.Add(new Exclude {
                            Pattern = entry.Key
                        });
                    }
                }

                if (entry.Value == null)
                {
                    continue;
                }

                // add to the cluster it should now belong to
                var clusterToAddTo = clusters
                                     .FirstOrDefault(c => c.Id == entry.Value);

                if (clusterToAddTo == null)
                {
                    // --> new cluster added in UI
                    clusterToAddTo = new Spec.Cluster {
                        Name = captions.Get(entry.Value).DisplayText, Id = entry.Value
                    };
                    clusters.Add(clusterToAddTo);
                    spec.Packages.First().Clusters.Add(clusterToAddTo);
                }

                if (clusterToAddTo.Matches(entry.Key))
                {
                    // node already or again matched
                    // -> ignore
                    continue;
                }
                else
                {
                    clusterToAddTo.Patterns.Add(new Include {
                        Pattern = entry.Key
                    });
                }
            }
        }