<activity xmlns="http://taverna.sf.net/2008/xml/t2flow">


<class>net.sf.taverna.t2.activities.localworker.LocalworkerActivity</class><inputMap /><outputMap /><configBean encoding="xstream"><net.sf.taverna.t2.activities.localworker.LocalworkerActivityConfigurationBean xmlns="">
  <script>import org.biojava.bio.seq.Sequence;
import org.biojava.bio.seq.SequenceIterator;
import org.biojava.bio.seq.io.SeqIOTools;
import org.biojava.bio.seq.io.agave.AgaveWriter;

BufferedReader getReader (String fileUrl) throws IOException {
		InputStreamReader reader;
		try {
			reader = new FileReader(fileUrl);
		}
		catch (FileNotFoundException e) {
			// try a real URL instead
			URL url = new URL(fileUrl);
			reader = new InputStreamReader (url.openStream());
		}
		return new BufferedReader(reader);
	}

if ((fileUrl == void) || (fileUrl == null)) {
    throw new RuntimeException("The fileUrl must be specified");
}

BufferedReader br  = getReader(fileUrl);

// read the GenBank File
SequenceIterator sequences = SeqIOTools.readGenbank(br);

// iterate through the sequences
ByteArrayOutputStream os = new ByteArrayOutputStream();
StringBuffer sb = new StringBuffer();
AgaveWriter writer = new AgaveWriter();
PrintStream ps = new PrintStream(os);

while (sequences.hasNext()) {
	Sequence seq = sequences.nextSequence();
	writer.writeSequence(seq, ps);
	sb.append(os.toString());
}

genbankdata = sb.toString();
br.close();
ps.close();
  
</script>
  <dependencies class="java.util.Collections$SingletonList">
    <element class="string">uk.org.mygrid.resources:biojava:1.4pre1</element>
  </dependencies>
  <inputs>
    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>
      <handledReferenceSchemes />
      <translatedElementType>java.lang.String</translatedElementType>
      <allowsLiteralValues>true</allowsLiteralValues>
      <name>fileUrl</name>
      <depth>0</depth>
      <mimeTypes>
        <string>'text/plain'</string>
      </mimeTypes>
    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>
  </inputs>
  <outputs>
    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>
      <granularDepth>0</granularDepth>
      <name>genbankdata</name>
      <depth>0</depth>
      <mimeTypes>
        <string>'text/xml'</string>
      </mimeTypes>
    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>
  </outputs>
</net.sf.taverna.t2.activities.localworker.LocalworkerActivityConfigurationBean></configBean></activity>