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>&lt;?xml version="1.0" encoding="UTF-8"?&gt;&#xD;
&lt;localInvocation&gt;&lt;shellPrefix&gt;/bin/sh 
-c&lt;/shellPrefix&gt;&lt;linkCommand&gt;/bin/ln -s %%PATH_TO_ORIGINAL%% 
%%TARGET_NAME%%&lt;/linkCommand&gt;&lt;/localInvocation&gt;&#xD;
</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/

Reply via email to