예제 #1
0
        /// <summary>
        /// Resolve references.
        /// </summary>
        /// <param name="beans">
        /// The beans.
        /// </param>
        /// <param name="numberLevelsDeep">
        /// The number levels deep.
        /// </param>
        /// <param name="retrievalManager">
        /// The retrieval manager.
        /// </param>
        /// <param name="missingReferences">
        /// The missing references.
        /// </param>
        /// <returns>
        /// The <see cref="MaintainableDictionary{IMaintainableMutableObject}"/>.
        /// </returns>
        private MaintainableDictionary <IMaintainableMutableObject> ResolveReferencesInternal(
            IMutableObjects beans, int numberLevelsDeep, Func <IStructureReference, IMaintainableMutableObject> retrievalManager, IDictionaryOfSets <IMaintainableMutableObject, IStructureReference> missingReferences)
        {
            var returnMap  = new MaintainableDictionary <IMaintainableMutableObject>();
            var outerLevel = new Queue <IMaintainableMutableObject>();

            foreach (IMaintainableMutableObject artefact in beans.AllMaintainables)
            {
                outerLevel.Enqueue(artefact);
            }

            int count = 0;

            do
            {
                var innerLevel = new Queue <IMaintainableMutableObject>();
                while (outerLevel.Count > 0)
                {
                    IMaintainableMutableObject parent = outerLevel.Dequeue();
                    var structureReferences           = GetChildStructureReferences(retrievalManager, parent);

                    foreach (IStructureReference structureReference in structureReferences)
                    {
                        if (structureReference == null)
                        {
                            string message = string.Format(CultureInfo.InvariantCulture, "Null reference for parent artefact : {0}+{1}+{2}", parent.AgencyId, parent.Id, parent.Version);
                            _log.Error(message);
                            throw new MappingStoreException(message);
                        }

                        if (this._structureTypeSet.HasStructure(structureReference.MaintainableStructureEnumType))
                        {
                            IMaintainableMutableObject resolved = this.GetMutableObject(retrievalManager, structureReference);

                            if (resolved != null)
                            {
                                returnMap.AddToSet(parent, resolved);
                                if (numberLevelsDeep == 0 || numberLevelsDeep > count)
                                {
                                    innerLevel.Enqueue(resolved);
                                }
                            }
                            else if (missingReferences != null)
                            {
                                missingReferences.AddToSet(parent, structureReference);
                            }
                        }
                    }
                }

                count++;
                outerLevel = innerLevel;
            }while (count < numberLevelsDeep);

            return(returnMap);
        }
        /// <summary>
        /// Resolve references.
        /// </summary>
        /// <param name="beans">
        /// The beans.
        /// </param>
        /// <param name="numberLevelsDeep">
        /// The number levels deep.
        /// </param>
        /// <param name="retrievalManager">
        /// The retrieval manager.
        /// </param>
        /// <param name="missingReferences">
        /// The missing references.
        /// </param>
        /// <returns>
        /// The <see cref="MaintainableDictionary{IMaintainableMutableObject}"/>.
        /// </returns>
        private MaintainableDictionary<IMaintainableMutableObject> ResolveReferencesInternal(
            IMutableObjects beans, int numberLevelsDeep, Func<IStructureReference, IMaintainableMutableObject> retrievalManager, IDictionaryOfSets<IMaintainableMutableObject, IStructureReference> missingReferences)
        {
            var returnMap = new MaintainableDictionary<IMaintainableMutableObject>();
            var outerLevel = new Queue<IMaintainableMutableObject>();
            foreach (IMaintainableMutableObject artefact in beans.AllMaintainables)
            {
                outerLevel.Enqueue(artefact);
            }

            int count = 0;
            do
            {
                var innerLevel = new Queue<IMaintainableMutableObject>();
                while (outerLevel.Count > 0)
                {
                    IMaintainableMutableObject parent = outerLevel.Dequeue();
                    var structureReferences = GetChildStructureReferences(retrievalManager, parent);

                    foreach (IStructureReference structureReference in structureReferences)
                    {
                        if (structureReference == null)
                        {
                            string message = string.Format(CultureInfo.InvariantCulture, "Null reference for parent artefact : {0}+{1}+{2}", parent.AgencyId, parent.Id, parent.Version);
                            _log.Error(message);
                            throw new MappingStoreException(message);
                        }

                        if (this._structureTypeSet.HasStructure(structureReference.MaintainableStructureEnumType))
                        {
                            IMaintainableMutableObject resolved = this.GetMutableObject(retrievalManager, structureReference);

                            if (resolved != null)
                            {
                                returnMap.AddToSet(parent, resolved);
                                if (numberLevelsDeep == 0 || numberLevelsDeep > count)
                                {
                                    innerLevel.Enqueue(resolved);
                                }
                            }
                            else if (missingReferences != null)
                            {
                                missingReferences.AddToSet(parent, structureReference);
                            }
                        }
                    }
                }

                count++;
                outerLevel = innerLevel;
            }
            while (count < numberLevelsDeep);

            return returnMap;
        }