From 0ac2623eb41c24c65f294ee610b66ac6af7d18dd Mon Sep 17 00:00:00 2001
From: ulrich <undisclosed>
Date: Mon, 13 Mar 2017 16:39:30 +0000
Subject: [PATCH] Compile-Versuch (erfolgreich)

---
 web/ui/index.html                                   |    1 
 src/java/logging.properties                         |    3 
 src/java/de/uhilger/filecms/api/CompileService.java |  188 +++++++++++++++++++++++++++++++++++++++++++++++
 web/ui/ui.js                                        |   11 ++
 4 files changed, 200 insertions(+), 3 deletions(-)

diff --git a/src/java/de/uhilger/filecms/api/CompileService.java b/src/java/de/uhilger/filecms/api/CompileService.java
new file mode 100644
index 0000000..1b5d18b
--- /dev/null
+++ b/src/java/de/uhilger/filecms/api/CompileService.java
@@ -0,0 +1,188 @@
+/*
+    Dateiverwaltung - File management in your browser
+    Copyright (C) 2017 Ulrich Hilger, http://uhilger.de
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Affero General Public License as
+    published by the Free Software Foundation, either version 3 of the
+    License, or (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Affero General Public License for more details.
+
+    You should have received a copy of the GNU Affero General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+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 java.io.File;
+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.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 {
+  
+  private static final Logger logger = Logger.getLogger(CompileService.class.getName());
+  
+  private ServletContext ctx;
+  private HttpServletRequest request;
+  
+  public String compile(String relPath, List fileNames) throws IOException {
+    //Files[] files1 = ... ; // input for first compilation task
+    //Files[] files2 = ... ; // input for second compilation task
+    
+    File targetDir = getTargetDir(relPath);
+    //System.out.println(targetDir.getAbsolutePath());
+    ArrayList<File> files = new ArrayList();
+    
+    for(int i=0; i < fileNames.size(); i++) {
+      Object o = fileNames.get(i);
+      if(o instanceof ArrayList) {
+        ArrayList al = (ArrayList) o;
+        logger.fine(al.get(0).toString());
+        File targetFile = new File(targetDir, al.get(0).toString());
+        logger.fine(targetFile.getAbsolutePath());
+        files.add(targetFile);
+      }
+    }
+
+    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
+    DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector();
+    StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
+
+    Iterable<? extends JavaFileObject> compilationUnits1 = fileManager.getJavaFileObjectsFromFiles(files);
+    
+    final Iterable<String> options =
+            Arrays.asList(new String[]{"-Xlint",
+              /*"-cp", project.getClassPath(),*/
+              "-d", targetDir.getAbsolutePath()
+              });
+    
+    compiler.getTask(null, fileManager, diagnostics, options, null, compilationUnits1).call();
+
+    /*
+    Iterable<? extends JavaFileObject> compilationUnits2
+            = fileManager.getJavaFileObjects(files2); // use alternative method
+    // reuse the same file manager to allow caching of jar files
+    compiler.getTask(null, fileManager, null, null, null, compilationUnits2).call();
+    */
+    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());
+      }
+      msg.append(':');
+      msg.append(err.getLineNumber());
+      msg.append(": ");
+      msg.append(err.getMessage(Locale.GERMANY));
+    }    
+    
+    return msg.toString();
+  }
+  private File getTargetDir(String relPath) {
+    logger.fine(relPath);
+    String targetPath = null;
+    if(relPath.startsWith(PUB_DIR_NAME)) {
+      targetPath = PUB_DIR_PATH + getUserName() + relPath.substring(PUB_DIR_NAME.length());
+    } else if(relPath.startsWith(HOME_DIR_NAME)) {
+      targetPath = HOME_DIR_PATH + getUserName() + relPath.substring(HOME_DIR_NAME.length());
+    } else {
+      // kann eigentlich nicht sein..
+    }
+    logger.fine(targetPath);
+    File targetDir = new File(getBase().getAbsolutePath(), targetPath);
+    return targetDir;
+  }
+  
+  private FileRef getBase() {
+    FileRef base = null;
+    Object o = getServletContext().getAttribute(Initialiser.FILE_BASE);
+    if(o instanceof String) {
+      String baseStr = (String) o;
+      logger.fine(baseStr);
+      File file = new File(baseStr);
+      base = new FileRef(file.getAbsolutePath(), file.isDirectory());
+    }
+    return base;
+  }
+  private String getUserName() {
+    String userName = null;
+    Object p = getRequest().getUserPrincipal();
+    if(p instanceof Principal) {
+      userName = ((Principal) p).getName();
+    }
+    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;
+  }
+}
+
+
+/*
+
+ Beispeil fuer einen dynamischen Compiler-Aufruf
+ 'in memory'
+
+ String className = "mypackage.MyClass";
+ String javaCode = "package mypackage;\n" +
+                  "public class MyClass implements Runnable {\n" +
+                  "    public void run() {\n" +
+                  "        System.out.println("\"Hello World\");\n" +
+                  "    }\n" +
+                  "}\n";
+ Class aClass = CompilerUtils.CACHED_COMPILER.loadFromJava(className, javaCode);
+ Runnable runner = (Runnable) aClass.newInstance();
+ runner.run();
+
+*/
\ No newline at end of file
diff --git a/src/java/logging.properties b/src/java/logging.properties
index 1f64a51..a12c65d 100644
--- a/src/java/logging.properties
+++ b/src/java/logging.properties
@@ -66,6 +66,3 @@
 # com.xyz.foo.level = SEVERE
 de.uhilger.filecms.handlers = java.util.logging.ConsoleHandler
 de.uhilger.filecms.level = FINER
