Exemplo n.º 1
0
        public void DetectAndFixMapCollisions(System.Management.Automation.PSCmdlet cmdlet, MappingToolDatabaseDataContext mapDatabaseContext, IEnumerable <Guid> rootMapIds, bool fillRootMapId, bool fixCollisions)
        {
            foreach (Guid rootMapId in rootMapIds)
            {
                if (Consumer.Nodes.ContainsKey(rootMapId))
                {
                    QueryMapNode rootMap = Consumer.Nodes[rootMapId];

                    var dbNodes = from qNode in mapDatabaseContext.Nodes
                                  where qNode.NodeUid == rootMap.NodeUid
                                  select qNode;

                    HashSet <Guid>       convertedNodes = new HashSet <Guid>();
                    List <CollisionInfo> collisions     = new List <CollisionInfo>();

                    if (dbNodes != null && dbNodes.Count() > 0)
                    {
                        var dbNode = dbNodes.First();

                        if (fillRootMapId)
                        {
                            dbNode.RootMapUid = rootMap.NodeUid;
                            mapDatabaseContext.SubmitChanges();
                        }

                        convertedNodes.Add(dbNode.NodeUid);
                    }

                    IEnumerable <QueryMapRelationship> relationships = Consumer.GetRelationships(rootMap, MapContainerRelationship);

                    foreach (QueryMapRelationship relationship in relationships)
                    {
                        IEnumerable <QueryMapNode> nodes = Consumer.GetNodes(relationship, rootMap);

                        foreach (QueryMapNode node in nodes)
                        {
                            if (!convertedNodes.Contains(node.NodeUid))
                            {
                                RecurseNodes(cmdlet, mapDatabaseContext, rootMap, node, convertedNodes, collisions, fillRootMapId);
                            }
                        }
                    }

                    if (fixCollisions)
                    {
                        FixCollisions(cmdlet, mapDatabaseContext, collisions);
                    }
                }
            }
        }
        public static string GetPath(this System.Management.Automation.PSCmdlet cmdlet, string path)
        {
            string absolutePath;

            if (System.IO.Path.IsPathRooted(path))
            {
                absolutePath = path;
            }
            else
            {
                string currentDirectory = cmdlet.CurrentProviderLocation("FileSystem").ProviderPath;
                absolutePath = System.IO.Path.GetFullPath(System.IO.Path.Combine(currentDirectory, path));
            }
            return(absolutePath);
        }
Exemplo n.º 3
0
        private void RecurseNodes(System.Management.Automation.PSCmdlet cmdlet, MappingToolDatabaseDataContext mapDatabaseContext, QueryMapNode rootMap, QueryMapNode node, HashSet <Guid> convertedNodes, List <CollisionInfo> collisions, bool fillRootMapId)
        {
            var dbNodes = from qNode in mapDatabaseContext.Nodes
                          where qNode.NodeUid == node.NodeUid
                          select qNode;

            if (dbNodes != null && dbNodes.Count() > 0)
            {
                var dbNode = dbNodes.First();

                convertedNodes.Add(dbNode.NodeUid);

                if (dbNode.RootMapUid != null && dbNode.RootMapUid != rootMap.NodeUid)
                {
                    CollisionInfo collisionInfo = new CollisionInfo();
                    collisionInfo.CollisionPoint   = node;
                    collisionInfo.CurrentRootMap   = dbNode.RootMapUid.Value;
                    collisionInfo.CollidingRootMap = rootMap;

                    collisions.Add(collisionInfo);
                    cmdlet.WriteWarning("Collision detected.");
                }
                else if (dbNode.RootMapUid == null && fillRootMapId)
                {
                    dbNode.RootMapUid = rootMap.NodeUid;
                    mapDatabaseContext.SubmitChanges();
                }
            }

            IEnumerable <QueryMapRelationship> relationships = Consumer.GetRelationships(node, MapContainerRelationship);

            foreach (QueryMapRelationship relationship in relationships)
            {
                IEnumerable <QueryMapNode> children = Consumer.GetNodes(relationship, node);

                foreach (QueryMapNode childNode in children)
                {
                    if (!convertedNodes.Contains(childNode.NodeUid))
                    {
                        RecurseNodes(cmdlet, mapDatabaseContext, rootMap, childNode, convertedNodes, collisions, fillRootMapId);
                    }
                }
            }
        }
