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