-de.uhilger.filesystem.level = FINER
-de.uhilger.wbx.handlers = java.util.logging.ConsoleHandler
-de.uhilger.wbx.level = FINER
\ No newline at end of file
diff --git a/web/ui/index.html b/web/ui/index.html
index 7a1abb9..87c6a46 100644
--- a/web/ui/index.html
+++ b/web/ui/index.html
@@ -107,6 +107,7 @@
               <a class="dropdown-item disabled" href="/file-cms/ui">Dateien verwalten</a>
               <div class="dropdown-divider"></div>
               <a id="m-test" class="dropdown-item" href="#">Test</a>
+              <a id="m-test-2" class="dropdown-item" href="#">Test 2</a>
               <div class="dropdown-divider"></div>
               <a id="logout" class="dropdown-item" href="#">Abmelden</a>
             </div>
diff --git a/web/ui/ui.js b/web/ui/ui.js
index aebbbfe..3b7f34b 100644
--- a/web/ui/ui.js
+++ b/web/ui/ui.js
@@ -57,6 +57,7 @@
   $('#m-paste').on('click', fm_menu_paste);
   $('#m-shrink').on('click', fm_menu_shrink);
   $('#m-test').on('click', fm_menu_test);
+  $('#m-test-2').on('click', fm_menu_test_2);
   $('#saveModal').on('hidden.bs.modal', function (e) {
     $('#modal_ok').attr('onclick','').unbind('click');
   });
@@ -276,6 +277,16 @@
   }
 }
 
+function fm_menu_test_2() {
+  var liste = fm_gewaehlte_dateien();
+  var m = '?c=de.uhilger.filecms.api.CompileService&m=compile&p=' + pfad + '&p=' + encodeURIComponent(liste);
+  var u = '../svc' + m;
+  fm_get(u, "text", function(resp) {
+    console.log('compile gab folgendes zurueck: ');
+    console.log(resp);
+  });
+}
+
 function fm_ansicht_umschalten() {
   if($('#ansicht').children(0).hasClass('fa-th-list')) {
     $('#ansicht').children(0).addClass('fa-th-large');

--
Gitblit v1.9.3