launcher/src/main/java/org/apidesign/bck2brwsr/dew/Compile.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 15 Jan 2013 22:48:17 +0100
branchdew
changeset 462 aa69b1387624
child 463 3641fd0663d3
permissions -rw-r--r--
Trying to compile Java source via the javax.tools.ToolProvider.getSystemJavaCompiler
jaroslav@462
     1
/*
jaroslav@462
     2
 * To change this template, choose Tools | Templates
jaroslav@462
     3
 * and open the template in the editor.
jaroslav@462
     4
 */
jaroslav@462
     5
package org.apidesign.bck2brwsr.dew;
jaroslav@462
     6
jaroslav@462
     7
import java.io.IOException;
jaroslav@462
     8
import java.nio.charset.Charset;
jaroslav@462
     9
import java.util.ArrayList;
jaroslav@462
    10
import java.util.Collections;
jaroslav@462
    11
import java.util.Iterator;
jaroslav@462
    12
import java.util.List;
jaroslav@462
    13
import java.util.Locale;
jaroslav@462
    14
import java.util.Map;
jaroslav@462
    15
import java.util.Set;
jaroslav@462
    16
import java.util.regex.Matcher;
jaroslav@462
    17
import java.util.regex.Pattern;
jaroslav@462
    18
import javax.tools.Diagnostic;
jaroslav@462
    19
import javax.tools.DiagnosticListener;
jaroslav@462
    20
import javax.tools.FileObject;
jaroslav@462
    21
import javax.tools.JavaCompiler;
jaroslav@462
    22
import javax.tools.JavaCompiler.CompilationTask;
jaroslav@462
    23
import javax.tools.JavaFileManager;
jaroslav@462
    24
import javax.tools.JavaFileObject;
jaroslav@462
    25
import javax.tools.JavaFileObject.Kind;
jaroslav@462
    26
import javax.tools.StandardJavaFileManager;
jaroslav@462
    27
import javax.tools.StandardLocation;
jaroslav@462
    28
jaroslav@462
    29
/**
jaroslav@462
    30
 *
jaroslav@462
    31
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@462
    32
 */
jaroslav@462
    33
