📄 proxygenerator.java
字号:
/* * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is Jamon code, released February, 2003. * * The Initial Developer of the Original Code is Jay Sachs. Portions * created by Jay Sachs are Copyright (C) 2003 Jay Sachs. All Rights * Reserved. * * Contributor(s): Ian Robertson */package org.jamon.codegen;import java.io.OutputStream;import java.util.Iterator;public class ProxyGenerator extends AbstractSourceGenerator{ public ProxyGenerator(TemplateDescriber p_describer, TemplateUnit p_templateUnit) { super(p_describer, p_templateUnit); } public void generateSource(OutputStream p_out) throws java.io.IOException { m_writer = new CodeWriter(p_out); generateHeader(); generatePrologue(); generateImports(); generateAnnotations(); generateDeclaration(); generateConstructors(); generateIntf(); generateImplData(); if (m_templateUnit.getJamonContextType() != null) { generateJamonContextSetter(); } generateOptionalArgs(); generateFragmentInterfaces(false); if (! m_templateUnit.isParent()) { generateConstructImpl(); generateMakeRenderer(); generateRender(); } if (m_templateUnit.isParent()) { generateParentRendererClass(); } if (m_templateUnit.hasParentPath() && ! m_templateUnit.isParent()) { generateMakeParentRenderer(); } generateEpilogue(); m_writer.finish(); } private void generateImports() { m_templateUnit.printImports(m_writer); } private String getClassName() { return PathUtils.getIntfClassName(m_templateUnit.getName()); } private String getPackageName() { return PathUtils.getIntfPackageName(m_templateUnit.getName()); } private void generateHeader() { m_writer.println("// Autogenerated Jamon proxy"); m_writer.println("// " + m_describer.getExternalIdentifier( m_templateUnit.getName()).replace('\\','/')); m_writer.println(); } private void generatePrologue() { String pkgName = getPackageName(); if (pkgName.length() > 0) { m_writer.println("package " + pkgName + ";"); m_writer.println(); } } private void generateConstructors() { m_writer.println(); m_writer.println ("public " + getClassName() + "(" + ClassNames.TEMPLATE_MANAGER + " p_manager)"); m_writer.openBlock(); m_writer.println(" super(p_manager);"); m_writer.closeBlock(); m_writer.println(); if (m_templateUnit.isParent()) { m_writer.println("protected " + getClassName() + "(String p_path)"); m_writer.openBlock(); m_writer.println("super(p_path);"); m_writer.closeBlock(); m_writer.println(); } else { m_writer.println("public " + getClassName() + "()"); m_writer.openBlock(); m_writer.println(" super(\"" + m_templateUnit.getName() + "\");"); m_writer.closeBlock(); m_writer.println(); } } private void generateFragmentInterfaces(boolean p_inner) { for (Iterator<FragmentArgument> f = m_templateUnit.getDeclaredFragmentArgs(); f.hasNext(); ) { f.next().getFragmentUnit().printInterface( m_writer, "public", !p_inner); m_writer.println(); } m_writer.println(); } private void generateAnnotations() { m_writer.print("@" + ClassNames.TEMPLATE_ANNOTATION); m_writer.openList("(", true); m_writer.printListElement("signature = \"" + m_templateUnit.getSignature() + "\""); if (m_templateUnit.getGenericParams().getCount() > 0) { m_writer.printListElement( "genericsCount = " + m_templateUnit.getGenericParams().getCount()); } if (m_templateUnit.getInheritanceDepth() > 0) { m_writer.printListElement("inheritanceDepth = " + m_templateUnit.getInheritanceDepth()); } if (m_templateUnit.getJamonContextType() != null) { m_writer.printListElement( "jamonContextType = \"" + m_templateUnit.getJamonContextType() + "\""); } generateArguments(m_templateUnit); generateMethodAnnotations(); generateAbstractMethodAnnotations(); m_writer.closeList(")"); m_writer.println(); } private void generateMethodAnnotations() { Iterator<MethodUnit> signatureMethodUnits = m_templateUnit.getSignatureMethodUnits(); if (signatureMethodUnits.hasNext()) { m_writer.printListElement("methods = "); m_writer.openList("{", true); while(signatureMethodUnits.hasNext()) { MethodUnit methodUnit = signatureMethodUnits.next(); m_writer.printListElement("@" + ClassNames.METHOD_ANNOTATION); m_writer.openList("(", true); m_writer.printListElement("name = \"" + methodUnit.getName() + "\""); generateArguments(methodUnit); m_writer.closeList(")"); } m_writer.closeList("}"); } } private void generateAbstractMethodAnnotations() { if (!m_templateUnit.getAbstractMethodNames().isEmpty()) { m_writer.printListElement("abstractMethodNames = "); m_writer.openList("{", false); for (String methodName: m_templateUnit.getAbstractMethodNames()) { m_writer.printListElement("\"" + methodName + "\""); } m_writer.closeList("}"); } } private void generateArguments(Unit p_unit) { generateArgumentAnnotations( "requiredArguments", p_unit.getSignatureRequiredArgs()); generateArgumentAnnotations( "optionalArguments", p_unit.getSignatureOptionalArgs()); generateFragmentAnnotations(p_unit.getFragmentArgs()); } private void generateFragmentAnnotations(Iterator<FragmentArgument> p_fargs) { if (p_fargs.hasNext()) { m_writer.printListElement("fragmentArguments = "); m_writer.openList("{", true); while (p_fargs.hasNext()) { FragmentArgument farg = p_fargs.next(); m_writer.printListElement("@" + ClassNames.FRAGMENT_ANNOTATION); m_writer.openList("(", true); m_writer.printListElement("name = \"" + farg.getName() + "\""); generateArgumentAnnotations("requiredArguments", farg.getFragmentUnit().getRequiredArgs()); generateArgumentAnnotations("optionalArguments", farg.getFragmentUnit().getOptionalArgs()); m_writer.closeList(")"); } m_writer.closeList("}"); } } private void generateArgumentAnnotations( String p_label, Iterator<? extends AbstractArgument> p_args) { if (p_args.hasNext()) { m_writer.printListElement(p_label + " = "); m_writer.openList("{", true); while(p_args.hasNext()) { AbstractArgument argument = p_args.next(); m_writer.printListElement( "@" + ClassNames.ARGUMENT_ANNOTATION + "(name = \"" + argument.getName() + "\", type = \"" + argument.getType() + "\")"); } m_writer.closeList("}"); } } private void generateDeclaration() { generateCustomAnnotations(m_templateUnit.getAnnotations(), AnnotationType.PROXY); m_writer.print("public "); if(m_templateUnit.isParent()) { m_writer.print("abstract "); } m_writer.println( "class " + getClassName() + m_templateUnit.getGenericParams().generateGenericsDeclaration()); m_writer.println(" extends " + (m_templateUnit.hasParentPath() ? PathUtils.getFullyQualifiedIntfClassName( m_templateUnit.getParentPath()) : ClassNames.TEMPLATE)); m_templateUnit.printInterfaces(m_writer); m_writer.openBlock(); } private void generateConstructImpl() { m_writer.println(); m_writer.println("@Override"); m_writer.print( "protected " + ClassNames.BASE_TEMPLATE + " constructImpl" + "(Class<? extends " + ClassNames.BASE_TEMPLATE + "> p_class)"); m_writer.openBlock(); m_writer.println("try"); m_writer.openBlock(); m_writer.println("return p_class"); m_writer.indent(); m_writer.println(".getConstructor(new Class [] { " + ClassNames.TEMPLATE_MANAGER + ".class" + ", ImplData.class })"); m_writer.println( ".newInstance(new Object [] { getTemplateManager(), getImplData()});"); m_writer.outdent(); m_writer.closeBlock(); m_writer.println("catch (RuntimeException e)"); m_writer.openBlock(); m_writer.println("throw e;"); m_writer.closeBlock(); m_writer.println("catch (Exception e)"); m_writer.openBlock(); m_writer.println("throw new " + ClassNames.JAMON_RUNTIME_EXCEPTION + "(e);"); m_writer.closeBlock(); m_writer.closeBlock(); m_writer.println(); m_writer.println("@Override"); m_writer.print("protected " + ClassNames.BASE_TEMPLATE + " constructImpl()"); m_writer.openBlock(); m_writer.println( "return new " + PathUtils.getImplClassName(m_templateUnit.getName()) + m_templateUnit.getGenericParams().generateGenericParamsList() + "(getTemplateManager(), getImplData());"); m_writer.closeBlock(); } private void generateRender() { m_writer.print((m_templateUnit.isParent() ? "protected" : "public") + " void render"); m_writer.openList(); m_writer.printListElement(ArgNames.WRITER_DECL); m_templateUnit.printRenderArgsDecl(m_writer); m_writer.closeList(); m_writer.println(); m_writer.println(" throws " + ClassNames.IOEXCEPTION); m_writer.openBlock(); m_writer.print("renderNoFlush"); m_writer.openList(); m_writer.printListElement(ArgNames.WRITER); m_templateUnit.printRenderArgs(m_writer); m_writer.closeList(); m_writer.println(";"); m_writer.println(ArgNames.WRITER + ".flush();"); m_writer.closeBlock(); m_writer.print((m_templateUnit.isParent() ? "protected" : "public") + " void renderNoFlush"); m_writer.openList(); m_writer.printListElement(ArgNames.WRITER_DECL); m_templateUnit.printRenderArgsDecl(m_writer); m_writer.closeList(); m_writer.println();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -