diff --git a/modules/nextflow/src/main/groovy/nextflow/script/WorkflowMetadata.groovy b/modules/nextflow/src/main/groovy/nextflow/script/WorkflowMetadata.groovy index 54de5b1dca..cc0a0b4435 100644 --- a/modules/nextflow/src/main/groovy/nextflow/script/WorkflowMetadata.groovy +++ b/modules/nextflow/src/main/groovy/nextflow/script/WorkflowMetadata.groovy @@ -306,6 +306,14 @@ class WorkflowMetadata { onCompleteActions.add(action) } + void setOnCompleteFormConfig( Closure action ) { + final clone = (Closure)action.clone() + clone.delegate = NF.binding.variables + clone.resolveStrategy = Closure.DELEGATE_FIRST + + onCompleteActions.add(clone) + } + /** * Implements the following idiom in the pipeline script: *
@@ -333,6 +341,14 @@ class WorkflowMetadata {
         onErrorActions.add(action)
     }
 
+    void setOnErrorFromConfig(Closure action ) {
+        final clone = (Closure)action.clone()
+        clone.delegate = NF.binding.variables
+        clone.resolveStrategy = Closure.DELEGATE_FIRST
+
+        onErrorActions.add(clone)
+    }
+
     /**
      * Dynamic getter for workflow metadata attributes
      *
@@ -366,11 +382,11 @@ class WorkflowMetadata {
         if( !workflowConfig ) return
         // -- register `onComplete`
         if( workflowConfig.onComplete instanceof Closure ) {
-            onComplete( (Closure)workflowConfig.onComplete )
+            setOnCompleteFormConfig( (Closure)workflowConfig.onComplete )
         }
         // -- register `onError`
         if( workflowConfig.onError instanceof Closure ) {
-            onError( (Closure)workflowConfig.onError )
+            setOnErrorFromConfig( (Closure)workflowConfig.onError )
         }
     }
 
diff --git a/modules/nextflow/src/test/groovy/nextflow/script/WorkflowMetadataTest.groovy b/modules/nextflow/src/test/groovy/nextflow/script/WorkflowMetadataTest.groovy
index 723a8249d4..19c69017dd 100644
--- a/modules/nextflow/src/test/groovy/nextflow/script/WorkflowMetadataTest.groovy
+++ b/modules/nextflow/src/test/groovy/nextflow/script/WorkflowMetadataTest.groovy
@@ -166,7 +166,7 @@ class WorkflowMetadataTest extends Specification {
         }
 
         when:
-        metadata.onComplete(handler)
+        metadata.setOnCompleteFormConfig(handler)
         metadata.invokeOnComplete()
 
         then:
@@ -190,7 +190,7 @@ class WorkflowMetadataTest extends Specification {
         def metadata = new WorkflowMetadata(session, null)
 
         when:
-        metadata.onComplete {
+        metadata.setOnCompleteFormConfig {
             throw new WorkflowScriptErrorException('You failed!')
         }
         metadata.invokeOnComplete()
@@ -236,7 +236,7 @@ class WorkflowMetadataTest extends Specification {
         }
 
         when:
-        metadata.onError(handler)
+        metadata.setOnErrorFromConfig(handler)
         metadata.invokeOnError(Mock(TraceRecord))
 
         then:
diff --git a/tests/checks/script-vars-oncomplete.nf/.checks b/tests/checks/script-vars-oncomplete.nf/.checks
new file mode 100644
index 0000000000..2496d34559
--- /dev/null
+++ b/tests/checks/script-vars-oncomplete.nf/.checks
@@ -0,0 +1,21 @@
+set -e
+
+#
+# run normal mode
+#
+echo ''
+$NXF_RUN | tee stdout
+
+[[ `grep -c 'Workflow Executed!' stdout` == 1 ]] || false
+[[ `grep -c 'local variable: local' stdout` == 1 ]] || false
+[[ `grep -c 'param output dir: results' stdout` == 1 ]] || false
+[[ `grep -c 'Method executed!' stdout` == 1 ]] || false
+[[ `grep -c 'script-vars-oncomplete.nf' stdout` == 1 ]] || false
+[[ `grep -c "Can't access to a global variable" stdout` == 1 ]] || false
+[[ `grep -c "Can't access to a private workflow property" stdout` == 1 ]] || false
+[[ `grep -c 'Success!' stdout` == 1 ]] || false
+
+
+
+
+
diff --git a/tests/checks/script-vars-onerror.nf/.checks b/tests/checks/script-vars-onerror.nf/.checks
new file mode 100644
index 0000000000..982fbdd337
--- /dev/null
+++ b/tests/checks/script-vars-onerror.nf/.checks
@@ -0,0 +1,21 @@
+set -e
+
+#
+# run normal mode
+#
+echo ''
+$NXF_RUN | tee stdout
+
+[[ `grep -c 'Workflow Failed!' stdout` == 1 ]] || false
+[[ `grep -c 'local variable: local' stdout` == 1 ]] || false
+[[ `grep -c 'param output dir: results' stdout` == 1 ]] || false
+[[ `grep -c 'Method executed!' stdout` == 1 ]] || false
+[[ `grep 'Executed script' stdout | grep -c 'script-vars-onerror.nf'` == 1 ]] || false
+[[ `grep -c "Can't access to a global variable" stdout` == 1 ]] || false
+[[ `grep -c "Can't access to a private workflow property" stdout` == 1 ]] || false
+[[ `grep -c 'Failure!' stdout` == 1 ]] || false
+
+
+
+
+
diff --git a/tests/script-vars-oncomplete.nf b/tests/script-vars-oncomplete.nf
new file mode 100644
index 0000000000..2012ca0c87
--- /dev/null
+++ b/tests/script-vars-oncomplete.nf
@@ -0,0 +1,35 @@
+def global_var = 'global'
+
+def method() {
+    println("Method executed!")
+}
+
+workflow {
+    params.outdir = 'results'
+
+    def local = 'local'
+
+    workflow.onComplete {
+        println("local variable: ${local}")
+        println("param output dir: ${params.outdir}")
+        method() 
+        println("Executed script : ${workflow.scriptFile}")
+        // expected failure
+        try {
+                println("global variable: ${global}")
+        }catch (groovy.lang.MissingPropertyException e){
+                println("Can't access to a global variable")
+        }
+	try {
+                println("workflow private variable: ${events}")
+        }catch (Exception e){
+                println("Can't access to a private workflow property")
+        }
+        if( workflow.success )
+            println("Success!")
+        else
+            println("Failure!")
+    }
+    
+    println("Workflow Executed!")
+}
diff --git a/tests/script-vars-onerror.nf b/tests/script-vars-onerror.nf
new file mode 100644
index 0000000000..6c53af65a0
--- /dev/null
+++ b/tests/script-vars-onerror.nf
@@ -0,0 +1,35 @@
+def global_var = 'global'
+
+def method() {
+    println("Method executed!")
+}
+
+workflow {
+    params.outdir = 'results'
+
+    def local = 'local'
+
+    workflow.onError {
+        println("local variable: ${local}")
+        println("param output dir: ${params.outdir}")
+        method() 
+        println("Executed script : ${workflow.scriptFile}")
+        // expected failures
+        try {
+                println("global variable: ${global}")
+        }catch (groovy.lang.MissingPropertyException e){
+                println("Can't access to a global variable")
+        }
+	try {
+                println("workflow private variable: ${events}")
+        }catch (Exception e){
+                println("Can't access to a private workflow property")
+        }
+	if( workflow.success )
+            println("Success!")
+        else
+            println("Failure!")
+    }
+    
+    throw new Exception("Workflow Failed!")
+}