From b43925c01e26edec418fbb2d35fba129b4ad6388 Mon Sep 17 00:00:00 2001 From: hanna Date: Tue, 21 Jul 2009 18:32:22 +0000 Subject: [PATCH] Switched to Reflections (http://code.google.com/p/reflections/) project for inspecting the source tree and loading walkers, rather than trying to roll our own by hand. git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@1286 348d0f76-0448-11de-a6fe-93d51630548a --- ivy.xml | 5 + .../sting/gatk/CommandLineGATK.java | 5 +- .../sting/gatk/GenomeAnalysisEngine.java | 4 +- .../sting/gatk/WalkerManager.java | 82 +------- .../variants/VariantFiltrationWalker.java | 10 +- .../somaticcoverage/SomaticCoverageTool.java | 2 +- .../broadinstitute/sting/utils/JVMUtils.java | 192 +----------------- .../sting/utils/PackageUtils.java | 67 +++--- .../utils/cmdLine/CommandLineProgram.java | 8 +- settings/ivysettings.xml | 1 + .../org.reflections/reflections-0.9.2.jar | Bin 0 -> 47205 bytes .../org.reflections/reflections-0.9.2.xml | 3 + 12 files changed, 60 insertions(+), 319 deletions(-) create mode 100644 settings/repository/org.reflections/reflections-0.9.2.jar create mode 100644 settings/repository/org.reflections/reflections-0.9.2.xml diff --git a/ivy.xml b/ivy.xml index 53c15d03c..6d580c3cc 100644 --- a/ivy.xml +++ b/ivy.xml @@ -10,5 +10,10 @@ + + + + + diff --git a/java/src/org/broadinstitute/sting/gatk/CommandLineGATK.java b/java/src/org/broadinstitute/sting/gatk/CommandLineGATK.java index d53638a19..e665e0f0d 100755 --- a/java/src/org/broadinstitute/sting/gatk/CommandLineGATK.java +++ b/java/src/org/broadinstitute/sting/gatk/CommandLineGATK.java @@ -42,9 +42,6 @@ public class CommandLineGATK extends CommandLineExecutable { @Argument(fullName = "analysis_type", shortName = "T", doc = "Type of analysis to run") private String analysisName = null; - @Argument(fullName = "plugin_path", doc = "Which path will the GATK search for plugin walkers.", required = false) - private String pluginPath = null; - // our argument collection, the collection of command line args we accept @ArgumentCollection private GATKArgumentCollection argCollection = new GATKArgumentCollection(); @@ -72,7 +69,7 @@ public class CommandLineGATK extends CommandLineExecutable { @Override protected GenomeAnalysisEngine getGATKEngine() { if( GATKEngine == null ) - GATKEngine = new GenomeAnalysisEngine( pluginPath ); + GATKEngine = new GenomeAnalysisEngine(); return GATKEngine; } diff --git a/java/src/org/broadinstitute/sting/gatk/GenomeAnalysisEngine.java b/java/src/org/broadinstitute/sting/gatk/GenomeAnalysisEngine.java index ca378bb94..8836d99f4 100755 --- a/java/src/org/broadinstitute/sting/gatk/GenomeAnalysisEngine.java +++ b/java/src/org/broadinstitute/sting/gatk/GenomeAnalysisEngine.java @@ -70,10 +70,10 @@ public class GenomeAnalysisEngine { * new MicroScheduler class we'll be able to delete that function. * */ - public GenomeAnalysisEngine( String pluginPathName ) { + public GenomeAnalysisEngine() { // make sure our instance variable points to this analysis engine instance = this; - walkerManager = new WalkerManager(pluginPathName); + walkerManager = new WalkerManager(); } /** diff --git a/java/src/org/broadinstitute/sting/gatk/WalkerManager.java b/java/src/org/broadinstitute/sting/gatk/WalkerManager.java index 0e84f5884..5d211199b 100755 --- a/java/src/org/broadinstitute/sting/gatk/WalkerManager.java +++ b/java/src/org/broadinstitute/sting/gatk/WalkerManager.java @@ -1,19 +1,12 @@ package org.broadinstitute.sting.gatk; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.HashMap; -import java.util.Map; -import java.util.Arrays; +import java.util.*; import org.broadinstitute.sting.gatk.walkers.*; import org.broadinstitute.sting.gatk.refdata.ReferenceOrderedDatum; import org.broadinstitute.sting.gatk.refdata.ReferenceOrderedData; -import org.broadinstitute.sting.utils.JVMUtils; -import org.broadinstitute.sting.utils.PathUtils; import org.broadinstitute.sting.utils.StingException; +import org.broadinstitute.sting.utils.PackageUtils; import org.apache.log4j.Logger; import net.sf.picard.filter.SamRecordFilter; @@ -33,42 +26,9 @@ public class WalkerManager { private Map> walkersByName; - public WalkerManager(String pluginDirectory) { - try { - List walkerCandidates = new ArrayList(); - - // Load all classes that live in this jar. - final File location = JVMUtils.getLocationFor( getClass() ); - walkerCandidates.addAll(loadClassesFromLocation(location)); - - // Load all classes that live in the extension path. - if (pluginDirectory == null) - pluginDirectory = location.getParent() + File.separator + "walkers"; - logger.info("plugin directory: " + pluginDirectory); - - File extensionPath = new File(pluginDirectory); - if (extensionPath.exists()) { - List classFilesInPath = PathUtils.findFilesInPath(extensionPath, "", "class", false); - walkerCandidates.addAll(JVMUtils.loadExternalClasses(extensionPath, classFilesInPath)); - List jarsInPath = PathUtils.findFilesInPath(extensionPath, "", "jar", false); - for( String jarFileName: jarsInPath ) { - File jarFile = new File( extensionPath, jarFileName ); - walkerCandidates.addAll(JVMUtils.loadExternalClassesFromJar(jarFile) ); - } - } - - List> walkers = filterWalkers(walkerCandidates); - - if (walkerCandidates.isEmpty()) - throw new RuntimeException("No walkers were found."); - - walkersByName = createWalkerDatabase(walkers); - } - // IOExceptions here are suspect; they indicate that the WalkerManager can't open its containing jar. - // Wrap in a RuntimeException. - catch (IOException ex) { - throw new RuntimeException(ex); - } + public WalkerManager() { + List> walkers = PackageUtils.getClassesImplementingInterface(Walker.class); + walkersByName = createWalkerDatabase(walkers); } /** @@ -206,38 +166,6 @@ public class WalkerManager { return filters; } - /** - * Load classes internal to the classpath from an arbitrary location. - * - * @param location Location from which to load classes. - * @return List of classes. - * @throws IOException Problem occurred reading classes. - */ - private List loadClassesFromLocation(File location) - throws IOException { - if (location.getAbsolutePath().endsWith(".jar")) - return JVMUtils.loadInternalClassesFromJar(location); - else { - List classFileNames = PathUtils.findFilesInPath(location, "", "class", true); - return JVMUtils.loadInternalClasses(classFileNames); - } - } - - /** - * Given a list of classes, return a list of those classes which extend from the Walker base interface. - * - * @param classes Arbitrary list of classes. - * @return List of classes extending from Walker. - */ - private List> filterWalkers(List classes) { - List> walkerClasses = new ArrayList>(); - for( Class clazz: classes ) { - if( JVMUtils.isConcreteImplementationOf(clazz,Walker.class) ) - walkerClasses.add( (Class)clazz ); - } - return walkerClasses; - } - /** * Instantiate the list of walker classes. Add them to the walker hashmap. * diff --git a/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VariantFiltrationWalker.java b/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VariantFiltrationWalker.java index 08fff4ba4..7d719ca37 100755 --- a/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VariantFiltrationWalker.java +++ b/java/src/org/broadinstitute/sting/playground/gatk/walkers/variants/VariantFiltrationWalker.java @@ -16,9 +16,7 @@ import org.broadinstitute.sting.playground.gatk.walkers.variants.*; import java.io.File; import java.io.FileNotFoundException; import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; +import java.util.*; /** * VariantFiltrationWalker applies specified conditionally independent features to pre-called variants, thus modifying @@ -33,8 +31,8 @@ public class VariantFiltrationWalker extends LocusWalker { @Argument(fullName="list", shortName="ls", doc="List the available features and exclusion criteria and exit") public Boolean LIST = false; @Argument(fullName="truth", shortName="truth", doc="Operate on truth set only") public Boolean TRUTH = false; - private ArrayList featureClasses; - private ArrayList exclusionClasses; + private List> featureClasses; + private List> exclusionClasses; private PrintWriter vwriter; private HashMap ewriters; @@ -143,7 +141,7 @@ public class VariantFiltrationWalker extends LocusWalker { * @param classes an ArrayList of classes * @return String of available classes */ - private String getAvailableClasses(ArrayList classes) { + private String getAvailableClasses(List> classes) { String availableString = ""; for (int classIndex = 0; classIndex < classes.size(); classIndex++) { diff --git a/java/src/org/broadinstitute/sting/playground/somaticcoverage/SomaticCoverageTool.java b/java/src/org/broadinstitute/sting/playground/somaticcoverage/SomaticCoverageTool.java index 2853ce766..e1e1abce6 100644 --- a/java/src/org/broadinstitute/sting/playground/somaticcoverage/SomaticCoverageTool.java +++ b/java/src/org/broadinstitute/sting/playground/somaticcoverage/SomaticCoverageTool.java @@ -63,7 +63,7 @@ public class SomaticCoverageTool extends CommandLineExecutable { @Override protected GenomeAnalysisEngine getGATKEngine() { if( GATKEngine == null ) - GATKEngine = new GenomeAnalysisEngine( null ); + GATKEngine = new GenomeAnalysisEngine(); return GATKEngine; } diff --git a/java/src/org/broadinstitute/sting/utils/JVMUtils.java b/java/src/org/broadinstitute/sting/utils/JVMUtils.java index 142deddaf..c4d63b08e 100755 --- a/java/src/org/broadinstitute/sting/utils/JVMUtils.java +++ b/java/src/org/broadinstitute/sting/utils/JVMUtils.java @@ -1,14 +1,5 @@ package org.broadinstitute.sting.utils; -import java.io.File; -import java.io.IOException; -import java.io.FileInputStream; -import java.util.List; -import java.util.ArrayList; -import java.util.jar.JarInputStream; -import java.util.jar.JarEntry; -import java.net.URL; -import java.net.URLClassLoader; import java.lang.reflect.Modifier; /** @@ -26,189 +17,14 @@ public class JVMUtils { */ private JVMUtils() { } - /** - * Determines which location contains the specified class. - * - * @return Location (either jar file or directory) of path containing class. - */ - public static File getLocationFor( Class clazz ) throws IOException { - try { - java.net.URI locationURI = clazz.getProtectionDomain().getCodeSource().getLocation().toURI(); - return new File(locationURI); - } - catch (java.net.URISyntaxException ex) { - // a URISyntaxException here must be an IO error; wrap as such. - throw new IOException(ex); - } - catch ( NullPointerException ne ) { - throw new IOException("Can not extract code source location for "+clazz.getName()); - } - } - - /** - * Loads concrete classes from a jar which are both in the same package or 'sub-package' of baseClass, - * and which extend from baseClass. Loaded classes must already be on the classpath. - * - * @param jarFile The jar file to search. - * @return A list of classes derived from baseClass. - */ - public static List loadInternalClassesFromJar(final File jarFile) - throws IOException { - return loadClassesFromJar( jarFile, new InternalLoadingStrategy() ); - } - - /** - * Loads concrete classes from a jar which are both in the same package or 'sub-package' of baseClass, - * and which extend from baseClass. Loaded classes can be outside of the current classpath. - * - * @param jarFile The jar file to search. - * @return A list of classes derived from baseClass. - */ - public static List loadExternalClassesFromJar(final File jarFile) - throws IOException { - return loadClassesFromJar( jarFile, new ExternalLoadingStrategy(jarFile) ); - } - - /** - * Loads a list of classes currently on the classpath. - * - * @param classFileNames List of files representing classes. - * @return class objects. - * @throws IOException Unable to open any of the found classes. - */ - public static List loadInternalClasses(List classFileNames) - throws IOException { - return loadClasses( classFileNames, new InternalLoadingStrategy() ); - } - - /** - * Load loose classes, external to the classloader, from the specified directory. - * - * @param path source path from which to load classes. - * @return A list of all loose classes contained in the path directory. - */ - public static List loadExternalClasses(final File path, List classFileNames) - throws IOException { - return loadClasses( classFileNames, new ExternalLoadingStrategy( path ) ); - } - - /** - * Convert a filename of the form a/b/c.class to a.b.c. Makes no assurances about whether the - * class is valid on any classloader. - * - * @param fileName Filename to convert. - * @return classname represented by that file. - */ - public static String fileNameToClassName(String fileName) { - return fileName.substring(0, fileName.lastIndexOf(".class")).replace('/', '.'); - } - /** * Is the specified class a concrete implementation of baseClass? * @param clazz Class to check. - * @param baseClass Base class to check against. - * @return True if clazz implements baseClass and is not abstract / an interface. False otherwise. + * @return True if clazz is concrete. False otherwise. */ - public static boolean isConcreteImplementationOf( Class clazz, Class baseClass ) { - return baseClass.isAssignableFrom(clazz) && - !Modifier.isAbstract(clazz.getModifiers()) && - !Modifier.isInterface(clazz.getModifiers()); - } - - /** - * Loads a list of classes from the given jar, using the provided loading strategy. - * @param jarFile Jar file from which to load. - * @param loader Dictates how these classes should be loaded. - * @return A list of loaded classes. - * @throws IOException In case there's an IO error trying to load the jar. - */ - private static List loadClassesFromJar( final File jarFile, final LoadingStrategy loader ) - throws IOException { - List classes = new ArrayList(); - - JarInputStream jarInputStream = new JarInputStream(new FileInputStream(jarFile)); - - try { - JarEntry jarEntry = jarInputStream.getNextJarEntry(); - - while (jarEntry != null) { - String jarEntryName = jarEntry.getName(); - if (jarEntryName.endsWith(".class")) { - String className = fileNameToClassName(jarEntryName); - classes.add( loader.load( className ) ); - } - jarEntry = jarInputStream.getNextJarEntry(); - } - } - catch (ClassNotFoundException ex) { - // A ClassNotFoundException here must be an IO error; wrap as such. - throw new IOException(ex); - } - finally { - jarInputStream.close(); - } - - return classes; - } - - /** - * Loads a list of classes, using the provided loading strategy. - * @param classFileNames Which class files to load. - * @param loader Dictates how these classes should be loaded. - * @return A list of loaded classes. - * @throws IOException In case there's an IO error trying to load the jar. - */ - private static List loadClasses( List classFileNames, LoadingStrategy loader ) - throws IOException { - List classes = new ArrayList(); - - for (String classFileName : classFileNames) { - String className = fileNameToClassName(classFileName); - try { - classes.add( loader.load( className ) ); - } - catch (ClassNotFoundException ex) { - // A ClassNotFoundException here must be an IO error; wrap as such. - throw new IOException(ex); - } - } - - return classes; - } - - - /** - * What mechanism should we use for loading a list of classes? - */ - private static interface LoadingStrategy { - Class load( String className ) throws ClassNotFoundException; - } - - /** - * An internal loading strategy, for loading classes already on the classpath. - */ - private static class InternalLoadingStrategy implements LoadingStrategy { - public Class load( String className ) - throws ClassNotFoundException { - return Class.forName( className ); - } - } - - /** - * An external loading strategy, for loading classes not necessarily already - * on the classpath. - */ - private static class ExternalLoadingStrategy implements LoadingStrategy { - private final ClassLoader classLoader; - - public ExternalLoadingStrategy( final File jarFile ) throws IOException { - URL pathURL = jarFile.toURI().toURL(); - classLoader = new URLClassLoader(new URL[]{pathURL}); - } - - public Class load( String className ) throws ClassNotFoundException { - return classLoader.loadClass(className); - } + public static boolean isConcrete( Class clazz ) { + return !Modifier.isAbstract(clazz.getModifiers()) && + !Modifier.isInterface(clazz.getModifiers()); } } diff --git a/java/src/org/broadinstitute/sting/utils/PackageUtils.java b/java/src/org/broadinstitute/sting/utils/PackageUtils.java index cc99d630c..3ff474686 100755 --- a/java/src/org/broadinstitute/sting/utils/PackageUtils.java +++ b/java/src/org/broadinstitute/sting/utils/PackageUtils.java @@ -1,56 +1,55 @@ package org.broadinstitute.sting.utils; -import java.util.List; +import org.reflections.Reflections; +import org.reflections.scanners.SubTypesScanner; +import org.reflections.util.AbstractConfiguration; +import org.reflections.util.ClasspathHelper; + +import java.util.Set; import java.util.ArrayList; -import java.io.File; -import java.io.IOException; +import java.util.List; /** * PackageUtils contains some useful methods for package introspection. */ public class PackageUtils { + /** + * A reference into our introspection utility. + */ + private static Reflections reflections = null; + + static { + // Initialize general-purpose source tree reflector. + reflections = new Reflections( new AbstractConfiguration() { + { + setUrls(ClasspathHelper.getUrlsForCurrentClasspath()); + setScanners(new SubTypesScanner()); + } + }); + } + /** * Private constructor. No instantiating this class! */ private PackageUtils() {} + { + } /** * Return the classes that implement the specified interface. * * @param iface the interface which returned classes should implement. - * @return the list of classes that implement the interface. How is that not clear by now?!!!!111one!! + * @return the list of classes that implement the interface. */ - public static ArrayList getClassesImplementingInterface(Class iface) { - try { - final File location = JVMUtils.getLocationFor(iface); - - List potentialClasses = getClassesFromLocation(location); - ArrayList implementingClasses = new ArrayList(); - - for (Class potentialClass : potentialClasses) { - if (JVMUtils.isConcreteImplementationOf(potentialClass, iface)) { - implementingClasses.add(potentialClass); - } - } - - return implementingClasses; - } catch (IOException e) { - throw new StingException(String.format("Unable to inspect package containing '%s'", iface.getName())); + public static List> getClassesImplementingInterface(Class iface) { + // Load all classes implementing the given interface, then filter out any class that isn't concrete. + Set> allTypes = reflections.getSubTypesOf(iface); + List> concreteTypes = new ArrayList>(); + for( Class type: allTypes ) { + if( JVMUtils.isConcrete(type) ) + concreteTypes.add(type); } - } - /** - * Return a list of classes at the specified location - * @param location the location where we should start searching (as returned by JVMUtils.getLocationFor(Class)) - * @return a list of classes at this location - * @throws IOException thrown if the jar or directory cannot be inspected - */ - public static List getClassesFromLocation(File location) throws IOException { - if (location.getAbsolutePath().endsWith(".jar")) - return JVMUtils.loadInternalClassesFromJar(location); - else { - List classFileNames = PathUtils.findFilesInPath(location, "", "class", true); - return JVMUtils.loadInternalClasses(classFileNames); - } + return concreteTypes; } } diff --git a/java/src/org/broadinstitute/sting/utils/cmdLine/CommandLineProgram.java b/java/src/org/broadinstitute/sting/utils/cmdLine/CommandLineProgram.java index 7a1eaf448..b9a00b590 100644 --- a/java/src/org/broadinstitute/sting/utils/cmdLine/CommandLineProgram.java +++ b/java/src/org/broadinstitute/sting/utils/cmdLine/CommandLineProgram.java @@ -99,13 +99,7 @@ public abstract class CommandLineProgram { // Default implementation to find a command line that makes sense. // If the user is running from a jar, return '-jar '; otherwise // return the full class name. - String runningInstructions = null; - try { - runningInstructions = JVMUtils.getLocationFor( getClass() ).getName(); - } - catch( IOException ex ) { - throw new StingException("Unable to determine running instructions", ex); - } + String runningInstructions = getClass().getName(); if( runningInstructions.endsWith(".jar") ) runningInstructions = String.format("-jar %s", runningInstructions); diff --git a/settings/ivysettings.xml b/settings/ivysettings.xml index 5cacb105a..fcfc8fd0f 100644 --- a/settings/ivysettings.xml +++ b/settings/ivysettings.xml @@ -12,5 +12,6 @@ + diff --git a/settings/repository/org.reflections/reflections-0.9.2.jar b/settings/repository/org.reflections/reflections-0.9.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..c91cffea5a025144f81f219eaa6ef16eabca9ec2 GIT binary patch literal 47205 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 V0B + +