private void CalculateDiffForMas(IMa maComplete, IMa maSubset, Dictionary <string, List <string> > diff)
        {
            Dictionary <string, IAsma> childAsmasOfSubset = new Dictionary <string, IAsma>();

            foreach (IAsma childAsmaOfSubset in maSubset.Asmas)
            {
                childAsmasOfSubset.Add(childAsmaOfSubset.Name, childAsmaOfSubset);
            }

            foreach (IAsma childAsmaOfComplete in maComplete.Asmas)
            {
                if (childAsmasOfSubset.ContainsKey(childAsmaOfComplete.Name))
                {
                    BieAggregator bieAggregatorOfComplete = childAsmaOfComplete.AssociatedBieAggregator;

                    if (bieAggregatorOfComplete.IsMa)
                    {
                        CalculateDiffForMas(bieAggregatorOfComplete.Ma, childAsmasOfSubset[childAsmaOfComplete.Name].AssociatedBieAggregator.Ma, diff);
                    }
                    else if (bieAggregatorOfComplete.IsAbie)
                    {
                        CalculateDiffForAbie(bieAggregatorOfComplete.Abie, childAsmasOfSubset[childAsmaOfComplete.Name].AssociatedBieAggregator.Abie, diff);
                    }
                }
                else
                {
                    // den subtree welcher am asma haengt entfernen
                }
            }
        }
        private void Compile(IDocLibrary docLibrary)
        {
            IMa           documentRoot  = docLibrary.DocumentRoot;
            IAsma         asma          = documentRoot.Asmas.FirstOrDefault();
            BieAggregator bieAggregator = asma.AssociatedBieAggregator;

            if (bieAggregator.IsMa)
            {
                CompileXsdTypesFromMa(bieAggregator.Ma);
            }
            else if (bieAggregator.IsAbie)
            {
                CompileXsdTypesFromAbie(bieAggregator.Abie);
            }
            else
            {
                throw new Exception("The ASMA " + asma.Name + " of the Document Root Element " + documentRoot.Name + " neither aggregates a MA nor an ABIE.");
            }
        }
        private void CompileXsdTypesFromMa(IMa ma)
        {
            if (!alreadyCompiledTypes.Contains(ma.Id))
            {
                alreadyCompiledTypes.Add(ma.Id);

                XsdType xsdType = AddXsdType(ma.Name);

                foreach (IAsma asma in ma.Asmas)
                {
                    BieAggregator bieAggregator = asma.AssociatedBieAggregator;

                    if (bieAggregator.IsMa)
                    {
                        xsdType.AddChild(asma.Name);

                        CompileXsdTypesFromMa(bieAggregator.Ma);
                    }
                    else if (bieAggregator.IsAbie)
                    {
                        //if (bieAggregator.Name == "PaymentConditionsType_PaymentTerms")
                        //{
                        //    int y = 1;
                        //}

                        // BUG FIX:
                        xsdType.AddChild(asma.Name);

                        // In case that trough the ASMA aggregated element is an ABIE,
                        // then the ASMA is not an actual complex element of the MA's
                        // complex type.
                        CompileXsdTypesFromAbie(bieAggregator.Abie);
                    }
                    else
                    {
                        throw new Exception("The ASMA " + asma.Name + " of the MA " + ma.Name +
                                            " neither aggregates a MA nor an ABIE.");
                    }
                }
            }
        }