private void BuildMethod(StringBuilder stringBuilder, UmlMethod umlMethod)
 {
     stringBuilder.AppendLine($"   {umlMethod.OutputType} {umlMethod.Name}({umlMethod.InputType})");
 }
예제 #2
0
        private GeneralUseStructure FromXmi(XmlDocument document, ref String name)
        {
            UmlModel            model = new UmlModel();
            XmlNamespaceManager ns    = new XmlNamespaceManager(document.NameTable);

            ns.AddNamespace("JUDE", "http://objectclub.esm.co.jp/Jude/namespace/");
            ns.AddNamespace("UML", "org.omg.xmi.namespace.UML");
            List <UmlClass>    classes         = new List <UmlClass> ();
            List <String>      pairs           = new List <String> ();
            UmlSequenceDiagram sequenceDiagram = null;

            foreach (XmlNode classNode in document.SelectNodes("//UML:Namespace.ownedElement//UML:Class[@xmi.id]", ns))
            {
                UmlClass sdClass = new UmlClass();
                sdClass.Id   = classNode.Attributes["xmi.id"].Value;
                sdClass.Name = classNode.Attributes["name"].Value;

                foreach (XmlNode operationNode in classNode.SelectNodes("//UML:Class[@xmi.id='" + sdClass.Id + "']//UML:Operation[@xmi.id]", ns))
                {
                    UmlMethod method = new UmlMethod();
                    method.Id       = operationNode.Attributes["xmi.id"].Value;
                    method.Name     = operationNode.Attributes["name"].Value;
                    method.Abstract = Boolean.Parse(operationNode.Attributes["isAbstract"].Value);

                    #region Visibility - VERIFICAR QUAL É O CORRETO
                    foreach (XmlNode modelElementVisibilityNode in operationNode.SelectNodes("//UML:Class[@xmi.id='" + sdClass.Id + "']//UML:Operation[@xmi.id='" + method.Id + "']//UML:ModelElement.visibility", ns))
                    {
                        method.Visibility = modelElementVisibilityNode.Attributes["xmi.value"].Value;
                    }

                    foreach (XmlNode featureVisibilityNode in operationNode.SelectNodes("//UML:Class[@xmi.id='" + sdClass.Id + "']//UML:Operation[@xmi.id='" + method.Id + "']//UML:Feature.visibility", ns))
                    {
                        method.Visibility = featureVisibilityNode.Attributes["xmi.value"].Value;
                    }
                    #endregion

                    foreach (XmlNode parameterNode in operationNode.SelectNodes("//UML:Class[@xmi.id='" + sdClass.Id + "']//UML:Operation[@xmi.id='" + method.Id + "']//UML:BehavioralFeature.parameter//UML:Parameter", ns))
                    {
                        UmlMethodParam methodParam = new UmlMethodParam();
                        methodParam.Id   = parameterNode.Attributes["xmi.id"].Value;
                        methodParam.Name = parameterNode.Attributes["name"].Value;
                        methodParam.Kind = parameterNode.Attributes["kind"].Value;

                        foreach (XmlNode parameterTypeClassifierNode in parameterNode.SelectNodes("//UML:Parameter[@xmi.id='" + methodParam.Id + "']//UML:Classifier", ns))
                        {
                            String aux = parameterTypeClassifierNode.Attributes["xmi.idref"].Value;
                            methodParam.Type = GetParamType(document, ns, aux);
                        }
                        method.Params.Add(methodParam);
                    }
                    sdClass.Methods.Add(method);
                }
                classes.Add(sdClass);
            }

            XmlNodeList sequenceDiagramNodeList = document.SelectNodes("//UML:Namespace.collaboration//UML:Collaboration[@xmi.id]", ns);

            foreach (XmlNode sequenceDiagramNode in sequenceDiagramNodeList)
            {
                sequenceDiagram    = new UmlSequenceDiagram();
                sequenceDiagram.Id = sequenceDiagramNode.Attributes["xmi.id"].Value;
                model.AddDiagram(sequenceDiagram);
                String pair = "";

                foreach (XmlNode classifierRoleNode in sequenceDiagramNode.SelectNodes("//UML:ClassifierRole[@xmi.id]", ns))
                {
                    String aux = classifierRoleNode.Attributes["xmi.id"].Value;
                    pair  = classifierRoleNode.Attributes["xmi.id"].Value;
                    pair += "#";

                    foreach (XmlNode classifierRoleBaseNode in classifierRoleNode.SelectNodes("//UML:ClassifierRole[@xmi.id='" + aux + "']//UML:ClassifierRole.base//UML:Classifier[@xmi.idref]", ns))
                    {
                        pair += classifierRoleBaseNode.Attributes["xmi.idref"].Value;
                    }
                    pairs.Add(pair);
                }
            }

            foreach (UmlClass sdClass in classes)
            {
                foreach (String pair in pairs)
                {
                    String[] splitted = pair.Split('#');
                    if (sdClass.Id.Equals(splitted[1]))
                    {
                        sdClass.IdRef = splitted[0];
                        break;
                    }
                }
                foreach (UmlMethod method in sdClass.Methods)
                {
                    sequenceDiagram.UmlObjects.Add(method);
                    foreach (UmlMethodParam param in method.Params)
                    {
                        sequenceDiagram.UmlObjects.Add(param);
                    }
                }
                sequenceDiagram.UmlObjects.Add(sdClass);
            }

            foreach (UmlSequenceDiagram sequenceDiagramAux in model.Diagrams.OfType <UmlSequenceDiagram> ())
            {
                XmlNodeList messageNodeList = document.SelectNodes("//UML:Namespace.collaboration//UML:Collaboration[@xmi.id='" + sequenceDiagramAux.Id + "']//UML:Message[@xmi.id]", ns);
                foreach (XmlNode messageNode in messageNodeList)
                {
                    UmlMessage message  = new UmlMessage();
                    String     storedID = "";
                    message.Id   = messageNode.Attributes["xmi.id"].Value;
                    message.Name = messageNode.Attributes["name"].Value;

                    foreach (XmlNode taggedValuesNode in messageNode.SelectNodes("//UML:Message[@xmi.id='" + message.Id + "']//UML:ModelElement.taggedValue//UML:TaggedValue", ns))
                    {
                        String tagName  = (taggedValuesNode.Attributes["tag"].Value).ToUpper();
                        String tagValue = HttpUtility.UrlDecode(taggedValuesNode.Attributes["value"].Value);
                        message.SetTaggedValue(tagName, tagValue);
                    }

                    foreach (XmlNode senderNode in messageNode.SelectNodes("//UML:Message[@xmi.id='" + message.Id + "']//UML:Message.sender//UML:ClassifierRole[@xmi.idref]", ns))
                    {
                        message.Sender = (from c in sequenceDiagramAux.UmlObjects.OfType <UmlClass> () where c.IdRef.Equals(senderNode.Attributes["xmi.idref"].Value) select c).FirstOrDefault();
                        break;
                    }

                    foreach (XmlNode receiverNode in messageNode.SelectNodes("//UML:Message[@xmi.id='" + message.Id + "']//UML:Message.receiver//UML:ClassifierRole[@xmi.idref]", ns))
                    {
                        message.Receiver = (from c in sequenceDiagramAux.UmlObjects.OfType <UmlClass> () where c.IdRef.Equals(receiverNode.Attributes["xmi.idref"].Value) select c).FirstOrDefault();
                        break;
                    }

                    foreach (XmlNode actionNode in messageNode.SelectNodes("//UML:Message[@xmi.id='" + message.Id + "']//UML:Message.action//UML:Action[@xmi.id]", ns))
                    {
                        storedID = "";
                        try {
                            storedID           = actionNode.Attributes["xmi.id"].Value;
                            message.ActionType = Convert.ToInt32(actionNode.Attributes["actionType"].Value);
                        } catch {
                        }
                        foreach (XmlNode operationNode in actionNode.SelectNodes("//UML:Action[@xmi.id='" + storedID + "']//UML:Operation", ns))
                        {
                            String aux = operationNode.Attributes["xmi.idref"].Value;
                            message.Method = GetMethod(aux, sequenceDiagram);
                        }
                    }

                    foreach (XmlNode judeMessagePresentation in document.SelectNodes("//JUDE:MessagePresentation[@index]", ns))
                    {
                        String idAux = judeMessagePresentation.Attributes["xmi.id"].Value;
                        foreach (XmlNode umlMessageNode in judeMessagePresentation.SelectNodes("//JUDE:MessagePresentation[@xmi.id='" + idAux + "']//JUDE:UPresentation.semanticModel//UML:Message[@xmi.idref='" + message.Id + "']", ns))
                        {
                            String aux2 = "";
                            try {
                                aux2 = judeMessagePresentation.Attributes["index"].Value;
                            } catch {
                            }
                            decimal index = decimal.Parse(aux2, new CultureInfo("en-US"));
                            message.Index = Convert.ToDouble(index);
                            break;
                        }
                    }
                    sequenceDiagramAux.UmlObjects.Add(message);
                }
            }
            return(model);
        }
