This is an automated email from the ASF dual-hosted git repository.

nfilotto pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new d708ff6d12e CAMEL-19220: camel-groovy - Avoid setting variables to 
initialize the binding (#9692)
d708ff6d12e is described below

commit d708ff6d12e8b3877a4b252462ca7c2c128e231b
Author: Nicolas Filotto <essob...@users.noreply.github.com>
AuthorDate: Wed Mar 29 18:11:25 2023 +0200

    CAMEL-19220: camel-groovy - Avoid setting variables to initialize the 
binding (#9692)
    
    ## Motivation
    
    The changes made for 
[CAMEL-19212](https://issues.apache.org/jira/browse/CAMEL-19212) cause runtime 
errors in native mode https://github.com/apache/camel-quarkus/issues/4712.
    
    ## Modifications:
    
    * Rewrite the code to avoid calling `setVariable` on the binding
---
 .../camel/language/groovy/GroovyExpression.java    | 27 ++++++++--------------
 1 file changed, 9 insertions(+), 18 deletions(-)

diff --git 
a/components/camel-groovy/src/main/java/org/apache/camel/language/groovy/GroovyExpression.java
 
b/components/camel-groovy/src/main/java/org/apache/camel/language/groovy/GroovyExpression.java
index 3e118f68d3e..355b8084027 100644
--- 
a/components/camel-groovy/src/main/java/org/apache/camel/language/groovy/GroovyExpression.java
+++ 
b/components/camel-groovy/src/main/java/org/apache/camel/language/groovy/GroovyExpression.java
@@ -16,7 +16,6 @@
  */
 package org.apache.camel.language.groovy;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
@@ -48,25 +47,25 @@ public class GroovyExpression extends ExpressionSupport {
 
     @Override
     public <T> T evaluate(Exchange exchange, Class<T> type) {
-        Script script = instantiateScript(exchange);
-        populateBinding(script.getBinding(), exchange);
+        Map<String, Object> globalVariables = new HashMap<>();
+        Script script = instantiateScript(exchange, globalVariables);
+        script.setBinding(createBinding(exchange, globalVariables));
         Object value = script.run();
 
         return exchange.getContext().getTypeConverter().convertTo(type, value);
     }
 
     @SuppressWarnings("unchecked")
-    private Script instantiateScript(Exchange exchange) {
+    private Script instantiateScript(Exchange exchange, Map<String, Object> 
globalVariables) {
         // Get the script from the cache, or create a new instance
         GroovyLanguage language = (GroovyLanguage) 
exchange.getContext().resolveLanguage("groovy");
         Set<GroovyShellFactory> shellFactories = 
exchange.getContext().getRegistry().findByType(GroovyShellFactory.class);
         GroovyShellFactory shellFactory = null;
         String fileName = null;
-        Map<String, Object> variables = Collections.emptyMap();
         if (shellFactories.size() == 1) {
             shellFactory = shellFactories.iterator().next();
             fileName = shellFactory.getFileName(exchange);
-            variables = shellFactory.getVariables(exchange);
+            globalVariables.putAll(shellFactory.getVariables(exchange));
         }
         final String key = fileName != null ? fileName + text : text;
         Class<Script> scriptClass = language.getScriptFromCache(key);
@@ -79,20 +78,12 @@ public class GroovyExpression extends ExpressionSupport {
             language.addScriptToCache(key, scriptClass);
         }
         // New instance of the script
-        Script script = ObjectHelper.newInstance(scriptClass, Script.class);
-        Binding binding = script.getBinding();
-        for (Map.Entry<String, Object> variableEntry : variables.entrySet()) {
-            binding.setVariable(variableEntry.getKey(), 
variableEntry.getValue());
-        }
-
-        return script;
+        return ObjectHelper.newInstance(scriptClass, Script.class);
     }
 
-    private void populateBinding(Binding binding, Exchange exchange) {
-        Map<String, Object> variables = new HashMap<>();
+    private Binding createBinding(Exchange exchange, Map<String, Object> 
globalVariables) {
+        Map<String, Object> variables = new HashMap<>(globalVariables);
         ExchangeHelper.populateVariableMap(exchange, variables, true);
-        for (Map.Entry<String, Object> variableEntry : variables.entrySet()) {
-            binding.setVariable(variableEntry.getKey(), 
variableEntry.getValue());
-        }
+        return new Binding(variables);
     }
 }

Reply via email to