Exemple #1
0
  /** 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();

    List<String> parameters = new ArrayList<String>(20);
    parameters.add("-encoding");
    parameters.add(ctxt.getOptions().getJavaEncoding());

    String javaFileName = new File(ctxt.getServletJavaFileName()).getPath();
    String classpath = ctxt.getClassPath();

    String sep = File.pathSeparator; // System.getProperty("path.separator");

    StringBuffer errorReport = new StringBuffer();

    StringBuffer info = new StringBuffer();
    info.append("Compile: javaFileName=" + javaFileName + "\n");

    // Start capturing the System.err output for this thread
    SystemLogHandler.setThread();

    // Initializing classpath
    String path = System.getProperty("java.class.path");
    info.append("    cmd cp=" + path + "\n");
    info.append("    ctx cp=" + classpath + "\n");
    path += sep;
    path += classpath;

    if (log.isDebugEnabled()) log.debug("Using classpath: " + path);

    parameters.add("-classpath");
    parameters.add(path);

    // Initializing sourcepath
    parameters.add("-sourcepath");
    parameters.add(options.getScratchDir().getPath());

    info.append("    work dir=" + options.getScratchDir() + "\n");

    // Initialize and set java extensions
    String extdirs = System.getProperty("java.ext.dirs");
    if (extdirs != null) {
      parameters.add("-extdirs");
      parameters.add(extdirs);
      info.append("    extension dir=" + extdirs + "\n");
    }

    if (ctxt.getOptions().getFork()) {
      String endorsed = System.getProperty("java.endorsed.dirs");
      if (endorsed != null) {
        parameters.add("-endorseddirs"); // "-J-Djava.endorsed.dirs="+endorsed
        parameters.add(endorsed);
        info.append("    endorsed dir=" + endorsed + "\n");
      } else {
        info.append("    no endorsed dirs specified\n");
      }
    }

    if (ctxt.getOptions().getClassDebugInfo()) parameters.add("-g");

    Exception ie = null;

    // Set the Java compiler to use
    if (javaCompiler == null) {
      // assumption, there is no dynamic changing Java compiler
      String compiler = options.getCompiler();
      if (compiler == null) compiler = "com.sun.tools.javac.Main";
      // verify compiler
      try {
        javaCompiler = Class.forName(compiler);
      } catch (ClassNotFoundException cnfe) {
        // try to figure out class path to compiler
        String compileClassPath = System.getProperty("java.home");
        if (compileClassPath == null)
          try {
            compileClassPath = System.getenv("JAVA_HOME");
            if (compileClassPath == null) compileClassPath = System.getenv("java_home");
          } catch (SecurityException se) {

          }

        if (compileClassPath != null) {
          // HACK for now
          compileClassPath = compileClassPath.replace("jre", "jdk");
          compileClassPath += "/lib/tools.jar";
          info.append("    checking default compiler in " + compileClassPath + "\n");
          try {
            javaCompiler =
                Class.forName(
                    compiler,
                    true,
                    new URLClassLoader(new URL[] {new URL("file", "localhost", compileClassPath)}));
          } catch (Error er) {
            log.error("Setting up Java compiler error ", er);
          } catch (Exception ex) {
            log.error("Setting up Java compiler exception ", ex);
          }
        } else info.append("    no Java home path specified\n");
      }
      info.append("    compiler=" + compiler + "\n");
    }

    if (options.getCompilerTargetVM() != null) {
      parameters.add("-target");
      parameters.add(options.getCompilerTargetVM());
      info.append("   compilerTargetVM=" + options.getCompilerTargetVM() + "\n");
    }

    if (options.getCompilerSourceVM() != null) {
      parameters.add("-source");
      parameters.add(options.getCompilerSourceVM());
      info.append("   compilerSourceVM=" + options.getCompilerSourceVM() + "\n");
    }

    info.append("   JavaPath=" + ctxt.getJavaPath() + "\n");

    parameters.add(javaFileName);

    boolean compilationErrors = false;
    String errorCapture = null;
    if (javaCompiler != null)
      try {
        Integer success;
        Method cm = javaCompiler.getMethod("compile", new Class[] {String[].class});
        if (ctxt.getOptions().getFork()) {
          success =
              (Integer)
                  cm.invoke(null, new Object[] {parameters.toArray(new String[parameters.size()])});
        } else {
          synchronized (javacLock) {
            success =
                (Integer)
                    cm.invoke(
                        null, new Object[] {parameters.toArray(new String[parameters.size()])});
          }
        }
        if (success.intValue() != 0) compilationErrors = true;
      } catch (Throwable t) {
        if (t instanceof ThreadDeath) throw (ThreadDeath) t;
        if (t instanceof InvocationTargetException) t = t.getCause();
        if (t instanceof Exception) ie = (Exception) t;
        else ie = new Exception(t);
        log.error("Javac exception ", t);
        log.error("Env: " + info.toString());
      } finally {
        // Stop capturing the System.err output for this thread
        errorCapture = SystemLogHandler.unsetThread();
      }
    if (compilationErrors && errorCapture != null) {
      errorReport.append(System.getProperty("line.separator"));
      errorReport.append(errorCapture);
    }

    if (!ctxt.keepGenerated()) {
      if (new File(javaFileName).delete() == false)
        log.error("Couldn't delete source: " + javaFileName);
    }

    if (compilationErrors || ie != null) {
      String errorReportString = errorReport.toString();
      log.error("Error compiling file: " + javaFileName + " " + errorReportString);
      JavacErrorDetail[] javacErrors =
          ErrorDispatcher.parseJavacErrors(errorReportString, javaFileName, pageNodes);
      if (javacErrors != null) {
        errDispatcher.javacError(javacErrors);
      } else {
        errDispatcher.javacError(errorReportString, ie);
      }
    }

    if (log.isDebugEnabled()) {
      long t2 = System.currentTimeMillis();
      log.debug("Compiled " + ctxt.getServletJavaFileName() + " " + (t2 - t1) + "ms");
    }

    if (ctxt.isPrototypeMode()) {
      return;
    }

    // JSR45 Support
    if (!options.isSmapSuppressed()) {
      log.debug("Install Smap " + (smap == null ? "null" : Arrays.toString(smap)));
      SmapUtil.installSmap(smap);
    }
  }
  /** 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();
    }

    String javaEncoding = ctxt.getOptions().getJavaEncoding();
    String javaFileName = ctxt.getServletJavaFileName();
    String classpath = ctxt.getClassPath();

    String sep = System.getProperty("path.separator");

    StringBuilder errorReport = new StringBuilder();

    StringBuilder info = new StringBuilder();
    info.append("Compile: javaFileName=" + javaFileName + "\n");
    info.append("    classpath=" + classpath + "\n");

    // Start capturing the System.err output for this thread
    SystemLogHandler.setThread();

    // Initializing javac task
    getProject();
    Javac javac = (Javac) project.createTask("javac");

    // Initializing classpath
    Path path = new Path(project);
    path.setPath(System.getProperty("java.class.path"));
    info.append("    cp=" + System.getProperty("java.class.path") + "\n");
    StringTokenizer tokenizer = new StringTokenizer(classpath, sep);
    while (tokenizer.hasMoreElements()) {
      String pathElement = tokenizer.nextToken();
      File repository = new File(pathElement);
      path.setLocation(repository);
      info.append("    cp=" + repository + "\n");
    }

    if (log.isDebugEnabled())
      log.debug("Using classpath: " + System.getProperty("java.class.path") + sep + classpath);

    // Initializing sourcepath
    Path srcPath = new Path(project);
    srcPath.setLocation(options.getScratchDir());

    info.append("    work dir=" + options.getScratchDir() + "\n");

    // Initialize and set java extensions
    String exts = System.getProperty("java.ext.dirs");
    if (exts != null) {
      Path extdirs = new Path(project);
      extdirs.setPath(exts);
      javac.setExtdirs(extdirs);
      info.append("    extension dir=" + exts + "\n");
    }

    // Add endorsed directories if any are specified and we're forking
    // See Bugzilla 31257
    if (ctxt.getOptions().getFork()) {
      String endorsed = System.getProperty("java.endorsed.dirs");
      if (endorsed != null) {
        Javac.ImplementationSpecificArgument endorsedArg = javac.createCompilerArg();
        endorsedArg.setLine("-J-Djava.endorsed.dirs=" + quotePathList(endorsed));
        info.append("    endorsed dir=" + quotePathList(endorsed) + "\n");
      } else {
        info.append("    no endorsed dirs specified\n");
      }
    }

    // Configure the compiler object
    javac.setEncoding(javaEncoding);
    javac.setClasspath(path);
    javac.setDebug(ctxt.getOptions().getClassDebugInfo());
    javac.setSrcdir(srcPath);
    javac.setTempdir(options.getScratchDir());
    javac.setOptimize(!ctxt.getOptions().getClassDebugInfo());
    javac.setFork(ctxt.getOptions().getFork());
    info.append("    srcDir=" + srcPath + "\n");

    // Set the Java compiler to use
    if (options.getCompiler() != null) {
      javac.setCompiler(options.getCompiler());
      info.append("    compiler=" + options.getCompiler() + "\n");
    }

    if (options.getCompilerTargetVM() != null) {
      javac.setTarget(options.getCompilerTargetVM());
      info.append("   compilerTargetVM=" + options.getCompilerTargetVM() + "\n");
    }

    if (options.getCompilerSourceVM() != null) {
      javac.setSource(options.getCompilerSourceVM());
      info.append("   compilerSourceVM=" + options.getCompilerSourceVM() + "\n");
    }

    // Build includes path
    PatternSet.NameEntry includes = javac.createInclude();

    includes.setName(ctxt.getJavaPath());
    info.append("    include=" + ctxt.getJavaPath() + "\n");

    BuildException be = null;

    try {
      if (ctxt.getOptions().getFork()) {
        javac.execute();
      } else {
        synchronized (javacLock) {
          javac.execute();
        }
      }
    } catch (BuildException e) {
      be = e;
      log.error(Localizer.getMessage("jsp.error.javac"), e);
      log.error(Localizer.getMessage("jsp.error.javac.env") + info.toString());
    }

    errorReport.append(logger.getReport());

    // Stop capturing the System.err output for this thread
    String errorCapture = SystemLogHandler.unsetThread();
    if (errorCapture != null) {
      errorReport.append(Constants.NEWLINE);
      errorReport.append(errorCapture);
    }

    if (!ctxt.keepGenerated()) {
      File javaFile = new File(javaFileName);
      javaFile.delete();
    }

    if (be != null) {
      String errorReportString = errorReport.toString();
      log.error(Localizer.getMessage("jsp.error.compilation", javaFileName, errorReportString));
      JavacErrorDetail[] javacErrors =
          ErrorDispatcher.parseJavacErrors(errorReportString, javaFileName, pageNodes);
      if (javacErrors != null) {
        errDispatcher.javacError(javacErrors);
      } else {
        errDispatcher.javacError(errorReportString, be);
      }
    }

    if (log.isDebugEnabled()) {
      long t2 = System.currentTimeMillis();
      log.debug("Compiled " + ctxt.getServletJavaFileName() + " " + (t2 - t1) + "ms");
    }

    logger = null;
    project = null;

    if (ctxt.isPrototypeMode()) {
      return;
    }

    // JSR45 Support
    if (!options.isSmapSuppressed()) {
      SmapUtil.installSmap(smap);
    }
  }