final class Compile implements JavaFileManager, DiagnosticListener<JavaFileObject> {
jaroslav@462
    34
    private final JFO jfo;
jaroslav@462
    35
    private final String pkg;
jaroslav@462
    36
    private StandardJavaFileManager delegate;
jaroslav@462
    37
    private List<Diagnostic<? extends JavaFileObject>> errors = new ArrayList<>();
jaroslav@462
    38
jaroslav@462
    39
    public Compile(String pkg, JFO jfo) {
jaroslav@462
    40
        this.pkg = pkg;
jaroslav@462
    41
        this.jfo = jfo;
jaroslav@462
    42
    }
jaroslav@462
    43
    
jaroslav@462
    44
    public static Map<String,byte[]> compile(String html, String java) throws IOException {
jaroslav@462
    45
        JavaCompiler jc = javax.tools.ToolProvider.getSystemJavaCompiler();
jaroslav@462
    46
        String pkg = findPkg(java);
jaroslav@462
    47
        String cls = findCls(java);
jaroslav@462
    48
        
jaroslav@462
    49
        JFO jfo = new JFO(java, pkg.replace('.', '/') + '/' + cls + ".java");
jaroslav@462
    50
        final Compile cmp = new Compile(pkg, jfo);
jaroslav@462
    51
        cmp.delegate = jc.getStandardFileManager(cmp, Locale.ENGLISH, Charset.forName("UTF-8"));
jaroslav@462
    52
        
jaroslav@462
    53
        Set<String> toCmp = Collections.singleton(pkg + '.' + cls);
jaroslav@462
    54
        Set<JFO> unit = Collections.singleton(jfo);
jaroslav@462
    55
        CompilationTask task = jc.getTask(null, cmp, cmp, null, null, unit);
jaroslav@462
    56
        if (task.call() != true) {
jaroslav@462
    57
            throw new IOException("Compilation failed: " + cmp.errors);
jaroslav@462
    58
        }
jaroslav@462
    59
        return Collections.emptyMap();
jaroslav@462
    60
    }
jaroslav@462
    61
jaroslav@462
    62
    @Override
jaroslav@462
    63
    public ClassLoader getClassLoader(Location location) {
jaroslav@462
    64
        return null;//Compile.class.getClassLoader();
jaroslav@462
    65
    }
jaroslav@462
    66
jaroslav@462
    67
    @Override
jaroslav@462
    68
    public Iterable<JavaFileObject> list(Location location, String packageName, Set<Kind> kinds, boolean recurse) throws IOException {
jaroslav@462
    69
        if (location == StandardLocation.PLATFORM_CLASS_PATH) {
jaroslav@462
    70
            return delegate.list(location, packageName, kinds, recurse);
jaroslav@462
    71
        }
jaroslav@462
    72
        if (location == StandardLocation.CLASS_PATH) {
jaroslav@462
    73
            return delegate.list(location, packageName, kinds, recurse);
jaroslav@462
    74
        }
jaroslav@462
    75
        if (location == StandardLocation.SOURCE_PATH) {
jaroslav@462
    76
            if (packageName.equals(pkg)) {
jaroslav@462
    77
                return Collections.<JavaFileObject>singleton(jfo);
jaroslav@462
    78
            }
jaroslav@462
    79
            return Collections.emptyList();
jaroslav@462
    80
        }
jaroslav@462
    81
        throw new UnsupportedOperationException("Loc: " + location + " pkg: " + packageName + " kinds: " + kinds + " rec: " + recurse);
jaroslav@462
    82
    }
jaroslav@462
    83
jaroslav@462
    84
    @Override
jaroslav@462
    85
    public String inferBinaryName(Location location, JavaFileObject file) {
jaroslav@462
    86
        if (file == jfo) {
jaroslav@462
    87
            return pkg + "." + file.getName();
jaroslav@462
    88
        }
jaroslav@462
    89
        return delegate.inferBinaryName(location, file);
jaroslav@462
    90
    }
jaroslav@462
    91
jaroslav@462
    92
    @Override
jaroslav@462
    93
    public boolean isSameFile(FileObject a, FileObject b) {
jaroslav@462
    94
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
jaroslav@462
    95
    }
jaroslav@462
    96
jaroslav@462
    97
    @Override
jaroslav@462
    98
    public boolean handleOption(String current, Iterator<String> remaining) {
jaroslav@462
    99
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
jaroslav@462
   100
    }
jaroslav@462
   101
jaroslav@462
   102
    @Override
jaroslav@462
   103
    public boolean hasLocation(Location location) {
jaroslav@462
   104
        return true;
jaroslav@462
   105
    }
jaroslav@462
   106
jaroslav@462
   107
    @Override
jaroslav@462
   108
    public JavaFileObject getJavaFileForInput(Location location, String className, Kind kind) throws IOException {
jaroslav@462
   109
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
jaroslav@462
   110
    }
jaroslav@462
   111
jaroslav@462
   112
    @Override
jaroslav@462
   113
    public JavaFileObject getJavaFileForOutput(Location location, String className, Kind kind, FileObject sibling) throws IOException {
jaroslav@462
   114
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
jaroslav@462
   115
    }
jaroslav@462
   116
jaroslav@462
   117
    @Override
jaroslav@462
   118
    public FileObject getFileForInput(Location location, String packageName, String relativeName) throws IOException {
jaroslav@462
   119
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
jaroslav@462
   120
    }
jaroslav@462
   121
jaroslav@462
   122
    @Override
jaroslav@462
   123
    public FileObject getFileForOutput(Location location, String packageName, String relativeName, FileObject sibling) throws IOException {
jaroslav@462
   124
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
jaroslav@462
   125
    }
jaroslav@462
   126
jaroslav@462
   127
    @Override
jaroslav@462
   128
    public void flush() throws IOException {
jaroslav@462
   129
    }
jaroslav@462
   130
jaroslav@462
   131
    @Override
jaroslav@462
   132
    public void close() throws IOException {
jaroslav@462
   133
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
jaroslav@462
   134
    }
jaroslav@462
   135
jaroslav@462
   136
    @Override
jaroslav@462
   137
    public int isSupportedOption(String option) {
jaroslav@462
   138
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
jaroslav@462
   139
    }
jaroslav@462
   140
jaroslav@462
   141
    @Override
jaroslav@462
   142
    public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
jaroslav@462
   143
        errors.add(diagnostic);
jaroslav@462
   144
    }
jaroslav@462
   145
    private static String findPkg(String java) throws IOException {
jaroslav@462
   146
        Pattern p = Pattern.compile("package\\p{javaWhitespace}*([\\p{Alnum}\\.]+)\\p{javaWhitespace}*;", Pattern.MULTILINE);
jaroslav@462
   147
        Matcher m = p.matcher(java);
jaroslav@462
   148
        if (!m.find()) {
jaroslav@462
   149
            throw new IOException("Can't find package declaration in the java file");
jaroslav@462
   150
        }
jaroslav@462
   151
        String pkg = m.group(1);
jaroslav@462
   152
        return pkg;
jaroslav@462
   153
    }
jaroslav@462
   154
    private static String findCls(String java) throws IOException {
jaroslav@462
   155
        Pattern p = Pattern.compile("class\\p{javaWhitespace}*([\\p{Alnum}\\.]+)\\p{javaWhitespace}", Pattern.MULTILINE);
jaroslav@462
   156
        Matcher m = p.matcher(java);
jaroslav@462
   157
        if (!m.find()) {
jaroslav@462
   158
            throw new IOException("Can't find package declaration in the java file");
jaroslav@462
   159
        }
jaroslav@462
   160
        String cls = m.group(1);
jaroslav@462
   161
        return cls;
jaroslav@462
   162
    }
jaroslav@462
   163
}