/*
* Jalview - A Sequence Alignment Editor and Viewer
- * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
import jalview.analysis.*;
import jalview.bin.*;
import jalview.datamodel.*;
-import jalview.datamodel.Alignment;
-import jalview.datamodel.AlignmentView;
import jalview.gui.*;
-import jalview.io.*;
-import jalview.util.*;
-import jalview.ws.WSThread.*;
-import vamsas.objects.simple.*;
public class JPredClient
extends WSClient
{
- /**
- * crate a new GUI JPred Job
- * @param sh ServiceHandle
- * @param title String
- * @param msa boolean - true - submit alignment as a sequence profile
- * @param alview AlignmentView
- */
- public JPredClient(ext.vamsas.ServiceHandle sh, String title, boolean msa, AlignmentView alview, AlignFrame parentFrame) {
+ /**
+ * crate a new GUI JPred Job
+ * @param sh ServiceHandle
+ * @param title String
+ * @param msa boolean - true - submit alignment as a sequence profile
+ * @param alview AlignmentView
+ * @param viewonly TODO
+ */
+ public JPredClient(ext.vamsas.ServiceHandle sh, String title, boolean msa,
+ AlignmentView alview, AlignFrame parentFrame,
+ boolean viewonly)
+ {
super();
- wsInfo=setWebService(sh);
- startJPredClient(title, msa, alview, parentFrame);
+ wsInfo = setWebService(sh);
+ startJPredClient(title, msa, alview, parentFrame, viewonly);
}
+
/**
* startJPredClient
* TODO: refine submission to cope with local prediction of visible regions or multiple single sequence jobs
* @param title String
* @param msa boolean
* @param alview AlignmentView
+ * @param viewonly if true then the prediction will be made just on the concatenated visible regions
*/
private void startJPredClient(String title, boolean msa,
- jalview.datamodel.AlignmentView alview, AlignFrame parentFrame)
+ jalview.datamodel.AlignmentView alview,
+ AlignFrame parentFrame, boolean viewonly)
{
AlignmentView input = alview;
if (wsInfo == null)
Cache.log.warn("Couldn't find a Jpred webservice to invoke!");
return;
}
+ SeqCigar[] msf = null;
+ SequenceI seq = null;
+ int[] delMap = null;
+ // original JNetClient behaviour - submit full length of sequence or profile
+ // and mask result.
+ msf = input.getSequences();
+ seq = msf[0].getSeq('-');
+
+ if (viewonly)
+ {
+ int[] viscontigs = alview.getVisibleContigs();
+ int spos = 0;
+ int i = 0;
+ if (viscontigs != null)
+ {
+ // Construct the delMap - mapping from the positions within the input to Jnet to the contigs in the original sequence
- SeqCigar[] msf = input.getSequences();
- SequenceI seq = msf[0].getSeq('-');
+ delMap = new int[seq.getEnd() - seq.getStart() + 1];
+ int gapMap[] = seq.gapMap();
+ for (int contig = 0; contig < viscontigs.length; contig += 2)
+ {
+
+ while (spos < gapMap.length && gapMap[spos] < viscontigs[contig])
+ {
+ spos++;
+ }
+ while (spos < gapMap.length && gapMap[spos] <= viscontigs[contig + 1])
+ {
+ delMap[i++] = spos++;
+ }
+ }
+ int tmap[] = new int[i];
+ System.arraycopy(delMap, 0, tmap, 0, i);
+ delMap = tmap;
+ }
+ }
if (msa && msf.length > 1)
{
- String altitle = "JNet prediction on " + seq.getName() +
+ String altitle = "JNet prediction on " + (viewonly ? "visible " : "") +
+ seq.getName() +
" using alignment from " + title;
- wsInfo.setProgressText("Job details for MSA based prediction (" +
- title + ") on sequence :\n>" + seq.getName() +
- "\n" +
- AlignSeq.extractGaps("-. ", seq.getSequence()) +
- "\n");
SequenceI aln[] = new SequenceI[msf.length];
for (int i = 0, j = msf.length; i < j; i++)
{
}
Hashtable SequenceInfo = jalview.analysis.SeqsetUtils.uniquify(aln, true);
-
+ if (viewonly)
+ {
+ // Remove hidden regions from sequence objects.
+ String seqs[] = alview.getSequenceStrings('-');
+ for (int i = 0, j = msf.length; i < j; i++)
+ {
+ aln[i].setSequence(seqs[i]);
+ }
+ seq.setSequence(seqs[0]);
+ }
+ wsInfo.setProgressText("Job details for " + (viewonly ? "visible " : "") +
+ "MSA based prediction (" +
+ title + ") on sequence :\n>" + seq.getName() +
+ "\n" +
+ AlignSeq.extractGaps("-. ",
+ seq.getSequenceAsString()) +
+ "\n");
JPredThread jthread = new JPredThread(wsInfo, altitle, server,
- SequenceInfo, aln, alview, parentFrame);
+ SequenceInfo, aln, delMap, alview,
+ parentFrame, WsURL);
wsInfo.setthisService(jthread);
jthread.start();
}
else
{
- if (!msa && msf.length>1)
+ if (!msa && msf.length > 1)
+ {
throw new Error("Implementation Error! Multiple single sequence prediction jobs are not yet supported.");
- wsInfo.setProgressText("Job details for prediction on sequence :\n>" +
- seq.getName() + "\n" +
- AlignSeq.extractGaps("-. ", seq.getSequence()) +
- "\n");
- String altitle = "JNet prediction for sequence " + seq.getName() +
+ }
+ String altitle = "JNet prediction for " + (viewonly ? "visible " : "") +
+ "sequence " + seq.getName() +
" from " +
title;
-
+ String seqname = seq.getName();
Hashtable SequenceInfo = jalview.analysis.SeqsetUtils.SeqCharacterHash(
seq);
-
- JPredThread jthread = new JPredThread(wsInfo, altitle, server,
- SequenceInfo, seq, alview, parentFrame);
+ if (viewonly)
+ {
+ // Remove hidden regions from input sequence
+ String seqs[] = alview.getSequenceStrings('-');
+ seq.setSequence(seqs[0]);
+ }
+ wsInfo.setProgressText("Job details for prediction on " +
+ (viewonly ? "visible " : "") + "sequence :\n>" +
+ seqname + "\n" +
+ AlignSeq.extractGaps("-. ",
+ seq.getSequenceAsString()) +
+ "\n");
+ JPredThread jthread = new JPredThread(wsInfo, altitle, server, WsURL,
+ SequenceInfo, seq, delMap, alview,
+ parentFrame);
wsInfo.setthisService(jthread);
jthread.start();
}
}
- public JPredClient(ext.vamsas.ServiceHandle sh, String title, SequenceI seq, AlignFrame parentFrame)
+
+ public JPredClient(ext.vamsas.ServiceHandle sh, String title, SequenceI seq,
+ AlignFrame parentFrame)
{
super();
wsInfo = setWebService(sh);
startJPredClient(title, seq, parentFrame);
}
- public JPredClient(ext.vamsas.ServiceHandle sh, String title, SequenceI[] msa, AlignFrame parentFrame)
+ public JPredClient(ext.vamsas.ServiceHandle sh, String title, SequenceI[] msa,
+ AlignFrame parentFrame)
{
wsInfo = setWebService(sh);
startJPredClient(title, msa, parentFrame);
startJPredClient(title, seq, null);
}
- private void startJPredClient(String title, SequenceI[] msf, AlignFrame parentFrame)
+ private void startJPredClient(String title, SequenceI[] msf,
+ AlignFrame parentFrame)
{
if (wsInfo == null)
{
wsInfo.setProgressText("Job details for MSA based prediction (" +
title + ") on sequence :\n>" + seq.getName() + "\n" +
- AlignSeq.extractGaps("-. ", seq.getSequence()) +
+ AlignSeq.extractGaps("-. ", seq.getSequenceAsString()) +
"\n");
SequenceI aln[] = new SequenceI[msf.length];
for (int i = 0, j = msf.length; i < j; i++)
Hashtable SequenceInfo = jalview.analysis.SeqsetUtils.uniquify(aln, true);
Jpred server = locateWebService();
- if (server==null)
+ if (server == null)
{
return;
}
- JPredThread jthread = new JPredThread(wsInfo, altitle, server, SequenceInfo, aln,null, parentFrame);
+ JPredThread jthread = new JPredThread(wsInfo, altitle, server, SequenceInfo,
+ aln, null, null, parentFrame, WsURL);
wsInfo.setthisService(jthread);
jthread.start();
}
- public void startJPredClient(String title, SequenceI seq, AlignFrame parentFrame)
+ public void startJPredClient(String title, SequenceI seq,
+ AlignFrame parentFrame)
{
if (wsInfo == null)
{
}
wsInfo.setProgressText("Job details for prediction on sequence :\n>" +
seq.getName() + "\n" +
- AlignSeq.extractGaps("-. ", seq.getSequence()) +
+ AlignSeq.extractGaps("-. ", seq.getSequenceAsString()) +
"\n");
String altitle = "JNet prediction for sequence " + seq.getName() + " from " +
title;
Hashtable SequenceInfo = jalview.analysis.SeqsetUtils.SeqCharacterHash(seq);
Jpred server = locateWebService();
- if (server==null)
+ if (server == null)
{
return;
}
- JPredThread jthread = new JPredThread(wsInfo, altitle, server, SequenceInfo, seq,null, parentFrame);
+ JPredThread jthread = new JPredThread(wsInfo, altitle, server, WsURL,
+ SequenceInfo, seq, null, null,
+ parentFrame);
wsInfo.setthisService(jthread);
jthread.start();
}
private ext.vamsas.Jpred locateWebService()
{
ext.vamsas.JpredServiceLocator loc = new JpredServiceLocator(); // Default
- ext.vamsas.Jpred server=null;
+ ext.vamsas.Jpred server = null;
try
{
server = loc.getjpred(new java.net.URL(WsURL)); // JBPNote will be set from properties
- ( (JpredSoapBindingStub)server).setTimeout(60000); // one minute stub
+ ( (JpredSoapBindingStub) server).setTimeout(60000); // one minute stub
//((JpredSoapBindingStub)this.server)._setProperty(org.apache.axis.encoding.C, Boolean.TRUE);
}
return server;
}
-
- class JPredThread
- extends WSThread
- implements WSClientI
- {
- class JPredJob
- extends WSThread.WSJob
- {
-
- vamsas.objects.simple.Sequence sequence;
- vamsas.objects.simple.Msfalignment msa;
- java.util.Hashtable SequenceInfo = null;
- /**
- *
- * @return true if getResultSet will return a valid alignment and prediction result.
- */
- public boolean hasResults()
- {
- if (subjobComplete && result != null && result.isFinished()
- && ( (JpredResult) result).getPredfile() != null &&
- ( (JpredResult) result).getAligfile() != null)
- {
- return true;
- }
- return false;
- }
-
- boolean hasValidInput()
- {
- if (sequence != null)
- {
- return true;
- }
- return false;
- }
-
- public Alignment getResultSet()
- throws Exception
- {
- if (result == null || !result.isFinished())
- {
- return null;
- }
- Alignment al = null;
- int FirstSeq = -1; // the position of the query sequence in Alignment al
-
- JpredResult result = (JpredResult)this.result;
-
- jalview.bin.Cache.log.debug("Parsing output from JNet job.");
- // JPredFile prediction = new JPredFile("C:/JalviewX/files/jpred.txt", "File");
- jalview.io.JPredFile prediction = new jalview.io.JPredFile(result.
- getPredfile(),
- "Paste");
- SequenceI[] preds = prediction.getSeqsAsArray();
- jalview.bin.Cache.log.debug("Got prediction profile.");
-
- if ( (this.msa != null) && (result.getAligfile() != null))
- {
- jalview.bin.Cache.log.debug("Getting associated alignment.");
- // we ignore the returned alignment if we only predicted on a single sequence
- String format = new jalview.io.IdentifyFile().Identify(result.
- getAligfile(),
- "Paste");
-
- if (jalview.io.FormatAdapter.isValidFormat(format))
- {
- al = new Alignment(new FormatAdapter().readFile(result.getAligfile(),
- "Paste", format));
- SequenceI sqs[] = new SequenceI[al.getHeight()];
- for (int i = 0, j = al.getHeight(); i < j; i++)
- {
- sqs[i] = al.getSequenceAt(i);
- }
- if (!jalview.analysis.SeqsetUtils.deuniquify( (Hashtable)
- SequenceInfo, sqs))
- {
- throw (new Exception(
- "Couldn't recover sequence properties for alignment."));
- }
-
- FirstSeq = 0;
- al.setDataset(null);
-
- jalview.io.JnetAnnotationMaker.add_annotation(prediction, al, FirstSeq,
- false);
-
- }
- else
- {
- throw (new Exception(
- "Unknown format "+format+" for file : \n" +
- result.getAligfile()));
- }
- }
- else
- {
- al = new Alignment(preds);
- FirstSeq = prediction.getQuerySeqPosition();
- if (!jalview.analysis.SeqsetUtils.SeqCharacterUnhash(
- al.getSequenceAt(FirstSeq), SequenceInfo))
- {
- throw (new Exception(
- "Couldn't recover sequence properties for JNet Query sequence!"));
- } else {
- al.setDataset(null);
- jalview.io.JnetAnnotationMaker.add_annotation(prediction, al, FirstSeq,
- true);
- }
- }
-
- return al; // , FirstSeq, noMsa};
- }
- public JPredJob(Hashtable SequenceInfo, SequenceI seq)
- {
- super();
- String sq = AlignSeq.extractGaps(Comparison.GapChars, seq.getSequence());
- if (sq.length() >= 20)
- {
- this.SequenceInfo = SequenceInfo;
- sequence = new vamsas.objects.simple.Sequence();
- sequence.setId(seq.getName());
- sequence.setSeq(sq);
- }
- }
-
- public JPredJob(Hashtable SequenceInfo, SequenceI[] msf)
- {
- this(SequenceInfo, msf[0]);
- if (sequence != null)
- {
- if (msf.length > 1)
- {
- msa = new vamsas.objects.simple.Msfalignment();
- jalview.io.PileUpfile pileup = new jalview.io.PileUpfile();
- msa.setMsf(pileup.print(msf));
- }
- }
- }
- }
- ext.vamsas.Jpred server;
- String altitle = "";
- JPredThread(WebserviceInfo wsinfo, String altitle, ext.vamsas.Jpred server, AlignmentView alview, AlignFrame alframe) {
- this.altitle = altitle;
- this.server = server;
- this.wsInfo = wsinfo;
- this.input = alview;
- this.alignFrame = alframe;
- }
-
-// String OutputHeader;
-// vamsas.objects.simple.JpredResult result;
-
- JPredThread(WebserviceInfo wsinfo, String altitle, ext.vamsas.Jpred server, Hashtable SequenceInfo,SequenceI seq, AlignmentView alview, AlignFrame alframe)
- {
- this(wsinfo, altitle, server,alview, alframe);
- JPredJob job = new JPredJob(SequenceInfo, seq);
- if (job.hasValidInput())
- {
- OutputHeader = wsInfo.getProgressText();
- jobs = new WSJob[]
- {
- job};
- job.jobnum = 0;
- }
- }
-
- JPredThread(WebserviceInfo wsinfo, String altitle, ext.vamsas.Jpred server, Hashtable SequenceInfo, SequenceI[] msf, AlignmentView alview, AlignFrame alframe)
- {
- this(wsinfo, altitle, server,alview, alframe);
- JPredJob job = new JPredJob(SequenceInfo, msf);
- if (job.hasValidInput())
- {
- jobs = new WSJob[]
- {
- job};
- OutputHeader = wsInfo.getProgressText();
- job.jobnum = 0;
- }
- }
-
- /*
- public void run()
- {
- StartJob();
-
- while (!jobComplete && (allowedServerExceptions > 0))
- {
- try
- {
- if ( (result = server.getresult(jobId)) == null)
- {
- throw (new Exception(
- "Timed out when communicating with server\nTry again later.\n"));
- }
- if (result.getState()==0)
- jalview.bin.Cache.log.debug("Finished "+jobId);
- if (result.isRunning())
- {
- wsInfo.setStatus(WebserviceInfo.STATE_RUNNING);
- }
- if (result.isQueued())
- {
- wsInfo.setStatus(WebserviceInfo.STATE_QUEUING);
- }
-
- wsInfo.setProgressText(OutputHeader + "\n" +
- result.getStatus());
-
- if (result.isFinished())
- {
-
- parseResult();
- jobComplete = true;
- jobsRunning--;
- } else {
- // catch exceptions
- if (! (result.isJobFailed() || result.isServerError()))
- {
- try
- {
- Thread.sleep(5000);
- }
- catch (InterruptedException ex1)
- {
- }
-
- // System.out.println("I'm alive "+seqid+" "+jobid);
- }
- else
- {
- wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR);
- jobsRunning--;
- jobComplete = true;
- }
- }
- }
- catch (Exception ex)
- {
- allowedServerExceptions--;
-
- wsInfo.appendProgressText("\nJPredWS Server exception!\n" +
- ex.getMessage());
-
- try
- {
- if (allowedServerExceptions > 0)
- {
- Thread.sleep(5000);
- }
- }
- catch (InterruptedException ex1)
- {
- }
- }
- catch (OutOfMemoryError er)
- {
- jobComplete = true;
- wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR);
- JOptionPane.showInternalMessageDialog(Desktop.desktop,
- "Out of memory handling result!!"
- +
- "\nSee help files for increasing Java Virtual Machine memory."
- , "Out of memory",
- JOptionPane.WARNING_MESSAGE);
- System.out.println("JPredClient: "+er);
- System.gc();
- }
- }
- if (result!=null)
- if (! (result.isJobFailed() || result.isServerError()))
- {
- wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_OK);
- }
- else
- {
- wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR);
- }
- }
- */
- void StartJob(WSJob j)
- {
- if (! (j instanceof JPredJob))
- {
- throw new Error("Implementation error - StartJob(JpredJob) called on " +
- j.getClass());
- }
- try
- {
- JPredJob job = (JPredJob) j;
- if (job.msa != null)
- {
- job.jobId = server.predictOnMsa(job.msa);
- }
- else
- if (job.sequence!=null)
- {
- job.jobId = server.predict(job.sequence); // debug like : job.jobId = "/jobs/www-jpred/jp_Yatat29";//
- }
-
- if (job.jobId != null)
- {
- if (job.jobId.startsWith("Broken"))
- {
- job.result = (vamsas.objects.simple.Result)new JpredResult();
- job.result.setInvalid(true);
- job.result.setStatus("Submission " + job.jobId);
- }
- else
- {
- job.submitted = true;
- job.subjobComplete = false;
- Cache.log.info(WsURL + " Job Id '" + job.jobId + "'");
- }
- }
- else
- {
- throw new Exception("Server timed out - try again later\n");
- }
- }
- catch (Exception e)
- {
- if (e.getMessage().indexOf("Exception") > -1)
- {
- wsInfo.setStatus(j.jobnum, WebserviceInfo.STATE_STOPPED_SERVERERROR);
- wsInfo.setProgressText(j.jobnum,
- "Failed to submit the prediction. (Just close the window)\n"
- +
- "It is most likely that there is a problem with the server.\n");
- System.err.println(
- "JPredWS Client: Failed to submit the prediction. Quite possibly because of a server error - see below)\n" +
- e.getMessage() + "\n");
-
- jalview.bin.Cache.log.warn("Server Exception", e);
- }
- else
- {
- wsInfo.setStatus(j.jobnum, WebserviceInfo.STATE_STOPPED_ERROR);
- // JBPNote - this could be a popup informing the user of the problem.
- wsInfo.appendProgressText(j.jobnum,
- "Failed to submit the prediction:\n"
- + e.getMessage() +
- wsInfo.getProgressText());
-
- jalview.bin.Cache.log.debug("Failed Submission of job " + j.jobnum, e);
-
- }
- j.allowedServerExceptions = -1;
- j.subjobComplete = true;
- }
- }
-
- /* private void addFloatAnnotations(Alignment al, int[] gapmap,
- Vector values, String Symname,
- String Visname, float min,
- float max, int winLength)
- {
- Annotation[] annotations = new Annotation[al.getWidth()];
-
- for (int j = 0; j < values.size(); j++)
- {
- float value = Float.parseFloat(values.get(j).toString());
- annotations[gapmap[j]] = new Annotation("", value + "", ' ',
- value);
- }
-
- al.addAnnotation(new AlignmentAnnotation(Symname, Visname,
- annotations, min, max, winLength));
- }*/
-
- void parseResult()
- {
- int results = 0; // number of result sets received
- JobStateSummary finalState = new JobStateSummary();
- try
- {
- for (int j = 0; j < jobs.length; j++)
- {
- finalState.updateJobPanelState(wsInfo, OutputHeader, jobs[j]);
- if (jobs[j].submitted && jobs[j].subjobComplete && jobs[j].hasResults())
- {
- results++;
- }
- }
- }
- catch (Exception ex)
- {
-
- Cache.log.error("Unexpected exception when processing results for " +
- altitle, ex);
- wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR);
- }
- if (results > 0)
- {
- wsInfo.showResultsNewFrame
- .addActionListener(new java.awt.event.ActionListener()
- {
- public void actionPerformed(
- java.awt.event.ActionEvent evt)
- {
- displayResults(true);
- }
- });
- wsInfo.mergeResults
- .addActionListener(new java.awt.event.ActionListener()
- {
- public void actionPerformed(
- java.awt.event.ActionEvent evt)
- {
- displayResults(false);
- }
- });
- wsInfo.setResultsReady();
- }
- else
- {
- wsInfo.setFinishedNoResults();
- }
- }
-
- void displayResults(boolean newWindow)
- {
- // TODO: cope with multiple subjobs.
- if (jobs != null)
- {
- Alignment res = null;
- boolean msa=false;
- for (int jn = 0; jn < jobs.length; jn++)
- {
- Alignment jobres = null;
- JPredJob j = (JPredJob) jobs[jn];
-
- if (j.hasResults())
- {
- // hack - we only deal with all single seuqence predictions or all profile predictions
- msa = (j.msa!=null) ? true : msa;
- try
- {
- jalview.bin.Cache.log.debug("Parsing output of job " + jn);
- jobres = j.getResultSet();
- jalview.bin.Cache.log.debug("Finished parsing output.");
- if (jobs.length==1)
- res = jobres;
- else {
- // do merge with other job results
- throw new Error("Multiple JNet subjob merging not yet implemented.");
- }
- }
- catch (Exception e)
- {
- jalview.bin.Cache.log.error(
- "JNet Client: JPred Annotation Parse Error",
- e);
- wsInfo.setStatus(j.jobnum, WebserviceInfo.STATE_STOPPED_ERROR);
- wsInfo.appendProgressText(j.jobnum,
- OutputHeader + "\n" +
- j.result.getStatus() +
- "\nInvalid JNet job result data!\n" +
- e.getMessage());
- j.result.setBroken(true);
- }
- }
- }
-
- if (res != null)
- {
- if (newWindow)
- {
- AlignFrame af;
- if (input==null) {
- af = new AlignFrame(res,
- AlignFrame.DEFAULT_WIDTH,
- AlignFrame.DEFAULT_HEIGHT);
-
- } else {
- java.lang.Object[] alandcolsel = input.getAlignmentAndColumnSelection(alignFrame.getViewport().getGapCharacter());
-
- if (((SequenceI[])alandcolsel[0])[0].getLength()!=res.getWidth()) {
- if (msa) {
- throw new Error("Implementation Error! ColumnSelection from input alignment will not map to result alignment!");
- } else {
- // test this.
- ((ColumnSelection) alandcolsel[1]).pruneDeletions(ShiftList.parseMap(((SequenceI[]) alandcolsel[0])[0].gapMap()));//gapMap returns insert list, interpreted as delete list by pruneDeletions
- }
- }
- af = new AlignFrame(res, (ColumnSelection) alandcolsel[1],
- AlignFrame.DEFAULT_WIDTH,
- AlignFrame.DEFAULT_HEIGHT);
- }
- Desktop.addInternalFrame(af, altitle,
- AlignFrame.DEFAULT_WIDTH,
- AlignFrame.DEFAULT_HEIGHT);
- }
- else
- {
- Cache.log.info("Append results onto existing alignment.");
- }
- }
- }
- }
- void pollJob(WSJob job)
- throws Exception
- {
- job.result = server.getresult(job.jobId);
- }
- public boolean isCancellable()
- {
- return false;
- }
-
- public void cancelJob()
- {
- throw new Error("Implementation error!");
- }
-
- public boolean canMergeResults()
- {
- return false;
- }
-
- }
}
-