private void generateHelper()

in src/com/intellij/idea/plugin/hybris/system/type/model/generator/JetBrainsEmitter.java [541:663]


    private void generateHelper(final FileManager fileManager, final NamespaceDesc nsd, final ModelDesc model, final File outDir) {
        final Map<String, TypeDesc> jtMap = model.jtMap;
        final Map<String, NamespaceDesc> nsdMap = model.nsdMap;
        if (nsd.helperClass == null || nsd.helperClass.length() == 0) {
            return;
        }
        final ArrayList<TypeDesc> jtList = new ArrayList<>();
        for (TypeDesc td : jtMap.values()) {
            if (td.type != TypeDesc.TypeEnum.CLASS) {
                continue;
            }
//            if (!nsd.name.equals(td.xsNamespace)) {
//                continue;
//            }
            jtList.add(td);
        }
        if (jtList.size() == 0) {
            return;
        }

        final String stringClass = getStringClassName();
        final String typeName = nsd.helperClass.substring(nsd.helperClass.lastIndexOf(".") + 1);
        final String typeQName = model.toJavaQualifiedTypeName("", nsd.helperClass, false);
        final String pkgName = typeQName.substring(0, typeQName.lastIndexOf('.'));
        File outFile = new File(outDir, toJavaFileName(typeQName));
        outFile = fileManager.getOutputFile(outFile);
        PrintWriter out = null;
        try {
            Util.log("Generating type: " + typeName + "");
            out = new PrintWriter(new FileWriter(outFile));
            out.println("// Generated on " + new Date());
            out.println("// DTD/Schema  :    " + nsd.name);
            out.println("");
            if (pkgName != null) {
                out.println("package " + pkgName + ';');
            }
            out.println("");
            out.println("");
            out.println(JDOC_OPEN);
            out.println(JDOC_CONT + nsd.name + " helper class.");
            if (AUTHOR != null) {
                out.println(JDOC_CONT + AUTHOR);
            }
            out.println(JDOC_CLOSE);
            out.print("public class " + typeName + ' ');
            out.println('{');
            out.println("");
            out.println("\tprivate interface GetName { " + stringClass + " getName(Object o); }");
            out.println("\tprivate static java.util.HashMap<Class, GetName> nameMap = new java.util.HashMap();");
            out.println("\tstatic {");

            for (TypeDesc td : jtList) {
                final ArrayList<FieldDesc> fields = new ArrayList<>(td.fdMap.values());
                Collections.sort(fields, (o1, o2) -> o1.realIndex - o2.realIndex);
                int guessPriority = 0;
                FieldDesc guessedField = null;
                for (FieldDesc fd : fields) {
                    if (fd.clType == FieldDesc.STR || fd.clType == FieldDesc.SIMPLE || fd.clType == FieldDesc.ATTR) {
                        if (fd.name.equals("name") && guessPriority < 10) {
                            guessPriority = 10;
                            guessedField = fd;
                        } else if (fd.name.endsWith("Name")) {
                            if ((fd.name.endsWith(Util.decapitalize(td.name + "Name")) || fd.realIndex < 2) && guessPriority < 10) {
                                guessPriority = 10;
                                guessedField = fd;
                            } else if (fd.name.endsWith(Util.decapitalize("DisplayName")) && guessPriority < 5) {
                                guessPriority = 5;
                                guessedField = fd;
                            } else if (guessPriority < 3) {
                                guessPriority = 3;
                                guessedField = fd;
                            }
                        } else if (fd.name.equals("value") && guessPriority < 1) {
                            guessPriority = 1;
                            guessedField = fd;
                        }
                    } else if ((fd.clType == -FieldDesc.OBJ || fd.clType == -FieldDesc.STR) && fd.name.endsWith(
                        "displayNames") && guessPriority < 5) {
                        guessPriority = 5;
                        guessedField = fd;
                    }
                }
                out.println();
                final String qname = model.getNSDPrefix(td) + td.name;
                final String tdNameString = '"' + toPresentationName(td.name) + '"';
                out.println("\t\tnameMap.put(" + qname + ".class, new GetName() {");
                out.println("\t\t\tpublic " + stringClass + " getName(Object o) {");
                if (guessedField != null) {
                    out.println("\t\t\t\t" + qname + " my = (" + qname + ") o;");
                    final String getter = "my.get" + Util.capitalize(guessedField.name) + "()";
                    if (guessedField.clType > 0) {
                        out.println("\t\t\t\t" + stringClass + " s = o==null? null:" + getter +
                                    (guessedField.clType == FieldDesc.STR || guessedField.clType == FieldDesc.ATTR
                                         ? ".getValue();"
                                         : ";"));
                        out.println("\t\t\t\treturn s==null?" + tdNameString + ":s;");
                    } else {
                        out.println("\t\t\t\treturn (o!=null && " + getter + "!=null && " + getter + ".size()>0)?");
                        out.println("\t\t\t\t\tgetPresentationName(" + getter + ".get(0), null):" + tdNameString + ';');
                    }
                } else {
                    out.println("\t\t\t\treturn " + tdNameString + ';');
                }
                out.println("\t\t\t}");
                out.println("\t\t});");
            }
            out.println("\t}");

            out.println("\tpublic static " + stringClass + " getPresentationName(Object o, " + stringClass + " def) {");
            out.println("\t\tGetName g = o!=null? nameMap.get(o.getClass().getInterfaces()[0]):null;");
            out.println("\t\treturn g != null?g.getName(o):def;");
            out.println("\t}");
            out.println('}');
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {
                out.close();
            } catch (Exception ex) {
            }
            fileManager.releaseOutputFile(outFile);
        }
    }