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