Hi,
I created a workflow with an external tool service that has a input port
using string replacement. When I feed a string containing a dollar sign
(e.g. a filename) I get the following exception:
WARN 2012-04-15 17:05:48,527
(net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke:234) -
Failed (INVOCATION) invoking
net.sf.taverna.t2.activities.externaltool.ExternalToolActivity@53caf04d
for job DispatchJobEvent facade21:Workflow15:Tool[]: Uncaught exception
while invoking
net.sf.taverna.t2.activities.externaltool.ExternalToolActivity@53caf04d
java.lang.IndexOutOfBoundsException: No group 4
at java.util.regex.Matcher.start(Matcher.java:374)
at java.util.regex.Matcher.appendReplacement(Matcher.java:748)
at java.util.regex.Matcher.replaceAll(Matcher.java:823)
at java.lang.String.replaceAll(String.java:2201)
at
de.uni_luebeck.inb.knowarc.usecases.invocation.local.LocalUseCaseInvocation.submit_generate_job_inner(LocalUseCaseInvocation.java:248)
at
de.uni_luebeck.inb.knowarc.usecases.invocation.UseCaseInvocation.submit_generate_job(UseCaseInvocation.java:253)
at
net.sf.taverna.t2.activities.externaltool.ExternalToolActivity$1.run(ExternalToolActivity.java:254)
at java.lang.Thread.run(Thread.java:679)
I think this is due to the fact that String.replaceAll() uses the the
method replaceAll() of java.util.regex.Matcher. This method treats
backslash and dollar characters specially
(http://docs.oracle.com/javase/6/docs/api/java/util/regex/Matcher.html#replaceAll%28java.lang.String%29).
This is a feature of the replaceAll() method but I'm not sure it makes
sense in this context. Using Matcher.quoteReplacement() returns an
escaped string that would avoid this
(http://docs.oracle.com/javase/6/docs/api/java/util/regex/Matcher.html#quoteReplacement%28java.lang.String%29).
Attached the sample workflow that fails.
Regards,
Markus
<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1"
producedBy="taverna-2.3.0"><dataflow id="f2bef282-6f06-4862-8d12-12b5c70f882c"
role="top"><name>Workflow15</name><inputPorts
/><outputPorts><port><name>Tool_STDOUT</name><annotations
/></port><port><name>Tool_STDERR</name><annotations
/></port></outputPorts><processors><processor><name>Tool</name><inputPorts><port><name>in1</name><depth>0</depth></port></inputPorts><outputPorts><port><name>STDOUT</name><depth>0</depth><granularDepth>0</granularDepth></port><port><name>STDERR</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations
/><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>external-tool-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.externaltool.ExternalToolActivity</class><inputMap><map
from="in1" to="in1" /></inputMap><outputMap><map from="STDERR" to="STDERR"
/><map from="STDOUT" to="STDOUT" /></outputMap><configBean
encoding="xstream"><net.sf.taverna.t2.activities.externaltool.ExternalToolActivityConfigurationBean
xmlns="">
<mechanismType>789663B8-DA91-428A-9F7D-B3F3DA185FD4</mechanismType>
<mechanismName>default local</mechanismName>
<mechanismXML><?xml version="1.0" encoding="UTF-8"?>
<localInvocation><shellPrefix>/bin/sh
-c</shellPrefix><linkCommand>/bin/ln -s %%PATH_TO_ORIGINAL%%
%%TARGET_NAME%%</linkCommand></localInvocation>
</mechanismXML>
<externaltoolid>d1f2d078-1fb3-47f9-ad2c-124fec05dcdb</externaltoolid>
<useCaseDescription>
<usecaseid />
<description />
<command>ls "%%in1%%"</command>
<preparingTimeoutInSeconds>1200</preparingTimeoutInSeconds>
<executionTimeoutInSeconds>1800</executionTimeoutInSeconds>
<tags>
<string>in1</string>
</tags>
<REs />
<queue__preferred />
<queue__deny />
<static__inputs />
<inputs>
<entry>
<string>in1</string>
<de.uni__luebeck.inb.knowarc.usecases.ScriptInputUser>
<tag>in1</tag>
<file>false</file>
<tempFile>false</tempFile>
<binary>false</binary>
<charsetName>UTF-8</charsetName>
<forceCopy>false</forceCopy>
<list>false</list>
<concatenate>false</concatenate>
<mime />
</de.uni__luebeck.inb.knowarc.usecases.ScriptInputUser>
</entry>
</inputs>
<outputs />
<includeStdIn>false</includeStdIn>
<includeStdOut>true</includeStdOut>
<includeStdErr>true</includeStdErr>
<validReturnCodes>
<int>0</int>
</validReturnCodes>
</useCaseDescription>
<edited>false</edited>
</net.sf.taverna.t2.activities.externaltool.ExternalToolActivityConfigurationBean></configBean><annotations
/></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean
encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig
xmlns="">
<maxJobs>1</maxJobs>
</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean
encoding="xstream"><null xmlns=""
/></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean
encoding="xstream"><null xmlns=""
/></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean
encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig
xmlns="">
<backoffFactor>1.0</backoffFactor>
<initialDelay>1000</initialDelay>
<maxDelay>5000</maxDelay>
<maxRetries>0</maxRetries>
</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean
encoding="xstream"><null xmlns=""
/></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port
name="in1" depth="0"
/></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>in1_value</name><inputPorts
/><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations
/><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap
/><outputMap><map from="value" to="value" /></outputMap><configBean
encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean
xmlns="">
<value>test$4.class</value>
</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations
/></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean
encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig
xmlns="">
<maxJobs>1</maxJobs>
</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean
encoding="xstream"><null xmlns=""
/></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean
encoding="xstream"><null xmlns=""
/></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean
encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig
xmlns="">
<backoffFactor>1.0</backoffFactor>
<initialDelay>1000</initialDelay>
<maxDelay>5000</maxDelay>
<maxRetries>0</maxRetries>
</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean
encoding="xstream"><null xmlns=""
/></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy
/></iteration></iterationStrategyStack></processor></processors><conditions
/><datalinks><datalink><sink
type="processor"><processor>Tool</processor><port>in1</port></sink><source
type="processor"><processor>in1_value</processor><port>value</port></source></datalink><datalink><sink
type="dataflow"><port>Tool_STDOUT</port></sink><source
type="processor"><processor>Tool</processor><port>STDOUT</port></source></datalink><datalink><sink
type="dataflow"><port>Tool_STDERR</port></sink><source
type="processor"><processor>Tool</processor><port>STDERR</port></source></datalink></datalinks><annotations><annotation_chain_2_2
encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
<annotationAssertions>
<net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
<annotationBean
class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
<identification>73e7b472-7907-497f-9b17-5dd5a63d42b8</identification>
</annotationBean>
<date>2012-04-15 16:30:18.166 CEST</date>
<creators />
<curationEventList />
</net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
</annotationAssertions>
</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2
encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
<annotationAssertions>
<net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
<annotationBean
class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
<identification>aedc13e3-e267-4762-92a3-37c2e5f62d8e</identification>
</annotationBean>
<date>2012-04-15 17:05:47.25 CEST</date>
<creators />
<curationEventList />
</net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
</annotationAssertions>
</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2
encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
<annotationAssertions>
<net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
<annotationBean
class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
<identification>f6b63ebd-1e5f-4cad-9e5f-d2e1e174c50b</identification>
</annotationBean>
<date>2012-04-15 17:04:22.376 CEST</date>
<creators />
<curationEventList />
</net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
</annotationAssertions>
</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2
encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
<annotationAssertions>
<net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
<annotationBean
class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
<identification>7ff149df-9e85-47ef-ab48-2829449dfb2d</identification>
</annotationBean>
<date>2012-04-15 16:24:31.248 CEST</date>
<creators />
<curationEventList />
</net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
</annotationAssertions>
</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2
encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
<annotationAssertions>
<net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
<annotationBean
class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
<identification>4cae27ce-7992-4c56-aca6-72403463c4ad</identification>
</annotationBean>
<date>2012-04-15 17:04:43.140 CEST</date>
<creators />
<curationEventList />
</net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
</annotationAssertions>
</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2
encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
<annotationAssertions>
<net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
<annotationBean
class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
<identification>669c293b-3a05-48e7-9350-bcc269ffdd10</identification>
</annotationBean>
<date>2012-04-15 16:30:46.931 CEST</date>
<creators />
<curationEventList />
</net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
</annotationAssertions>
</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2
encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
<annotationAssertions>
<net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
<annotationBean
class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
<identification>f2bef282-6f06-4862-8d12-12b5c70f882c</identification>
</annotationBean>
<date>2012-04-15 18:00:59.533 CEST</date>
<creators />
<curationEventList />
</net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
</annotationAssertions>
</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2
encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
<annotationAssertions>
<net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
<annotationBean
class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
<identification>1f8f373c-403b-448f-b54e-8e128ee177f3</identification>
</annotationBean>
<date>2012-04-15 16:25:02.133 CEST</date>
<creators />
<curationEventList />
</net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
</annotationAssertions>
</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2
encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
<annotationAssertions>
<net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
<annotationBean
class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
<identification>6237ab46-cf76-472c-aec0-d5f6c5888744</identification>
</annotationBean>
<date>2012-04-15 17:03:40.977 CEST</date>
<creators />
<curationEventList />
</net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
</annotationAssertions>
</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2
encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
<annotationAssertions>
<net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
<annotationBean
class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
<identification>5b3cd0d5-6359-4444-83d4-54d2bc52b32b</identification>
</annotationBean>
<date>2012-04-15 17:31:37.460 CEST</date>
<creators />
<curationEventList />
</net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
</annotationAssertions>
</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2
encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
<annotationAssertions>
<net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
<annotationBean
class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
<identification>505c563d-e4f7-44a5-a9aa-36302989dc26</identification>
</annotationBean>
<date>2012-04-15 17:05:24.765 CEST</date>
<creators />
<curationEventList />
</net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
</annotationAssertions>
</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>------------------------------------------------------------------------------
For Developers, A Lot Can Happen In A Second.
Boundary is the first to Know...and Tell You.
Monitor Your Applications in Ultra-Fine Resolution. Try it FREE!
http://p.sf.net/sfu/Boundary-d2dvs2
_______________________________________________
taverna-hackers mailing list
[email protected]
Web site: http://www.taverna.org.uk
Mailing lists: http://www.taverna.org.uk/about/contact-us/
Developers Guide: http://www.taverna.org.uk/developers/