Example #1
0
        /// <summary>
        /// Validates the SDMX V20.
        /// </summary>
        /// <param name="dataQuery">
        /// The data query.
        /// </param>
        /// <param name="format">
        /// The format.
        /// </param>
        /// <exception cref="Org.Sdmxsource.Sdmx.Api.Exception.SdmxNoResultsException">
        /// This dataflow uses SDMX v2.0 only
        ///     DataStructureDefinition.
        /// </exception>
        private static void ValidateSdmxV20(IBaseDataQuery dataQuery, BaseConstantType <BaseDataFormatEnumType> format)
        {
            if (!dataQuery.DataStructure.IsCompatible(SdmxSchema.GetFromEnum(SdmxSchemaEnumType.VersionTwo)))
            {
                // TODO check java message/error in this case
                throw new SdmxNoResultsException("This dataflow uses SDMX v2.1 only DataStructureDefinition.");
            }

            switch (format.EnumType)
            {
            case BaseDataFormatEnumType.Null:
                break;

            case BaseDataFormatEnumType.Generic:
            case BaseDataFormatEnumType.Compact:
            case BaseDataFormatEnumType.Utility:
            case BaseDataFormatEnumType.Edi:
                ValidateSdmxV20TimeSeries(dataQuery);
                break;

            case BaseDataFormatEnumType.CrossSectional:
                ValidateErrors(Validator.ValidateForCrossSectional(dataQuery.DataStructure));
                break;

            default:
                throw new SdmxSemmanticException("SDMX v2.0 Unsupported format " + format);
            }
        }
        public static BaseConstantType getBaseType(SWIGTYPE_Ogre__GpuConstantType ctype)
        {
            BaseConstantType ret = (BaseConstantType)OgrePINVOKE.GpuConstantDefinition_getBaseType((int)ctype);

            if (OgrePINVOKE.SWIGPendingException.Pending)
            {
                throw OgrePINVOKE.SWIGPendingException.Retrieve();
            }
            return(ret);
        }
        /// <summary>
        /// Validates the SDMX V20.
        /// </summary>
        /// <param name="dataQuery">
        /// The data query.
        /// </param>
        /// <param name="format">
        /// The format.
        /// </param>
        /// <exception cref="Org.Sdmxsource.Sdmx.Api.Exception.SdmxNoResultsException">
        /// This dataflow uses SDMX v2.0 only
        ///     DataStructureDefinition.
        /// </exception>
        private static void ValidateSdmxV20(IBaseDataQuery dataQuery, BaseConstantType<BaseDataFormatEnumType> format)
        {
            if (!dataQuery.DataStructure.IsCompatible(SdmxSchema.GetFromEnum(SdmxSchemaEnumType.VersionTwo)))
            {
                // TODO check java message/error in this case
                throw new SdmxNoResultsException("This dataflow uses SDMX v2.1 only DataStructureDefinition.");
            }

            switch (format.EnumType)
            {
                case BaseDataFormatEnumType.Null:
                    break;
                case BaseDataFormatEnumType.Generic:
                case BaseDataFormatEnumType.Compact:
                case BaseDataFormatEnumType.Utility:
                case BaseDataFormatEnumType.Edi:
                    ValidateSdmxV20TimeSeries(dataQuery);
                    break;
                case BaseDataFormatEnumType.CrossSectional:
                    ValidateErrors(Validator.ValidateForCrossSectional(dataQuery.DataStructure));
                    break;
                default:
                    throw new SdmxSemmanticException("SDMX v2.0 Unsupported format " + format);
            }
        }
 /// <summary>
 /// Returns the <see cref="IStructureWriterEngine"/> engine.
 /// </summary>
 /// <param name="schemaVersion">
 /// The schema version.
 /// </param>
 /// <param name="stream">
 /// The stream.
 /// </param>
 /// <returns>
 /// The <see cref="IStructureWriterEngine"/>.
 /// </returns>
 /// <exception cref="SdmxNotImplementedException">
 /// The specified value at <paramref name="schemaVersion"/> is not supported
 /// </exception>
 private IStructureWriterEngine GetObjectEngine(BaseConstantType<SdmxSchemaEnumType> schemaVersion, Stream stream)
 {
     switch (schemaVersion.EnumType)
     {
         case SdmxSchemaEnumType.VersionOne:
             return this._writer != null ? new StructureWriterEngineV1(this._writer) : new StructureWriterEngineV1(stream);
         case SdmxSchemaEnumType.VersionTwo:
             return this._writer != null ? new StructureWriterV2(this._writer) : new StructureWriterV2(stream);
         case SdmxSchemaEnumType.Edi:
             return new StructureWriterEngineEdi(stream);
         case SdmxSchemaEnumType.VersionTwoPointOne:
             return this._writer != null ? new StructureWriterEngineV21(this._writer) : new StructureWriterEngineV21(stream);
         default:
             throw new SdmxNotImplementedException(ExceptionCode.Unsupported, schemaVersion + " - StructureWritingManagerImpl.writeStructure");
     }
 }
        /// <summary>
        /// The validate parents and siblings.
        /// </summary>
        /// <param name="mutableObject">
        /// The mutable object.
        /// </param>
        /// <param name="structureType">
        /// The structure type.
        /// </param>
        /// <param name="stubs">
        /// The stubs.
        /// </param>
        private static void ValidateParentsAndSiblings(IMutableObjects mutableObject, BaseConstantType<SdmxStructureEnumType> structureType, bool stubs)
        {
            switch (structureType.EnumType)
            {
                case SdmxStructureEnumType.Categorisation:
                    break;
                case SdmxStructureEnumType.CategoryScheme:
                    {
                        if (!stubs)
                        {
                            Assert.IsNotEmpty(mutableObject.Categorisations);
                            Assert.IsNotEmpty(mutableObject.Dataflows);
                            Assert.IsNotEmpty(mutableObject.CategorySchemes);
                            var referencedByParent =
                                (from m in mutableObject.Categorisations select new StructureReferenceImpl(m.CategoryReference.MaintainableReference, m.CategoryReference.MaintainableStructureEnumType))
                                    .Distinct().ToArray();
                            var got = from o in mutableObject.CategorySchemes select _fromMutable.Build(o);
                            if (referencedByParent.Length > 0)
                            {
                                CollectionAssert.IsSubsetOf(referencedByParent, got);
                            }
                        }
                    }

                    break;
                case SdmxStructureEnumType.CodeList:
                    {
                        if (!mutableObject.Codelists.All(o => "MA".Equals(o.AgencyId)))
                        {
                            Assert.IsNotEmpty(mutableObject.Codelists);
                            Assert.IsTrue(mutableObject.DataStructures.Count + mutableObject.HierarchicalCodelists.Count > 0, _fromMutable.Build(mutableObject.Codelists.First()).ToString());
                            if (mutableObject.DataStructures.Count > 0)
                            {
                                Assert.IsNotEmpty(mutableObject.ConceptSchemes);
                            }
                        }

                        if (!stubs)
                        {
                            var referencedByParent = GetComponentReferences(mutableObject, structureType);
                            var got = (from o in mutableObject.Codelists select _fromMutable.Build(o)).Distinct<IStructureReference>().ToArray();

                            CollectionAssert.IsSubsetOf(referencedByParent, got);

                            var hclReferences =
                                (from m in mutableObject.HierarchicalCodelists from codelistRefMutableObject in m.CodelistRef select codelistRefMutableObject.CodelistReference).Distinct().ToArray();

                            CollectionAssert.IsSubsetOf(hclReferences, got);
                        }
                    }

                    break;
                case SdmxStructureEnumType.ConceptScheme:
                    {
                        Assert.IsNotEmpty(mutableObject.ConceptSchemes);
                        Assert.IsNotEmpty(mutableObject.Codelists);
                        Assert.IsNotEmpty(mutableObject.DataStructures);
                        if (!stubs)
                        {
                            var referencedByParent = GetComponentReferences(mutableObject, structureType);
                            var got = from o in mutableObject.ConceptSchemes select _fromMutable.Build(o);

                            CollectionAssert.IsSubsetOf(referencedByParent, got);
                        }
                    }

                    break;
                case SdmxStructureEnumType.Dataflow:
                    {
                        Assert.IsNotEmpty(mutableObject.Categorisations);
                        Assert.IsNotEmpty(mutableObject.Dataflows);
                        Assert.IsNotEmpty(mutableObject.CategorySchemes);
                        if (!stubs)
                        {
                            var referencedByParent = (from m in mutableObject.Categorisations select m.StructureReference).Distinct().ToArray();
                            var got = (from o in mutableObject.Dataflows select _fromMutable.Build(o)).Distinct<IStructureReference>().ToArray();

                            if (referencedByParent.Length > 0)
                            {
                                CollectionAssert.IsSubsetOf(referencedByParent, got);
                            }
                        }
                    }

                    break;
                case SdmxStructureEnumType.Dsd:
                    {
                        Assert.IsNotEmpty(mutableObject.Dataflows);
                        Assert.IsNotEmpty(mutableObject.DataStructures);
                        if (!stubs)
                        {
                            var referencedByParent = (from m in mutableObject.Dataflows select m.DataStructureRef).Distinct().ToArray();
                            var got = from o in mutableObject.DataStructures select _fromMutable.Build(o);

                            CollectionAssert.IsSubsetOf(referencedByParent, got);
                        }
                    }

                    break;
                case SdmxStructureEnumType.HierarchicalCodelist:
                    break;
            }
        }
        /// <summary>
        /// Validates the descendants.
        /// </summary>
        /// <param name="mutableObject">
        /// The mutable object.
        /// </param>
        /// <param name="structureType">
        /// Type of the structure.
        /// </param>
        /// <param name="stubs">
        /// if set to <c>true</c> [stubs].
        /// </param>
        private static void ValidateDescendants(IMutableObjects mutableObject, BaseConstantType<SdmxStructureEnumType> structureType, bool stubs)
        {
            switch (structureType.EnumType)
            {
                case SdmxStructureEnumType.Categorisation:
                    if (!stubs)
                    {
                        Assert.IsNotEmpty(mutableObject.Dataflows);
                        Assert.IsNotEmpty(mutableObject.CategorySchemes);
                        Assert.IsNotEmpty(mutableObject.DataStructures);
                        Assert.IsNotEmpty(mutableObject.Codelists);
                        Assert.IsNotEmpty(mutableObject.ConceptSchemes);
                    }

                    break;
                case SdmxStructureEnumType.CategoryScheme:
                    break;
                case SdmxStructureEnumType.CodeList:
                    break;
                case SdmxStructureEnumType.ConceptScheme:
                    break;
                case SdmxStructureEnumType.Dataflow:
                    {
                        Assert.IsNotEmpty(mutableObject.Dataflows);
                        Assert.IsNotEmpty(mutableObject.DataStructures);
                        Assert.IsNotEmpty(mutableObject.Codelists);
                        Assert.IsNotEmpty(mutableObject.ConceptSchemes);
                    }

                    break;
                case SdmxStructureEnumType.Dsd:
                    {
                        Assert.IsNotEmpty(mutableObject.DataStructures);
                        Assert.IsNotEmpty(mutableObject.Codelists);
                        Assert.IsNotEmpty(mutableObject.ConceptSchemes);
                    }

                    break;
                case SdmxStructureEnumType.HierarchicalCodelist:
                    Assert.IsNotEmpty(mutableObject.Codelists);
                    break;
            }
        }
        /// <summary>
        /// The validate children.
        /// </summary>
        /// <param name="mutableObject">The mutable object.</param>
        /// <param name="structureType">The structure type.</param>
        /// <param name="stubs">if set to <c>true</c> [stubs].</param>
        private static void ValidateChildren(IMutableObjects mutableObject, BaseConstantType<SdmxStructureEnumType> structureType, bool stubs)
        {
            switch (structureType.EnumType)
            {
                case SdmxStructureEnumType.Categorisation:

                    Assert.IsNotEmpty(mutableObject.Dataflows);
                    Assert.IsNotEmpty(mutableObject.CategorySchemes);
                    if (!stubs)
                    {
                        var categorySchemeRefs =
                            (from m in mutableObject.Categorisations select new StructureReferenceImpl(m.CategoryReference.MaintainableReference, m.CategoryReference.MaintainableStructureEnumType))
                                .Distinct().ToArray();
                        var got = from o in mutableObject.CategorySchemes select _fromMutable.Build(o);

                        CollectionAssert.AreEquivalent(categorySchemeRefs, got);
                    }

                    if (!stubs)
                    {
                        var dataflows = (from m in mutableObject.Categorisations select m.StructureReference).Distinct();
                        var got = from o in mutableObject.Dataflows select _fromMutable.Build(o);

                        CollectionAssert.AreEquivalent(dataflows, got);
                    }

                    break;
                case SdmxStructureEnumType.CategoryScheme:

                    break;
                case SdmxStructureEnumType.CodeList:

                    break;
                case SdmxStructureEnumType.ConceptScheme:

                    break;
                case SdmxStructureEnumType.Dataflow:
                    {
                        Assert.IsNotEmpty(mutableObject.DataStructures);
                        if (!stubs)
                        {
                            var dataflows = (from m in mutableObject.Dataflows select m.DataStructureRef).Distinct();
                            var got = from o in mutableObject.DataStructures select _fromMutable.Build(o);

                            CollectionAssert.AreEquivalent(dataflows, got);
                        }
                    }

                    break;
                case SdmxStructureEnumType.Dsd:
                    Assert.IsNotEmpty(mutableObject.ConceptSchemes);
                    Assert.IsNotEmpty(mutableObject.Codelists);
                    if (!stubs)
                    {
                        var sdmxStructureType = SdmxStructureType.GetFromEnum(SdmxStructureEnumType.ConceptScheme);
                        ValidateComponentReferences(mutableObject, sdmxStructureType);
                    }

                    if (!stubs)
                    {
                        var sdmxStructureType = SdmxStructureType.GetFromEnum(SdmxStructureEnumType.CodeList);
                        ValidateComponentReferences(mutableObject, sdmxStructureType);
                    }

                    break;
                case SdmxStructureEnumType.HierarchicalCodelist:
                    Assert.IsNotEmpty(mutableObject.Codelists);
                    if (!stubs)
                    {
                        var got = (from o in mutableObject.Codelists select _fromMutable.Build(o)).Distinct<IStructureReference>().ToArray();

                        var hclReferences =
                            (from m in mutableObject.HierarchicalCodelists from codelistRefMutableObject in m.CodelistRef select codelistRefMutableObject.CodelistReference).Distinct().ToArray();

                        CollectionAssert.IsSubsetOf(hclReferences, got);
                    }

                    break;
            }
        }
 /// <summary>
 /// Validates all.
 /// </summary>
 /// <param name="mutableObject">
 /// The mutable object.
 /// </param>
 /// <param name="structureType">
 /// Type of the structure.
 /// </param>
 /// <param name="stubs">
 /// if set to <c>true</c> [stubs].
 /// </param>
 private static void ValidateAll(IMutableObjects mutableObject, BaseConstantType<SdmxStructureEnumType> structureType, bool stubs)
 {
     ValidateParentsAndSiblings(mutableObject, structureType, stubs);
     ValidateDescendants(mutableObject, structureType, stubs);
 }
        /// <summary>
        /// Get component references.
        /// </summary>
        /// <param name="mutableObject">
        /// The mutable object.
        /// </param>
        /// <param name="structureType">
        /// The structure type.
        /// </param>
        /// <returns>
        /// The component reference
        /// </returns>
        private static IEnumerable<IStructureReference> GetComponentReferences(IMutableObjects mutableObject, BaseConstantType<SdmxStructureEnumType> structureType)
        {
            ISet<IStructureReference> structureReferences = new HashSet<IStructureReference>();
            foreach (var dsd in mutableObject.DataStructures)
            {
                structureReferences.UnionWith(_referenceSetBuilder.Build(dsd));
            }

            return
                (from m in structureReferences
                 where m.MaintainableStructureEnumType.EnumType == structureType.EnumType
                 select new StructureReferenceImpl(m.MaintainableReference, m.MaintainableStructureEnumType)).Distinct().ToArray();
        }
        /// <summary>
        /// Validates the specific.
        /// </summary>
        /// <param name="mutableObject">
        /// The mutable object.
        /// </param>
        /// <param name="structureType">
        /// Type of the structure.
        /// </param>
        /// <param name="stubs">
        /// if set to <c>true</c> [stubs].
        /// </param>
        /// <param name="specificStructureType">
        /// Type of the specific structure.
        /// </param>
        /// <param name="structureReference">
        /// The structure reference.
        /// </param>
        private static void ValidateSpecific(
            IMutableObjects mutableObject, 
            BaseConstantType<SdmxStructureEnumType> structureType, 
            bool stubs, 
            BaseConstantType<SdmxStructureEnumType> specificStructureType, 
            IStructureReference structureReference)
        {
            switch (structureType.EnumType)
            {
                case SdmxStructureEnumType.Categorisation:
                    switch (specificStructureType.EnumType)
                    {
                        case SdmxStructureEnumType.Categorisation:
                            break;
                        case SdmxStructureEnumType.CategoryScheme:
                            Assert.IsNotEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.CodeList:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.ConceptScheme:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.Dataflow:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.Dsd:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.HierarchicalCodelist:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                    }

                    break;
                case SdmxStructureEnumType.CategoryScheme:

                    // if we have stubs then no categorisations can be retrieved. 
                    // as a result we cannot get other structures.
                    if (!stubs)
                    {
                        switch (specificStructureType.EnumType)
                        {
                            case SdmxStructureEnumType.Categorisation:
                                Assert.IsNotEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                                Assert.IsNotEmpty(mutableObject.Categorisations, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                                break;
                            case SdmxStructureEnumType.CategoryScheme:
                                Assert.IsNotEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                                break;
                            case SdmxStructureEnumType.CodeList:
                                Assert.IsNotEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                                Assert.IsNotEmpty(mutableObject.Codelists, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                                break;
                            case SdmxStructureEnumType.ConceptScheme:
                                Assert.IsNotEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                                Assert.IsNotEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                                break;
                            case SdmxStructureEnumType.Dataflow:
                                Assert.IsNotEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                                Assert.IsNotEmpty(mutableObject.Dataflows, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                                break;
                            case SdmxStructureEnumType.Dsd:
                                Assert.IsNotEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                                Assert.IsNotEmpty(mutableObject.DataStructures, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                                break;
                            case SdmxStructureEnumType.HierarchicalCodelist:
                                Assert.IsNotEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                                Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                                break;
                        }
                    }

                    break;
                case SdmxStructureEnumType.CodeList:
                    switch (specificStructureType.EnumType)
                    {
                        case SdmxStructureEnumType.Categorisation:
                            if (!stubs)
                            {
                                Assert.IsNotEmpty(mutableObject.Categorisations, structureReference.ToString());
                            }

                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());

                            break;
                        case SdmxStructureEnumType.CategoryScheme:
                            if (!stubs)
                            {
                                Assert.IsNotEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            }

                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.CodeList:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.ConceptScheme:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.Dataflow:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.Dsd:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.HierarchicalCodelist:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());

                            // Assert.IsNotEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                    }

                    break;
                case SdmxStructureEnumType.ConceptScheme:
                    switch (specificStructureType.EnumType)
                    {
                        case SdmxStructureEnumType.Categorisation:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.CategoryScheme:
                            Assert.IsNotEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.CodeList:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.ConceptScheme:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.Dataflow:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.Dsd:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.HierarchicalCodelist:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                    }

                    break;
                case SdmxStructureEnumType.Dataflow:
                    switch (specificStructureType.EnumType)
                    {
                        case SdmxStructureEnumType.Categorisation:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.CategoryScheme:
                            Assert.IsNotEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.CodeList:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.ConceptScheme:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.Dataflow:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.Dsd:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.HierarchicalCodelist:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                    }

                    break;
                case SdmxStructureEnumType.Dsd:
                    switch (specificStructureType.EnumType)
                    {
                        case SdmxStructureEnumType.Categorisation:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.CategoryScheme:
                            Assert.IsNotEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.CodeList:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.ConceptScheme:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.Dataflow:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.Dsd:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.HierarchicalCodelist:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                    }

                    break;
                case SdmxStructureEnumType.HierarchicalCodelist:
                    switch (specificStructureType.EnumType)
                    {
                        case SdmxStructureEnumType.Categorisation:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.CategoryScheme:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.CodeList:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.ConceptScheme:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.Dataflow:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.Dsd:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                        case SdmxStructureEnumType.HierarchicalCodelist:
                            Assert.IsEmpty(mutableObject.CategorySchemes, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Categorisations, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Dataflows, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.DataStructures, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.Codelists, structureReference.ToString());
                            Assert.IsEmpty(mutableObject.ConceptSchemes, structureReference.ToString());
                            Assert.IsNotEmpty(mutableObject.HierarchicalCodelists, structureReference.ToString());
                            break;
                    }

                    break;
            }
        }
 /// <summary>
 /// Parse the Header.DataSetAction and update the <see cref="_isDeleteMessage"/>
 /// </summary>
 /// <param name="action">
 /// The SDMX Header
 /// </param>
 private void ParseAction(BaseConstantType<DatasetActionEnumType> action)
 {
     this._isDeleteMessage = action != null && action.EnumType == DatasetActionEnumType.Delete;
 }
        /// <summary>
        /// Processes the node.
        /// </summary>
        /// <param name="crossReferenceManager">The cross reference manager.</param>
        /// <param name="maintainable">The maintainable.</param>
        /// <param name="specificStructureType">Type of the specific structure.</param>
        /// <param name="returnStub">if set to <c>true</c> [return stub].</param>
        /// <param name="allowedDataflows">The allowed dataflows.</param>
        /// <param name="rootNode">The root node.</param>
        /// <param name="specificObjects">The specific objects.</param>
        /// <param name="stack">The stack.</param>
        private static void ProcessNode(
            IAuthCrossReferenceMutableRetrievalManager crossReferenceManager, 
            IMaintainableMutableObject maintainable, 
            BaseConstantType<SdmxStructureEnumType> specificStructureType, 
            bool returnStub, 
            IList<IMaintainableRefObject> allowedDataflows, 
            RelationNode rootNode, 
            ICollection<IMaintainableMutableObject> specificObjects, 
            Stack<IMaintainableMutableObject> stack)
        {
            var isTarget = rootNode.DestType == specificStructureType.EnumType;
            bool getStub;
            Action<IMaintainableMutableObject> action;
            if (isTarget)
            {
                getStub = returnStub;
                action = specificObjects.Add;
            }
            else
            {
                getStub = rootNode.DestType != SdmxStructureEnumType.Categorisation;
                action = stack.Push;
            }

            var rootFunc = GetFunc(crossReferenceManager, getStub, allowedDataflows, rootNode);
            
            foreach (var maintainableMutableObject in rootFunc(maintainable))
            {
                action(maintainableMutableObject);
            }
        }
        /// <summary>
        /// Returns specific structures of the specified type <paramref name="specificStructureType"/> related to the <paramref name="maintainable"/>
        /// </summary>
        /// <param name="crossReferenceManager">
        /// The cross reference manager.
        /// </param>
        /// <param name="maintainable">
        /// The maintainable.
        /// </param>
        /// <param name="specificStructureType">
        /// The specific structure type.
        /// </param>
        /// <param name="returnStub">
        /// The return stub.
        /// </param>
        /// <param name="allowedDataflows">
        /// The allowed dataflows.
        /// </param>
        /// <returns>
        /// The <see cref="IEnumerable{IMaintainableMutableObject}"/>.
        /// </returns>
        private static IEnumerable<IMaintainableMutableObject> GetSpecificObjects(
            IAuthCrossReferenceMutableRetrievalManager crossReferenceManager, 
            IMaintainableMutableObject maintainable, 
            BaseConstantType<SdmxStructureEnumType> specificStructureType, 
            bool returnStub, 
            IList<IMaintainableRefObject> allowedDataflows)
        {
            var specificObjects = new List<IMaintainableMutableObject>();
            var relationNodes = RelationBuilder.Build(maintainable.StructureType.EnumType, specificStructureType.EnumType);
            var stack = new Stack<IMaintainableMutableObject>();
            foreach (var rootNode in relationNodes)
            {
                ProcessNode(crossReferenceManager, maintainable, specificStructureType, returnStub, allowedDataflows, rootNode, specificObjects, stack);

                while (stack.Count > 0)
                {
                    var current = stack.Pop();
                    var currentNode = RelationBuilder.Build(current.StructureType.EnumType, specificStructureType.EnumType).FirstOrDefault();
                    if (currentNode != null)
                    {
                        ProcessNode(crossReferenceManager, current, specificStructureType, returnStub, allowedDataflows, currentNode, specificObjects, stack);
                    }
                }
            }

            return specificObjects;
        }