Ejemplo n.º 1
0
        public void DeserializeVersionLinks(XElement parentNode, SerializationContext context)
        {
            foreach (XElement linkedItemsElement in parentNode.Elements(context.ExolutioNS + "LinkedItems"))
            {
                VersionedItemPivot pivot = new VersionedItemPivot();
                PivotList.Add(pivot);

                Dictionary <Version, Guid> linkedItemsIds = new Dictionary <Version, Guid>();
                foreach (XElement linkedItemElement in linkedItemsElement.Elements(context.ExolutioNS + "LinkedItem"))
                {
                    Guid    id        = SerializationContext.DecodeGuid(linkedItemElement.Attribute("itemID").Value);
                    Guid    versionId = SerializationContext.DecodeGuid(linkedItemElement.Attribute("versionNumber").Value);
                    Version version   = (Version)Project.TranslateComponent(versionId);
                    linkedItemsIds[version] = id;
                }

                if (linkedItemsIds.Count > 0)
                {
                    foreach (KeyValuePair <Version, Guid> kvp in linkedItemsIds)
                    {
                        IVersionedItem exolutioObject = (IVersionedItem)Project.TranslateComponent(kvp.Value);
                        pivotLookupDictionary[exolutioObject.ID] = pivot;
                        pivot.PivotMapping.Add(kvp.Key, exolutioObject.ID);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        public IVersionedItem GetItemInVersion(IVersionedItem item, Version version)
        {
            VersionedItemPivot pivot = PivotLookupDictionary[item.ID];
            Guid result;

            if (pivot.PivotMapping.TryGetValue(version, out result))
            {
                return((IVersionedItem)Project.TranslateComponent(result));
            }
            else
            {
                return(null);
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Adds new item to versioning infrastracture (item must not be linked to any other existing item).
        /// </summary>
        public void AddVersionedItem(IVersionedItem item, bool addWhenBranchingOrLoading = false)
        {
            if ((!Loading && !branching) || addWhenBranchingOrLoading)
            {
                if (pivotLookupDictionary.ContainsKey(item.ID))
                {
                    throw new ExolutioModelException("Item already added into versioning infrastracture. ");
                }

                VersionedItemPivot pivot = new VersionedItemPivot();
                PivotList.Add(pivot);
                pivotLookupDictionary[item.ID] = pivot;
                pivot.PivotMapping.Add(item.Version, item.ID);
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Removes item from versioning infrastructure
        /// </summary>
        public void RemoveVersionedItem(IVersionedItem removedItem)
        {
            if (!PivotLookupDictionary.ContainsKey(removedItem.ID) && branching)
            {
                return;
            }

            VersionedItemPivot pivot          = PivotLookupDictionary[removedItem.ID];
            Version            deletedVersion = removedItem.Version;

            // versioned item is going to be removed, thus it is removed from pivot lookup
            pivotLookupDictionary.Remove(removedItem.ID);
            pivot.PivotMapping.Remove(removedItem.Version.ID);

            if (pivot.PivotMapping.IsEmpty())
            {
                PivotList.Remove(pivot);
            }
        }
Ejemplo n.º 5
0
        public void VerifyConsistency()
        {
            foreach (KeyValuePair <Guid, VersionedItemPivot> kvp in PivotLookupDictionary)
            {
                VersionedItemPivot pivot         = kvp.Value;
                IVersionedItem     versionedItem = (IVersionedItem)Project.TranslateComponent(kvp.Key);

                Debug.Assert(pivot.PivotMapping.ContainsKey(versionedItem.Version));
                Debug.Assert(pivot.PivotMapping[versionedItem.Version.ID] == versionedItem.ID);
            }

            foreach (VersionedItemPivot pivot in PivotList)
            {
                foreach (KeyValuePair <Guid, Guid> itemID in pivot.PivotMapping)
                {
                    Version        version    = Project.TranslateComponent <Version>(itemID.Key);
                    IVersionedItem linkedItem = (IVersionedItem)Project.TranslateComponent(itemID.Value);
                    Debug.Assert(PivotLookupDictionary[linkedItem.ID] == pivot);
                }
            }
        }
Ejemplo n.º 6
0
        public void UnregisterVersionLink(IVersionedItem item1, IVersionedItem item2, IEnumerable <IVersionedItem> group1 = null, IEnumerable <IVersionedItem> group2 = null)
        {
            if (!AreItemsLinked(item1, item2))
            {
                throw new ExolutioModelException();
            }

            VersionedItemPivot pivot;

            if (!pivotLookupDictionary.TryGetValue(item1.ID, out pivot))
            {
                throw new ExolutioModelException();
            }

            if (group1 == null && group2 == null)
            {
                group1 = new List <IVersionedItem>(pivot.PivotMapping.Where(kvp => kvp.Key != item2.Version.ID).
                                                   Select(kvp => (IVersionedItem)Project.TranslateComponent(kvp.Value)));
                group2 = new IVersionedItem[] { item2 };
            }

            if (group1 == null)
            {
                group1 = new List <IVersionedItem>(pivot.PivotMapping.Where(kvp => !group2.Contains((IVersionedItem)Project.TranslateComponent(kvp.Value))).
                                                   Select(kvp => (IVersionedItem)Project.TranslateComponent(kvp.Value)));
            }
            if (group2 == null)
            {
                group2 = new List <IVersionedItem>(pivot.PivotMapping.Where(kvp => !group1.Contains((IVersionedItem)Project.TranslateComponent(kvp.Value))).
                                                   Select(kvp => (IVersionedItem)Project.TranslateComponent(kvp.Value)));
            }

            {
                VersionedItemPivot pivot1 = new VersionedItemPivot();
                PivotList.Add(pivot1);
                foreach (IVersionedItem versionedItem in group1)
                {
                    pivot1.PivotMapping[versionedItem.Version.ID] = versionedItem.ID;
                    pivotLookupDictionary[versionedItem.ID]       = pivot1;
                }
            }

            {
                VersionedItemPivot pivot2 = new VersionedItemPivot();
                PivotList.Add(pivot2);
                foreach (IVersionedItem versionedItem in group2)
                {
                    pivot2.PivotMapping[versionedItem.Version.ID] = versionedItem.ID;
                    pivotLookupDictionary[versionedItem.ID]       = pivot2;
                }
            }

            foreach (KeyValuePair <Guid, Guid> keyValuePair in pivot.PivotMapping)
            {
                IVersionedItem item = (IVersionedItem)Project.TranslateComponent(keyValuePair.Value);
                if (!group1.Contains(item) && !group2.Contains(item))
                {
                    throw new ExolutioModelException();
                }
            }

            PivotList.Remove(pivot);

#if DEBUG
            VerifyConsistency();
#endif
        }
Ejemplo n.º 7
0
        public void RegisterVersionLink(Version version1, Version version2, IVersionedItem itemVersion1, IVersionedItem itemVersion2)
        {
            if (version1 != itemVersion1.Version)
            {
                throw new ExolutioModelException(Exceptions.VersionManager_RegisterVersionLink_itemOldVersion_Version_must_point_to_the_same_object_as_oldVersion);
            }

            if (itemVersion1.GetType() != itemVersion2.GetType())
            {
                throw new ExolutioModelException();
            }

            VersionedItemPivot pivot1;
            VersionedItemPivot pivot2;

            VersionedItemPivot pivot;

            pivotLookupDictionary.TryGetValue(itemVersion1.ID, out pivot1);
            pivotLookupDictionary.TryGetValue(itemVersion2.ID, out pivot2);

            if (pivot1 == null && pivot2 == null) // new pivot is created
            {
                AddVersionedItem(itemVersion1, true);
                pivot = pivotLookupDictionary[itemVersion1.ID];
                pivotLookupDictionary[itemVersion2.ID] = pivot;
                pivot.PivotMapping[version2]           = itemVersion2.ID;
            }
            else if (pivot1 == null) //existing pivot is used
            {
                pivot = pivot2;
                pivotLookupDictionary[itemVersion1.ID] = pivot;
                pivot.PivotMapping[version1]           = itemVersion1.ID;
            }
            else if (pivot2 == null) //existing pivot is used
            {
                pivot = pivot1;
                pivotLookupDictionary[itemVersion2.ID] = pivot;
                pivot.PivotMapping[version2]           = itemVersion2.ID;
            }
            else // in this case the two existing pivots are merged
            {
                pivot = new VersionedItemPivot();
                PivotList.Add(pivot);
                PivotList.Remove(pivot1);
                PivotList.Remove(pivot2);
                foreach (KeyValuePair <Guid, Guid> keyValuePair in pivot1.PivotMapping)
                {
                    Guid versionGuid = keyValuePair.Key;
                    Guid itemGuid    = keyValuePair.Value;
                    pivotLookupDictionary[itemGuid] = pivot;
                    pivot.PivotMapping[versionGuid] = itemGuid;
                }
                foreach (KeyValuePair <Guid, Guid> keyValuePair in pivot2.PivotMapping)
                {
                    Guid versionGuid = keyValuePair.Key;
                    Guid itemGuid    = keyValuePair.Value;
                    pivotLookupDictionary[itemGuid] = pivot;
                    pivot.PivotMapping[versionGuid] = itemGuid;
                }
            }
#if DEBUG
            VerifyConsistency();
#endif
        }
Ejemplo n.º 8
0
        public IEnumerable <IVersionedItem> GetAllVersionsOfItem(IVersionedItem item)
        {
            VersionedItemPivot pivot = PivotLookupDictionary[item.ID];

            return(pivot.PivotMapping.Values.Select(ID => (IVersionedItem)Project.TranslateComponent(ID)));
        }