1 package org.apidesign.bck2brwsr.mojo;
3 import org.apache.maven.plugin.AbstractMojo;
6 import java.io.FileWriter;
7 import java.lang.reflect.Method;
8 import java.net.MalformedURLException;
10 import java.net.URLClassLoader;
11 import java.util.ArrayList;
12 import java.util.Collection;
13 import java.util.List;
14 import org.apache.maven.artifact.Artifact;
15 import org.apache.maven.model.Dependency;
16 import org.apache.maven.plugin.MojoExecutionException;
17 import org.apache.maven.plugins.annotations.Component;
18 import org.apache.maven.plugins.annotations.LifecyclePhase;
19 import org.apache.maven.plugins.annotations.Mojo;
20 import org.apache.maven.plugins.annotations.Parameter;
21 import org.apache.maven.project.MavenProject;
23 /** Compiles classes into JavaScript. */
24 @Mojo(name="j2js", defaultPhase=LifecyclePhase.PROCESS_CLASSES)
25 public class Bck2BrswrMojo extends AbstractMojo {
26 public Bck2BrswrMojo() {
28 /** Root of the class files */
29 @Parameter(defaultValue="${project.build.directory}/classes")
31 /** File to generate. Defaults bootjava.js in the first non-empty
32 package under the classes directory */
34 private File javascript;
36 @Parameter(defaultValue="${project}")
37 private MavenProject prj;
42 public void execute() throws MojoExecutionException {
43 if (!classes.isDirectory()) {
44 throw new MojoExecutionException("Can't find " + classes);
47 if (javascript == null) {
48 javascript = new File(findNonEmptyFolder(classes), "bootjava.js");
51 List<String> arr = new ArrayList<String>();
52 collectAllClasses("", classes, arr);
57 URLClassLoader url = buildClassLoader(classes, prj.getDependencyArtifacts());
59 Class<?> c = Class.forName("org.apidesign.vm4brwsr.GenJS");
60 Method m = c.getDeclaredMethod("compile", ClassLoader.class, Appendable.class, List.class);
61 m.setAccessible(true);
62 FileWriter w = new FileWriter(javascript);
63 m.invoke(null, url, w, arr);
65 } catch (Exception ex) {
66 throw new MojoExecutionException("Can't compile", ex);
70 private static File findNonEmptyFolder(File dir) throws MojoExecutionException {
71 if (!dir.isDirectory()) {
72 throw new MojoExecutionException("Not a directory " + dir);
74 File[] arr = dir.listFiles();
75 if (arr.length == 1 && arr[0].isDirectory()) {
76 return findNonEmptyFolder(arr[0]);
81 private static void collectAllClasses(String prefix, File toCheck, List<String> arr) {
82 File[] files = toCheck.listFiles();
84 for (File f : files) {
85 collectAllClasses(prefix + f.getName() + "/", f, arr);
87 } else if (toCheck.getName().endsWith(".class")) {
88 arr.add(prefix.substring(0, prefix.length() - 7));
92 private static URLClassLoader buildClassLoader(File root, Collection<Artifact> deps) throws MalformedURLException {
93 List<URL> arr = new ArrayList<URL>();
94 arr.add(root.toURI().toURL());
95 for (Artifact a : deps) {
96 arr.add(a.getFile().toURI().toURL());
98 return new URLClassLoader(arr.toArray(new URL[0]), Bck2BrswrMojo.class.getClassLoader());