Exemplo n.º 4
0
 public void DetectAndFixMapCollisions(System.Management.Automation.PSCmdlet cmdlet, MappingToolDatabaseDataContext mapDatabaseContext, IEnumerable <Guid> rootMapIds)
 {
     DetectAndFixMapCollisions(cmdlet, mapDatabaseContext, rootMapIds, true, true);
 }
Exemplo n.º 5
0
        private void FixCollisions(System.Management.Automation.PSCmdlet cmdlet, MappingToolDatabaseDataContext mapDatabaseContext, List <CollisionInfo> collisions)
        {
            List <QueryMapRelationship> relationshipsToReconnect = new List <QueryMapRelationship>();

            foreach (CollisionInfo collision in collisions)
            {
                cmdlet.WriteWarning("Fixing collision.");
                IEnumerable <QueryMapRelationship> relationships = Consumer.GetRelationships(collision.CollisionPoint);

                foreach (QueryMapRelationship relationship in relationships)
                {
                    IEnumerable <QueryMapNode> nodes = Consumer.GetNodes(relationship, collision.CollisionPoint);

                    foreach (QueryMapNode node in nodes)
                    {
                        var rootMapIds = from qNode in mapDatabaseContext.Nodes
                                         where qNode.NodeUid == node.NodeUid
                                         select qNode.RootMapUid;

                        Guid?rootMapId = rootMapIds.FirstOrDefault();

                        if (rootMapId != null && rootMapId == collision.CollidingRootMap.NodeUid)
                        {
                            relationshipsToReconnect.Add(relationship);
                        }
                    }
                }

                DateTime currentTimestamp = DateTime.Now;

                Node copiedNode = new Node();
                copiedNode.NodeUid        = Guid.NewGuid();
                copiedNode.DomainUid      = collision.CollisionPoint.DomainUid;
                copiedNode.RootMapUid     = collision.CollidingRootMap.NodeUid;
                copiedNode.NodeTypeUid    = collision.CollisionPoint.NodeTypeUid;
                copiedNode.NodeOriginalId = collision.CollisionPoint.NodeOriginalId;
                copiedNode.Created        = currentTimestamp;
                copiedNode.Modified       = currentTimestamp;

                mapDatabaseContext.Nodes.InsertOnSubmit(copiedNode);
                mapDatabaseContext.SubmitChanges();

                var originalMetadata = from qMetadata in Consumer.Metadata
                                       where qMetadata.NodeUid == collision.CollisionPoint.NodeUid
                                       select qMetadata;

                foreach (var originalMetadatum in originalMetadata)
                {
                    Metadata copiedMetadata = new Metadata();
                    copiedMetadata.MetadataId        = Guid.NewGuid();
                    copiedMetadata.RootMapUid        = collision.CollidingRootMap.NodeUid;
                    copiedMetadata.DomainUid         = copiedNode.DomainUid;
                    copiedMetadata.MetadataTypeUid   = originalMetadatum.MetadataTypeUid;
                    copiedMetadata.NodeUid           = copiedNode.NodeUid;
                    copiedMetadata.RelationshipUid   = originalMetadatum.RelationshipUid;
                    copiedMetadata.DescriptorTypeUid = originalMetadatum.DescriptorTypeUid;
                    copiedMetadata.MetadataName      = originalMetadatum.MetadataName;
                    copiedMetadata.MetadataValue     = originalMetadatum.MetadataValue;
                    copiedMetadata.Created           = currentTimestamp;
                    copiedMetadata.Modified          = currentTimestamp;

                    mapDatabaseContext.Metadatas.InsertOnSubmit(copiedMetadata);
                }

                mapDatabaseContext.SubmitChanges();

                foreach (QueryMapRelationship relationshipToReconnect in relationshipsToReconnect)
                {
                    var descriptors = from qDescriptor in mapDatabaseContext.Descriptors
                                      where qDescriptor.NodeUid == collision.CollisionPoint.NodeUid && qDescriptor.RelationshipUid == relationshipToReconnect.RelationshipUid
                                      select qDescriptor;

                    if (descriptors != null && descriptors.Count() > 0)
                    {
                        foreach (Descriptor descriptor in descriptors)
                        {
                            descriptor.NodeUid = copiedNode.NodeUid;
                        }
                    }

                    mapDatabaseContext.SubmitChanges();
                }
            }
        }