001 package org.fusesource.hawtjni.maven;
002
003 import java.io.File;
004 import java.util.List;
005 import java.util.regex.Pattern;
006
007 import org.apache.maven.plugin.logging.Log;
008 import org.codehaus.plexus.util.cli.CommandLineException;
009 import org.codehaus.plexus.util.cli.CommandLineUtils;
010 import org.codehaus.plexus.util.cli.Commandline;
011 import org.codehaus.plexus.util.cli.StreamConsumer;
012 import org.codehaus.plexus.util.cli.CommandLineUtils.StringStreamConsumer;
013
014 public class CLI {
015
016 public static final boolean IS_WINDOWS = isWindows();
017
018 static private boolean isWindows() {
019 String name = System.getProperty("os.name").toLowerCase().trim();
020 return name.startsWith("win");
021 }
022
023 public boolean verbose;
024 public Log log;
025
026
027 public void setExecutable(File path) {
028 if( IS_WINDOWS ) {
029 return;
030 }
031 try {
032 // These are Java 1.6 Methods..
033 if( !path.canExecute() ) {
034 path.setExecutable(true);
035 }
036 } catch (NoSuchMethodError e1) {
037 // Do it the old fasioned way...
038 try {
039 system(path.getParentFile(), new String[] { "chmod", "a+x", path.getCanonicalPath() });
040 } catch (Throwable e2) {
041 }
042 }
043 }
044
045 public int system(File wd, String[] command) throws CommandLineException {
046 return system(wd, command, null);
047 }
048
049 public int system(File wd, String[] command, List<String> args) throws CommandLineException {
050 Commandline cli = new Commandline();
051 cli.setWorkingDirectory(wd);
052 for (String c : command) {
053 cli.createArg().setValue(c);
054 }
055 if( args!=null ) {
056 for (String arg : args) {
057 cli.createArg().setValue(arg);
058 }
059 }
060 log.info("executing: "+cli);
061
062 StreamConsumer consumer = new StreamConsumer() {
063 public void consumeLine(String line) {
064 log.info(line);
065 }
066 };
067 if( !verbose ) {
068 consumer = new StringStreamConsumer();
069 }
070 int rc = CommandLineUtils.executeCommandLine(cli, null, consumer, consumer);
071 if( rc!=0 ) {
072 if( !verbose ) {
073 // We only display output if the command fails..
074 String output = ((StringStreamConsumer)consumer).getOutput();
075 if( output.length()>0 ) {
076 String nl = System.getProperty( "line.separator");
077 String[] lines = output.split(Pattern.quote(nl));
078 for (String line : lines) {
079 log.info(line);
080 }
081 }
082 }
083 log.info("rc: "+rc);
084 } else {
085 if( !verbose ) {
086 String output = ((StringStreamConsumer)consumer).getOutput();
087 if( output.length()>0 ) {
088 String nl = System.getProperty( "line.separator");
089 String[] lines = output.split(Pattern.quote(nl));
090 for (String line : lines) {
091 log.debug(line);
092 }
093 }
094 }
095 log.debug("rc: "+rc);
096 }
097 return rc;
098 }
099
100 }