Dateiverwaltung für die WebBox
ulrich
2017-03-14 e3043fddcaf5e3ea4beb022c04d411661a3499bd
commit | author | age
0ac262 1 /*
U 2     Dateiverwaltung - File management in your browser
3     Copyright (C) 2017 Ulrich Hilger, http://uhilger.de
4
5     This program is free software: you can redistribute it and/or modify
6     it under the terms of the GNU Affero General Public License as
7     published by the Free Software Foundation, either version 3 of the
8     License, or (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU Affero General Public License for more details.
14
15     You should have received a copy of the GNU Affero General Public License
16     along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18 package de.uhilger.filecms.api;
19
20 import static de.uhilger.filecms.api.FileMgr.HOME_DIR_NAME;
21 import static de.uhilger.filecms.api.FileMgr.HOME_DIR_PATH;
22 import static de.uhilger.filecms.api.FileMgr.PUB_DIR_NAME;
23 import static de.uhilger.filecms.api.FileMgr.PUB_DIR_PATH;
e3043f 24 import de.uhilger.filecms.data.CompilerIssue;
0ac262 25 import de.uhilger.filecms.data.FileRef;
U 26 import de.uhilger.filecms.web.Initialiser;
27 import de.uhilger.transit.web.RequestKontext;
28 import de.uhilger.transit.web.WebKontext;
29 import java.io.File;
30 import java.io.IOException;
31 import java.security.Principal;
32 import java.util.ArrayList;
33 import java.util.Arrays;
34 import java.util.Iterator;
35 import java.util.List;
36 import java.util.Locale;
37 import java.util.logging.Logger;
38 import javax.servlet.ServletContext;
39 import javax.servlet.http.HttpServletRequest;
40 import javax.tools.Diagnostic;
41 import javax.tools.DiagnosticCollector;
42 import javax.tools.JavaCompiler;
43 import javax.tools.JavaFileObject;
44 import javax.tools.StandardJavaFileManager;
45 import javax.tools.ToolProvider;
46
47 /**
48  *
49  */
50 public class CompileService implements RequestKontext, WebKontext {
51   
52   private static final Logger logger = Logger.getLogger(CompileService.class.getName());
53   
54   private ServletContext ctx;
55   private HttpServletRequest request;
56   
e3043f 57   public List<CompilerIssue> compile(String relPath, List fileNames) throws IOException {
0ac262 58     //Files[] files1 = ... ; // input for first compilation task
U 59     //Files[] files2 = ... ; // input for second compilation task
60     
61     File targetDir = getTargetDir(relPath);
62     //System.out.println(targetDir.getAbsolutePath());
63     ArrayList<File> files = new ArrayList();
64     
65     for(int i=0; i < fileNames.size(); i++) {
66       Object o = fileNames.get(i);
67       if(o instanceof ArrayList) {
68         ArrayList al = (ArrayList) o;
69         logger.fine(al.get(0).toString());
70         File targetFile = new File(targetDir, al.get(0).toString());
71         logger.fine(targetFile.getAbsolutePath());
72         files.add(targetFile);
73       }
74     }
75
76     JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
77     DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector();
78     StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
79
80     Iterable<? extends JavaFileObject> compilationUnits1 = fileManager.getJavaFileObjectsFromFiles(files);
81     
e3043f 82     /*
0ac262 83     final Iterable<String> options =
U 84             Arrays.asList(new String[]{"-Xlint",
e3043f 85               "-cp", project.getClassPath(),
0ac262 86               "-d", targetDir.getAbsolutePath()
U 87               });
88     
89     compiler.getTask(null, fileManager, diagnostics, options, null, compilationUnits1).call();
e3043f 90     */
U 91     compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits1).call();
0ac262 92
U 93     /*
94     Iterable<? extends JavaFileObject> compilationUnits2
95             = fileManager.getJavaFileObjects(files2); // use alternative method
96     // reuse the same file manager to allow caching of jar files
97     compiler.getTask(null, fileManager, null, null, null, compilationUnits2).call();
98     */
99     fileManager.close();
100
e3043f 101     List compileResults = diagnostics.getDiagnostics();
U 102     List<CompilerIssue> compilerIssues = new ArrayList();
103     Iterator i = compileResults.iterator();
104     while(i.hasNext()) {
105       Object o = i.next();
106       Diagnostic<? extends JavaFileObject> err;
107       if(o instanceof Diagnostic) {
108         err = (Diagnostic) o;
109         CompilerIssue issue = new CompilerIssue();
110         issue.setKind(err.getKind().name());
111         issue.setLineNumber(err.getLineNumber());
112         issue.setMessage(err.getMessage(Locale.GERMANY));
113         issue.setSoureName(err.getSource().getName());
114         compilerIssues.add(issue);
0ac262 115       }
e3043f 116     }
U 117     return compilerIssues;
0ac262 118   }
e3043f 119   
0ac262 120   private File getTargetDir(String relPath) {
U 121     logger.fine(relPath);
122     String targetPath = null;
123     if(relPath.startsWith(PUB_DIR_NAME)) {
124       targetPath = PUB_DIR_PATH + getUserName() + relPath.substring(PUB_DIR_NAME.length());
125     } else if(relPath.startsWith(HOME_DIR_NAME)) {
126       targetPath = HOME_DIR_PATH + getUserName() + relPath.substring(HOME_DIR_NAME.length());
127     } else {
128       // kann eigentlich nicht sein..
129     }
130     logger.fine(targetPath);
131     File targetDir = new File(getBase().getAbsolutePath(), targetPath);
132     return targetDir;
133   }
134   
135   private FileRef getBase() {
136     FileRef base = null;
137     Object o = getServletContext().getAttribute(Initialiser.FILE_BASE);
138     if(o instanceof String) {
139       String baseStr = (String) o;
140       logger.fine(baseStr);
141       File file = new File(baseStr);
142       base = new FileRef(file.getAbsolutePath(), file.isDirectory());
143     }
144     return base;
145   }
146   private String getUserName() {
147     String userName = null;
148     Object p = getRequest().getUserPrincipal();
149     if(p instanceof Principal) {
150       userName = ((Principal) p).getName();
151     }
152     return userName;
153   }    
154
155   @Override
156   public HttpServletRequest getRequest() {
157     return request;
158   }
159
160   @Override
161   public void setRequest(HttpServletRequest r) {
162     this.request = r;
163   }
164
165   @Override
166   public ServletContext getServletContext() {
167     return ctx;
168   }
169
170   @Override
171   public void setServletContext(ServletContext servletContext) {
172     this.ctx = servletContext;
173   }
174 }
175
176
177 /*
178
179  Beispeil fuer einen dynamischen Compiler-Aufruf
180  'in memory'
181
182  String className = "mypackage.MyClass";
183  String javaCode = "package mypackage;\n" +
184                   "public class MyClass implements Runnable {\n" +
185                   "    public void run() {\n" +
186                   "        System.out.println("\"Hello World\");\n" +
187                   "    }\n" +
188                   "}\n";
189  Class aClass = CompilerUtils.CACHED_COMPILER.loadFromJava(className, javaCode);
190  Runnable runner = (Runnable) aClass.newInstance();
191  runner.run();
192
d920b7 193 */
U 194
195 /*
196   CodeMirror Breakpoint bzw. Gutter Marker
197
198   https://codemirror.net/demo/marker.html
0ac262 199 */