From e3043fddcaf5e3ea4beb022c04d411661a3499bd Mon Sep 17 00:00:00 2001 From: ulrich <undisclosed> Date: Tue, 14 Mar 2017 14:27:13 +0000 Subject: [PATCH] Syntax-Check fuer Java, Gutter Marker fuer Fehler, Tooltips fuer Fehlermeldungen --- web/ui/index.html | 1 src/java/de/uhilger/filecms/data/CompilerIssue.java | 63 +++++++++++++++++++++ src/java/de/uhilger/filecms/api/CompileService.java | 41 +++++++------ web/ui/ui.js | 47 ++++++++++++++- 4 files changed, 131 insertions(+), 21 deletions(-) diff --git a/src/java/de/uhilger/filecms/api/CompileService.java b/src/java/de/uhilger/filecms/api/CompileService.java index f596dd6..d65fba2 100644 --- a/src/java/de/uhilger/filecms/api/CompileService.java +++ b/src/java/de/uhilger/filecms/api/CompileService.java @@ -21,6 +21,7 @@ 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; @@ -42,7 +43,6 @@ import javax.tools.JavaFileObject; import javax.tools.StandardJavaFileManager; import javax.tools.ToolProvider; -import org.apache.commons.io.FileUtils; /** * @@ -54,7 +54,7 @@ private ServletContext ctx; private HttpServletRequest request; - public String compile(String relPath, List fileNames) throws IOException { + public List<CompilerIssue> compile(String relPath, List fileNames) throws IOException { //Files[] files1 = ... ; // input for first compilation task //Files[] files2 = ... ; // input for second compilation task @@ -79,13 +79,16 @@ Iterable<? extends JavaFileObject> compilationUnits1 = fileManager.getJavaFileObjectsFromFiles(files); + /* final Iterable<String> options = Arrays.asList(new String[]{"-Xlint", - /*"-cp", project.getClassPath(),*/ + "-cp", project.getClassPath(), "-d", targetDir.getAbsolutePath() }); compiler.getTask(null, fileManager, diagnostics, options, null, compilationUnits1).call(); + */ + compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits1).call(); /* Iterable<? extends JavaFileObject> compilationUnits2 @@ -95,23 +98,25 @@ */ 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; diff --git a/src/java/de/uhilger/filecms/data/CompilerIssue.java b/src/java/de/uhilger/filecms/data/CompilerIssue.java new file mode 100644 index 0000000..5239489 --- /dev/null +++ b/src/java/de/uhilger/filecms/data/CompilerIssue.java @@ -0,0 +1,63 @@ +/* + 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.data; + +/** + * + */ +public class CompilerIssue { + private String soureName; + private String message; + private String kind; + private long lineNumber; + + public String getSoureName() { + return soureName; + } + + public void setSoureName(String soureName) { + this.soureName = soureName; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getKind() { + return kind; + } + + public void setKind(String kind) { + this.kind = kind; + } + + public long getLineNumber() { + return lineNumber; + } + + public void setLineNumber(long lineNumber) { + this.lineNumber = lineNumber; + } + + +} diff --git a/web/ui/index.html b/web/ui/index.html index 87c6a46..e30a181 100644 --- a/web/ui/index.html +++ b/web/ui/index.html @@ -218,6 +218,7 @@ <script src="/jslib/codemirror/addon/display/fullscreen.js"></script> <script src="/jslib/tinymce/tinymce.min.js"></script> + <script src="/jslib/tether/tether.min.js"></script> <script src="/jslib/bootstrap/js/bootstrap.min.js"></script> <script src="/jslib/mustache/mustache.min.js"></script> <script src="ui.js"></script> diff --git a/web/ui/ui.js b/web/ui/ui.js index 2cfd263..997e9ee 100644 --- a/web/ui/ui.js +++ b/web/ui/ui.js @@ -31,6 +31,7 @@ var loc; var PERS_DIR = "Persoenlich"; var PUB_DIR = "Oeffentlich"; +var compilerIssues; function fm_init() { $("#mce-editor").hide(); @@ -281,9 +282,24 @@ 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); + fm_get(u, "json", function(resp) { + cm.clearGutter("breakpoints"); + + if(resp.List[0].CompilerIssue !== undefined) { + if(resp.List[0].CompilerIssue instanceof Array) { + var issueNo = 0; + while(issueNo < resp.List[0].CompilerIssue.length) { + // 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); + fm_set_code_marker(resp.List[0].CompilerIssue[issueNo].lineNumber, resp.List[0].CompilerIssue[issueNo].kind + ' ' + resp.List[0].CompilerIssue[issueNo].message); + issueNo++; + } + } else { + fm_set_code_marker(resp.List[0].CompilerIssue.lineNumber, resp.List[0].CompilerIssue.kind + ' ' + resp.List[0].CompilerIssue.message); + } + } }); } @@ -843,6 +859,7 @@ function fm_code_edit(content, m) { cm = CodeMirror.fromTextArea(document.getElementById("editspace"), { lineNumbers: true, + gutters: ["CodeMirror-linenumbers", "breakpoints"], mode: m, viewportMargin : Infinity, tabSize: 2, @@ -859,6 +876,30 @@ //cm.setValue(content); cm.setValue(unescapeHtml(content)); cm.getDoc().markClean(); + cm.on("gutterClick", function(theEditor, lineNumber) { + var info = theEditor.lineInfo(lineNumber); + //--lineNumber; + //console.log(info.gutterMarkers.breakpoints.message); + //var marker = info.gutterMarkers.breakpoints; + //$(marker).tooltip('toggle'); + }); +} + +function fm_set_code_marker(lineNumber, message) { + cm.setGutterMarker(lineNumber-1, "breakpoints", makeMarker(message)); +} + +function makeMarker(msg) { + var marker = document.createElement("div"); + marker.style.color = "#822"; + marker.innerHTML = "●"; + //marker.message = msg; + $(marker).tooltip({ + placement: 'right', + title: msg, + offset: '10 -10' + }); + return marker; } -- Gitblit v1.9.3