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

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


The following commit(s) were added to refs/heads/master by this push:
     new 5b82a17  CAMEL-15914: camel-csimple - Generate source code whether its 
a predicate or expression.
5b82a17 is described below

commit 5b82a173db4cc51deafa1f8a082f3753b23091de
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Fri Dec 4 12:51:26 2020 +0100

    CAMEL-15914: camel-csimple - Generate source code whether its a predicate 
or expression.
---
 .../language/csimple/CSimpleCodeGenerator.java     |  6 +++
 .../camel/language/csimple/CSimpleExpression.java  |  5 +++
 .../camel/language/csimple/CSimpleLanguage.java    | 50 ++++++++++++----------
 .../camel/language/csimple/HighPredicate.java      |  5 +++
 .../camel/language/csimple/MedPredicate.java       |  5 +++
 5 files changed, 48 insertions(+), 23 deletions(-)

diff --git 
a/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleCodeGenerator.java
 
b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleCodeGenerator.java
index b336aa8..1d92fc4 100644
--- 
a/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleCodeGenerator.java
+++ 
b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleCodeGenerator.java
@@ -103,6 +103,12 @@ public class CSimpleCodeGenerator {
         sb.append("\n");
 
         sb.append("    @Override\n");
+        sb.append("    public boolean isPredicate() {\n");
+        sb.append("        return ").append(predicate).append(";\n");
+        sb.append("    }\n");
+        sb.append("\n");
+
+        sb.append("    @Override\n");
         sb.append("    public String getText() {\n");
         // \ should be escaped
         String escaped = StringHelper.replaceAll(text, "\\", "\\\\");
diff --git 
a/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleExpression.java
 
b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleExpression.java
index b33fbd3..46d383e 100644
--- 
a/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleExpression.java
+++ 
b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleExpression.java
@@ -26,6 +26,11 @@ import org.apache.camel.Predicate;
 public interface CSimpleExpression extends Expression, Predicate {
 
     /**
+     * Whether this script is to be used as predicate only.
+     */
+    boolean isPredicate();
+
+    /**
      * The csimple script as text
      */
     String getText();
diff --git 
a/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleLanguage.java
 
b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleLanguage.java
index 4c8eec4..d7210d6 100644
--- 
a/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleLanguage.java
+++ 
b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleLanguage.java
@@ -20,9 +20,7 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
@@ -51,15 +49,16 @@ public class CSimpleLanguage extends LanguageSupport 
implements StaticService {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(CSimpleLanguage.class);
 
-    private final Map<String, CSimpleExpression> compiled;
+    private final Map<String, CSimpleExpression> compiledPredicates = new 
ConcurrentHashMap<>();
+    private final Map<String, CSimpleExpression> compiledExpressions = new 
ConcurrentHashMap<>();
+
     /**
      * If set, this implementation attempts to compile those expressions at 
runtime, that are not yet available in
-     * {@link #compiled}; otherwise no compilation attempts will be made at 
runtime
+     * {@link #compiledPredicates}; otherwise no compilation attempts will be 
made at runtime
      */
     private final CompilationSupport compilationSupport;
 
     public CSimpleLanguage() {
-        this.compiled = new ConcurrentHashMap<>();
         this.compilationSupport = new CompilationSupport();
     }
 
@@ -69,7 +68,13 @@ public class CSimpleLanguage extends LanguageSupport 
implements StaticService {
      * @param compiled the compiled
      */
     private CSimpleLanguage(Map<String, CSimpleExpression> compiled) {
-        this.compiled = compiled;
+        compiled.forEach((k, v) -> {
+            if (v.isPredicate()) {
+                this.compiledPredicates.put(k, v);
+            } else {
+                this.compiledExpressions.put(k, v);
+            }
+        });
         this.compilationSupport = null;
     }
 
@@ -130,11 +135,11 @@ public class CSimpleLanguage extends LanguageSupport 
implements StaticService {
         String text = expression.replaceAll("\n", "");
         text = text.trim();
 
-        Predicate answer = compiled.get(text);
+        Predicate answer = compiledPredicates.get(text);
         if (answer == null && compilationSupport != null) {
             CSimpleExpression exp = 
compilationSupport.compilePredicate(getCamelContext(), expression);
             if (exp != null) {
-                compiled.put(text, exp);
+                compiledPredicates.put(text, exp);
                 answer = exp;
             }
         }
@@ -153,11 +158,11 @@ public class CSimpleLanguage extends LanguageSupport 
implements StaticService {
         String text = expression.replaceAll("\n", "");
         text = text.trim();
 
-        Expression answer = compiled.get(text);
+        Expression answer = compiledExpressions.get(text);
         if (answer == null && compilationSupport != null) {
             CSimpleExpression exp = 
compilationSupport.compileExpression(getCamelContext(), expression);
             if (exp != null) {
-                compiled.put(text, exp);
+                compiledExpressions.put(text, exp);
                 answer = exp;
             }
         }
@@ -180,12 +185,10 @@ public class CSimpleLanguage extends LanguageSupport 
implements StaticService {
     }
 
     public static class Builder {
-        private Map<String, CSimpleExpression> compiled = new 
LinkedHashMap<String, CSimpleExpression>();
+        private Map<String, CSimpleExpression> compiled = new HashMap<>();
 
         public CSimpleLanguage build() {
-            final Map<String, CSimpleExpression> cmpl = 
Collections.unmodifiableMap(compiled);
-            compiled = null; // invalidate the builder to prevent leaking the 
mutable collection
-            return new CSimpleLanguage(cmpl);
+            return new CSimpleLanguage(compiled);
         }
 
         public Builder expression(CSimpleExpression expression) {
@@ -225,12 +228,8 @@ public class CSimpleLanguage extends LanguageSupport 
implements StaticService {
                 compiler = (CSimpleCompiler) 
ecc.getInjector().newInstance(clazz.get(), false);
                 if (compiler != null) {
                     LOG.info("Detected camel-csimple-joor compiler");
-                    if (imports != null) {
-                        imports.forEach(compiler::addImport);
-                    }
-                    if (aliases != null) {
-                        aliases.forEach(compiler::addAliases);
-                    }
+                    imports.forEach(compiler::addImport);
+                    aliases.forEach(compiler::addAliases);
                 }
                 ServiceHelper.initService(compiler);
             }
@@ -275,15 +274,20 @@ public class CSimpleLanguage extends LanguageSupport 
implements StaticService {
                         Class<CSimpleExpression> clazz
                                 = 
ecc.getClassResolver().resolveMandatoryClass(fqn, CSimpleExpression.class);
                         CSimpleExpression ce = 
clazz.getConstructor(CamelContext.class).newInstance(getCamelContext());
-                        compiled.put(ce.getText(), ce);
+                        if (ce.isPredicate()) {
+                            compiledPredicates.put(ce.getText(), ce);
+                        } else {
+                            compiledExpressions.put(ce.getText(), ce);
+                        }
                     }
                 } catch (Exception e) {
                     throw new RuntimeCamelException("Error initializing 
csimple language", e);
                 } finally {
                     IOHelper.close(is);
                 }
-                if (!compiled.isEmpty()) {
-                    LOG.info("Loaded and initialized {} csimple expressions 
from classpath", compiled.size());
+                int size = compiledPredicates.size() + 
compiledExpressions.size();
+                if (size > 0) {
+                    LOG.info("Loaded and initialized {} csimple expressions 
from classpath", size);
                 }
             }
         }
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/language/csimple/HighPredicate.java
 
b/core/camel-core/src/test/java/org/apache/camel/language/csimple/HighPredicate.java
index 377ce26..4c33f05 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/language/csimple/HighPredicate.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/language/csimple/HighPredicate.java
@@ -29,6 +29,11 @@ public class HighPredicate extends CSimpleSupport {
     }
 
     @Override
+    public boolean isPredicate() {
+        return true;
+    }
+
+    @Override
     public String getText() {
         return "${body} > 10";
     }
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/language/csimple/MedPredicate.java
 
b/core/camel-core/src/test/java/org/apache/camel/language/csimple/MedPredicate.java
index 0be1d42..00a37ff 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/language/csimple/MedPredicate.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/language/csimple/MedPredicate.java
@@ -29,6 +29,11 @@ public class MedPredicate extends CSimpleSupport {
     }
 
     @Override
+    public boolean isPredicate() {
+        return true;
+    }
+
+    @Override
     public String getText() {
         return "${body} > 5";
     }

Reply via email to