<activity xmlns="http://taverna.sf.net/2008/xml/t2flow"><class>org.apache.taverna.activities.localworker.LocalworkerActivity</class><inputMap /><outputMap /><configBean encoding="xstream"><org.apache.taverna.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 EMBL File
SequenceIterator sequences = SeqIOTools.readSwissprot(br);

// Prepare the writer
AgaveWriter writer = new AgaveWriter();
ByteArrayOutputStream os = new ByteArrayOutputStream();
StringBuffer sb = new StringBuffer();
PrintStream ps = new PrintStream(os);

// iterate through the sequences
while (sequences.hasNext()) {
	Sequence seq = sequences.nextSequence();
	writer.writeSequence(seq, ps);
	sb.append(os.toString());
}
results = 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>
    <org.apache.taverna.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>
    </org.apache.taverna.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>
  </inputs>
  <outputs>
    <org.apache.taverna.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>
      <granularDepth>0</granularDepth>
      <name>results</name>
      <depth>0</depth>
      <mimeTypes>
        <string>'text/plain'</string>
      </mimeTypes>
    </org.apache.taverna.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>
  </outputs>
</org.apache.taverna.activities.localworker.LocalworkerActivityConfigurationBean></configBean></activity>