kinman 2003/08/18 17:36:35 Modified: jasper2/src/share/org/apache/jasper/compiler Generator.java Node.java Log: - Adjust Java lines mappings for codes that are generated in buffers. The diff is more than was actually changed, due to a change of a class name. Revision Changes Path 1.197 +80 -32 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java Index: Generator.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v retrieving revision 1.196 retrieving revision 1.197 diff -u -r1.196 -r1.197 --- Generator.java 17 Aug 2003 21:54:36 -0000 1.196 +++ Generator.java 19 Aug 2003 00:36:35 -0000 1.197 @@ -91,7 +91,7 @@ private static final Class[] OBJECT_CLASS = { Object.class}; private ServletWriter out; - private MethodsBuffer methodsBuffer; + private ArrayList methodsBuffered; private FragmentHelperClass fragmentHelperClass; private ErrorDispatcher err; private BeanRepository beanInfo; @@ -695,7 +695,7 @@ private boolean isFragment; private boolean isTagFile; private ServletWriter out; - private MethodsBuffer methodsBuffer; + private ArrayList methodsBuffered; private FragmentHelperClass fragmentHelperClass; private int methodNesting; private TagInfo tagInfo; @@ -706,13 +706,13 @@ */ public GenerateVisitor(boolean isTagFile, ServletWriter out, - MethodsBuffer methodsBuffer, + ArrayList methodsBuffered, FragmentHelperClass fragmentHelperClass, ClassLoader loader, TagInfo tagInfo) { this.isTagFile = isTagFile; this.out = out; - this.methodsBuffer = methodsBuffer; + this.methodsBuffered = methodsBuffered; this.fragmentHelperClass = fragmentHelperClass; this.loader = loader; this.tagInfo = tagInfo; @@ -1485,7 +1485,6 @@ // If the tag contains no scripting element, generate its codes // to a method. ServletWriter outSave = null; - MethodsBuffer methodsBufferSave = null; Node.ChildInfo ci = n.getChildInfo(); if (ci.isScriptless() && !ci.hasScriptingVars()) { // The tag handler and its body code can reside in a separate @@ -1515,9 +1514,10 @@ // Set up new buffer for the method outSave = out; - out = methodsBuffer.getOut(); - methodsBufferSave = methodsBuffer; - methodsBuffer = new MethodsBuffer(); + GenBuffer genBuffer = new GenBuffer( + n.implementsSimpleTag()? null:n.getBody()); + methodsBuffered.add(genBuffer); + out = genBuffer.getOut(); methodNesting++; // Generate code for method declaration @@ -1590,12 +1590,7 @@ methodNesting--; - // Append any methods that got generated in the body to the - // current buffer - out.print(methodsBuffer.toString()); - - // restore previous buffer - methodsBuffer = methodsBufferSave; + // restore previous writer out = outSave; } } @@ -2722,7 +2717,7 @@ fragmentHelperClass.openFragment(n, tagHandlerVar, methodNesting); ServletWriter outSave = out; - out = fragment.getMethodsBuffer().getOut(); + out = fragment.getGenBuffer().getOut(); String tmpParent = parent; parent = tagHandlerVar; boolean tmpIsFragment = isFragment; @@ -2851,12 +2846,17 @@ * Common part of postamble, shared by both servlets and tag files. */ private void genCommonPostamble() { - // Append any methods that were generated - out.printMultiLn(methodsBuffer.toString()); + // Append any methods that were generated in the buffer. + for (int i = 0; i < methodsBuffered.size(); i++) { + GenBuffer methodBuffer = (GenBuffer) methodsBuffered.get(i); + methodBuffer.adjustJavaLines(out.getJavaLine()-1); + out.printMultiLn(methodBuffer.toString()); + } // Append the helper class if( fragmentHelperClass.isUsed() ) { fragmentHelperClass.generatePostamble(); + fragmentHelperClass.adjustJavaLines(out.getJavaLine()-1); out.printMultiLn(fragmentHelperClass.toString()); } @@ -2910,7 +2910,7 @@ */ Generator(ServletWriter out, Compiler compiler) { this.out = out; - methodsBuffer = new MethodsBuffer(); + methodsBuffered = new ArrayList(); err = compiler.getErrorDispatcher(); ctxt = compiler.getCompilationContext(); fragmentHelperClass = new FragmentHelperClass( @@ -2949,7 +2949,7 @@ gen.fragmentHelperClass.generatePreamble(); page.visit(gen.new GenerateVisitor(gen.ctxt.isTagFile(), out, - gen.methodsBuffer, + gen.methodsBuffered, gen.fragmentHelperClass, gen.ctxt.getClassLoader(), tagInfo)); @@ -2960,7 +2960,7 @@ gen.fragmentHelperClass.generatePreamble(); page.visit(gen.new GenerateVisitor(gen.ctxt.isTagFile(), out, - gen.methodsBuffer, + gen.methodsBuffered, gen.fragmentHelperClass, gen.ctxt.getClassLoader(), null)); @@ -3406,12 +3406,20 @@ } } - private static class MethodsBuffer { + /** + * A class for generating codes to a buffer. + */ + private static class GenBuffer { + private Node.Nodes body; private java.io.CharArrayWriter charWriter; protected ServletWriter out; - MethodsBuffer() { + GenBuffer(Node.Nodes body) { + this.body = body; + if (body != null) { + body.setGeneratedInBuffer(true); + } charWriter = new java.io.CharArrayWriter(); out = new ServletWriter(new java.io.PrintWriter(charWriter)); } @@ -3423,6 +3431,38 @@ public String toString() { return charWriter.toString(); } + + /** + * Adjust the Java Lines. This is necessary because the Java lines + * stored with the nodes are relative the beginning of this buffer + * and need to be adjusted when this buffer is inserted into the + * source. + */ + public void adjustJavaLines(final int offset) { + + if (body != null) { + try { + body.visit(new Node.Visitor() { + public void doVisit(Node n) { + if (n.getBeginJavaLine() > 0) { + n.setBeginJavaLine(n.getBeginJavaLine() + offset); + n.setEndJavaLine(n.getEndJavaLine() + offset); + } + } + + public void visit(Node.CustomTag n) + throws JasperException { + doVisit(n); + Node.Nodes body = n.getBody(); + if (body != null && !body.isGeneratedInBuffer()) { + body.visit(this); + } + } + }); + } catch (JasperException ex) { + } + } + } } /** @@ -3431,16 +3471,16 @@ private static class FragmentHelperClass { private static class Fragment { - private MethodsBuffer methodsBuffer; + private GenBuffer genBuffer; private int id; - public Fragment( int id ) { + public Fragment( int id, Node.Nodes body ) { this.id = id; - methodsBuffer = new MethodsBuffer(); + genBuffer = new GenBuffer(body); } - public MethodsBuffer getMethodsBuffer() { - return this.methodsBuffer; + public GenBuffer getGenBuffer() { + return this.genBuffer; } public int getId() { @@ -3456,7 +3496,7 @@ private String className; // Buffer for entire helper class - private MethodsBuffer classBuffer = new MethodsBuffer(); + private GenBuffer classBuffer = new GenBuffer(null); public FragmentHelperClass( String className ) { this.className = className; @@ -3497,11 +3537,11 @@ int methodNesting) throws JasperException { - Fragment result = new Fragment( fragments.size() ); + Fragment result = new Fragment( fragments.size(), parent.getBody()); fragments.add( result ); this.used = true; - ServletWriter out = result.getMethodsBuffer().getOut(); + ServletWriter out = result.getGenBuffer().getOut(); out.pushIndent(); out.pushIndent(); // XXX - Returns boolean because if a tag is invoked from @@ -3532,7 +3572,7 @@ } public void closeFragment( Fragment fragment, int methodNesting ) { - ServletWriter out = fragment.getMethodsBuffer().getOut(); + ServletWriter out = fragment.getGenBuffer().getOut(); // XXX - See comment in openFragment() if (methodNesting > 0) { out.printil( "return false;" ); @@ -3548,7 +3588,8 @@ // Generate all fragment methods: for( int i = 0; i < fragments.size(); i++ ) { Fragment fragment = (Fragment)fragments.get( i ); - out.printMultiLn( fragment.getMethodsBuffer().toString() ); + fragment.getGenBuffer().adjustJavaLines(out.getJavaLine()-1); + out.printMultiLn( fragment.getGenBuffer().toString() ); } // Generate postamble: @@ -3610,6 +3651,13 @@ public String toString() { return classBuffer.toString(); + } + + public void adjustJavaLines(int offset) { + for( int i = 0; i < fragments.size(); i++ ) { + Fragment fragment = (Fragment)fragments.get(i); + fragment.getGenBuffer().adjustJavaLines(offset); + } } } } 1.75 +12 -3 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Node.java Index: Node.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Node.java,v retrieving revision 1.74 retrieving revision 1.75 diff -u -r1.74 -r1.75 --- Node.java 11 May 2003 22:54:47 -0000 1.74 +++ Node.java 19 Aug 2003 00:36:35 -0000 1.75 @@ -2103,6 +2103,7 @@ private List list; private Node.Root root; // null if this is not a page + private boolean generatedInBuffer; public Nodes() { list = new Vector(); @@ -2158,6 +2159,14 @@ public Node.Root getRoot() { return root; + } + + public boolean isGeneratedInBuffer() { + return generatedInBuffer; + } + + public void setGeneratedInBuffer(boolean g) { + generatedInBuffer = g; } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]