package edu.cmu.minorthird.util; import org.apache.log4j.Logger; /** * A lightweight command-line processing tool. * * @author William Cohen */ public class JointCommandLineProcessor implements CommandLineProcessor{ private static Logger log=Logger.getLogger(JointCommandLineProcessor.class); private boolean helpConsumed; private CommandLineProcessor[] subprocessor; public JointCommandLineProcessor(CommandLineProcessor[] subprocessor){ this.subprocessor=subprocessor; helpConsumed=false; } @Override public boolean shouldTerminate(){ return helpConsumed; } @Override final public void processArguments(String[] args){ int k=0; while(k<args.length){ int delta=consumeArguments(args,k); k+=delta; if(delta==0){ // figure out how many args to skip delta++; if(k+1<args.length&&!args[k+1].startsWith("-")){ delta++; log.warn("Unknown arguments "+args[k]+" "+args[k+1]+ " will be ignored"); }else{ log.warn("Unknown argument "+args[k]+" will be ignored"); } k+=delta; } } } @Override final public int consumeArguments(String[] args,int startPos){ int pos=startPos; boolean somethingConsumed=true; while(pos<args.length&&somethingConsumed){ if("-help".equals(args[pos])||"--help".equals(args[pos])){ helpConsumed=true; help(); pos++; continue; } if("-config".equals(args[pos])||"--config".equals(args[pos])){ if(pos+1<args.length){ BasicCommandLineProcessor.config(args[pos+1],this); pos+=2; }else{ usage("missing argument for -config"); } continue; } somethingConsumed=false; for(int i=0;!somethingConsumed&&i<subprocessor.length;i++){ int k=subprocessor[i].consumeArguments(args,pos); //System.out.println("arg "+pos+" subprocessor "+i+" result "+k); if(k>0){ log.debug("Subprocessor"+i+" consumed "+k+" args at pos="+pos); pos+=k; somethingConsumed=true; } } } return pos-startPos; } @Override final public void usage(String errorMessage){ System.out.println(errorMessage); usage(); } @Override final public void usage(){ for(int i=0;i<subprocessor.length;i++){ log.info("Subprocessor"+i+" usage invoked"); subprocessor[i].usage(); } } final public void help(){ usage(); } // static public void main(String[] args){ // CommandLineProcessor cp1=new BasicCommandLineProcessor(){ // // public void one(){ // System.out.println("one"); // } // }; // CommandLineProcessor cp2=new BasicCommandLineProcessor(){ // // public void two(){ // System.out.println("two"); // } // // public void tree(){ // System.out.println("three"); // } // }; // CommandLineProcessor jcp= // new JointCommandLineProcessor(new CommandLineProcessor[]{cp1,cp2}); // jcp.processArguments(args); // } }