static public Hashtable sampleToJObject(EA.Repository Repository, EA.Diagram diagram, DiagramCache diagramCache) { Hashtable result = new Hashtable(); IList <EA.Element> clazzes = MetaDataManager.diagramClasses(Repository, diagramCache.elementsList); IList <EA.Element> samples = MetaDataManager.diagramSamples(Repository, diagramCache.elementsList); EA.Element root = MetaDataManager.findContainer(Repository, diagram, diagramCache, RoundTripAddInClass.EA_STEREOTYPE_CONSTRAINT); logger.log("MetaData container:" + root.Name); EA.Element rootClassifier = MetaDataManager.extractSelection(diagramCache, root); MetaDataManager.extractDiagramMetaData(result, root); logger.log("Export container:" + rootClassifier.Name); String prefix = (string)result[RoundTripAddInClass.PREFIX]; Dictionary <int, JObject> instances = new Dictionary <int, JObject>(); JArray container = new JArray(); string containerName = root.Name; string containerClassifier = rootClassifier.Name; IList <int> visited = new List <int>(); IList <EA.Element> parents = new List <EA.Element>(); IList <int> sampleIds = new List <int>(); IList <int> relationsVisited = new List <int>(); foreach (EA.Element sample in samples) { sampleIds.Add(sample.ElementID); if (sample.Stereotype == RoundTripAddInClass.EA_STEREOTYPE_CONSTRAINT) { continue; } if (sample.ClassfierID != root.ClassfierID) { //skip root elements that are the population elements. continue; } visited.Add(sample.ElementID); parents.Add(sample); } parentsToJObject(Repository, diagram, container, sampleIds, null, parents, visited, relationsVisited, diagramCache); string msg = prefix + JsonConvert.SerializeObject(container, Newtonsoft.Json.Formatting.Indented) + "\n"; result.Add("sample", containerName); result.Add("class", containerClassifier); result.Add("json", msg); //result.Add("export", root.Name); return(result); }
static public Hashtable sampleToJObject(EA.Repository Repository, EA.Diagram diagram, IList <EA.Element> diagramElements) { Hashtable result = new Hashtable(); IList <EA.Element> clazzes = MetaDataManager.diagramClasses(Repository, diagramElements); IList <EA.Element> samples = MetaDataManager.diagramSamples(Repository, diagramElements); EA.Element root = findContainer(Repository, diagram, diagramElements); EA.Element rootClassifier = Repository.GetElementByID(root.ClassifierID); Dictionary <int, JObject> instances = new Dictionary <int, JObject>(); JObject container = new JObject(); string containerName = root.Name; string containerClassifier = rootClassifier.Name; instances.Add(root.ElementID, container); foreach (EA.Element sample in samples) { //logger.log("Sample Name:" + sample.Name+"\t"+sample.ElementID); if (sample.Stereotype == RoundTripAddInClass.EA_STEREOTYPE_SAMPLE) { continue; } EA.Element clazz = null; if (sample.ClassifierID != 0) { clazz = Repository.GetElementByID(sample.ClassifierID); } else { logger.log("Classifier is null"); } JObject jsonClass = null; if (!instances.TryGetValue(sample.ElementID, out jsonClass)) { jsonClass = new JObject(); instances.Add(sample.ElementID, jsonClass); } string rs = sample.RunState; // Loop through all attributes in run state and add to json Dictionary <string, RunState> runstate = ObjectManager.parseRunState(rs); foreach (string key in runstate.Keys) { logger.log("Adding property:" + key + " =>" + runstate[key].value); object o = runstate[key].value; // Find classifier attribute specified in run state string attrType = null; string attrUpperBound = null; if (clazz != null) { foreach (EA.Attribute a in clazz.Attributes) { if (a.Name.Equals(key)) { attrType = a.Type; attrUpperBound = a.UpperBound; break; } } // Check if attribuite is defined as related enumeration. When cardinaltity is 0..* then set the attribute cardinality so we serialize as an array foreach (EA.Connector con in clazz.Connectors) { // Check relation is named the same as the run state attribute name and is an enumeration EA.Element related = Repository.GetElementByID(con.SupplierID); if (con.SupplierEnd.Role == key && related.Type == RoundTripAddInClass.EA_TYPE_ENUMERATION) { //if (con.SupplierEnd.Cardinality.Equals(RoundTripAddInClass.CARDINALITY_0_TO_MANY)) //{ //logger.log(" matching enum with 0..*:" + con.SupplierEnd.Cardinality); //} attrType = related.Type; attrUpperBound = con.SupplierEnd.Cardinality; break; } } // Check if attribute is defined as related DataItem foreach (EA.Connector con in clazz.Connectors) { // Check relation is named the same as the run state attribute name and is an enumeration EA.Element related = Repository.GetElementByID(con.SupplierID); if (con.SupplierEnd.Role == key && related.Stereotype == RoundTripAddInClass.EA_STEREOTYPE_DATAITEM) { attrType = SchemaManager.getDataItemType(related); attrUpperBound = con.SupplierEnd.Cardinality; break; } } } // Add attribute to json as either value or array if (attrType != null) { //logger.log(" upper bound:" + key + " =>" + attrUpperBound); if (attrUpperBound.Equals("*") || attrUpperBound.Equals(RoundTripAddInClass.CARDINALITY_0_TO_MANY)) { // Create array and split values separated by commas JArray ja = new JArray(); foreach (string value in runstate[key].value.Split(',')) { o = convertEATypeToValue(attrType, value); ja.Add(o); } jsonClass.Add(new JProperty(key, ja)); } else { // Not array so convert and add attribute and formatted value o = convertEATypeToValue(attrType, runstate[key].value); logger.log("Attr:" + attrType + " " + o.ToString()); jsonClass.Add(new JProperty(key, o)); } } else { // No classifier found so add as object serialized as string logger.log("Attr:" + key + "-" + o.ToString()); jsonClass.Add(new JProperty(key, o)); } } } logger.log("Export container:" + containerName); foreach (EA.Element clazz in samples) { JObject jsonClass = null; if (!instances.TryGetValue(clazz.ElementID, out jsonClass)) { continue; } if (jsonClass != null) { logger.log("Found jsonClass:" + clazz.Name); foreach (EA.Connector con in clazz.Connectors) { //logger.log("Found connector:"); EA.Element related = null; if (clazz.ElementID == con.ClientID) { related = Repository.GetElementByID(con.SupplierID); try { object o = instances[related.ElementID]; } catch (KeyNotFoundException) { //Object is in package but not on the diagram continue; } if (related != null && instances[related.ElementID] != null) { if (con.SupplierEnd.Cardinality.Equals(RoundTripAddInClass.CARDINALITY_0_TO_MANY) || con.SupplierEnd.Cardinality.Equals(RoundTripAddInClass.CARDINALITY_1_TO_MANY) ) { //logger.log("Found array"); string propertyName = related.Name; //Override with the connection supplier end try{ if (con.SupplierEnd.Role.Length > 0) { propertyName = con.SupplierEnd.Role; } }catch (Exception) { } JProperty p = jsonClass.Property(propertyName); if (p == null) { JArray ja = new JArray(); ja.Add(instances[related.ElementID]); //logger.log("Adding array property:"+ related.Name); jsonClass.Add(new JProperty(propertyName, ja)); } else { JArray ja = (JArray)p.Value; //logger.log("Adding to array property"); ja.Add(instances[related.ElementID]); } } else { string propertyName = related.Name; //Override with the connection supplier end try { if (con.SupplierEnd.Role.Length > 0) { propertyName = con.SupplierEnd.Role; } }catch (Exception) { } //logger.log("Adding property:" + related.Name); jsonClass.Add(new JProperty(propertyName, instances[related.ElementID])); } } } } } } //KeyValuePair<string,JObject> kv = new KeyValuePair<string,JObject>(containerName,container); //return kv; //logger.log("REturning result"); result.Add("sample", containerName); result.Add("class", containerClassifier); result.Add("json", container); return(result); }