Dateiverwaltung für die WebBox
ulrich
2017-03-19 72e43ddf5a01b28d57a41bdbd4b77a0519d92912
src/java/de/uhilger/filecms/api/CompileService.java
@@ -17,44 +17,101 @@
*/
package de.uhilger.filecms.api;
import static de.uhilger.filecms.api.FileMgr.HOME_DIR_NAME;
import static de.uhilger.filecms.api.FileMgr.HOME_DIR_PATH;
import static de.uhilger.filecms.api.FileMgr.PUB_DIR_NAME;
import static de.uhilger.filecms.api.FileMgr.PUB_DIR_PATH;
import de.uhilger.filecms.data.FileRef;
import de.uhilger.filecms.web.Initialiser;
import de.uhilger.transit.web.RequestKontext;
import de.uhilger.transit.web.WebKontext;
import de.uhilger.filecms.data.CompilerIssue;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.security.Principal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.tools.Diagnostic;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import org.apache.commons.io.FileUtils;
/**
 *
 */
public class CompileService implements RequestKontext, WebKontext {
public class CompileService extends Api {
  
  private static final Logger logger = Logger.getLogger(CompileService.class.getName());
  public List<CompilerIssue> compileAll(String relPath) {
    logger.fine(relPath);
    List<CompilerIssue> compilerIssues = new ArrayList();
    try {
      File targetDir = getTargetDir(relPath);
      ArrayList<File> files = new ArrayList();
      collectFiles(files, targetDir, new JavaFileFilter());
      JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
      DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector();
      StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
      Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(files);
      compiler.getTask(null, null, diagnostics, null, null, compilationUnits).call();
      fileManager.close();
      List compileResults = diagnostics.getDiagnostics();
      Iterator i = compileResults.iterator();
      while(i.hasNext()) {
        Object o = i.next();
        Diagnostic<? extends JavaFileObject> err;
        if(o instanceof Diagnostic) {
          err = (Diagnostic) o;
          CompilerIssue issue = new CompilerIssue();
          issue.setKind(err.getKind().name());
          issue.setLineNumber(err.getLineNumber());
          issue.setMessage(err.getMessage(Locale.GERMANY));
          issue.setSoureName(err.getSource().getName());
          compilerIssues.add(issue);
        }
      }
    } catch(Exception ex) {
      logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
    }
    return compilerIssues;
  }
  
  private ServletContext ctx;
  private HttpServletRequest request;
  private void collectFiles(ArrayList<File> files, File dir, FileFilter filter) {
    File[] dirFiles = dir.listFiles(filter);
    for(int i = 0; i < dirFiles.length; i++) {
      if(dirFiles[i].isDirectory()) {
        logger.fine("drill down to " + dirFiles[i].getAbsolutePath());
        collectFiles(files, dirFiles[i], filter);
      } else {
        logger.fine("add " + dirFiles[i].getAbsolutePath());
        files.add(dirFiles[i]);
      }
    }
  }
  
  public String compile(String relPath, List fileNames) throws IOException {
  public class JavaFileFilter implements FileFilter {
    @Override
    public boolean accept(File pathname) {
      boolean doAccept = false;
      if(pathname.getName().endsWith(".java") || pathname.isDirectory()) {
        doAccept = true;
      }
      return doAccept;
    }
  }
  /**
   *
   * @param relPath
   * @param fileNames
   * @param mode 0 = test, 1 = build
   * @return
   * @throws IOException
   */
  public List<CompilerIssue> compile(String relPath, List fileNames, String mode) throws IOException {
    //Files[] files1 = ... ; // input for first compilation task
    //Files[] files2 = ... ; // input for second compilation task
    
@@ -79,13 +136,19 @@
    Iterable<? extends JavaFileObject> compilationUnits1 = fileManager.getJavaFileObjectsFromFiles(files);
    
    final Iterable<String> options =
            Arrays.asList(new String[]{"-Xlint",
    if( mode.equals("1")) {
      final Iterable<String> options = Arrays.asList(new String[]{"-Xlint",
              /*"-cp", project.getClassPath(),*/
              "-d", targetDir.getAbsolutePath()
              });
      compiler.getTask(null, fileManager, diagnostics, options, null, compilationUnits1).call();
    } else {
      compiler.getTask(null, null, diagnostics, null, null, compilationUnits1).call();
    }
    
    compiler.getTask(null, fileManager, diagnostics, options, null, compilationUnits1).call();
    //compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits1).call();
    /*
    Iterable<? extends JavaFileObject> compilationUnits2
@@ -95,23 +158,26 @@
    */
    fileManager.close();
    StringBuilder msg = new StringBuilder();
    msg.append("Result of compile to Java bytecode (empty means no error):");
    for (Diagnostic<? extends JavaFileObject> err : diagnostics.getDiagnostics()) {
      msg.append('\n');
      msg.append(err.getKind());
      msg.append(": ");
      if (err.getSource() != null) {
        msg.append(err.getSource().getName());
    List compileResults = diagnostics.getDiagnostics();
    List<CompilerIssue> compilerIssues = new ArrayList();
    Iterator i = compileResults.iterator();
    while(i.hasNext()) {
      Object o = i.next();
      Diagnostic<? extends JavaFileObject> err;
      if(o instanceof Diagnostic) {
        err = (Diagnostic) o;
        CompilerIssue issue = new CompilerIssue();
        issue.setKind(err.getKind().name());
        issue.setLineNumber(err.getLineNumber());
        issue.setMessage(err.getMessage(Locale.GERMANY));
        issue.setSoureName(err.getSource().getName());
        compilerIssues.add(issue);
      }
      msg.append(':');
      msg.append(err.getLineNumber());
      msg.append(": ");
      msg.append(err.getMessage(Locale.GERMANY));
    }
    return msg.toString();
    }
    return compilerIssues;
  }
  /*
  private File getTargetDir(String relPath) {
    logger.fine(relPath);
    String targetPath = null;
@@ -146,26 +212,7 @@
    }
    return userName;
  }    
  @Override
  public HttpServletRequest getRequest() {
    return request;
  }
  @Override
  public void setRequest(HttpServletRequest r) {
    this.request = r;
  }
  @Override
  public ServletContext getServletContext() {
    return ctx;
  }
  @Override
  public void setServletContext(ServletContext servletContext) {
    this.ctx = servletContext;
  }
*/
}
@@ -185,4 +232,10 @@
 Runnable runner = (Runnable) aClass.newInstance();
 runner.run();
*/
/*
  CodeMirror Breakpoint bzw. Gutter Marker
  https://codemirror.net/demo/marker.html
*/