Scala classes were only returning direct subclasses (confirmed when inspected in debugger) so changed PluginManager to allow specifying the explicit subclass.
Removed some generics from PluginManager for now until able to figure out syntax for requesting explicit subclass. QStatusMessenger uses a slightly more primitive Map[String, Seq[RemoteFile]] instead of Map[ArgumentSource, Seq[RemoteFile]]. Added an QCommandPlugin.initScript utility method for handling specialized script types.
This commit is contained in:
parent
e03c9269ad
commit
2ec3852acd
|
|
@ -350,11 +350,11 @@ public class WalkerManager extends PluginManager<Walker> {
|
|||
* @return A name for this type of walker.
|
||||
*/
|
||||
@Override
|
||||
public String getName(Class<? extends Walker> walkerType) {
|
||||
public String getName(Class walkerType) {
|
||||
String walkerName = "";
|
||||
|
||||
if (walkerType.getAnnotation(WalkerName.class) != null)
|
||||
walkerName = walkerType.getAnnotation(WalkerName.class).value().trim();
|
||||
walkerName = ((WalkerName)walkerType.getAnnotation(WalkerName.class)).value().trim();
|
||||
else
|
||||
walkerName = super.getName(walkerType);
|
||||
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@ public class PluginManager<PluginType> {
|
|||
* Create a new plugin manager.
|
||||
* @param pluginType Core type for a plugin.
|
||||
*/
|
||||
public PluginManager(Class<PluginType> pluginType) {
|
||||
public PluginManager(Class pluginType) {
|
||||
this(pluginType, pluginType.getSimpleName().toLowerCase(), pluginType.getSimpleName(), null);
|
||||
}
|
||||
|
||||
|
|
@ -110,7 +110,7 @@ public class PluginManager<PluginType> {
|
|||
* @param pluginType Core type for a plugin.
|
||||
* @param classpath Custom class path to search for classes.
|
||||
*/
|
||||
public PluginManager(Class<PluginType> pluginType, List<URL> classpath) {
|
||||
public PluginManager(Class pluginType, List<URL> classpath) {
|
||||
this(pluginType, pluginType.getSimpleName().toLowerCase(), pluginType.getSimpleName(), classpath);
|
||||
}
|
||||
|
||||
|
|
@ -120,7 +120,7 @@ public class PluginManager<PluginType> {
|
|||
* @param pluginCategory Provides a category name to the plugin. Must not be null.
|
||||
* @param pluginSuffix Provides a suffix that will be trimmed off when converting to a plugin name. Can be null.
|
||||
*/
|
||||
public PluginManager(Class<PluginType> pluginType, String pluginCategory, String pluginSuffix) {
|
||||
public PluginManager(Class pluginType, String pluginCategory, String pluginSuffix) {
|
||||
this(pluginType, pluginCategory, pluginSuffix, null);
|
||||
}
|
||||
|
||||
|
|
@ -131,7 +131,7 @@ public class PluginManager<PluginType> {
|
|||
* @param pluginSuffix Provides a suffix that will be trimmed off when converting to a plugin name. Can be null.
|
||||
* @param classpath Custom class path to search for classes.
|
||||
*/
|
||||
public PluginManager(Class<PluginType> pluginType, String pluginCategory, String pluginSuffix, List<URL> classpath) {
|
||||
public PluginManager(Class pluginType, String pluginCategory, String pluginSuffix, List<URL> classpath) {
|
||||
this.pluginCategory = pluginCategory;
|
||||
this.pluginSuffix = pluginSuffix;
|
||||
|
||||
|
|
@ -149,6 +149,7 @@ public class PluginManager<PluginType> {
|
|||
}
|
||||
|
||||
// Load all classes types filtering them by concrete.
|
||||
@SuppressWarnings("unchecked")
|
||||
Set<Class<? extends PluginType>> allTypes = reflections.getSubTypesOf(pluginType);
|
||||
for( Class<? extends PluginType> type: allTypes ) {
|
||||
// The plugin manager does not support anonymous classes; to be a plugin, a class must have a name.
|
||||
|
|
@ -325,7 +326,7 @@ public class PluginManager<PluginType> {
|
|||
* @param pluginType The type of plugin.
|
||||
* @return A name for this type of plugin.
|
||||
*/
|
||||
public String getName(Class<? extends PluginType> pluginType) {
|
||||
public String getName(Class pluginType) {
|
||||
String pluginName = "";
|
||||
|
||||
if (pluginName.length() == 0) {
|
||||
|
|
|
|||
|
|
@ -92,13 +92,19 @@ class QCommandLine extends CommandLineProgram with Logging {
|
|||
private lazy val qScriptPluginManager = {
|
||||
qScriptClasses = IOUtils.tempDir("Q-Classes-", "", settings.qSettings.tempDirectory)
|
||||
qScriptManager.loadScripts(scripts, qScriptClasses)
|
||||
new PluginManager[QScript](classOf[QScript], Seq(qScriptClasses.toURI.toURL))
|
||||
new PluginManager[QScript](qPluginType, Seq(qScriptClasses.toURI.toURL))
|
||||
}
|
||||
|
||||
private lazy val qCommandPlugin = {
|
||||
new PluginManager[QCommandPlugin](classOf[QCommandPlugin])
|
||||
}
|
||||
|
||||
private lazy val allCommandPlugins = qCommandPlugin.createAllTypes()
|
||||
|
||||
private lazy val qPluginType: Class[_ <: QScript] = {
|
||||
allCommandPlugins.map(_.qScriptClass).headOption.getOrElse(classOf[QScript])
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes the QScripts passed in, runs their script() methods, retrieves their generated
|
||||
* functions, and then builds and runs a QGraph based on the dependencies.
|
||||
|
|
@ -106,8 +112,6 @@ class QCommandLine extends CommandLineProgram with Logging {
|
|||
def execute = {
|
||||
ClassFieldCache.parsingEngine = this.parser
|
||||
|
||||
val allCommandPlugins = qCommandPlugin.createAllTypes()
|
||||
|
||||
if (settings.qSettings.runName == null)
|
||||
settings.qSettings.runName = FilenameUtils.removeExtension(scripts.head.getName)
|
||||
if (IOUtils.isDefaultTempDir(settings.qSettings.tempDirectory))
|
||||
|
|
@ -138,6 +142,7 @@ class QCommandLine extends CommandLineProgram with Logging {
|
|||
for (script <- allQScripts) {
|
||||
logger.info("Scripting " + qScriptPluginManager.getName(script.getClass.asSubclass(classOf[QScript])))
|
||||
loadArgumentsIntoObject(script)
|
||||
allCommandPlugins.foreach(_.initScript(script))
|
||||
// TODO: Pulling inputs can be time/io expensive! Some scripts are using the files to generate functions-- even for dry runs-- so pull it all down for now.
|
||||
//if (settings.run)
|
||||
script.pullInputs()
|
||||
|
|
|
|||
|
|
@ -6,4 +6,6 @@ import util.RemoteFileConverter
|
|||
trait QCommandPlugin {
|
||||
def statusMessenger: QStatusMessenger = null
|
||||
def remoteFileConverter: RemoteFileConverter = null
|
||||
def qScriptClass: Class[_ <: QScript] = classOf[QScript]
|
||||
def initScript(script: QScript) {}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,13 +149,17 @@ trait QScript extends Logging with PrimitiveOptionConversions with StringFileCon
|
|||
* List out the remote outputs
|
||||
* @return the RemoteFile outputs by argument source
|
||||
*/
|
||||
def remoteInputs: Map[ArgumentSource, Seq[RemoteFile]] = remoteFieldMap(inputFields)
|
||||
def remoteInputs: Map[String, Seq[RemoteFile]] = tagMap(remoteFieldMap(inputFields))
|
||||
|
||||
/**
|
||||
* List out the remote outputs
|
||||
* @return the RemoteFile outputs by argument source
|
||||
*/
|
||||
def remoteOutputs: Map[ArgumentSource, Seq[RemoteFile]] = remoteFieldMap(outputFields)
|
||||
def remoteOutputs: Map[String, Seq[RemoteFile]] = tagMap(remoteFieldMap(outputFields))
|
||||
|
||||
private def tagMap(remoteFieldMap: Map[ArgumentSource, Seq[RemoteFile]]): Map[String, Seq[RemoteFile]] = {
|
||||
remoteFieldMap.collect{ case (k, v) => ClassFieldCache.fullName(k) -> v }.toMap
|
||||
}
|
||||
|
||||
private def remoteFieldMap(fields: Seq[ArgumentSource]): Map[ArgumentSource, Seq[RemoteFile]] = {
|
||||
fields.map(field => (field -> filterRemoteFiles(ClassFieldCache.getFieldFiles(this, field)))).filter(tuple => !tuple._2.isEmpty).toMap
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
package org.broadinstitute.sting.queue.engine
|
||||
|
||||
import org.broadinstitute.sting.commandline.ArgumentSource
|
||||
import org.broadinstitute.sting.queue.util.RemoteFile
|
||||
|
||||
/**
|
||||
|
|
@ -8,7 +7,7 @@ import org.broadinstitute.sting.queue.util.RemoteFile
|
|||
*/
|
||||
trait QStatusMessenger {
|
||||
def started()
|
||||
def done(inputs: Seq[Map[ArgumentSource, Seq[RemoteFile]]], outputs: Seq[Map[ArgumentSource, Seq[RemoteFile]]])
|
||||
def done(inputs: Seq[Map[String, Seq[RemoteFile]]], outputs: Seq[Map[String, Seq[RemoteFile]]])
|
||||
def exit(message: String)
|
||||
|
||||
def started(job: String)
|
||||
|
|
|
|||
Loading…
Reference in New Issue