costin 01/06/05 23:16:05 Modified: jasper34/generator/org/apache/jasper34/generator GeneratorBase.java Log: The modified GeneratorBase, with individual methods for each hook Revision Changes Path 1.2 +132 -9 jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/generator/GeneratorBase.java Index: GeneratorBase.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/generator/GeneratorBase.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- GeneratorBase.java 2001/05/27 23:19:31 1.1 +++ GeneratorBase.java 2001/06/06 06:16:03 1.2 @@ -1,8 +1,4 @@ /* - * $Header: /home/cvs/jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/generator/GeneratorBase.java,v 1.1 2001/05/27 23:19:31 costin Exp $ - * $Revision: 1.1 $ - * $Date: 2001/05/27 23:19:31 $ - * * ==================================================================== * * The Apache Software License, Version 1.1 @@ -62,21 +58,148 @@ package org.apache.jasper34.generator; import org.apache.jasper34.core.*; -import org.apache.jasper34.core.*; import org.apache.jasper34.runtime.JasperException; + +import java.lang.reflect.*; + +import org.apache.jasper34.parser.*; +import org.apache.jasper34.jsptree.*; /** * Helpful abstract base class that generators can extend. * * @author Anil K. Vijendran + * @author Costin Manolache */ -abstract class GeneratorBase implements Generator { +public abstract class GeneratorBase { protected JspCompilationContext ctxt; + Mark start, stop; + // protected CommentGenerator commentGenerator; + + GeneratorBase() { + } + + GeneratorBase( Mark start, Mark stop) { + this.start = start; + this.stop = stop; + } + + // public void setCommentGenerator( CommentGenerator commentGenerator ) { + // this.commentGenerator=commentGenerator; + // } - public void init(JspCompilationContext ctxt) throws JasperException { - this.ctxt = ctxt; + public void setMark( Mark start, Mark stop) { + this.start = start; + this.stop = stop; } + + // -------------------- Generator hooks -------------------- + + public static final int CLASS_DECLARATION_HOOK = 0; + public static final int DESTROY_METHOD_HOOK = 1; + public static final int FILE_DECLARATION_HOOK = 2; + public static final int INIT_METHOD_HOOK = 3; + public static final int SERVICE_METHOD_HOOK = 4; + public static final int STATIC_INITIALIZER_HOOK = 5; + + public static String hookNames[] = { + "generateClassDeclaration", + "generateDestroyMethod", + "generateFileDeclaration", + "generateInitMethod", + "generateServiceMethod", + "generateStaticInitializer" + }; + + static final int HOOK_COUNT=6; + public boolean hasHook( int hookId ) { + if( hooks==null ) initHooks(); + return hooks[hookId]; + } + + // -------------------- New interface -------------------- + + public void generateClassDeclaration( ServletWriter out ) + throws JasperException + { + } + + public void generateDestroyMethod( ServletWriter out ) + throws JasperException + { + } + public void generateFileDeclaration( ServletWriter out ) + throws JasperException + { + } + public void generateInitMethod( ServletWriter out ) + throws JasperException + { + } + public void generateServiceMethod( ServletWriter out ) + throws JasperException + { + } + public void generateStaticInitializer( ServletWriter out ) + throws JasperException + { + } + + // -------------------- Old interface -------------------- + /* + * This is really a no-op. + */ public boolean generateCoordinates(Class phase) { - return true; + return true; // generator.generateCoordinates(phase); + // will be overriden if someone needs to + } + + // void init(JspCompilationContext ctxt) throws JasperException; + public void init(JspCompilationContext ctxt) + throws JasperException + { + this.ctxt = ctxt; + // generator.init(ctxt); + // will be overriden + } + + // -------------------- Utils -------------------- + private boolean hooks[]=null; + + private void initHooks() { + hooks=new boolean[ HOOK_COUNT ]; + for( int i=1; i<HOOK_COUNT; i++ ) { + if( hasHook( this, hookNames[i] ) ) + hooks[i]=true; + else + hooks[i]=false; + } } + + private boolean hasHook( Object obj, String methodN ) { + try { + Method myMethods[]=obj.getClass().getMethods(); + for( int i=0; i< myMethods.length; i++ ) { + if( methodN.equals ( myMethods[i].getName() )) { + // check if it's overriden + Class declaring=myMethods[i].getDeclaringClass(); + Class parentOfDeclaring=declaring.getSuperclass(); + // this works only if the base class doesn't extend + // another class. + + // if the method is declared in a top level class + // like BaseInterceptor parent is Object, otherwise + // parent is BaseInterceptor or an intermediate class + if( ! "java.lang.Object". + equals(parentOfDeclaring.getName() )) { + return true; + } + } + } + } catch ( Exception ex ) { + ex.printStackTrace(); + } + return false; + } + }