From de6ae51f7e382b1775be13acf227631f1467eacf Mon Sep 17 00:00:00 2001 From: aaron Date: Mon, 2 Nov 2009 06:02:41 +0000 Subject: [PATCH] Scala walkers can now be build and run like any other walker in the GATK. Added the getUrlsForClasspath to PackageUtils, the Reflections package isn't getting the manifest files from jars in the classpath, and so we weren't seeing any walkers outside of the GenomeAnalysisTK.jar. A couple of notes: -Commented out BaseTransitionTableCalculator.scala because it's won't build; Chris could you fix this one (or kill it if it's not needed). -Removed the PrintReadsScala walker; moved the code over to a ScalaCountLoci walker (which is what the code was really doing). -Added configurations items to the ivy xml file. git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@1956 348d0f76-0448-11de-a6fe-93d51630548a --- build.xml | 115 ++++++++--------- ivy.xml | 41 +++--- .../sting/utils/PackageUtils.java | 121 ++++++++++++++++-- scala/src/BaseTransitionTableCalculator.scala | 5 +- ...tReadsScala.scala => ScalaCountLoci.scala} | 3 +- 5 files changed, 195 insertions(+), 90 deletions(-) rename scala/src/{PrintReadsScala.scala => ScalaCountLoci.scala} (86%) diff --git a/build.xml b/build.xml index d8d384d72..05389ad68 100644 --- a/build.xml +++ b/build.xml @@ -40,21 +40,18 @@ - + - - - - - - - - + + + + + @@ -104,10 +101,7 @@ - - - - + @@ -134,6 +128,7 @@ + @@ -186,54 +181,47 @@ - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + Building Scala... + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + @@ -265,10 +253,13 @@ + + + - + diff --git a/ivy.xml b/ivy.xml index 416e9e1da..43d6a9138 100644 --- a/ivy.xml +++ b/ivy.xml @@ -1,21 +1,30 @@ + - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - + + + + + + + + + diff --git a/java/src/org/broadinstitute/sting/utils/PackageUtils.java b/java/src/org/broadinstitute/sting/utils/PackageUtils.java index 3ff474686..f834c8fa1 100755 --- a/java/src/org/broadinstitute/sting/utils/PackageUtils.java +++ b/java/src/org/broadinstitute/sting/utils/PackageUtils.java @@ -3,16 +3,30 @@ package org.broadinstitute.sting.utils; import org.reflections.Reflections; import org.reflections.scanners.SubTypesScanner; import org.reflections.util.AbstractConfiguration; -import org.reflections.util.ClasspathHelper; +import org.apache.log4j.Logger; import java.util.Set; import java.util.ArrayList; import java.util.List; +import java.util.Collection; +import java.util.jar.Attributes; +import java.util.jar.JarFile; +import java.net.MalformedURLException; +import java.net.URL; +import java.io.File; +import java.io.IOException; + +import com.google.common.collect.Lists; /** * PackageUtils contains some useful methods for package introspection. */ public class PackageUtils { + /** + * our log, which we want to capture anything from this class + */ + private static Logger logger = Logger.getLogger(PackageUtils.class); + /** * A reference into our introspection utility. */ @@ -20,9 +34,9 @@ public class PackageUtils { static { // Initialize general-purpose source tree reflector. - reflections = new Reflections( new AbstractConfiguration() { + reflections = new Reflections(new AbstractConfiguration() { { - setUrls(ClasspathHelper.getUrlsForCurrentClasspath()); + setUrls(PackageUtils.getUrlsForClasspath(System.getProperty("java.class.path"))); setScanners(new SubTypesScanner()); } }); @@ -31,25 +45,116 @@ public class PackageUtils { /** * Private constructor. No instantiating this class! */ - private PackageUtils() {} + 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. + * @param iface the interface which returned classes should implement. + * @return the list of classes that implement the interface. */ 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) ) + for (Class type : allTypes) { + if (JVMUtils.isConcrete(type)) concreteTypes.add(type); } return concreteTypes; } + + /** + * get a list of URL's, given the current classpath. This function is a fix for the + * reflections package, which doesn't correctly expand the classpath from a jar (it doesn't + * get the manifest and parse out the embedded classpth). + * @param classpath the current classpath + * @return + */ + public static Collection getUrlsForClasspath(String classpath) { + // if the classpath is null, we can't really do anything + if (classpath == null || classpath.equals("")) + throw new StingException("Classpath cannot be empty or null"); + List urls = Lists.newArrayList(); + + // the current working directory + String baseDir = System.getProperty("user.dir"); + + // our collection of classpath's to expand + List javaClassPath = new ArrayList(); + + // the current classpath can be a list of path's seperated by a semicolon + String[] classPaths = classpath.split(File.pathSeparator); + for (String part : classPaths) { + extractJarClasspath(baseDir, javaClassPath, part); + } + + // check to make sure each extracted path exists, if so add it to our list + if (javaClassPath.size() > 0) + for (JarPath path : javaClassPath) { + try { + if (path.isValid()) + urls.add(path.toValidFile().toURL()); + } catch (MalformedURLException e) { + throw new StingException("could not create url from " + path, e); + } + } + + return urls; + } + + /** + * extract the classpath from a jar + * + * @param baseDir the base + * @param javaClassPath the list of jar paths + * @param part the current the subsection of the classpath we're processing + */ + private static void extractJarClasspath(String baseDir, List javaClassPath, String part) { + try { + JarFile myJar = new JarFile(part); + Attributes.Name classPath = new Attributes.Name("Class-Path"); + if (myJar.getManifest().getMainAttributes().containsKey(classPath)) { + for (String jar : myJar.getManifest().getMainAttributes().getValue(classPath).split(" ")) + javaClassPath.add(new JarPath(baseDir, new File(part).getParent(), jar)); + } + } catch (IOException e) { + logger.warn("could not retreive manifest from " + part); + } + } + + /** + * a simple helper class, to determine the absolute path to a jar file + */ + static class JarPath { + private final String mPath; + private final String mFilename; + private final String mWorkingDir; + + public JarPath(String workingDir, String path, String filename) { + this.mPath = path; + this.mFilename = filename; + mWorkingDir = workingDir; + } + + public File toValidFile() { + if (new File(mFilename).exists()) + return new File(mFilename); + if (new File(mPath + File.separator + mFilename).exists()) + return new File(mPath + File.separator + mFilename); + if (new File(mWorkingDir + File.separator + mFilename).exists()) + return new File(mWorkingDir + File.separator + mFilename); + return null; + } + + public boolean isValid() { + return (toValidFile() != null) ? true : false; + } + } + } diff --git a/scala/src/BaseTransitionTableCalculator.scala b/scala/src/BaseTransitionTableCalculator.scala index b07c539ce..ddd3b8548 100755 --- a/scala/src/BaseTransitionTableCalculator.scala +++ b/scala/src/BaseTransitionTableCalculator.scala @@ -1,4 +1,4 @@ -package org.broadinstitute.sting.scala +/**package org.broadinstitute.sting.scala import gatk.walkers.genotyper.{UnifiedGenotyper, GenotypeCall} import java.io.File @@ -68,7 +68,7 @@ class TransitionTable() { } } -class BaseTransitionTableCalculator extends LocusWalker[Unit,Int] { +class BaseTransitionTableCalculator { // extends LocusWalker[Unit,Int] { private var MIN_MAPPING_QUALITY = 30 private var MIN_BASE_QUALITY = 20 private var MIN_LOD = 5 @@ -208,3 +208,4 @@ class BaseTransitionTableCalculator extends LocusWalker[Unit,Int] { print1("1-mismatch-rev", tableREV) } } +*/ \ No newline at end of file diff --git a/scala/src/PrintReadsScala.scala b/scala/src/ScalaCountLoci.scala similarity index 86% rename from scala/src/PrintReadsScala.scala rename to scala/src/ScalaCountLoci.scala index 18bc9b2e6..658aabc18 100755 --- a/scala/src/PrintReadsScala.scala +++ b/scala/src/ScalaCountLoci.scala @@ -5,9 +5,8 @@ import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker import org.broadinstitute.sting.gatk.contexts.ReferenceContext import org.broadinstitute.sting.gatk.contexts.AlignmentContext -class PrintReadsScala extends LocusWalker[Int,Int] { +class ScalaCountLoci extends LocusWalker[Int,Int] { override def map(tracker: RefMetaDataTracker, ref: ReferenceContext, context: AlignmentContext): Int = { - //println(context.getReads().size()) return 1 }