// Copyright FreeHEP, 2005-2006.
package org.freehep.maven.rmic;
import java.io.*;
import java.util.*;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.StringUtils;
/**
* Compiles class files using the rmic compiler.
*
* @goal generate
* @description Compiles class files using the rmic compiler.
* @phase process-classes
* @author <a href="Mark.Donszelmann@slac.stanford.edu">Mark Donszelmann</a>
* @version $Id: RmicMojo.java 8938 2006-09-11 18:38:45Z duns $
*/
public class RmicMojo extends AbstractMojo {
/**
* Keep the generated .java files in the same directory as the generated
* .class files. Same as -keep option for rmic.
*
* @parameter expression="${rmic.keep}" default-value="false"
*/
private boolean keep;
/**
* Suppress warning messages, same as -nowarn option for rmic.
*
* @parameter expression="${rmic.noWarn}" default-value="false"
*/
private boolean noWarn;
/**
* Generates debug information, same as -g option for rmic.
*
* @parameter expression="${rmic.debug}" default-value="false"
*/
private boolean debug;
/**
* Generates verbose output, same as -verbose option for rmic.
*
* @parameter expression="${rmic.verbose}" default-value="false"
*/
private boolean verbose;
/**
* Specified the version of stubs to be generated. Possible values are 1.1, 1.2 or compat (default).
* Equivalent to -v1.1, -v1.2 and -vcompat for rmic.
*
* @parameter expression="${rmic.version}" default-value="compat"
*/
private String version;
/**
* Causes the rmic compiler to generate OMG IDL for the classes. Same as -idl option for rmic.
*
* @parameter expression="${rmic.idl}" default-value="false"
*/
private boolean idl;
/**
* Causes the rmic compiler to generate IIOP stubs rather than JRMP stubs. Same as -iiop option for rmic.
*
* @parameter expression="${rmic.iiop}" default-value="false"
*/
private boolean iiop;
/**
* The target directory into which to generate the output, same as -d option
* for rmic.
*
* @parameter expression="${project.build.directory}/classes"
*/
private String targetDirectory;
/**
* The package-qualified-class-name(s), for example com.somecompany.SomeClass.
*
* @parameter expression=""
* @required
*/
private List classes;
/**
* @parameter expression="${project}"
* @required
* @readonly
*/
private MavenProject project;
public void execute() throws MojoExecutionException {
if (!FileUtils.fileExists(targetDirectory)) {
FileUtils.mkdir( targetDirectory );
}
// FIXME runs always. we could check for class_skel.class ...
getLog().info( "Running rmic compiler on "+classes.size()+" file(s)...");
runCommand(generateCommandLine());
}
private String[] generateCommandLine() throws MojoExecutionException {
List cmdLine = new ArrayList();
cmdLine.add("rmic");
cmdLine.add("-classpath");
try {
cmdLine.add(StringUtils.join(project.getCompileClasspathElements().iterator(), File.pathSeparator));
} catch (Exception e) {
throw new MojoExecutionException("RMIC, cannot get classpath", e);
}
if (keep) {
cmdLine.add("-keep");
}
if (noWarn) {
cmdLine.add("-noWarn");
}
if (debug) {
cmdLine.add("-g");
}
if (verbose) {
cmdLine.add("-verbose");
}
if (version.equals("1.1")) {
cmdLine.add("-v1.1");
} else if (version.equals("1.2")) {
cmdLine.add("-v1.2");
} else if (version.equals("compat")) {
cmdLine.add("-vcompat");
} else {
throw new MojoExecutionException("RMIC Illegal value for 'version' "+version);
}
if (idl) {
cmdLine.add("-idl");
}
if (iiop) {
cmdLine.add("-iiop");
}
cmdLine.add("-d");
cmdLine.add(targetDirectory);
if (getLog().isDebugEnabled()) {
cmdLine.add("-verbose");
}
if (classes != null) {
for (Iterator i = classes.iterator(); i.hasNext(); ) {
cmdLine.add((String)i.next());
}
}
getLog().info(cmdLine.toString());
return (String[])cmdLine.toArray(new String[cmdLine.size()]);
}
private int runCommand(String[] cmdLine) throws MojoExecutionException {
try {
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(cmdLine);
StreamGobbler errorGobbler = new StreamGobbler(process.getErrorStream(), true);
StreamGobbler outputGobbler = new StreamGobbler(process.getInputStream(), false);
errorGobbler.start();
outputGobbler.start();
return process.waitFor();
} catch (Throwable e) {
throw new MojoExecutionException("Could not launch " + cmdLine[0], e);
}
}
class StreamGobbler extends Thread {
InputStream is;
boolean error;
StreamGobbler(InputStream is, boolean error) {
this.is = is;
this.error = error;
}
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = null;
while ((line = reader.readLine()) != null) {
if (error) {
getLog().error(line);
} else {
getLog().debug(line);
}
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}