/* * 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.jasper.compiler; import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import org.apache.commons.jci.compilers.CompilationResult; import org.apache.commons.jci.compilers.JavaCompiler; import org.apache.commons.jci.compilers.JavaCompilerFactory; import org.apache.commons.jci.compilers.JavaCompilerSettings; import org.apache.commons.jci.problems.CompilationProblem; import org.apache.commons.jci.readers.FileResourceReader; import org.apache.commons.jci.stores.FileResourceStore; import org.apache.jasper.JasperException; /** * JDT class compiler. This compiler will load source dependencies from the * context classloader, reducing dramatically disk access during * the compilation process. * * @author Cocoon2 * @author Remy Maucherat */ public class JCICompiler extends org.apache.jasper.compiler.Compiler { /** * Compile the servlet from .java file to .class file */ protected void generateClass(String[] smap) throws FileNotFoundException, JasperException, Exception { long t1 = 0; if (log.isDebugEnabled()) { t1 = System.currentTimeMillis(); } String packageName = ctxt.getServletPackageName(); ClassLoader classLoader = ctxt.getJspLoader(); String targetResource = (((packageName.length() != 0) ? (packageName + ".") : "") + ctxt.getServletClassName()).replace('.', '/') + ".java"; String[] resources = new String[] {targetResource}; JavaCompiler javaCompiler = (new JavaCompilerFactory()).createCompiler(options.getCompiler().substring(4)); FileResourceReader reader = new FileResourceReader(ctxt.getOptions().getScratchDir()); FileResourceStore store = new FileResourceStore(ctxt.getOptions().getScratchDir()); JavaCompilerSettings settings = javaCompiler.createDefaultSettings(); if (settings == null) { settings = new JavaCompilerSettings(); } settings.setDeprecations(false); if (ctxt.getOptions().getJavaEncoding() != null) { settings.setSourceEncoding(ctxt.getOptions().getJavaEncoding()); } if (ctxt.getOptions().getClassDebugInfo()) { // No support } // Source JVM if (ctxt.getOptions().getCompilerSourceVM() != null) { settings.setSourceVersion(ctxt.getOptions().getCompilerSourceVM()); } else { // Default to 1.5 settings.setSourceVersion("1.5"); } // Target JVM if (ctxt.getOptions().getCompilerTargetVM() != null) { settings.setTargetVersion(ctxt.getOptions().getCompilerTargetVM()); } else { // Default to 1.5 settings.setTargetVersion("1.5"); } CompilationResult result = javaCompiler.compile(resources, reader, store, classLoader, settings); ArrayList problemList = new ArrayList(); CompilationProblem[] problems = result.getErrors(); if (problems != null) { try { for (int i = 0; i < problems.length; i++) { CompilationProblem problem = problems[i]; problemList.add(ErrorDispatcher.createJavacError (problem.getFileName(), pageNodes, new StringBuffer(problem.getMessage()), problem.getStartLine(), ctxt)); } } catch (JasperException e) { log.error("Error visiting node", e); } } if (!ctxt.keepGenerated()) { File javaFile = new File(ctxt.getServletJavaFileName()); javaFile.delete(); } if (!problemList.isEmpty()) { JavacErrorDetail[] jeds = (JavacErrorDetail[]) 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 (! options.isSmapSuppressed()) { SmapUtil.installSmap(smap); } } }