Farewell, functionalj. You promised much, but you could not deliver.

git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@847 348d0f76-0448-11de-a6fe-93d51630548a
This commit is contained in:
hanna 2009-05-28 01:35:49 +00:00
parent d275c18e58
commit aa17c4a468
6 changed files with 34 additions and 53 deletions

View File

@ -1,7 +1,6 @@
<ivy-module version="1.0"> <ivy-module version="1.0">
<info organisation="org.broadinstitute" module="Sting"/> <info organisation="org.broadinstitute" module="Sting"/>
<dependencies> <dependencies>
<dependency org="net.sf" name="functionalj" rev="latest.integration" />
<dependency org="net.sf" name="sam" rev="latest.integration" /> <dependency org="net.sf" name="sam" rev="latest.integration" />
<dependency org="edu.mit.broad" name="picard" rev="latest.integration" /> <dependency org="edu.mit.broad" name="picard" rev="latest.integration" />
<dependency org="junit" name="junit" rev="4.4" /> <dependency org="junit" name="junit" rev="4.4" />

View File

@ -1,10 +1,5 @@
package org.broadinstitute.sting.gatk; package org.broadinstitute.sting.gatk;
import net.sf.functionalj.reflect.StdReflect;
import net.sf.functionalj.reflect.JdkStdReflect;
import net.sf.functionalj.FunctionN;
import net.sf.functionalj.Functions;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@ -41,7 +36,7 @@ public class WalkerManager {
*/ */
private static Logger logger = Logger.getLogger(WalkerManager.class); private static Logger logger = Logger.getLogger(WalkerManager.class);
private Map<String, Class> walkers; private Map<String, Class<? extends Walker>> walkersByName;
public WalkerManager(String pluginDirectory) { public WalkerManager(String pluginDirectory) {
try { try {
@ -67,12 +62,12 @@ public class WalkerManager {
} }
} }
walkerCandidates = filterWalkers(walkerCandidates); List<Class<? extends Walker>> walkers = filterWalkers(walkerCandidates);
if (walkerCandidates.isEmpty()) if (walkerCandidates.isEmpty())
throw new RuntimeException("No walkers were found."); throw new RuntimeException("No walkers were found.");
walkers = createWalkerDatabase(walkerCandidates); walkersByName = createWalkerDatabase(walkers);
} }
// IOExceptions here are suspect; they indicate that the WalkerManager can't open its containing jar. // IOExceptions here are suspect; they indicate that the WalkerManager can't open its containing jar.
// Wrap in a RuntimeException. // Wrap in a RuntimeException.
@ -88,7 +83,7 @@ public class WalkerManager {
* @return True if the walker exists, false otherwise. * @return True if the walker exists, false otherwise.
*/ */
public boolean doesWalkerExist(String walkerName) { public boolean doesWalkerExist(String walkerName) {
return walkers.containsKey(walkerName); return walkersByName.containsKey(walkerName);
} }
/** /**
@ -99,8 +94,8 @@ public class WalkerManager {
*/ */
public Walker createWalkerByName(String walkerName) public Walker createWalkerByName(String walkerName)
throws InstantiationException, IllegalAccessException { throws InstantiationException, IllegalAccessException {
Class walker = walkers.get(walkerName); Class<? extends Walker> walker = walkersByName.get(walkerName);
return (Walker) walker.newInstance(); return walker.newInstance();
} }
/** /**
@ -109,7 +104,7 @@ public class WalkerManager {
* @return Class representing the walker. * @return Class representing the walker.
*/ */
public Class getWalkerClassByName(String walkerName) { public Class getWalkerClassByName(String walkerName) {
return walkers.get(walkerName); return walkersByName.get(walkerName);
} }
/** /**
@ -213,10 +208,13 @@ public class WalkerManager {
* @param classes Arbitrary list of classes. * @param classes Arbitrary list of classes.
* @return List of classes extending from Walker. * @return List of classes extending from Walker.
*/ */
private List<Class> filterWalkers(List<Class> classes) { private List<Class<? extends Walker>> filterWalkers(List<Class> classes) {
StdReflect reflect = new JdkStdReflect(); List<Class<? extends Walker>> walkerClasses = new ArrayList<Class<? extends Walker>>();
FunctionN<Boolean> filterFunc = reflect.instanceFunction(new JVMUtils.ClassFilter(Walker.class), "filter", Class.class); for( Class clazz: classes ) {
return Functions.findAll(filterFunc.f1(), classes); if( JVMUtils.isConcreteImplementationOf(clazz,Walker.class) )
walkerClasses.add( (Class<? extends Walker>)clazz );
}
return walkerClasses;
} }
/** /**
@ -225,10 +223,10 @@ public class WalkerManager {
* @param walkerClasses Classes to instantiate. * @param walkerClasses Classes to instantiate.
* @return map of walker name to walker. * @return map of walker name to walker.
*/ */
private Map<String, Class> createWalkerDatabase(List<Class> walkerClasses) { private Map<String, Class<? extends Walker>> createWalkerDatabase(List<Class<? extends Walker>> walkerClasses) {
Map<String, Class> walkers = new HashMap<String, Class>(); Map<String, Class<? extends Walker>> walkers = new HashMap<String, Class<? extends Walker>>();
for (Class<Walker> walkerClass : walkerClasses) { for (Class<? extends Walker> walkerClass : walkerClasses) {
String walkerName = getWalkerName(walkerClass); String walkerName = getWalkerName(walkerClass);
logger.info(String.format("* Adding module %s", walkerName)); logger.info(String.format("* Adding module %s", walkerName));
walkers.put(walkerName, walkerClass); walkers.put(walkerName, walkerClass);

View File

@ -3,12 +3,6 @@ package org.broadinstitute.sting.utils;
import edu.mit.broad.picard.directed.IntervalList; import edu.mit.broad.picard.directed.IntervalList;
import edu.mit.broad.picard.reference.ReferenceSequenceFile; import edu.mit.broad.picard.reference.ReferenceSequenceFile;
import edu.mit.broad.picard.util.Interval; import edu.mit.broad.picard.util.Interval;
import net.sf.functionalj.Function1;
import net.sf.functionalj.FunctionN;
import net.sf.functionalj.Functions;
import net.sf.functionalj.reflect.JdkStdReflect;
import net.sf.functionalj.reflect.StdReflect;
import net.sf.functionalj.util.Operators;
import net.sf.samtools.SAMRecord; import net.sf.samtools.SAMRecord;
import net.sf.samtools.SAMSequenceDictionary; import net.sf.samtools.SAMSequenceDictionary;
import net.sf.samtools.SAMSequenceRecord; import net.sf.samtools.SAMSequenceRecord;
@ -203,23 +197,21 @@ public class GenomeLoc implements Comparable<GenomeLoc>, Cloneable {
* @param str String representation of genome locs. Null string corresponds to no filter. * @param str String representation of genome locs. Null string corresponds to no filter.
* @return Array of GenomeLoc objects corresponding to the locations in the string, sorted by coordinate order * @return Array of GenomeLoc objects corresponding to the locations in the string, sorted by coordinate order
*/ */
public static ArrayList<GenomeLoc> parseGenomeLocs(final String str) { public static List<GenomeLoc> parseGenomeLocs(final String str) {
// Null string means no filter. // Null string means no filter.
if( str == null ) return null; if( str == null ) return null;
// Of the form: loc1;loc2;... // Of the form: loc1;loc2;...
// Where each locN can be: // Where each locN can be:
// 'chr2', 'chr2:1000000' or 'chr2:1,000,000-2,000,000' // 'chr2', 'chr2:1000000' or 'chr2:1,000,000-2,000,000'
StdReflect reflect = new JdkStdReflect();
FunctionN<GenomeLoc> parseOne = reflect.staticFunction(GenomeLoc.class, "parseGenomeLoc", String.class);
Function1<GenomeLoc, String> f1 = parseOne.f1();
try { try {
Collection<GenomeLoc> result = Functions.map(f1, Arrays.asList(str.split(";"))); List<GenomeLoc> locs = new ArrayList<GenomeLoc>();
ArrayList<GenomeLoc> locs = new ArrayList(result); for( String loc: str.split(";") )
locs.add( parseGenomeLoc(loc.trim()) );
Collections.sort(locs); Collections.sort(locs);
//logger.info(String.format("Going to process %d locations", locs.length)); //logger.info(String.format("Going to process %d locations", locs.length));
locs = mergeOverlappingLocations(locs); locs = mergeOverlappingLocations(locs);
logger.info("Locations are:" + Utils.join(", ", Functions.map(Operators.toString, locs))); logger.info("Locations are:" + Utils.join(", ", locs));
return locs; return locs;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@ -228,8 +220,8 @@ public class GenomeLoc implements Comparable<GenomeLoc>, Cloneable {
} }
} }
public static ArrayList<GenomeLoc> mergeOverlappingLocations(final ArrayList<GenomeLoc> raw) { public static List<GenomeLoc> mergeOverlappingLocations(final List<GenomeLoc> raw) {
logger.debug(" Raw locations are:\n" + Utils.join("\n", Functions.map(Operators.toString, raw))); logger.debug(" Raw locations are:\n" + Utils.join("\n", raw));
if ( raw.size() <= 1 ) if ( raw.size() <= 1 )
return raw; return raw;
else { else {
@ -561,11 +553,11 @@ public class GenomeLoc implements Comparable<GenomeLoc>, Cloneable {
* *
* @param file_name * @param file_name
*/ */
public static ArrayList<GenomeLoc> IntervalFileToList(final String file_name) { public static List<GenomeLoc> IntervalFileToList(final String file_name) {
// first try to read it as an interval file since that's well structured // first try to read it as an interval file since that's well structured
// we'll fail quickly if it's not a valid file. Then try to parse it as // we'll fail quickly if it's not a valid file. Then try to parse it as
// a location string file // a location string file
ArrayList<GenomeLoc> ret = null; List<GenomeLoc> ret = null;
try { try {
IntervalList il = IntervalList.fromFile(new File(file_name)); IntervalList il = IntervalList.fromFile(new File(file_name));

View File

@ -101,20 +101,15 @@ public class JVMUtils {
} }
/** /**
* A functor returning true for classes which extend from baseClass. * 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.
*/ */
public static class ClassFilter { public static boolean isConcreteImplementationOf( Class clazz, Class baseClass ) {
private Class baseClass; return baseClass.isAssignableFrom(clazz) &&
!Modifier.isAbstract(clazz.getModifiers()) &&
public ClassFilter(Class baseClass) { !Modifier.isInterface(clazz.getModifiers());
this.baseClass = baseClass;
}
public Boolean filter(Class clazz) {
return baseClass.isAssignableFrom(clazz) &&
!Modifier.isAbstract(clazz.getModifiers()) &&
!Modifier.isInterface(clazz.getModifiers());
}
} }
/** /**

View File

@ -1,3 +0,0 @@
<ivy-module version="1.0">
<info organisation="net.sf" module="functionalj" revision="1.0" status="release" />
</ivy-module>