package org.codehaus.mojo.ruby; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringReader; import java.util.StringTokenizer; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.codehaus.plexus.component.jruby.JRubyInvoker; import org.codehaus.plexus.component.jruby.JRubyRuntimeInvoker; import org.codehaus.plexus.util.StringOutputStream; /** * @goal run * @requiresDependencyResolution * @description Runs a given ruby script * @author eredmond * @version $Id$ */ public class RunScriptMojo extends AbstractMojo { /** * A path to a ruby script file to be executed. * @parameter */ private File script; /** * A block of ruby code to be executed. * @parameter */ private String ruby; /** * Specifies $LOAD_PATH directories. * @parameter */ private String[] libraryPaths; /** * Require the library, before executing your script. * @parameter */ private String[] requires; /** * Assume 'while gets(); ... end' loop around your script. * @parameter default-value=false */ private boolean assumeLoop; /** * Assume loop like 'assumeLoop' but print line also like sed. * @parameter default-value=false */ private boolean assumePrintLoop; /** * Autosplit mode with 'assumeLoop' or 'assumePrintLoop' (splits $_ into $F) * @parameter default-value=false */ private boolean autoSplit; /** * Enable line ending processing. * @parameter default-value=false */ private boolean processLineEnds; /** * Set warning level; 0=silence, 1=medium, 2=verbose * @parameter default-value=1 */ private int warning; /** * Sets debugging flags (set $DEBUG to true). * @parameter default-value=false */ private boolean debug; /** * @parameter default-value="${basedir}" */ private File currentDirectory; public void execute() throws MojoExecutionException, MojoFailureException { JRubyInvoker invoker = new JRubyRuntimeInvoker( null ); if ( script != null ) { try { InputStream scriptStream = new FileInputStream( script ); invoker.setReader( new InputStreamReader( scriptStream ) ); } catch ( FileNotFoundException e ) { throw new MojoFailureException( e.getMessage() ); } } else if ( ruby != null ) { invoker.setReader( new StringReader( ruby ) ); } else { throw new MojoFailureException( "Cannot execute [rubyscript:run] without configuring either 'script' or 'ruby'" ); } invoker.setCurrentDirectory( currentDirectory.getAbsolutePath() ); invoker.setAssumePrintLoop( assumePrintLoop ); invoker.setAssumeLoop( assumeLoop ); invoker.setAutoSplit( autoSplit ); invoker.setProcessLineEnds( processLineEnds ); invoker.setWarning( warning ); invoker.setDebug( debug ); invoker.setLibraryPaths( libraryPaths ); invoker.setRequires( requires ); //invoker.setDebug( true ); try { StringOutputStream stdout = new StringOutputStream(); StringOutputStream stderr = new StringOutputStream(); invoker.invoke( stdout, stderr ); logOutput( stdout.toString(), false ); logOutput( stderr.toString(), true ); } catch ( Throwable e ) { throw new MojoFailureException( e.getMessage() ); } } /** * Outputs Strings as info or error to the mojo's log. * * @param out * @param error true if error */ private void logOutput( String output, boolean error ) { if ( output != null && output.length() > 0 ) { for ( StringTokenizer tokens = new StringTokenizer( output, "\n" ); tokens.hasMoreTokens(); ) { if ( error ) { getLog().error( tokens.nextToken() ); } else { getLog().info( tokens.nextToken() ); } } } } }