package org.codehaus.mojo.j2me;
/*
* The MIT License
*
* Copyright (c) 2004, The Codehaus
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is furnished to do
* so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.maven.artifact.DependencyResolutionRequiredException;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
/**
* The preverify MoJo runs the preverify command from the given J2ME SDK.
* <p>
* Preverification takes place in the phase process-classes, that means after
* successfull compilation. The MoJo takes the classes to preverify from
* ${project.build.outputDirectory} and places the preverified classes into the
* same directory. Therefore no change to the packaging phase is neccessary.
* </p>
*
* @goal preverify
* @phase process-classes
* @description Preverifies j2me class files
*
* @author <a href="frank.seidinger@novity.de">Frank Seidinger</a>
*/
public class PreverifyMojo
extends AbstractMojo
{
/**
* The name of the preverify executable
*/
private static final String PREVERIFY = "preverify";
/**
* The Maven project reference.
*
* @parameter expression="${project}"
* @required
*/
private MavenProject project;
/**
* The path to the j2me sdk to use for preverifying
*
* @parameter
* @required
*/
private File sdkPath;
/**
* The logger to use
*/
private Log log;
/**
* The main method of this MoJo
*/
public void execute()
throws MojoExecutionException, MojoFailureException
{
log = getLog();
log.debug( "starting plugin" );
// build preverify command executable
validateSdk();
File binPath = getBinPath( sdkPath );
File cmd = getPreverifyCmd( binPath );
// build class path
String classPath = getClassPath( project );
// get target directory
String target = project.getBuild().getOutputDirectory();
try
{
// run preverify
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec( new String[] {
cmd.getPath(),
"-classpath",
classPath.toString(),
"-d",
target,
target } );
// get error stream
InputStream err = process.getErrorStream();
// wait for termination
int exitCode = process.waitFor();
// read error stream
byte[] errBuffer = new byte[err.available()];
err.read( errBuffer );
// check return code
if ( exitCode != 0 )
{
log.error( "error output :\n" + new String( errBuffer ) );
throw new MojoFailureException( "the preverify command returned: " + exitCode );
}
}
catch ( IOException e )
{
throw new MojoExecutionException( "the preverify command failed to execute", e );
}
catch ( InterruptedException e )
{
throw new MojoExecutionException( "the preverify command failed to execute", e );
}
log.debug( "finished plugin" );
}
private void validateSdk()
throws MojoFailureException
{
log.debug( "sdkPath = " + sdkPath );
// test, if the sdk path is valid
if ( sdkPath.exists() == false )
{
throw new MojoFailureException( "the path to the sdk cannot be found" );
}
// test, if the sdk path is a directory
if ( sdkPath.isDirectory() == false )
{
throw new MojoFailureException( "the path to the sdk is not a directory" );
}
}
private File getBinPath( File sdkPath )
throws MojoFailureException
{
// get the bin path
File binPath = new File( sdkPath.getPath() + File.separator + "bin" );
log.debug( "binPath = " + binPath );
// test, if bin path is valid
if ( ( binPath.exists() == false ) || ( binPath.isDirectory() == false ) )
{
throw new MojoFailureException( "the sdk contains no bin directory" );
}
return binPath;
}
private File getPreverifyCmd( File binPath )
throws MojoFailureException
{
// get os identification string
String osName = System.getProperty( "os.name" );
log.debug( "osName = " + osName );
// preset preverify command name
String preverifyCommand = PREVERIFY;
// test, if os is windows based
boolean isWindowsBased = osName.startsWith( "Windows" );
log.debug( "os is windows based: " + isWindowsBased );
// adjust command name to meet windows naming conventions
if ( isWindowsBased )
{
preverifyCommand = preverifyCommand + ".exe";
log.debug( "adjusted preverify command to meet windows naming convetions" );
}
// get the verify command
File cmd = new File( binPath.getPath() + File.separator + preverifyCommand );
log.debug( "cmd = " + cmd );
// test, if verify command is valid
if ( ( cmd.exists() == false ) || ( cmd.isFile() == false ) )
{
throw new MojoFailureException( "the preverify command cannot be found" );
}
if ( cmd.canRead() == false )
{
throw new MojoFailureException( "you have no access rights to the preverify command" );
}
return cmd;
}
private String getClassPath( MavenProject project )
throws MojoExecutionException
{
try
{
// create buffer receiving full classpath
StringBuffer classPath = new StringBuffer();
// loop through classpath elements
List artifacts = project.getRuntimeClasspathElements();
for ( int idx = 0; idx < artifacts.size(); idx++ )
{
// get next dependency
String classpathElement = (String) artifacts.get( idx );
// add path seperator if necessary
if ( classPath.length() > 0 )
{
classPath.append( File.pathSeparator );
}
// add path to dependency
classPath.append( classpathElement );
}
log.debug( "classpath: " + classPath );
return classPath.toString();
}
catch ( DependencyResolutionRequiredException e )
{
throw new MojoExecutionException( "faild to resolve dependency", e );
}
}
}