mojo/src/main/java/org/apidesign/bck2brwsr/mojo/BrswrMojo.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 07 Feb 2013 12:58:12 +0100
branchemul
changeset 694 0d277415ed02
parent 515 d303b4e7ad4c
child 726 013f06feb50f
permissions -rw-r--r--
Rebasing the Inflater support on jzlib which, unlike GNU ClassPath, has correct implementation of Huffman code. Making the implementation more easily testable by turning Inflater and ZipInputStream into pure delegates. Current implementation is going to need proper long support.
jaroslav@111
     1
/**
jaroslav@111
     2
 * Back 2 Browser Bytecode Translator
jaroslav@111
     3
 * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@111
     4
 *
jaroslav@111
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@111
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@111
     7
 * the Free Software Foundation, version 2 of the License.
jaroslav@111
     8
 *
jaroslav@111
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@111
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@111
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@111
    12
 * GNU General Public License for more details.
jaroslav@111
    13
 *
jaroslav@111
    14
 * You should have received a copy of the GNU General Public License
jaroslav@111
    15
 * along with this program. Look for COPYING file in the top folder.
jaroslav@111
    16
 * If not, see http://opensource.org/licenses/GPL-2.0.
jaroslav@111
    17
 */
jaroslav@109
    18
package org.apidesign.bck2brwsr.mojo;
jaroslav@109
    19
jaroslav@382
    20
import java.io.Closeable;
jaroslav@109
    21
import org.apache.maven.plugin.AbstractMojo;
jaroslav@109
    22
jaroslav@109
    23
import java.io.File;
jaroslav@305
    24
import java.io.IOException;
jaroslav@109
    25
import java.net.MalformedURLException;
jaroslav@109
    26
import java.net.URL;
jaroslav@109
    27
import java.net.URLClassLoader;
jaroslav@109
    28
import java.util.ArrayList;
jaroslav@109
    29
import java.util.Collection;
jaroslav@109
    30
import java.util.List;
jaroslav@109
    31
import org.apache.maven.artifact.Artifact;
jaroslav@109
    32
import org.apache.maven.plugin.MojoExecutionException;
jaroslav@109
    33
import org.apache.maven.plugins.annotations.LifecyclePhase;
jaroslav@109
    34
import org.apache.maven.plugins.annotations.Mojo;
jaroslav@109
    35
import org.apache.maven.plugins.annotations.Parameter;
jaroslav@109
    36
import org.apache.maven.project.MavenProject;
jaroslav@382
    37
import org.apidesign.bck2brwsr.launcher.Launcher;
jaroslav@109
    38
jaroslav@357
    39
/** Executes given HTML page in a browser. */
jaroslav@357
    40
@Mojo(name="brwsr", defaultPhase=LifecyclePhase.DEPLOY)
jaroslav@357
    41
public class BrswrMojo extends AbstractMojo {
jaroslav@357
    42
    public BrswrMojo() {
jaroslav@109
    43
    }
jaroslav@357
    44
    /** Resource to show as initial page */
jaroslav@109
    45
    @Parameter
jaroslav@357
    46
    private String startpage;
jaroslav@421
    47
jaroslav@109
    48
    @Parameter(defaultValue="${project}")
jaroslav@109
    49
    private MavenProject prj;
jaroslav@109
    50
    
jaroslav@357
    51
    /** Root of the class files */
jaroslav@357
    52
    @Parameter(defaultValue="${project.build.directory}/classes")
jaroslav@357
    53
    private File classes;
jaroslav@613
    54
    
jaroslav@613
    55
    /** Root of all pages, and files, etc. */
jaroslav@613
    56
    @Parameter
jaroslav@613
    57
    private File directory;
jaroslav@109
    58
jaroslav@109
    59
    @Override
jaroslav@109
    60
    public void execute() throws MojoExecutionException {
jaroslav@357
    61
        if (startpage == null) {
jaroslav@357
    62
            throw new MojoExecutionException("You have to provide a start page");
jaroslav@134
    63
        }
jaroslav@613
    64
        
jaroslav@109
    65
        try {
jaroslav@382
    66
            Closeable httpServer;
jaroslav@613
    67
            if (directory != null) {
jaroslav@613
    68
                httpServer = Launcher.showDir(directory, startpage);
jaroslav@613
    69
            } else {
jaroslav@613
    70
                URLClassLoader url = buildClassLoader(classes, prj.getDependencyArtifacts());
jaroslav@613
    71
                try {
jaroslav@613
    72
                    httpServer = Launcher.showURL(url, startpage());
jaroslav@613
    73
                } catch (Exception ex) {
jaroslav@613
    74
                    throw new MojoExecutionException("Can't open " + startpage(), ex);
jaroslav@613
    75
                }
jaroslav@372
    76
            }
jaroslav@357
    77
            System.in.read();
jaroslav@382
    78
            httpServer.close();
jaroslav@305
    79
        } catch (IOException ex) {
jaroslav@357
    80
            throw new MojoExecutionException("Can't show the browser", ex);
jaroslav@109
    81
        }
jaroslav@109
    82
    }
jaroslav@421
    83
    
jaroslav@421
    84
    private String startpage() {
jaroslav@422
    85
        return startpage;
jaroslav@109
    86
    }
jaroslav@109
    87
jaroslav@109
    88
    private static URLClassLoader buildClassLoader(File root, Collection<Artifact> deps) throws MalformedURLException {
jaroslav@109
    89
        List<URL> arr = new ArrayList<URL>();
jaroslav@109
    90
        arr.add(root.toURI().toURL());
jaroslav@109
    91
        for (Artifact a : deps) {
jaroslav@515
    92
            final File f = a.getFile();
jaroslav@515
    93
            if (f != null) {
jaroslav@515
    94
                arr.add(f.toURI().toURL());
jaroslav@515
    95
            }
jaroslav@109
    96
        }
jaroslav@357
    97
        return new URLClassLoader(arr.toArray(new URL[0]), BrswrMojo.class.getClassLoader());
jaroslav@109
    98
    }
jaroslav@109
    99
}