diff --git a/build.xml b/build.xml
index 6da364e26..cfb912937 100644
--- a/build.xml
+++ b/build.xml
@@ -110,6 +110,7 @@
+
@@ -196,7 +197,7 @@
-
+
diff --git a/ivy.xml b/ivy.xml
index f245cd81d..bbf4d9c19 100644
--- a/ivy.xml
+++ b/ivy.xml
@@ -7,6 +7,6 @@
-
+
diff --git a/java/src/org/broadinstitute/sting/gatk/GenomeAnalysisTK.java b/java/src/org/broadinstitute/sting/gatk/GenomeAnalysisTK.java
index 6c14df22e..591b29287 100644
--- a/java/src/org/broadinstitute/sting/gatk/GenomeAnalysisTK.java
+++ b/java/src/org/broadinstitute/sting/gatk/GenomeAnalysisTK.java
@@ -12,6 +12,7 @@ import org.broadinstitute.sting.gatk.refdata.rodDbSNP;
import org.broadinstitute.sting.gatk.refdata.rodGFF;
import org.broadinstitute.sting.gatk.walkers.LocusWalker;
import org.broadinstitute.sting.gatk.walkers.ReadWalker;
+import org.broadinstitute.sting.gatk.walkers.Walker;
import org.broadinstitute.sting.utils.FastaSequenceFile2;
import org.broadinstitute.sting.utils.GenomeLoc;
import org.broadinstitute.sting.utils.Utils;
@@ -42,6 +43,7 @@ public class GenomeAnalysisTK extends CommandLineProgram {
// our walker manager
private WalkerManager walkerManager = null;
+ private Walker my_walker = null;
public String pluginPathName = null;
private TraversalEngine engine = null;
@@ -60,12 +62,12 @@ public class GenomeAnalysisTK extends CommandLineProgram {
* Flags don't take an argument, the associated Boolean gets set to true if the flag appears on the command line.
*/
protected void setupArgs() {
- m_parser.addRequiredlArg("input_file", "I", "SAM or BAM file for validation", "INPUT_FILE");
+ m_parser.addRequiredArg("input_file", "I", "SAM or BAM file for validation", "INPUT_FILE");
m_parser.addOptionalArg("maximum_reads", "M", "Maximum number of reads to process before exiting", "MAX_READS_ARG");
m_parser.addOptionalArg("validation_strictness", "S", "How strict should we be with validation", "STRICTNESS_ARG");
m_parser.addOptionalArg("reference_sequence", "R", "Reference sequence file", "REF_FILE_ARG");
m_parser.addOptionalArg("genome_region", "L", "Genome region to operation on: from chr:start-end", "REGION_STR");
- m_parser.addRequiredlArg("analysis_type", "T", "Type of analysis to run", "Analysis_Name");
+ m_parser.addRequiredArg("analysis_type", "T", "Type of analysis to run", "Analysis_Name");
m_parser.addOptionalArg("DBSNP", "D", "DBSNP file", "DBSNP_FILE");
m_parser.addOptionalArg("Hapmap", "H", "Hapmap file", "HAPMAP_FILE");
m_parser.addOptionalFlag("threaded_IO", "P", "If set, enables threaded I/O operations", "ENABLED_THREADED_IO");
@@ -74,6 +76,32 @@ public class GenomeAnalysisTK extends CommandLineProgram {
m_parser.addOptionalArg("intervals_file", "V", "File containing list of genomic intervals to operate on. line := ", "INTERVALS_FILE");
}
+ /**
+ * GATK can add arguments dynamically based on analysis type.
+ * @return true
+ */
+ @Override
+ protected boolean canAddArgumentsDynamically() { return true; }
+
+ /**
+ * GATK provides the walker as an argument source. As a side-effect, initializes the walker variable.
+ * @return List of walkers to load dynamically.
+ */
+ @Override
+ protected Object[] getArgumentSources() {
+ if( Analysis_Name == null )
+ throw new IllegalArgumentException("Must provide analysis name");
+
+ walkerManager = new WalkerManager( pluginPathName );
+
+ if( !walkerManager.doesWalkerExist(Analysis_Name) )
+ throw new IllegalArgumentException("Invalid analysis name");
+
+ my_walker = walkerManager.getWalkerByName(Analysis_Name);
+
+ return new Object[] { my_walker };
+ }
+
/**
* Required main method implementation.
*/
@@ -82,10 +110,6 @@ public class GenomeAnalysisTK extends CommandLineProgram {
}
protected int execute() {
-
-
- walkerManager = new WalkerManager(pluginPathName);
-
final boolean TEST_ROD = false;
List rods = new ArrayList();
@@ -155,15 +179,10 @@ public class GenomeAnalysisTK extends CommandLineProgram {
//LocusWalker walker = new PileupWalker();
- // Try to get the walker specified
- Object my_walker;
- if (walkerManager.doesWalkerExist(Analysis_Name)) {
- my_walker = walkerManager.getWalkerByName(Analysis_Name);
- } else {
- logger.fatal("Could not find walker " + Analysis_Name);
- return 0;
- }
+ if( my_walker == null )
+ throw new RuntimeException( "Sanity check failed -- no walker present." );
+ // Try to get the walker specified
try {
LocusWalker, ?> walker = (LocusWalker, ?>) my_walker;
if ( INTERVALS_FILE == null )
diff --git a/java/src/org/broadinstitute/sting/gatk/WalkerManager.java b/java/src/org/broadinstitute/sting/gatk/WalkerManager.java
index a26ff32b5..0feb0854e 100755
--- a/java/src/org/broadinstitute/sting/gatk/WalkerManager.java
+++ b/java/src/org/broadinstitute/sting/gatk/WalkerManager.java
@@ -5,6 +5,7 @@ import net.sf.functionalj.reflect.JdkStdReflect;
import net.sf.functionalj.FunctionN;
import net.sf.functionalj.Functions;
+import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.io.File;
import java.io.FilenameFilter;
@@ -20,6 +21,7 @@ import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
import org.broadinstitute.sting.gatk.walkers.Walker;
+import org.broadinstitute.sting.utils.cmdLine.Argument;
/**
* Created by IntelliJ IDEA.
@@ -88,7 +90,8 @@ public class WalkerManager {
* @return The walker object if found; null otherwise.
*/
public Walker getWalkerByName(String walkerName) {
- return walkers.get(walkerName);
+ Walker walker = walkers.get(walkerName);
+ return walker;
}
/**
diff --git a/java/src/org/broadinstitute/sting/utils/cmdLine/Argument.java b/java/src/org/broadinstitute/sting/utils/cmdLine/Argument.java
new file mode 100755
index 000000000..8f117b535
--- /dev/null
+++ b/java/src/org/broadinstitute/sting/utils/cmdLine/Argument.java
@@ -0,0 +1,26 @@
+package org.broadinstitute.sting.utils.cmdLine;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: hanna
+ * Date: Mar 24, 2009
+ * Time: 11:11:36 AM
+ * To change this template use File | Settings | File Templates.
+ */
+@Documented
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD})
+public @interface Argument {
+ String fullName() default "";
+ String shortName() default "";
+ String doc() default "";
+ boolean required() default true;
+}
diff --git a/java/src/org/broadinstitute/sting/utils/cmdLine/ArgumentParser.java b/java/src/org/broadinstitute/sting/utils/cmdLine/ArgumentParser.java
index d171379bd..9ec2abc27 100644
--- a/java/src/org/broadinstitute/sting/utils/cmdLine/ArgumentParser.java
+++ b/java/src/org/broadinstitute/sting/utils/cmdLine/ArgumentParser.java
@@ -11,6 +11,8 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
+import org.broadinstitute.sting.utils.Pair;
+
/**
* User: aaron
* Date: Mar 19, 2009
@@ -33,7 +35,7 @@ public class ArgumentParser {
private ArrayList m_option_names = new ArrayList();
// where we eventually want the values to land
- private HashMap m_storageLocations = new HashMap();
+ private HashMap> m_storageLocations = new HashMap>();
// create Options object
protected Options m_options = new Options();
@@ -100,7 +102,18 @@ public class ArgumentParser {
* @param opt the option
*/
private void AddToOptionStorage(String name, String letterform, String fieldname, Option opt) {
+ AddToOptionStorage(name, letterform, getField(prog, fieldname), opt);
+ }
+ /**
+ * Used locally to add to the options storage we have, for latter processing
+ *
+ * @param name the name of the option
+ * @param letterform it's short form
+ * @param field what field it should be stuck into on the calling class
+ * @param opt the option
+ */
+ private void AddToOptionStorage(String name, String letterform, Pair