public void StartElement(string localName, string qName, SortedList <string, string> atts)
        {
            if (!abort)
            {
                /**
                 * Deo neophodan za proveru ako postoji xml:base jer tada elementi, bar vecina nema nista pre #
                 */
                if (atts.ContainsKey(xmlBase))
                {
                    profile.BaseNS = atts[xmlBase];
                    Console.WriteLine(profile.BaseNS);
                }

                checkedElementsCount++;
                if (qName.StartsWith(rdfsNamespace) || (qName.StartsWith(cimsNamespace)))
                {
                    documentIdentifiedLikeRDFS = true;
                }
                if ((!documentIdentifiedLikeRDFS) && (checkedElementsCount >= 70))
                {
                    this.profile = null;
                    //occurredError = new ExtendedParseError(new Exception(documentError));
                    abort = true;
                }

                if (qName.Equals(rdfProfileElement) || qName.Equals(cimsClassCategoryElement) ||
                    qName.Equals(rdfsClassElement) || qName.Equals(rdfPropertyElement))    //start of new profile element
                {
                    currentElement = new ProfileElement();

                    if (atts.ContainsKey(rdfAbout))
                    {
                        currentElement.URI = atts[rdfAbout];
                    }
                    else if (atts.ContainsKey(rdfId)) // some elements can have rdf:Id instead rdf:about
                    {
                        currentElement.URI = atts[rdfId];
                    }

                    switch (qName)
                    {
                    case cimsClassCategoryElement:
                    {
                        currentElement.Type = ProfileElement.TypeClassCategoryString;
                        break;
                    }

                    case rdfsClassElement:
                    {
                        currentElement.Type = ProfileElement.TypeClassString;
                        break;
                    }

                    case rdfPropertyElement:
                    {
                        currentElement.Type = ProfileElement.TypePropertyString;
                        break;
                    }
                    }
                }
                else if (qName.Equals(rdfType))
                {
                    if (currentElement != null)
                    {
                        currentElement.Type = ExtractResourceAttributeFromElement(atts);
                    }
                }
                else if (qName.Equals(rdfsSubClassOf))
                {
                    if (currentElement != null)
                    {
                        currentElement.SubClassOf = ExtractResourceAttributeFromElement(atts);
                    }
                }
                else if (qName.Equals(rdfsDomain))
                {
                    if (currentElement != null)
                    {
                        string domainOfProperty = ExtractResourceAttributeFromElement(atts);
                        ////if (domainOfProperty.StartsWith(StringManipulationManager.SeparatorSharp))
                        ////{
                        ////    domainOfProperty = domainOfProperty.Substring(1);
                        ////}
                        currentElement.Domain = domainOfProperty;

                        AddBelongingInformation(currentElement.Domain);
                    }
                }
                else if (qName.Equals(rdfsRange))
                {
                    if (currentElement != null)
                    {
                        currentElement.Range = ExtractResourceAttributeFromElement(atts);
                    }
                }
                else if (qName.Equals(cimsBelongsToCategory))
                {
                    if (currentElement != null)
                    {
                        string belongToCategory = ExtractResourceAttributeFromElement(atts);
                        ////if (belongToCategory.StartsWith(StringManipulationManager.SeparatorSharp))
                        ////{
                        ////    belongToCategory = belongToCategory.Substring(1);
                        ////}
                        currentElement.BelongsToCategory = belongToCategory;

                        AddBelongingInformation(currentElement.BelongsToCategory);
                    }
                }
                else if (qName.Equals(cimsStereotype))
                {
                    if (currentElement != null)
                    {
                        string stereotype = ExtractResourceAttributeFromElement(atts);
                        currentElement.AddStereotype(stereotype);
                    }
                }
                else if (qName.Equals(cimsDataType))
                {
                    if (currentElement != null)
                    {
                        currentElement.DataType = ExtractResourceAttributeFromElement(atts);
                    }
                }
                else if (qName.Equals(cimsInverseRoleName))
                {
                    if (currentElement != null)
                    {
                        currentElement.InverseRoleName = ExtractResourceAttributeFromElement(atts);
                    }
                }
                else if (qName.Equals(cimsMultiplicity))
                {
                    if (currentElement != null)
                    {
                        currentElement.MultiplicityAsString = ExtractSimpleNameFromResourceURI(ExtractResourceAttributeFromElement(atts));
                    }
                }
            }
        }
示例#2
0
        /// <summary>
        /// Adds missing data to <c>entity</c> with respect to <c>modelClass</c>, and <c>package</c> from the model
        /// </summary>
        /// <param name="entity">ProfileElement element with missing data</param>
        /// <param name="modelClass">CClass from model</param>
        /// <param name="package">CPackage from model. Contains the <c>modelClass</c></param>
        private void updateClassData(ProfileElement entity, CClass modelClass, CPackage package)
        {
            entity.AddStereotype(ProfileElementStereotype.StereotypeConcrete);
            entity.URI = modelClass.name;
            //PACKAGE: name and object - added "Package_" because of the current scheme
            entity.BelongsToCategory = "Package_" + package.name;
            entity.TypeAsEnumValue   = ProfileElementTypes.Class;
            entity.Label             = StringManipulationManager.ExtractAllAfterSeparator(modelClass.name, StringManipulationManager.SeparatorSharp);
            List <ProfileElement> packages = profile.GetAllProfileElementsOfType(ProfileElementTypes.ClassCategory);

            foreach (ProfileElement pack in packages)
            {
                if (pack.UniqueName.Equals(entity.BelongsToCategory))
                {
                    entity.BelongsToCategoryAsObject = pack;
                    pack.AddToMembersOfClassCategory(entity);
                    break;
                }
            }
            //if package is not found, look for it in the model
            //-----------------------------------------------------------------------------


            if (entity.BelongsToCategoryAsObject == null)
            {
                //looking for package (and we know which one - CPackage) and adding it to hierarchy
                ProfileElement newPackage = new ProfileElement();
                newPackage.Label = package.name;
                newPackage.URI   = "Package_" + package.name;

                //create separate package - detached from hierarchy, because we wont need it
                newPackage.TypeAsEnumValue = ProfileElementTypes.ClassCategory;
                newPackage.AddToMembersOfClassCategory(entity);
                entity.BelongsToCategoryAsObject = newPackage;
                entity.BelongsToCategory         = newPackage.UniqueName;
                profile.GetAllProfileElementsOfType(ProfileElementTypes.ClassCategory).Add(newPackage);
            }

            //-----------------------------------------------------------------------------

            //PARENT: assumption is that all the classes needed are in profile,
            //we dont need to add additional, not mentioned in profile
            entity.SubClassOf = modelClass.parentClassName == null ? string.Empty : modelClass.parentClassName;
            if (!string.IsNullOrEmpty(entity.SubClassOf))
            {
                bool foundInModel             = false;
                List <ProfileElement> classes = profile.GetAllProfileElementsOfType(ProfileElementTypes.Class);
                foreach (ProfileElement temp in classes)
                {
                    if (temp.URI.Equals(entity.SubClassOf))
                    {
                        entity.SubClassOfAsObject = temp;
                        break;
                    }
                }
                if (!foundInModel)
                {
                    entity.SubClassOf = string.Empty;
                }
            }

            //FIELDS
            foreach (CAttribute att in modelClass.attributes)
            {
                addAttributeToElement(entity, att, modelClass);
            }
        }