in src/com/intellij/idea/plugin/hybris/system/type/model/generator/JetBrainsEmitter.java [66:481]
public void generateClass(
final FileManager fileManager,
final TypeDesc td,
final ModelDesc model,
final File outDir,
final Set<String> simpleTypes
) {
final Map<String, TypeDesc> jtMap = model.jtMap;
final Map<String, NamespaceDesc> nsdMap = model.nsdMap;
final NamespaceDesc nsd = nsdMap.get(nsdMap.containsKey(td.xsNamespace) ? td.xsNamespace : "");
final String typeName = td.name;
final String typeQName = model.getNSDPrefix(td) + typeName;
final String pkgName = typeQName.lastIndexOf('.') > -1
? typeQName.substring(0, typeQName.lastIndexOf('.'))
: "";
final String stringClass = getStringClassName();
final File outFile = fileManager.getOutputFile(new File(outDir, toJavaFileName(typeQName)));
PrintWriter out = null;
try {
final TreeSet<String> externalClasses = new TreeSet<>();
if (td.type != TypeDesc.TypeEnum.ENUM) {
if (nsd.imports != null) {
final StringTokenizer st = new StringTokenizer(nsd.imports, ";");
while (st.hasMoreTokens()) {
externalClasses.add(st.nextToken());
}
}
if (!model.getNSDPrefix("", nsd.superClass, false).equals(model.getNSDPrefix(td))) {
externalClasses
.add(model.getNSDPrefix(
"",
nsd.superClass,
false
) + nsd.superClass.substring(nsd.superClass.lastIndexOf(".") + 1));
}
if (td.supers != null) {
for (TypeDesc tds : td.supers) {
final String pkg1 = model.getNSDPrefix(tds);
final String pkg2 = model.getNSDPrefix(td);
if (!pkg1.equals(pkg2)) {
externalClasses.add(model.getNSDPrefix(tds) + tds.name);
}
}
}
for (FieldDesc fd : td.fdMap.values()) {
if (fd.simpleTypesString != null && fd.simpleTypesString.indexOf(":fully-qualified-classType;") != -1) {
externalClasses.add("com.intellij.psi.PsiClass");
}
if (fd.contentQualifiedName != null && fd.contentQualifiedName.indexOf('.') > 0) {
final String pkgNameFD = fd.contentQualifiedName.substring(
0,
fd.contentQualifiedName.lastIndexOf('.')
);
if (!pkgNameFD.equals(pkgName)) {
externalClasses.add(fd.contentQualifiedName);
}
}
if (fd.clType < 0) {
externalClasses.add("java.util.List");
}
externalClasses.add("org.jetbrains.annotations.NotNull");
externalClasses.add("com.intellij.util.xml.*");
}
}
Util.log("Generating type: " + typeName + "");
out = new PrintWriter(new FileWriter(outFile));
if (NOT_COMPARE_MODE) {
out.println("// Generated on " + new Date());
out.println("// DTD/Schema : " + nsd.name);
}
out.println("");
if (NOT_COMPARE_MODE && pkgName != null && pkgName.length() > 0) {
out.println("package " + pkgName + ';');
}
out.println();
if (td.type != TypeDesc.TypeEnum.ENUM) {
boolean javaLang = false;
boolean external = false;
for (String s : externalClasses) {
if (s.startsWith("java.")) {
javaLang = true;
continue;
}
external = true;
out.println("import " + s + ';');
}
if (javaLang) {
if (external) {
out.println();
}
for (String s : externalClasses) {
if (!s.startsWith("java.")) {
continue;
}
out.println("import " + s + ';');
}
}
out.println();
}
if (td.type == TypeDesc.TypeEnum.ENUM) {
boolean text = false;
for (Map.Entry<String, FieldDesc> e : td.fdMap.entrySet()) {
if (!e.getKey().equals(e.getValue().name)) {
text = true;
break;
}
}
if (NOT_COMPARE_MODE) {
out.println(JDOC_OPEN);
out.println(JDOC_CONT + td.xsNamespace + ':' + td.xsName + " enumeration.");
if (AUTHOR != null) {
out.println(JDOC_CONT + AUTHOR);
}
printDocumentation(out, td.documentation, JDOC_CONT);
out.println(JDOC_CLOSE);
}
out.print("public enum " + typeName + (text
? (JB_OFF
? ""
: " implements com.intellij.util.xml.NamedEnum")
: ""));
out.print(" {");
boolean first = true;
for (Map.Entry<String, FieldDesc> e : td.fdMap.entrySet()) {
final String val = e.getKey();
final FieldDesc id = e.getValue();
if (first) {
first = false;
out.println("");
} else {
out.println(',');
}
if (text) {
out.print('\t' + id.name + " (\"" + val + "\")");
} else {
out.print('\t' + id.name);
}
}
if (text) {
out.println(';');
out.println();
out.println("\tprivate final " + stringClass + " value;");
out.println("\tprivate " + typeName + '(' + stringClass + " value) { this.value = value; }");
out.println("\tpublic " + stringClass + " getValue() { return value; }");
}
out.println();
out.println('}');
return;
}
if (NOT_COMPARE_MODE) {
out.println(JDOC_OPEN);
if (td.type == TypeDesc.TypeEnum.GROUP_INTERFACE) {
out.println(JDOC_CONT + td.xsNamespace + ':' + td.xsName + " model group interface.");
} else {
out.println(JDOC_CONT + td.xsNamespace + ':' + td.xsName + " interface.");
}
printDocumentation(out, td.documentation, JDOC_CONT);
if (AUTHOR != null) {
out.println(JDOC_CONT + AUTHOR);
}
out.println(JDOC_CLOSE);
}
out.print("public interface " + typeName);
if (nsd.superClass != null || (td.supers != null && td.supers.length > 1)) {
boolean comma = false;
if (td.type != TypeDesc.TypeEnum.GROUP_INTERFACE) {
if (nsd.superClass != null) {
out.print(" extends " + nsd.superClass.substring(nsd.superClass.lastIndexOf(".") + 1));
comma = true;
}
}
if (td.supers != null && td.supers.length > 0) {
if (!comma) {
out.print(" extends ");
}
for (TypeDesc aSuper : td.supers) {
if (comma) {
out.print(", ");
} else {
comma = true;
}
out.print(aSuper.name);
}
}
}
out.println(" {");
final FieldDesc[] fields = td.fdMap.values().toArray(new FieldDesc[td.fdMap.size()]);
if (fields.length == 0) {
Util.logwarn("no fields in: " + td.xsName);
}
Arrays.sort(fields, (o1, o2) -> o1.realIndex - o2.realIndex);
out.println("");
for (FieldDesc field : fields) {
final String tagName = field.tagName;
String type = myUseQualifiedClassNames ? pkgName + '.' + field.type : field.type;
String elementType = myUseQualifiedClassNames ? pkgName + '.' + field.elementType : field.elementType;
String name = field.name;
final String paramName = toJavaIdName(field.clType > 0 ? name : field.elementName);
final String javaDocTagName = field.clType < 0
? tagName + " children"
: tagName != null ? tagName + " child" : "simple content";
final boolean isAttr = field.clType == FieldDesc.ATTR;
final boolean isList = field.clType < 0;
if (name.equals("class")) { // getClass method prohibited
name = "clazz";
}
final boolean nameChanged = field.tagName != null &&
!name
.equals(isList
? Util.pluralize(Util.toJavaFieldName(field.tagName))
: Util.toJavaFieldName(field.tagName));
// annotations
// types replacement
String newType = field.clType < 0 ? elementType : type;
final String converterString = null;
if (field.simpleTypesString != null) {
if (field.simpleTypesString.indexOf(":fully-qualified-classType;") != -1) { // localType, remoteType, etc.
newType = "PsiClass";
//converterString = (JB_OFF ? "//" : "")+"\t@Convert (PsiClassReferenceConverter.class)";
} else if (field.simpleTypesString.indexOf(":ejb-linkType;") != -1) {
} else if (field.simpleTypesString.indexOf(":ejb-ref-nameType;") != -1) { // jndi-nameType
} else if (field.simpleTypesString.indexOf(":pathType;") != -1) {
} else if (field.simpleTypesString.indexOf(":java-identifierType;") != -1) {
//out.println((JB_OFF ? "//" : "") +"\t@Convert (JavaIdentifierConverter.class)");
} else if (field.simpleTypesString.indexOf(":QName;") != -1) {
// ???
} else if (field.simpleTypesString.indexOf(":integer;") != -1) { // BigDecimal
newType = REPLACE_TYPES_WITH_INTERFACES ? "Integer" : "int";
} else if (field.simpleTypesString.indexOf(":int;") != -1) {
newType = REPLACE_TYPES_WITH_INTERFACES ? "Integer" : "int";
} else if (field.simpleTypesString.indexOf(":byte;") != -1) {
newType = REPLACE_TYPES_WITH_INTERFACES ? "Byte" : "byte";
} else if (field.simpleTypesString.indexOf(":short;") != -1) {
newType = REPLACE_TYPES_WITH_INTERFACES ? "Short" : "short";
} else if (field.simpleTypesString.indexOf(":long;") != -1) {
newType = REPLACE_TYPES_WITH_INTERFACES ? "Long" : "long";
} else if (field.simpleTypesString.indexOf(":float;") != -1) {
newType = REPLACE_TYPES_WITH_INTERFACES ? "Float" : "float";
} else if (field.simpleTypesString.indexOf(":double;") != -1) {
newType = REPLACE_TYPES_WITH_INTERFACES ? "Double" : "double";
} else if (field.simpleTypesString.indexOf(":boolean;") != -1) { // true-falseType
newType = REPLACE_TYPES_WITH_INTERFACES ? "Boolean" : "boolean";
}
for (int idx = 0; idx != -1; ) {
simpleTypes.add(field.simpleTypesString.substring(idx));
idx = field.simpleTypesString.indexOf(';', idx) + 1;
if (idx == 0) {
break;
}
}
}
if (REPLACE_TYPES_WITH_INTERFACES) {
switch (Math.abs(field.clType)) {
case FieldDesc.ATTR:
newType = "GenericAttributeValue<" + newType + '>';
break;
case FieldDesc.BOOL:
newType = "GenericDomValue<Boolean>";
break;
case FieldDesc.SIMPLE:
break;
case FieldDesc.STR:
newType = "GenericDomValue<" + newType + '>';
break;
case FieldDesc.OBJ: {
final TypeDesc ftd = jtMap.get(field.contentQualifiedName);
if (ftd != null && ftd.type == TypeDesc.TypeEnum.ENUM) {
newType = "GenericDomValue<" + ftd.name + '>';
}
break;
}
}
}
if (newType != null && isList) {
elementType = newType;
} else if (newType != null) {
type = newType;
}
if (isList) {
type = "java.util.List<" + elementType + '>';
}
final StringBuffer sbAnnotations = new StringBuffer();
if (field.clType == FieldDesc.SIMPLE) {
// sbAnnotations.append((JB_OFF ? "//" : "") +"\t@TagValue");
}
//else if (isAttr && nameChanged) {
else if (isAttr) {
sbAnnotations.append((JB_OFF ? "//" : "") + "\t@com.intellij.util.xml.Attribute (\"")
.append(tagName)
.append("\")");
} else if (isList) {
sbAnnotations.append((JB_OFF ? "//" : "") + "\t@SubTagList (\"" + tagName + "\")");
//if (nameChanged) {
// sbAnnotations.append((JB_OFF ? "//" : "") + "\t@SubTag (\"").append(tagName).append("\")");
//} else {
// if (isBadTagName(tagName)) {
// sbAnnotations.append((JB_OFF ? "//" : "") + "\t@SubTagList (\"").append(tagName).append(
// "\")");
// }
//}
} else {
if (field.duplicateIndex >= 0) {
sbAnnotations.append((JB_OFF ? "//" : "") + "\t@SubTag (value = \"").append(tagName).append(
"\", index = ")
.append(field.duplicateIndex - 1).append(')');
} else if (field.clType == FieldDesc.BOOL) {
sbAnnotations.append((JB_OFF ? "//" : "") + "\t@SubTag (value = \"").append(tagName).append(
"\", indicator = true)");
//} else if (!name.equals(field.name)) {
} else {
sbAnnotations.append((JB_OFF ? "//" : "") + "\t@SubTag (\"").append(tagName).append("\")");
}
}
if (converterString != null) {
sbAnnotations.append('\n').append(converterString);
}
if (NOT_COMPARE_MODE && td.type != TypeDesc.TypeEnum.GROUP_INTERFACE) {
out.println('\t' + JDOC_OPEN);
final String text;
if (isList) {
text = "the list of " + javaDocTagName;
} else {
text = "the value of the " + javaDocTagName;
}
out.println('\t' + JDOC_CONT + "Returns " + text + '.');
printDocumentation(out, field.documentation, '\t' + JDOC_CONT);
out.println('\t' + JDOC_CONT + "@return " + text + '.');
out.println('\t' + JDOC_CLOSE);
}
out.println((JB_OFF ? "//" : "") + "\t@NotNull");
if (sbAnnotations.length() > 0) {
out.println(sbAnnotations);
}
if (td.type != TypeDesc.TypeEnum.GROUP_INTERFACE) {
// if (sbAnnotations.length() > 0) {
// out.println(sbAnnotations);
// }
if (field.required) {
out.println((JB_OFF ? "//" : "") + "\t@Required");
}
}
out.print('\t');
//out.print("public ");
out.print(type);
out.print(' ');
out.print("get");
out.print(Util.capitalize(name));
out.println("();");
final boolean genAddRemoveInsteadOfSet = true;
if (!genAddRemoveInsteadOfSet || field.clType > 0) {
if (field.clType == FieldDesc.SIMPLE) {
if (NOT_COMPARE_MODE && td.type != TypeDesc.TypeEnum.GROUP_INTERFACE) {
out.println('\t' + JDOC_OPEN);
if (field.clType < 0) {
out.println('\t' + JDOC_CONT + "Sets the list of " + javaDocTagName + '.');
} else {
out.println('\t' + JDOC_CONT + "Sets the value of the " + javaDocTagName + '.');
}
out.println('\t' + JDOC_CONT + "@param " + paramName + " the new value to set");
out.println('\t' + JDOC_CLOSE);
if (sbAnnotations.length() > 0) {
out.println(sbAnnotations);
}
}
out.print('\t');
//out.print("public ");
out.print("void set");
out.print(Util.capitalize(name));
out.print('(');
if (field.required) {
out.print((JB_OFF ? "" : "@NotNull "));
}
out.print(type);
out.print(' ');
out.print(paramName);
out.println(");");
}
} else {
if (NOT_COMPARE_MODE && td.type != TypeDesc.TypeEnum.GROUP_INTERFACE) {
out.println('\t' + JDOC_OPEN);
out.println('\t' + JDOC_CONT + "Adds new child to the list of " + javaDocTagName + '.');
out.println('\t' + JDOC_CONT + "@return created child");
out.println('\t' + JDOC_CLOSE);
if (sbAnnotations.length() > 0) {
out.println(sbAnnotations);
}
}
out.print('\t');
//out.print("public ");
out.print(elementType + " add");
out.print(Util.capitalize(field.elementName));
out.println("();");
}
out.println("");
out.println("");
}
out.println('}');
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try {
out.close();
} catch (Exception ex) {
}
fileManager.releaseOutputFile(outFile);
}
}