/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.sling.scripting.jsp.jasper.compiler; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; import org.apache.sling.commons.compiler.CompilationResult; import org.apache.sling.commons.compiler.CompilationUnit; import org.apache.sling.commons.compiler.CompilationUnitWithSource; import org.apache.sling.commons.compiler.CompilerMessage; import org.apache.sling.commons.compiler.Options; import org.apache.sling.scripting.jsp.jasper.JasperException; /** * JDT class compiler. This compiler will load source dependencies from the * context classloader, reducing dramatically disk access during * the compilation process. */ public class JDTCompiler extends org.apache.sling.scripting.jsp.jasper.compiler.Compiler { public JDTCompiler(boolean defaultIsSession) { super(defaultIsSession); } /** * Compile the servlet from .java file to .class file */ @Override protected void generateClass(String[] smap) throws FileNotFoundException, JasperException, Exception { long t1 = 0; if (log.isDebugEnabled()) { t1 = System.currentTimeMillis(); } final String sourceFile = ctxt.getServletJavaFileName(); final String packageName = ctxt.getServletPackageName(); final String targetClassName = ((packageName.length() != 0) ? (packageName + ".") : "") + ctxt.getServletClassName(); final CompilationUnit unit = new CompilationUnitWithSource() { /** * @see org.apache.sling.commons.compiler.CompilationUnit#getLastModified() */ public long getLastModified() { return -1; } /** * @see org.apache.sling.commons.compiler.CompilationUnit#getMainClassName() */ public String getMainClassName() { return targetClassName; } /** * @see org.apache.sling.commons.compiler.CompilationUnit#getSource() */ public Reader getSource() throws IOException { return new BufferedReader(new InputStreamReader(ctxt.getInputStream(sourceFile), ctxt.getOptions().getJavaEncoding())); } /** * @see org.apache.sling.commons.compiler.CompilationUnitWithSource#getFileName() */ public String getFileName() { return sourceFile; } }; final Options options = new Options(); options.put(Options.KEY_CLASS_LOADER_WRITER, ctxt.getRuntimeContext().getIOProvider().getClassLoaderWriter()); options.put(Options.KEY_GENERATE_DEBUG_INFO, ctxt.getOptions().getClassDebugInfo()); // Source JVM if (ctxt.getOptions().getCompilerSourceVM() != null) { options.put(Options.KEY_SOURCE_VERSION, ctxt.getOptions().getCompilerSourceVM()); } else { // Default to 1.6 options.put(Options.KEY_SOURCE_VERSION, Options.VERSION_1_6); } // Target JVM if (ctxt.getOptions().getCompilerTargetVM() != null) { options.put(Options.KEY_TARGET_VERSION, ctxt.getOptions().getCompilerTargetVM()); } else { // Default to 1.6 options.put(Options.KEY_TARGET_VERSION, Options.VERSION_1_6); } final ArrayList<JavacErrorDetail> problemList = new ArrayList<JavacErrorDetail>(); final CompilationResult result = this.ctxt.getRuntimeContext().getIOProvider().getJavaCompiler().compile(new CompilationUnit[] {unit}, options); if ( result.getErrors() != null ) { for(final CompilerMessage cm : result.getErrors() ) { final String name = cm.getFile(); try { problemList.add(ErrorDispatcher.createJavacError (name, pageNodes, new StringBuffer(cm.getMessage()), cm.getLine(), ctxt)); } catch (JasperException e) { log.error("Error visiting node", e); } } } if (!ctxt.keepGenerated()) { ctxt.delete(ctxt.getServletJavaFileName()); } if (!problemList.isEmpty()) { JavacErrorDetail[] jeds = problemList.toArray(new JavacErrorDetail[0]); errDispatcher.javacError(jeds); } if( log.isDebugEnabled() ) { long t2=System.currentTimeMillis(); log.debug("Compiled " + ctxt.getServletJavaFileName() + " " + (t2-t1) + "ms"); } if (ctxt.isPrototypeMode()) { return; } // JSR45 Support if (! this.options.isSmapSuppressed()) { SmapUtil.installSmap(getCompilationContext(), smap); } } }