-/* Copyright (c) 2009 Peter Troshin\r
+/* Copyright (c) 2011 Peter Troshin\r
* \r
- * JAva Bioinformatics Analysis Web Services (JABAWS) @version: 1.0\r
+ * JAva Bioinformatics Analysis Web Services (JABAWS) @version: 2.0 \r
* \r
* This library is free software; you can redistribute it and/or modify it under the terms of the\r
* Apache License version 2 as published by the Apache Software Foundation\r
\r
import java.security.InvalidParameterException;\r
import java.util.ArrayList;\r
+import java.util.HashSet;\r
import java.util.List;\r
+import java.util.Set;\r
\r
import org.apache.log4j.Logger;\r
\r
+import compbio.data.sequence.Alignment;\r
import compbio.data.sequence.FastaSequence;\r
+import compbio.data.sequence.ScoreManager;\r
import compbio.engine.AsyncExecutor;\r
import compbio.engine.Configurator;\r
import compbio.engine.ProgressGetter;\r
import compbio.metadata.Limit;\r
import compbio.metadata.LimitExceededException;\r
import compbio.metadata.Option;\r
-import compbio.util.Timer;\r
+import compbio.metadata.ResultNotAvailableException;\r
+import compbio.ws.client.Services;\r
+import compbio.ws.client.ServicesUtil;\r
\r
public final class WSUtil {\r
\r
- private static final String CACHE_KEY = "LIMITS_CACHE";\r
-\r
- private static Logger log = Logger.getLogger(WSUtil.class);\r
-\r
public static final void validateJobId(String jobId)\r
throws InvalidParameterException {\r
if (!compbio.engine.client.Util.isValidJobId(jobId)) {\r
}\r
\r
public static final void validateFastaInput(List<FastaSequence> sequences)\r
- throws InvalidParameterException {\r
+ throws JobSubmissionException {\r
if (sequences == null || sequences.isEmpty()) {\r
- throw new InvalidParameterException(\r
+ throw new JobSubmissionException(\r
"List of fasta sequences required but not provided! ");\r
}\r
+ Set<String> names = new HashSet<String>();\r
+ for (FastaSequence fs : sequences) {\r
+ boolean unique = names.add(fs.getId());\r
+ if (!unique) {\r
+ throw new JobSubmissionException(\r
+ "Input sequences must have unique names! \n"\r
+ + "Sequence " + fs.getId() + " is a duplicate!");\r
+ }\r
+ if (fs.getLength() == 0) {\r
+ throw new JobSubmissionException(\r
+ "Sequence must not be empty! Sequence: " + fs.getId()\r
+ + " was empty");\r
+ }\r
+ }\r
}\r
\r
public static JobStatus getJobStatus(String jobId) {\r
}\r
\r
public static <T> String align(List<FastaSequence> sequences,\r
- ConfiguredExecutable<T> confExec, WSLogger logger,\r
+ ConfiguredExecutable<T> confExec, Logger logger,\r
String callingMethod, Limit<T> limit)\r
throws LimitExceededException, JobSubmissionException {\r
- Timer timer = Timer.getMilliSecondsTimer();\r
+\r
+ if (limit != null && limit.isExceeded(sequences)) {\r
+ throw LimitExceededException.newLimitExceeded(limit, sequences);\r
+ }\r
+ compbio.runner.Util.writeInput(sequences, confExec);\r
+ AsyncExecutor engine = Configurator.getAsyncEngine(confExec);\r
+ String jobId = engine.submitJob(confExec);\r
+ reportUsage(confExec, logger);\r
+ return jobId;\r
+ }\r
+ \r
+ // Hardcoded gapchar '-' in this method\r
+ \r
+// public static <T> String fold(Alignment alignment,\r
+// ConfiguredExecutable<T> confExec, Logger logger,\r
+// String callingMethod, Limit<T> limit)\r
+// throws LimitExceededException, JobSubmissionException {\r
+// \r
+// List<FastaSequence> sequences = alignment.getSequences();\r
+// if (limit != null && limit.isExceeded(sequences)) {\r
+// throw LimitExceededException.newLimitExceeded(limit, sequences);\r
+// }\r
+// compbio.runner.Util.writeClustalInput(sequences, confExec, '-');\r
+// System.out.println("WSUtil-fold: Writing the clustal input file on the server: to file: "\r
+// + confExec.getInput());\r
+// System.out.println("WSUtil-fold: The executable is configured with parameters: " \r
+// + confExec.getParameters());\r
+//// System.out.println("WSUTil-fold: Dump the configured executable:\n" \r
+//// + confExec.toString());\r
+// AsyncExecutor engine = Configurator.getAsyncEngine(confExec);\r
+// String jobId = engine.submitJob(confExec);\r
+// reportUsage(confExec, logger);\r
+// return jobId;\r
+// }\r
+\r
+ static <T> void reportUsage(ConfiguredExecutable<T> confExec, Logger logger) {\r
+ if (GAUtils.IS_GA_ENABLED) {\r
+ Services service = ServicesUtil.getServiceByRunner(confExec\r
+ .getExecutable().getClass());\r
+ GAUtils.reportUsage(service);\r
+ logger.info("Reporting GA usage for " + service);\r
+ }\r
+ }\r
+\r
+ public static <T> String analize(List<FastaSequence> sequences,\r
+ ConfiguredExecutable<T> confExec, Logger log, String method,\r
+ Limit<T> limit) throws JobSubmissionException {\r
if (limit != null && limit.isExceeded(sequences)) {\r
throw LimitExceededException.newLimitExceeded(limit, sequences);\r
}\r
+ log.debug("Method: " + method + " with task: " + confExec.getTaskId());\r
compbio.runner.Util.writeInput(sequences, confExec);\r
AsyncExecutor engine = Configurator.getAsyncEngine(confExec);\r
String jobId = engine.submitJob(confExec);\r
- if (logger != null) {\r
- logger.log(timer, callingMethod, jobId);\r
+ reportUsage(confExec, log);\r
+ return jobId;\r
+ }\r
+ \r
+ // Same as analize but Alifold takes clustal input not fasta\r
+ \r
+ public static <T> String fold(List<FastaSequence> sequences,\r
+ ConfiguredExecutable<T> confExec, Logger log, String method,\r
+ Limit<T> limit) throws JobSubmissionException {\r
+ if (limit != null && limit.isExceeded(sequences)) {\r
+ throw LimitExceededException.newLimitExceeded(limit, sequences);\r
}\r
+ log.debug("Method: " + method + " with task: " + confExec.getTaskId());\r
+ // This line is different from the above method\r
+ compbio.runner.Util.writeClustalInput(sequences, confExec, '-');\r
+ AsyncExecutor engine = Configurator.getAsyncEngine(confExec);\r
+ String jobId = engine.submitJob(confExec);\r
+ reportUsage(confExec, log);\r
return jobId;\r
}\r
\r
return oList;\r
}\r
\r
+ public static void validateAAConInput(List<FastaSequence> sequences)\r
+ throws JobSubmissionException {\r
+ validateFastaInput(sequences);\r
+ int len = 0;\r
+ for (FastaSequence fs : sequences) {\r
+ if (len == 0) {\r
+ len = fs.getLength();\r
+ continue;\r
+ }\r
+ if (fs.getLength() != len) {\r
+ throw new JobSubmissionException(\r
+ "All sequences must be of the same length. Please align "\r
+ + "the sequences prior to submission! The first sequence length is : "\r
+ + len + " but the sequence '" + fs.getId()\r
+ + "' length is " + fs.getLength());\r
+ }\r
+ }\r
+ }\r
+\r
+ public static <T> ScoreManager getAnnotation(String jobId, Logger log)\r
+ throws ResultNotAvailableException {\r
+ WSUtil.validateJobId(jobId);\r
+ AsyncExecutor asyncEngine = Configurator.getAsyncEngine(jobId);\r
+ ConfiguredExecutable<T> aacon = (ConfiguredExecutable<T>) asyncEngine\r
+ .getResults(jobId);\r
+ \r
+ \r
+ ScoreManager mas = aacon.getResults();\r
+ \r
+ log.trace(jobId + " getConservation : " + mas);\r
+ return mas;\r
+ }\r
+\r
/*\r
* UNUSED\r
* \r