/** * Checks that all the definitions this class depends on are already generated * This includes the base classes as well as any types that appear as * attributes and are not marked "@Shared" * */ private static bool GenIDL_DependenciesAlreadyGenerated(Repository repository, Element classElem, TextOutputInterface output, HashSet<long> completedClasses, bool outputReport) { //output.OutputTextLine("// GenIDL_DependenciesAlreadyGenerated Checking: " + classElem.Name); // Check base classes if (classElem.BaseClasses.Count > 0) { Object obj = classElem.BaseClasses.GetAt(0); Element elem = (Element)obj; if (!completedClasses.Contains(elem.ElementID)) { if (outputReport) { output.OutputText(" ( \"" + GenIDL_GetFullPackageName(repository, classElem) + "\" , \"" + classElem.Name + "\" )"); output.OutputText(" depends on ( " + GenIDL_GetFullPackageName(repository, elem) + "\" , \"" + elem.Name + "\" )"); output.OutputTextLine(" dependency: baseclass"); } return false; } } // Check atributes foreach (EA.Attribute child in classElem.Attributes) { if (child.ClassifierID == 0) /* Primitive type */ { continue; } if (!completedClasses.Contains(child.ClassifierID)) { // Not generated yet. It is only OK if this is by reference if ( !IsAttributeReference(child) ) { if (outputReport) { Element childTypeElem = repository.GetElementByID(child.ClassifierID); output.OutputText(" ( \"" + GenIDL_GetFullPackageName(repository, classElem) + "\" , \"" + classElem.Name + "\" )"); output.OutputText(" depends on ( " + GenIDL_GetFullPackageName(repository, childTypeElem) + "\" , \"" + childTypeElem.Name + "\" )"); output.OutputTextLine(" dependency: attribute \"" + child.Name + "\""); } return false; } } } // Check relationships (Aggregations only) String explanation; foreach (EA.Connector conn in classElem.Connectors) { ConnectorEnd thisElemEnd; ConnectorEnd referencedElemEnd; int referencedElemId; Element referencedElem; bool includeReferencedTypeAsMember; String memberName; bool includeAsReference; // Resolve the reference but ommit any explanatory text GenIDL_ReferenceDescriptor(repository, conn, classElem.ElementID, false, out thisElemEnd, out referencedElemEnd, out referencedElemId, out referencedElem, out memberName, out includeAsReference, out includeReferencedTypeAsMember, out explanation); // If the reference did not have to be included, there there is no dependency on it. if ( includeReferencedTypeAsMember == false ) { continue; } // If we are here then the referenced element must appear as a member. There is a depedency so we must make sure // that that class has already been generated if (!completedClasses.Contains(referencedElemId)) { if (outputReport) { output.OutputText(" ( \"" + GenIDL_GetFullPackageName(repository, classElem) + "\" , \"" + classElem.Name + "\" )"); output.OutputText(" depends on ( " + GenIDL_GetFullPackageName(repository, referencedElem) + "\" , \"" + referencedElem.Name + "\" )"); output.OutputTextLine(" dependency: aggregation \"" + memberName + "\""); } return false; } } return true; }
private static void GenIDL_AttributeWithAnnotations(EA.Attribute child, String effectiveType, String effectiveName, String extraAnnotation, TextOutputInterface output, int depth) { int annotationCount = 0; if (idlVersion >= IDLVersion.IDL_V400) { annotationCount = GenIDL_AttributeAnnotations(child, output, depth); if (extraAnnotation != null) { GenIDL_Annotation(extraAnnotation, annotationCount==0, output, depth); ++annotationCount; } } output.OutputText(depth, effectiveType + " " + effectiveName + ";"); if (idlVersion < IDLVersion.IDL_V400) { annotationCount = GenIDL_AttributeAnnotations(child, output, depth); if (extraAnnotation != null) { GenIDL_Annotation(extraAnnotation, annotationCount==0, output, depth); ++annotationCount; } } }
private static void GenIDL_Class(Repository repository, Element classElem, TextOutputInterface output, int depth, HashSet<String> uncheckedElem, String elementPath) { // Check if this was a XSD simpleType if so there is nothing to do because we already generated // a typedef for it... if (IsXSDSimpleType(classElem)) { return; } String className = IDL_NormalizeUserDefinedClassifierName(classElem.Name); String baseClassName = null; if (classElem.BaseClasses.Count > 0) { Object obj = classElem.BaseClasses.GetAt(0); Element elem = (Element)obj; baseClassName = GenIDL_GetFullPackageName(repository, elem) + IDL_NormalizeUserDefinedClassifierName(elem.Name); if (baseClassName == null) { output.OutputText(depth, "/* Warning: empty base class ommitted for " + classElem.Name + "*/"); } } // In IDL4 and higher annotations are before the class if (idlVersion >= IDLVersion.IDL_V400) { GenIDL_ClassAnnotation(classElem, output, depth); } output.OutputText(depth, "struct " + className); if (baseClassName != null) { output.OutputText(" : " + baseClassName); } output.OutputTextLine(" {"); bool emptyClassContent = true; if (GenIDL_Attributes(repository, classElem, output, depth + 1)) { emptyClassContent = false; } if (GenIDL_Relations(repository, classElem, output, depth + 1)) { emptyClassContent = false; } if (emptyClassContent) { GenIDL_EmptyClassContent(className, output, depth + 1); } output.OutputText(depth, "};"); // In IDL35 annotations may appear after the class as a comment if (idlVersion < IDLVersion.IDL_V400) { GenIDL_ClassAnnotation(classElem, output, depth); } output.OutputTextLine(); }
internal static void GenIDL_Preview(Repository repository, TextOutputInterface output, HashSet<string> uncheckedElem, String fullPath) { char[] delimiterChars = { '\\'}; String[] elementNames = fullPath.Split(delimiterChars); String pathToElement = ""; if (elementNames.Length <= 1) { GenIDL(repository, true, output, uncheckedElem); return; } Package package = (Package)EAUtil_FindChild(repository.Models, elementNames[0]); if (package == null) { output.OutputTextLine("// Could not find selected package: \"" + fullPath + "\" in the model"); return; } Package parentPackage = package; Element classElem = null; for (int i = 1; i < elementNames.Length; ++i, parentPackage = package) { String elemName = elementNames[i]; package = (Package)EAUtil_FindChild(parentPackage.Packages, elemName); if ((package == null) && (i == elementNames.Length - 1)) { classElem = (Element)EAUtil_FindChild(parentPackage.Elements, elemName); } } output.Clear(); if (package == null && classElem == null) { output.OutputTextLine("// Could not find selected element: \"" + fullPath + "\" in the model"); return; } pathToElement = elementNames[0]; for (int i = 1; i < elementNames.Length - 1; ++i) { output.OutputText("module " + IDL_NormalizeUserDefinedClassifierName(elementNames[i]) + " { "); pathToElement += "\\" + elementNames[i]; } output.OutputTextLine(); if (package != null) { // display package // output.OutputTextLine("Displaying Package: " + package.Name); Dictionary<long, bool> moduleRelevance = new Dictionary<long, bool>(); HashSet<long> dummyCompletedClases = new HashSet<long>(); UpdateModuleRelevance(moduleRelevance, package, output); Main.GenIDL_ModuleFirstPass(repository, package, true, output, elementNames.Length - 1, pathToElement, uncheckedElem, moduleRelevance, null); int generatedItemCount; Main.GenIDL_ModuleSecondPass(repository, package, true, output, elementNames.Length - 1, pathToElement, out generatedItemCount, uncheckedElem, moduleRelevance, dummyCompletedClases); } else if (classElem != null) { // display class // output.OutputTextLine("Displaying Class: " + classElem.Name); if (IsElementEnum(classElem)) { Main.GenIDL_Enum(repository, classElem, output, elementNames.Length - 1, uncheckedElem, pathToElement); } else { Main.GenIDL_Class(repository, classElem, output, elementNames.Length - 1, uncheckedElem, pathToElement); } } for (int i = 1; i < elementNames.Length - 1; ++i) { output.OutputText("};"); } }
/* * This outputs an annotation with zero or one paramater. * * - annotationName. The normalized name of the annotation * * - annotationParam1. The value of the annotation paramater. May be null if the * annotation does not have any parameters * * - firstAnnotation. Indicates whether this is the first annotation being generated for the class or * the member. This affects the formatting for IDLVersion.IDL_V350_CONNEXT52 */ private static void GenIDL_Annotation( String annotationName, String annotationParam1, bool firstAnnotation, TextOutputInterface output, int depth) { // Depending on the version of IDL annotations need to be mapped String mappedAnnotationName; String mappedAnnotationParam1; GenIDL_MapAnnotation(annotationName, annotationParam1, out mappedAnnotationName, out mappedAnnotationParam1); if (idlVersion >= IDLVersion.IDL_V400) { output.OutputText(depth, "@" + mappedAnnotationName.ToLower()); if ( (mappedAnnotationParam1 != null) && !mappedAnnotationParam1.Equals("") ) { output.OutputText("(" + mappedAnnotationParam1 + ") "); } //output.OutputTextLine(); } else if (idlVersion >= IDLVersion.IDL_V350_XTYPES) { output.OutputText(" //@" + mappedAnnotationName); if ( (mappedAnnotationParam1 != null) && !mappedAnnotationParam1.Equals("") ) { output.OutputText("(" + mappedAnnotationParam1 + ") "); } } else // IDLVersion.IDL_V350_CONNEXT52 { if (firstAnnotation) { output.OutputText(" //@" + mappedAnnotationName); } else { // output.OutputTextLine(); output.OutputText(depth, " //@" + mappedAnnotationName); } if ( (mappedAnnotationParam1 != null) && !mappedAnnotationParam1.Equals("") ) { output.OutputText(" " + mappedAnnotationParam1); } } }
//TODO: This should examine the relationship and determine the multiplicity so that // the relationship can be generated as a sequence rather than single reference. private static bool GenIDL_Relations(Repository repository, Element classElem, TextOutputInterface output, int depth) { bool generatedRelationship = false; foreach (EA.Connector conn in classElem.Connectors) { List<String> annotations = null; String refname = null; String referencedType = GenIDL_GetReferencedTypeToInclude(out annotations, out refname, repository, classElem, conn, output, depth); if (referencedType != null) { if (annotations != null) { if (idlVersion >= IDLVersion.IDL_V400) { output.OutputText(depth, annotations[0] + " "); for (int i = 1; i < annotations.Count; ++i) { output.OutputText(annotations[i] + " "); } output.OutputTextLine(referencedType + " " + refname + "; "); } else { output.OutputTextLine(depth, referencedType + " " + refname + "; //" + annotations[0]); for (int i=1; i< annotations.Count; ++i) { output.OutputTextLine(depth, "//" + annotations[i]); } } } else { output.OutputTextLine(depth, referencedType + " " + refname + ";"); } generatedRelationship = true; } } return generatedRelationship; }
/* Generate the IDL for an enum literal. */ private static void GenIDL_EnumLiterals(Repository repository, String enumName, Element enumElem, TextOutputInterface output, int depth) { short childCount = enumElem.Attributes.Count; for (short i = 0 ; i < childCount; ++i ) { EA.Attribute child = enumElem.Attributes.GetAt(i); // String typeName = IDL_NormalizeMemberTypeName(child.Type); // Handle enumeration values. The "default value set in UML takes precedence // if not then look at the tag Value int value; String valueAnnotation = null; if (Int32.TryParse(child.Default, out value)) { valueAnnotation = child.Default; // output.OutputText(" //@Value " + child.Default); } else { string[] relevantAnnotationsWithValue = new string[] { "ID", "Value" }; foreach (AttributeTag tag in child.TaggedValues) { String normalizedAnnotation = IDL_NormalizeAnnotationName(tag.Name); if (relevantAnnotationsWithValue.Contains(normalizedAnnotation)) { valueAnnotation = tag.Value; } } } if ( (idlVersion >= IDLVersion.IDL_V400) && (valueAnnotation != null) ) { GenIDL_Annotation("Value", valueAnnotation, true, output, depth); } output.OutputText(depth, enumName + "_" + child.Name); if ((idlVersion == IDLVersion.IDL_V350_CONNEXT52) && (valueAnnotation != null)) { output.OutputText(" = " + valueAnnotation); } if (i < childCount - 1) { output.OutputText(","); } if ((idlVersion == IDLVersion.IDL_V350_XTYPES) && (valueAnnotation != null)) { GenIDL_Annotation("Value", valueAnnotation, true, output, depth); } output.OutputTextLine(); } }
/** * Checks that all the definitions this class depends on are already generated * This includes the base classes as well as any types that appear as * attributes and are not marked "@Shared" * */ private static bool GenIDL_DependenciesAlreadyGenerated(Repository repository, Element classElem, TextOutputInterface output, HashSet<long> completedClasses, bool outputReport) { //output.OutputTextLine("// GenIDL_DependenciesAlreadyGenerated Checking: " + classElem.Name); // Check base classes if (classElem.BaseClasses.Count > 0) { Object obj = classElem.BaseClasses.GetAt(0); Element elem = (Element)obj; if (!completedClasses.Contains(elem.ElementID)) { if (outputReport) { output.OutputText(" ( \"" + GenIDL_GetFullPackageName(repository, classElem) + "\" , \"" + classElem.Name + "\" )"); output.OutputText(" depends on ( " + GenIDL_GetFullPackageName(repository, elem) + "\" , \"" + elem.Name + "\" )"); output.OutputTextLine(" dependency: baseclass"); } return false; } } // Check atributes foreach (EA.Attribute child in classElem.Attributes) { if (child.ClassifierID == 0) /* Primitive type */ { continue; } if (!completedClasses.Contains(child.ClassifierID)) { // Not generated yet. It is only OK if this is by reference if ( !IsAttributeReference(child) ) { if (outputReport) { Element childTypeElem = repository.GetElementByID(child.ClassifierID); output.OutputText(" ( \"" + GenIDL_GetFullPackageName(repository, classElem) + "\" , \"" + classElem.Name + "\" )"); output.OutputText(" depends on ( " + GenIDL_GetFullPackageName(repository, childTypeElem) + "\" , \"" + childTypeElem.Name + "\" )"); output.OutputTextLine(" dependency: attribute \"" + child.Name + "\""); } return false; } } } // Check relationships (Aggregations only) foreach (EA.Connector conn in classElem.Connectors) { ConnectorEnd thisElemEnd; ConnectorEnd referencedElemEnd; int referencedElemId; if (classElem.ElementID == conn.ClientID) { thisElemEnd = conn.ClientEnd; referencedElemEnd = conn.SupplierEnd; referencedElemId = conn.SupplierID; } else { thisElemEnd = conn.SupplierEnd; referencedElemEnd = conn.ClientEnd; referencedElemId = conn.ClientID; } if ( (thisElemEnd.Aggregation == 0) || (conn.Type.Equals("Aggregation") == false)) { continue; } if (!referencedElemEnd.IsNavigable) { continue; } if (!completedClasses.Contains(referencedElemId)) { if (outputReport) { Element referencedElem = repository.GetElementByID(referencedElemId); output.OutputText(" ( \"" + GenIDL_GetFullPackageName(repository, classElem) + "\" , \"" + classElem.Name + "\" )"); output.OutputText(" depends on ( " + GenIDL_GetFullPackageName(repository, referencedElem) + "\" , \"" + referencedElem.Name + "\" )"); output.OutputTextLine(" dependency: aggregation \"" + conn.Name + "\""); } return false; } } return true; }
private static void GenIDL_Class(Repository repository, Element classElem, TextOutputInterface output, int depth, HashSet<String> uncheckedElem, String elementPath) { String baseClassName = null; if (classElem.BaseClasses.Count > 0) { Object obj = classElem.BaseClasses.GetAt(0); Element elem = (Element)obj; baseClassName = GenIDL_GetFullPackageName(repository, elem) + IDL_NormalizeUserDefinedClassifierName(elem.Name); } String className = IDL_NormalizeUserDefinedClassifierName(classElem.Name); // In IDL4 and higher annotations are before the class if (idlVersion >= IDLVersion.IDL_V400) { GenIDL_ClassAnnotation(classElem, output, depth); } output.OutputText(depth, "struct " + className); if (baseClassName != null) { output.OutputText(" : " + baseClassName); } output.OutputTextLine(" {"); bool emptyClassContent = true; if (GenIDL_Attributes(repository, classElem, output, depth + 1)) { emptyClassContent = false; } if (GenIDL_Relations(repository, classElem, output, depth + 1)) { emptyClassContent = false; } if (emptyClassContent) { GenIDL_EmptyClassContent(className, output, depth + 1); } output.OutputText(depth, "};"); // In IDL35 annotations may appear after the class as a comment if (idlVersion < IDLVersion.IDL_V400) { GenIDL_ClassAnnotation(classElem, output, depth); } output.OutputTextLine(); }
private static void GenIDL_Annotation( String annotationName, String annotationParam1, bool firstAnnotation, TextOutputInterface output, int depth) { if (idlVersion >= IDLVersion.IDL_V400) { output.OutputText(depth, "@" + annotationName.ToLower()); if (annotationParam1 != null) { output.OutputText("(" + annotationParam1 + ") "); } output.OutputTextLine(); } else if (idlVersion >= IDLVersion.IDL_V350_XTYPES) { output.OutputText(" //@" + annotationName); if (annotationParam1 != null) { output.OutputText("(" + annotationParam1 + ") "); } } else { if (firstAnnotation) { output.OutputText(" //@" + annotationName); } else { output.OutputTextLine(); output.OutputText(depth, " //@" + annotationName); } if (annotationParam1 != null) { output.OutputText(" " + annotationParam1); } } }