예제 #3
0
        public bool TryParse()
        {
            StructuralTestData testData = new StructuralTestData();

            XmlNamespaceManager ns = new XmlNamespaceManager(new NameTable());

            ns.AddNamespace("xmi", "http://schema.omg.org/spec/XMI/1.3");
            ns.AddNamespace("UML", "org.omg.xmi.namespace.UML");

            XmlDocument doc = new XmlDocument();

            doc.Load(InputFile);

            String         stereotypeId    = null;
            List <XmlNode> classifierNodes = new List <XmlNode>();

            //1st, Locate SATestData stereotype xmi.id attribute
            foreach (XmlNode classNode in doc.SelectNodes("//UML:Stereotype", ns))
            {
                try{
                    if (classNode.Attributes["name"].Value == "SATestData")
                    {
                        stereotypeId = classNode.Attributes["xmi.id"].Value;
                        break;
                    }
                }catch (Exception) {}
            }

            //2nd, Find stereotyped classifier role (with SATestData stereotype)
            XmlNodeList classifiers = doc.SelectNodes("//UML:ClassifierRole", ns);

            foreach (XmlNode classifier in classifiers)
            {
                try{
                    //Locate stereotype inside classifier
                    foreach (XmlNode ste in classifier.SelectNodes(".//UML:Stereotype[@xmi.idref='" + stereotypeId + "']", ns))
                    {
                        classifierNodes.Add(classifier);
                    }
                }catch (Exception) {}
            }

            //3rd, Locate messages linked to found CR
            //List<XmlNode> messageNodes = new List<XmlNode>();
            XmlNodeList messages = doc.SelectNodes("//UML:Message", ns);
            List <KeyValuePair <string, XmlNode> > messageNodes = new List <KeyValuePair <string, XmlNode> >();

            foreach (XmlNode classifierNode in classifierNodes)
            {
                string roleid = classifierNode.Attributes["xmi.id"].Value;
                foreach (XmlNode message in messages)
                {
                    //checks if meesage is send to required classifier role
                    try
                    {
                        foreach (XmlNode n in message.SelectNodes(".//UML:Message.receiver/UML:ClassifierRole[@xmi.idref='" + roleid + "']", ns))
                        {
                            messageNodes.Add(
                                new KeyValuePair <string, XmlNode>(
                                    classifierNode.Attributes["name"].Value,
                                    message));
                        }
                    }
                    catch (Exception) { }
                }

                UmlClass c = new UmlClass();
                c.Name = classifierNode.Attributes["name"].Value;

                //4th, parse information from message names
                foreach (KeyValuePair <string, XmlNode> n in messageNodes)
                {
                    foreach (XmlNode a in n.Value.SelectNodes(".//UML:Message.action/UML:CallAction", ns))
                    {
                        string actionId = a.Attributes["xmi.idref"].Value;
                        foreach (XmlNode action in doc.SelectNodes("//UML:CallAction[@xmi.id='" + actionId + "']", ns))
                        {
                            string assignature = action.Attributes["name"].Value;

                            UmlMethod m = new UmlMethod();
                            m.Id     = Convert.ToInt32(assignature.Split(':')[0]);
                            m.Name   = assignature.Split(':')[1].Split('(')[0].Split(' ')[1];
                            m.Return = assignature.Split(':')[1].Split('(')[0].Split(' ')[0];

                            int id = 0;
                            foreach (string s in assignature.Split('(')[1].Replace(")", "").Split(','))
                            {
                                UmlMethodParam par = new UmlMethodParam();
                                par.Id   = ++id;
                                par.Type = s.Trim().Split(' ')[0];
                                par.Name = s.Trim().Split(' ')[1];
                                m.Params.Add(par);
                            }

                            if (c.Name == n.Key)
                            {
                                c.Methods.Add(m);
                            }
                        }
                    }
                }
                testData.Classes.Add(c);
            }

            //5th, collect stereotypes and their tags
            XmlNodeList stereotypes = doc.SelectNodes("//UML:Stereotype[@xmi.id='" + stereotypeId + "']", ns);
            XmlNode     stereotype  = null;

            foreach (XmlNode s in stereotypes)
            {
                stereotype = s;
                break;
            }

            //XmlNode firstClassifierNode = classifierNodes.FirstOrDefault();

            foreach (XmlNode xm in classifierNodes)
            {
                foreach (XmlNode t in stereotype.SelectNodes(".//UML:TagDefinition", ns))
                {
                    string tagId = t.Attributes["xmi.id"].Value;

                    foreach (XmlNode tv in xm.SelectNodes(".//UML:TaggedValue", ns))
                    {
                        foreach (XmlNode tvt in tv.SelectNodes(".//UML:TagDefinition[@xmi.idref='" + tagId + "']", ns))
                        {
                            foreach (XmlNode tdv in tv.SelectNodes(".//UML:TaggedValue.dataValue", ns))
                            {
                                testData.Tags.Add(new UmlTag()
                                {
                                    Name  = t.Attributes["name"].Value,
                                    Value = tdv.InnerXml
                                });
                                break;
                            }
                            break;
                        }
                    }
                }
            }

            this.parsedStructure = testData;
            return(true);
        }