private void BuildMethod(StringBuilder stringBuilder, UmlMethod umlMethod) { stringBuilder.AppendLine($" {umlMethod.OutputType} {umlMethod.Name}({umlMethod.InputType})"); }
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); }
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); }