costin 01/06/16 13:35:20 Modified: jasper34/generator/org/apache/jasper34/core Compiler.java Log: Compiler is the main helper to convert jsp to java and to class. This fix eliminates a lot of duplicated code from various liaisons, moves logging and all common operations here and cleans up ( a bit ) the process. The compile() method was removed - it didn't provide enough control on error reporting and guessing. To compile java files you need to create a JavaCompiler and use it - then we can access the message ( and process it to extract line numbers and map them ). Revision Changes Path 1.5 +93 -119 jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/core/Compiler.java Index: Compiler.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/core/Compiler.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- Compiler.java 2001/06/12 15:00:26 1.4 +++ Compiler.java 2001/06/16 20:35:20 1.5 @@ -56,13 +56,9 @@ */ package org.apache.jasper34.core; -import java.util.Hashtable; -import java.io.FileNotFoundException; -import java.io.File; -import java.io.PrintWriter; -import java.io.ByteArrayOutputStream; -import java.io.FileOutputStream; -import java.io.OutputStreamWriter; +import java.util.*; +import java.io.*; +import java.net.*; import org.apache.jasper34.core.*; import org.apache.jasper34.parser.*; @@ -89,6 +85,7 @@ */ public class Compiler { protected ContainerLiaison containerL; + protected int debug=0; /** */ @@ -96,6 +93,10 @@ this.containerL=liaison; } + public void setDebug( int d ) { + debug=d; + } + // -------------------- Conversion methods -------------------- /** @@ -107,17 +108,13 @@ public boolean jsp2java(JspPageInfo pageInfo) throws FileNotFoundException, JasperException, Exception { - // assert pageInfo has valid mangler, jspFile - String javaFileName = pageInfo.getMangler().getJavaFileName(); - //pageInfo.setServletJavaFileName(javaFileName); - containerL.message("jsp.message.java_file_name_is", - new Object[] { javaFileName }, - Log.DEBUG); + // XXX + if( debug > 0 ) + containerL.logKey("jsp.message.java_file_name_is",javaFileName ); - // Need the encoding specified in the JSP 'page' directive for // - reading the JSP page // - writing the JSP servlet source @@ -146,7 +143,14 @@ JspReader reader = JspReader. createJspReader(pageInfo.getJspFile(),containerL,jspEncoding); - OutputStreamWriter osw; +// PrintWriter pW = +// createPrintWriter( javaFileName, javaEncoding, +// containerL.getOptions().getJavaEncoding()); + // make sure the directory is created + File javaFile=new File(javaFileName); + new File( javaFile.getParent()).mkdirs(); + + OutputStreamWriter osw=null; try { osw = new OutputStreamWriter( new FileOutputStream(javaFileName),javaEncoding); @@ -173,14 +177,11 @@ new Object[] { "UTF8" })); } } - + //return new PrintWriter( osw ); pageInfo.setJavaEncoding( javaEncoding ); ServletWriter writer = new ServletWriter(new PrintWriter(osw)); - // ctxt.setReader(reader); - // ctxt.setWriter(writer); - ParseEventListener listener = new JspParseEventListener(containerL, reader, @@ -192,123 +193,97 @@ p.parse(); listener.endPageProcessing(); writer.close(); + + if( debug > 0 ) { + File f = new File( pageInfo.getMangler().getJavaFileName()); + containerL.log( "Created file : " + f + " " + f.lastModified()); + } return true; } - /** - * Compile the jsp file from the current engine context - * - * @return true if the class file was outdated the jsp file - * was recomp iled. - */ - public boolean compile(JspPageInfo pageInfo, JavaCompiler javac) - throws FileNotFoundException, JasperException, Exception - { - jsp2java( pageInfo ); - return javac( pageInfo, javac ); - } - - public void prepareCompiler( JavaCompiler javac, Options options, - JspPageInfo pageInfo) + public void prepareCompiler( JavaCompiler javac, JspPageInfo pageInfo) { - String sep = System.getProperty("path.separator"); - String classpath = containerL.getClassPath(); + Options options=pageInfo.getOptions(); + if( debug > 0 ) logCompileInfo( pageInfo ); + javac.setEncoding(pageInfo.getJavaEncoding()); - javac.setClasspath( System.getProperty("java.class.path")+ sep + - System.getProperty("tc_path_add") + sep + - classpath + sep + containerL.getOutputDir()); + javac.setClasspath( computeCompilerClassPath( pageInfo ) ); javac.setOutputDir(containerL.getOutputDir()); javac.setClassDebugInfo(pageInfo.getOptions().getClassDebugInfo()); - - String compilerPath = options.getJspCompilerPath(); - if (compilerPath != null) - javac.setCompilerPath(compilerPath); - + javac.setCompilerPath(options.getJspCompilerPath()); } - - public boolean javac(JspPageInfo pageInfo, String javacName) - throws FileNotFoundException, JasperException, Exception - { - JavaCompiler javaC=null; - try { - Class jspCompilerPlugin=Class.forName(javacName); - javaC=JavaCompiler.createJavaCompiler( containerL, - jspCompilerPlugin ); - } catch( Exception ex ) { - throw ex; + + public void logCompileInfo( JspPageInfo pageInfo ) { + Options options=pageInfo.getOptions(); + containerL.log( "CLASSPATH= " + computeCompilerClassPath( pageInfo) ); + if( debug > 2) { + containerL.log( "Encoding= " + pageInfo.getJavaEncoding() ); + containerL.log( "OutputDir= " + containerL.getOutputDir() ); } - return javac( pageInfo, javaC ); + containerL.log( "DebugInfp= " + + pageInfo.getOptions().getClassDebugInfo()); + if( options.getJspCompilerPath()!=null ) + containerL.log( "CompilerPath= " + options.getJspCompilerPath()); } + static String CPSEP = System.getProperty("path.separator"); + + public String computeCompilerClassPath( JspPageInfo pageInfo ) { + StringBuffer sb=new StringBuffer(); + String cp=System.getProperty("java.class.path"); + sb.append( cp ); + cp=System.getProperty("tc_path_add"); + if( cp!=null ) + sb.append( CPSEP ).append(cp); + cp=containerL.getClassPath(); + if( cp!=null ) + sb.append( CPSEP ).append(cp); + cp=pageInfo.getOptions().getClassPath(); + if( cp!=null ) + sb.append( CPSEP ).append(cp); + + sb.append( CPSEP ).append(containerL.getOutputDir()); + // XXX cache it in ContainerLiaison + return sb.toString(); + } - public boolean javac(JspPageInfo pageInfo, JavaCompiler javac) - throws FileNotFoundException, JasperException, Exception + + /** Create a compier based on our options + */ + public JavaCompiler createJavaCompiler(JspPageInfo pageInfo) { + String javacName=pageInfo.getOptions().getJspCompilerPlugin(); + JavaCompiler javaC=JavaCompiler.createJavaCompiler( containerL, + javacName ); + return javaC; + } + + /** Create a compier using a certain plugin + */ + public JavaCompiler createJavaCompiler(JspPageInfo pageInfo, + String javacName) { - prepareCompiler( javac, pageInfo.getOptions(), pageInfo); - ByteArrayOutputStream out = new ByteArrayOutputStream (256); - - prepareCompiler( javac, pageInfo.getOptions(), pageInfo ); - javac.setMsgOutput(out); - /** - * Execute the compiler - */ - boolean status = javac.compile(pageInfo.getMangler().getJavaFileName()); + JavaCompiler javaC=JavaCompiler.createJavaCompiler( containerL, + javacName ); + return javaC; + } + - if (!containerL.getOptions().getKeepGenerated()) { + public void postCompile( JspPageInfo pageInfo ) { + if (!pageInfo.getOptions().getKeepGenerated()) { File javaFile = new File(pageInfo.getMangler().getJavaFileName()); javaFile.delete(); } - - if (status == false) { - String msg = out.toString (); - throw new JasperException(containerL.getString("jsp.error.unable.compile") - + msg); - } - - String classFile = containerL.getOutputDir() + File.separatorChar; - - String pkgName = pageInfo.getMangler().getPackageName(); - containerL.message("jsp.message.package_name_is", - new Object[] { (pkgName==null)? - "[default package]":pkgName }, - Log.DEBUG); - - String className = pageInfo.getMangler().getClassName(); - //pageInfo.setServletClassName(className); - containerL.message("jsp.message.class_name_is", - new Object[] { className }, - Log.DEBUG); - - String classFileName = pageInfo.getMangler().getClassFileName(); - containerL.message("jsp.message.class_file_name_is", - new Object[] { classFileName }, - Log.DEBUG); - - - - if (pkgName != null && !pkgName.equals("")) - classFile = classFile + pkgName.replace('.', File.separatorChar) + - File.separatorChar; - classFile = classFile + className + ".class"; - - if (!classFile.equals(classFileName)) { - File classFileObject = new File(classFile); - File myClassFileObject = new File(classFileName); - if (myClassFileObject.exists()) - myClassFileObject.delete(); - if (classFileObject.renameTo(myClassFileObject) == false) - throw new JasperException(containerL.getString("jsp.error.unable.rename", - new Object[] { - classFileObject, - myClassFileObject - })); - } - - return true; } + /* To compile a page: + - createJavaCompiler + - prepareCompiler + - compiler.compile() + - postCompile + - report error ( javac.getCompilerMessage() ) + */ // XXX move to parser /** @@ -379,7 +354,7 @@ System.getProperty("tc_path_add") + sep + containerL.getOutputDir(), "-d", containerL.getOutputDir(), - pageInfo.getServletJavaFileName() + pageInfo.getMangler().getJavaFileName() }; StringBuffer b = new StringBuffer(); @@ -388,9 +363,8 @@ b.append(" "); } - containerL.message("jsp.message.compiling_with", - new Object[] { b.toString() }, - Log.DEBUG); + if( debug > 0 ) + containerL.logKey("jsp.message.compiling_with", b.toString() ); return b.toString(); }