rt/mojo/src/main/java/org/apidesign/bck2brwsr/mojo/AOTLibrary.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 06 Dec 2014 06:28:17 +0100
changeset 1737 82fd3830167d
parent 1710 rt/mojo/src/main/java/org/apidesign/bck2brwsr/mojo/AheadOfTime.java@6db177c4f72c
child 1739 e9b9d9ff0621
permissions -rw-r--r--
Ability to extract precompiled bck2brwsr JavaScript files from Maven artifacts named bck2brwsr
     1 /**
     2  * Back 2 Browser Bytecode Translator
     3  * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
     4  *
     5  * This program is free software: you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License as published by
     7  * the Free Software Foundation, version 2 of the License.
     8  *
     9  * This program is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License
    15  * along with this program. Look for COPYING file in the top folder.
    16  * If not, see http://opensource.org/licenses/GPL-2.0.
    17  */
    18 
    19 package org.apidesign.bck2brwsr.mojo;
    20 
    21 import java.io.File;
    22 import java.io.FileOutputStream;
    23 import java.io.IOException;
    24 import java.io.OutputStreamWriter;
    25 import java.io.Writer;
    26 import java.net.MalformedURLException;
    27 import java.net.URL;
    28 import java.net.URLClassLoader;
    29 import java.util.ArrayList;
    30 import java.util.Collection;
    31 import java.util.List;
    32 import java.util.jar.Attributes;
    33 import java.util.jar.JarEntry;
    34 import java.util.jar.JarOutputStream;
    35 import java.util.jar.Manifest;
    36 import org.apache.maven.artifact.Artifact;
    37 import org.apache.maven.plugin.AbstractMojo;
    38 import org.apache.maven.plugin.MojoExecutionException;
    39 import org.apache.maven.plugin.MojoFailureException;
    40 import org.apache.maven.plugins.annotations.Component;
    41 import org.apache.maven.plugins.annotations.LifecyclePhase;
    42 import org.apache.maven.plugins.annotations.Mojo;
    43 import org.apache.maven.plugins.annotations.Parameter;
    44 import org.apache.maven.plugins.annotations.ResolutionScope;
    45 import org.apache.maven.project.MavenProject;
    46 import org.apache.maven.project.MavenProjectHelper;
    47 import org.apidesign.bck2brwsr.aot.Bck2BrwsrJars;
    48 import org.apidesign.vm4brwsr.Bck2Brwsr;
    49 import org.apidesign.vm4brwsr.ObfuscationLevel;
    50 
    51 /**
    52  *
    53  * @author Jaroslav Tulach
    54  * @since 0.12
    55  */
    56 @Mojo(name = "library",
    57     requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME,
    58     defaultPhase = LifecyclePhase.PACKAGE
    59 )
    60 public class AOTLibrary extends AbstractMojo {
    61     @Parameter(defaultValue = "${project}")
    62     private MavenProject prj;
    63 
    64     @Component
    65     private MavenProjectHelper projectHelper;
    66     @Parameter(defaultValue = "${project.build.directory}/${project.build.finalName}.jar")
    67     private File mainJar;    
    68     @Parameter(defaultValue = "${project.build.finalName}-min.js")
    69     private String minified;
    70     @Parameter(defaultValue = "${project.build.finalName}-debug.js")
    71     private String debug;
    72     
    73     @Parameter(defaultValue = "${project.build.directory}/${project.build.finalName}-bck2brwsr.jar")
    74     private File aotJar;
    75     
    76     @Parameter
    77     private String[] exports;
    78     
    79     @Override
    80     public void execute() throws MojoExecutionException, MojoFailureException {
    81         URLClassLoader loader;
    82         try {
    83             loader = buildClassLoader(mainJar, prj.getArtifacts());
    84         } catch (MalformedURLException ex) {
    85             throw new MojoFailureException("Can't initialize classloader");
    86         }
    87 
    88         try {
    89             Manifest m = new Manifest();
    90             {
    91                 Attributes attr = new Attributes();
    92                 attr.putValue("Bck2BrwsrArtifactId", prj.getArtifactId());
    93                 attr.putValue("Bck2BrwsrGroupId", prj.getGroupId());
    94                 attr.putValue("Bck2BrwsrVersion", prj.getVersion());
    95                 attr.putValue("Bck2BrwsrMinified", "true");
    96                 m.getEntries().put(minified, attr);
    97             }
    98             {
    99                 Attributes attr = new Attributes();
   100                 attr.putValue("Bck2BrwsrArtifactId", prj.getArtifactId());
   101                 attr.putValue("Bck2BrwsrGroupId", prj.getGroupId());
   102                 attr.putValue("Bck2BrwsrVersion", prj.getVersion());
   103                 attr.putValue("Bck2BrwsrDebug", "true");
   104                 m.getEntries().put(debug, attr);
   105             }
   106             
   107             FileOutputStream fos = new FileOutputStream(this.aotJar);
   108             JarOutputStream os = new JarOutputStream(fos, m);
   109 
   110             Bck2Brwsr c = Bck2BrwsrJars.configureFrom(null, mainJar, loader);
   111             if (exports != null) {
   112                 for (String e : exports) {
   113                     c = c.addExported(e.replace('.', '/'));
   114                 }
   115             }
   116             {
   117                 os.putNextEntry(new JarEntry(debug));
   118                 Writer w = new OutputStreamWriter(os);
   119                 c.
   120                     obfuscation(ObfuscationLevel.NONE).
   121                     generate(w);
   122                 w.flush();
   123                 os.closeEntry();
   124             }
   125             {
   126                 os.putNextEntry(new JarEntry(minified));
   127             
   128                 Writer w = new OutputStreamWriter(os);
   129                 c.
   130                     obfuscation(ObfuscationLevel.FULL).
   131                     generate(w);
   132                 w.flush();
   133                 os.closeEntry();
   134             }
   135             os.close();
   136             
   137             projectHelper.attachArtifact(prj, "jar", "bck2brwsr", aotJar);
   138         } catch (IOException ex) {
   139             throw new MojoFailureException("Cannot generate script for " + mainJar, ex);
   140         }
   141     }
   142 
   143     private static URLClassLoader buildClassLoader(File root, Collection<Artifact> deps) throws MalformedURLException {
   144         List<URL> arr = new ArrayList<URL>();
   145         if (root != null) {
   146             arr.add(root.toURI().toURL());
   147         }
   148         for (Artifact a : deps) {
   149             if (a.getFile() != null) {
   150                 arr.add(a.getFile().toURI().toURL());
   151             }
   152         }
   153         return new URLClassLoader(arr.toArray(new URL[0]), Java2JavaScript.class.getClassLoader());
   154     }
   155 }