src/java/de/uhilger/filecms/api/Api.java | ●●●●● patch | view | raw | blame | history | |
src/java/de/uhilger/filecms/api/CompileService.java | ●●●●● patch | view | raw | blame | history | |
src/java/de/uhilger/filecms/api/FileMgr.java | ●●●●● patch | view | raw | blame | history | |
web/WEB-INF/web.xml | ●●●●● patch | view | raw | blame | history | |
web/ui/index.html | ●●●●● patch | view | raw | blame | history | |
web/ui/ui.js | ●●●●● patch | view | raw | blame | history |
src/java/de/uhilger/filecms/api/Api.java
@@ -20,8 +20,13 @@ package de.uhilger.filecms.api; 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.security.Principal; import java.util.logging.Logger; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; @@ -30,6 +35,19 @@ */ public abstract class Api implements WebKontext, RequestKontext { private static final Logger logger = Logger.getLogger(Api.class.getName()); public static final String WBX_DATA_PATH = "daten/"; public static final String PUB_DIR_PATH = "www/"; public static final String HOME_DIR_PATH = "home/"; public static final String PUB_DIR_NAME = "Oeffentlich"; //public static final String HOME_DIR_NAME = "Persoenlicher Ordner"; public static final String HOME_DIR_NAME = "Persoenlich"; public static final String WBX_ADMIN_ROLE = "wbxAdmin"; public static final String WBX_BASE = "$basis"; public static final String WBX_DATA = "$daten"; /** Zeiger zum Servlet-Kontext dieser Anwendung */ private ServletContext ctx; @@ -37,6 +55,91 @@ private HttpServletRequest request; /** * Einen relativen Pfad in einen absoluten Pfad der WebBox * aufloesen. * * Nur die absoluten Pfade zu PUB_DIR_NAME, HOME_DIR_NAME * sowie WBX_BASE und WBX_DATA werden ausgegeben. Letztere * beiden nur fuer Nutzer mit der Rolle WBX_ADMIN_ROLE. * * D.h., es werden nur Pfade aufgeloest, die sich innerhalb * des Ordners der WeBox befinden. * * @param relPath * @return */ protected File getTargetDir(String relPath) { logger.fine(relPath); File targetDir; String targetPath = null; if(relPath.startsWith(PUB_DIR_NAME)) { targetPath = PUB_DIR_PATH + getUserName() + relPath.substring(PUB_DIR_NAME.length()); targetDir = new File(getBase().getAbsolutePath(), targetPath); } else if(relPath.startsWith(HOME_DIR_NAME)) { targetPath = HOME_DIR_PATH + getUserName() + relPath.substring(HOME_DIR_NAME.length()); targetDir = new File(getBase().getAbsolutePath(), targetPath); } else if(getRequest().isUserInRole(WBX_ADMIN_ROLE)) { logger.fine("in admin role"); if(relPath.startsWith(WBX_BASE)) { logger.fine("is base"); targetPath = getCatalinaBase(); targetDir = new File(targetPath, relPath.substring(WBX_BASE.length())); } else if(relPath.startsWith(WBX_DATA)) { targetPath = getWbxDataDir(); logger.fine("is data, combine " + targetPath + ' ' + relPath.substring(WBX_DATA.length())); targetDir = new File(targetPath, relPath.substring(WBX_DATA.length())); } else { targetDir = getDefaultDir(relPath); } } else { // kann eigentlich nicht sein.. targetDir = getDefaultDir(relPath); } logger.fine("returning targetDir " + targetDir.getAbsolutePath()); //File targetDir = new File(getBase().getAbsolutePath(), targetPath); return targetDir; } protected File getDefaultDir(String relPath) { String targetPath = PUB_DIR_PATH + getUserName() + relPath.substring(PUB_DIR_NAME.length()); return new File(getBase().getAbsolutePath(), targetPath); } protected 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; } protected String getUserName() { String userName = null; Object p = getRequest().getUserPrincipal(); if(p instanceof Principal) { userName = ((Principal) p).getName(); } return userName; } protected String getCatalinaBase() { String path = getServletContext().getRealPath("/"); logger.fine("getRealPath: " + path); // file-cms in webapps File file = new File(path); file = file.getParentFile().getParentFile(); return file.getAbsolutePath(); } protected String getWbxDataDir() { String wbxBase = getBase().getAbsolutePath(); File file = new File(wbxBase); return file.getAbsolutePath(); } /* ------------- Implementierung WebKontext ------------- */ @Override src/java/de/uhilger/filecms/api/CompileService.java
@@ -17,26 +17,17 @@ */ 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.CompilerIssue; 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.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; @@ -47,12 +38,70 @@ /** * */ 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 class JavaFileFilter implements FileFilter { @Override public boolean accept(File pathname) { boolean doAccept = false; if(pathname.getName().endsWith(".java") || pathname.isDirectory()) { doAccept = true; } return doAccept; } } /** * @@ -128,6 +177,7 @@ return compilerIssues; } /* private File getTargetDir(String relPath) { logger.fine(relPath); String targetPath = null; @@ -162,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; } */ } src/java/de/uhilger/filecms/api/FileMgr.java
@@ -46,16 +46,6 @@ public class FileMgr extends Api { private static final Logger logger = Logger.getLogger(FileMgr.class.getName()); public static final String WBX_DATA_PATH = "daten/"; public static final String PUB_DIR_PATH = "www/"; public static final String HOME_DIR_PATH = "home/"; public static final String PUB_DIR_NAME = "Oeffentlich"; //public static final String HOME_DIR_NAME = "Persoenlicher Ordner"; public static final String HOME_DIR_NAME = "Persoenlich"; public static final String WBX_ADMIN_ROLE = "wbxAdmin"; public static final String WBX_BASE = "$basis"; public static final String WBX_DATA = "$daten"; public static final int OP_COPY = 1; public static final int OP_MOVE = 2; @@ -372,86 +362,4 @@ /* ---- Hilfsfunktionen ---- */ /** * Einen relativen Pfad in einen absoluten Pfad der WebBox * aufloesen. * * Nur die absoluten Pfade zu PUB_DIR_NAME, HOME_DIR_NAME * sowie WBX_BASE und WBX_DATA werden ausgegeben. Letztere * beiden nur fuer Nutzer mit der Rolle WBX_ADMIN_ROLE. * * D.h., es werden nur Pfade aufgeloest, die sich innerhalb * des Ordners der WeBox befinden. * * @param relPath * @return */ private File getTargetDir(String relPath) { logger.fine(relPath); File targetDir; String targetPath = null; if(relPath.startsWith(PUB_DIR_NAME)) { targetPath = PUB_DIR_PATH + getUserName() + relPath.substring(PUB_DIR_NAME.length()); targetDir = new File(getBase().getAbsolutePath(), targetPath); } else if(relPath.startsWith(HOME_DIR_NAME)) { targetPath = HOME_DIR_PATH + getUserName() + relPath.substring(HOME_DIR_NAME.length()); targetDir = new File(getBase().getAbsolutePath(), targetPath); } else if(getRequest().isUserInRole(WBX_ADMIN_ROLE)) { if(relPath.startsWith(WBX_BASE)) { targetPath = getCatalinaBase(); targetDir = new File(targetPath, relPath.substring(WBX_BASE.length())); } else if(relPath.startsWith(WBX_DATA)) { targetPath = getWbxDataDir(); targetDir = new File(targetPath, relPath.substring(WBX_BASE.length())); } else { targetDir = getDefaultDir(relPath); } } else { // kann eigentlich nicht sein.. targetDir = getDefaultDir(relPath); } logger.fine(targetPath); //File targetDir = new File(getBase().getAbsolutePath(), targetPath); return targetDir; } private File getDefaultDir(String relPath) { String targetPath = PUB_DIR_PATH + getUserName() + relPath.substring(PUB_DIR_NAME.length()); return new File(getBase().getAbsolutePath(), targetPath); } 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; } private String getCatalinaBase() { String path = getServletContext().getRealPath("/"); logger.fine("getRealPath: " + path); // file-cms in webapps File file = new File(path); file = file.getParentFile().getParentFile(); return file.getAbsolutePath(); } private String getWbxDataDir() { String wbxBase = getBase().getAbsolutePath(); File file = new File(wbxBase); return file.getAbsolutePath(); } } web/WEB-INF/web.xml
@@ -7,7 +7,7 @@ Bleibt der Eintrag leer oder wird er ganz weggelassen, wird ein hart kodierter Pfad fuer die WebBox verwendet.</description> <param-name>datenAblage</param-name> <param-value> </param-value> <param-value>/home/ulli/srv/wbx_probe/daten</param-value> </context-param> <listener> <description>Der Initialiser setzt globale Variable fuer die Dateiverwaltung</description> web/ui/index.html
@@ -109,7 +109,8 @@ <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> <a id="m-test-2" class="dropdown-item" href="#">Compile</a> <a id="m-test-3" class="dropdown-item" href="#">Compile all</a> <div class="dropdown-divider"></div> <a id="logout" class="dropdown-item" href="#">Abmelden</a> </div> web/ui/ui.js
@@ -61,7 +61,8 @@ $('#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); $('#m-test-2').on('click', fm_menu_compile); $('#m-test-3').on('click', fm_menu_compile_all); $('#saveModal').on('hidden.bs.modal', function (e) { $('#modal_ok').attr('onclick','').unbind('click'); }); @@ -294,8 +295,11 @@ } } function fm_menu_test_2() { function fm_menu_compile() { fm_compile('0', fm_mark_compile_results_in_editor); } function fm_menu_compile_all() { fm_compile_all(); } function fm_mark_compile_results_in_editor(resp) { @@ -324,6 +328,32 @@ } } function fm_compile_all() { var m = '?c=de.uhilger.filecms.api.CompileService&m=compileAll&p=' + pfad; var u = '../svc' + m; fm_get(u, "json", function(resp) { if(resp.List[0].CompilerIssue !== undefined) { var lno; var eMsg; if(resp.List[0].CompilerIssue instanceof Array) { var issueNo = 0; while(issueNo < resp.List[0].CompilerIssue.length) { console.log(' +++ ---- +++ '); console.log(resp.List[0].CompilerIssue[issueNo].kind); console.log(resp.List[0].CompilerIssue[issueNo].lineNumber); console.log(resp.List[0].CompilerIssue[issueNo].sourceName); console.log(resp.List[0].CompilerIssue[issueNo].message); issueNo++; } } else { lno = resp.List[0].CompilerIssue.lineNumber; eMsg = resp.List[0].CompilerIssue.kind + ' ' + resp.List[0].CompilerIssue.message; console.log(lno + ' ' + eMsg); } } }); } function fm_compile(modeStr, callback) { var liste = fm_gewaehlte_dateien(); var m = '?c=de.uhilger.filecms.api.CompileService&m=compile&p=' + pfad + '&p=' + encodeURIComponent(liste) +