nodegenerator.java

来自「Jamon是一个Java文本模板引擎」· Java 代码 · 共 278 行

JAVA
278
字号
package org.jamon.nodegen;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;import java.util.List;public class NodeGenerator{    private NodeGenerator()    {}    private static boolean containsLists(List<NodeMember> p_members)    {        for (NodeMember member : p_members)        {            if (member.isList())            {                return true;            }        }        return false;    }    private static void writeSource(File p_file, NodeDescriptor p_node)        throws IOException    {        PrintWriter writer = new PrintWriter(new FileWriter(p_file));        writeHeader(writer, p_node.getMembers());        writeConstructor(writer, p_node);        writeApply(writer, p_node);        writeMembers(writer, p_node.getName(), p_node.getMembers());        writeEquals(writer, p_node.getName(), p_node.getMembers());        writeHashCode(writer, p_node.getMembers());        writeToString(writer, p_node.getMembers());        writer.println("}");        writer.close();    }    private static void writeApply(PrintWriter p_writer, NodeDescriptor p_node)    {        p_writer.println("  @Override public void apply(Analysis p_analysis)");        p_writer.println("  {");        p_writer.println("    p_analysis.case" + p_node.getName() + "(this);");        p_writer.println("  }");        p_writer.println();    }    private static void writeHeader(        PrintWriter p_writer, List<NodeMember> p_members)    {        p_writer.println("package org.jamon.node;");        p_writer.println();        if (containsLists(p_members))        {            p_writer.println("import java.util.ArrayList;");            p_writer.println("import java.util.List;");            p_writer.println();        }    }    private static void writeConstructor(        PrintWriter p_writer, NodeDescriptor p_node)    {        p_writer.println(           "public class " + p_node.getName()           + " extends " + p_node.getParent());        p_writer.println("{");        p_writer.print("  public " + p_node.getName() + "(Location p_location");        for (NodeMember member : p_node.getParentMembers())        {            if (!member.isList())            {                p_writer.print(", " + member.getType()                               + " p_" + member.getName());            }        }        for (NodeMember member : p_node.getMembers())        {            if (!member.isList())            {                p_writer.print(", " + member.getType() + " p_" + member.getName());            }        }        p_writer.println(")");        p_writer.println("  {");        p_writer.print("    super(p_location");        for (NodeMember member : p_node.getParentMembers())        {            if (!member.isList())            {                p_writer.print(", p_" + member.getName());            }        }        p_writer.println(");");        for (NodeMember member : p_node.getMembers())        {            if (!member.isList())            {                if (!member.isPrimative())                {                    p_writer.println(                        "    if (("                            + member.instanceName()                            + " = p_"                            + member.getName()                            + ") == null)");                    p_writer.println(                        "      { throw new NullPointerException(); }");                }                else                {                    p_writer.println(                        "    "                            + member.instanceName()                            + " = p_"                            + member.getName()                            + ";");                }            }        }        p_writer.println("  }");        p_writer.println();    }    private static void writeMembers(        PrintWriter p_writer,        String p_nodeName,        List<NodeMember> p_members)    {        for (NodeMember member : p_members)        {            if (member.isList())            {                p_writer.println(                    "  private final List<" + member.getType() + "> "                        + member.instanceName()                        + " = new ArrayList<" + member.getType() + ">();");                p_writer.println(                    "  public "                        + p_nodeName                        + " add"                        + member.getCapitalizedName()                        + "("                        + member.getType()                        + " p_"                        + member.getName()                        + ")");                p_writer.println("  {");                p_writer.println(                    "    if (p_"                        + member.getName()                        + " == null) { throw new NullPointerException(); }");                p_writer.println(                    "    "                        + member.instanceName()                        + ".add(p_"                        + member.getName()                        + ");");                p_writer.println("    return this;");                p_writer.println("  }");                p_writer.println(                    "  public List<" + member.getType() + "> "                    + member.getGetter()                    + " { return " + member.instanceName() + "; }");            }            else            {                p_writer.println(                    "  private final "                        + member.getType()                        + " "                        + member.instanceName()                        + ";");                p_writer.println(                    "  public "                        + member.getType() + " "                        + member.getGetter()                        + " { return " + member.instanceName() + "; }");            }            p_writer.println();        }    }    private static void writeEquals(        PrintWriter p_writer,        String p_nodeName,        List<NodeMember> p_members)    {        p_writer.println("  @Override public boolean equals(Object p_obj)");        p_writer.println("  {");        p_writer.println("    return super.equals(p_obj)");        for (NodeMember member : p_members)        {            p_writer.print("      && " + member.instanceName());            if (member.isPrimative())            {                p_writer.print(" == ((");            }            else            {                p_writer.print(".equals(((");            }            p_writer.print(p_nodeName + ") p_obj)." + member.instanceName());            if (member.isPrimative())            {                p_writer.println();            }            else            {                p_writer.println(")");            }        }        p_writer.println("    ;");        p_writer.println("  }");        p_writer.println();    }    private static void writeHashCode(        PrintWriter p_writer, List<NodeMember> p_members)    {        p_writer.println("  @Override public int hashCode()");        p_writer.println("  {");        p_writer.println("    return super.hashCode()");        for (NodeMember member : p_members)        {            p_writer.println("      ^ " + member.hashCodeExpr());        }        p_writer.println("    ;");        p_writer.println("  }");        p_writer.println();    }    private static void writeToString(        PrintWriter p_writer, List<NodeMember> p_members)    {        p_writer.println(            "  @Override protected void propertiesToString(StringBuilder p_buffer)");        p_writer.println("  {");        p_writer.println("    super.propertiesToString(p_buffer);");        for (NodeMember member : p_members)        {            p_writer.print("    addProperty");            if (member.isList())            {                p_writer.print("List");            }            p_writer.print(                "(p_buffer, \"" + member.getName() + "\", " + member.instanceName());            if (member.isList())            {                p_writer.print(".iterator()");            }            p_writer.println(");");        }        p_writer.println("  }");        p_writer.println();    }    /**     * Create Java source files for nodes described in a node file.     * @param p_nodesDescriptor A description of the nodes     *         to generate Java sources for.     * @param p_sourceDir The directory to place generated files in.     * @throws IOException     **/    public static void generateSources(        Iterable<NodeDescriptor> p_nodes, File p_sourceDir)        throws IOException    {        for (NodeDescriptor node : p_nodes)        {            writeSource(new File(p_sourceDir, node.getName() + ".java"), node);        }    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?