You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/04/06 17:35:00 UTC

[camel] branch main updated: Datasonnet libraries autodiscovery (#7374)

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

davsclaus 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 92138ec1b47 Datasonnet libraries autodiscovery (#7374)
92138ec1b47 is described below

commit 92138ec1b4796ae6f1fe8cb6f75e6cb4a8517c3e
Author: javaduke <Eu...@modusbox.com>
AuthorDate: Wed Apr 6 10:34:46 2022 -0700

    Datasonnet libraries autodiscovery (#7374)
    
    * Datasonnet libraries auto discovery
    
    * cleanup
    
    * header added
    
    * better organized imports
    
    * cleanup
    
    * Fixing style
---
 .../language/datasonnet/DatasonnetExpression.java  | 21 +++++--
 .../src/test/java/library/TestLib.java             | 72 ++++++++++++++++++++++
 .../datasonnet/CamelDatasonnetJavaDslTest.java     | 20 ++++++
 .../language/datasonnet/CamelDatasonnetTest.java   |  7 +++
 .../camel/language.datasonnet/camel-context.xml    | 16 +++++
 .../org/apache/camel/main/components.properties    |  2 +-
 6 files changed, 131 insertions(+), 7 deletions(-)

diff --git a/components/camel-datasonnet/src/main/java/org/apache/camel/language/datasonnet/DatasonnetExpression.java b/components/camel-datasonnet/src/main/java/org/apache/camel/language/datasonnet/DatasonnetExpression.java
index 0bc7353d112..14b21c3b8c9 100644
--- a/components/camel-datasonnet/src/main/java/org/apache/camel/language/datasonnet/DatasonnetExpression.java
+++ b/components/camel-datasonnet/src/main/java/org/apache/camel/language/datasonnet/DatasonnetExpression.java
@@ -28,6 +28,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
 
 import com.datasonnet.Mapper;
 import com.datasonnet.MapperBuilder;
@@ -36,6 +37,7 @@ import com.datasonnet.document.Document;
 import com.datasonnet.document.MediaType;
 import com.datasonnet.document.MediaTypes;
 import com.datasonnet.header.Header;
+import com.datasonnet.spi.Library;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.RuntimeExpressionException;
@@ -183,12 +185,19 @@ public class DatasonnetExpression extends ExpressionAdapter implements Expressio
 
         language = (DatasonnetLanguage) context.resolveLanguage("datasonnet");
         // initialize mapper eager
-        language.computeIfMiss(expression, () -> new MapperBuilder(expression)
-                .withInputNames("body")
-                .withImports(resolveImports(language))
-                .withLibrary(CML.getInstance())
-                .withDefaultOutput(MediaTypes.APPLICATION_JAVA)
-                .build());
+        language.computeIfMiss(expression, () -> {
+            MapperBuilder builder = new MapperBuilder(expression)
+                    .withInputNames("body")
+                    .withImports(resolveImports(language))
+                    .withLibrary(CML.getInstance())
+                    .withDefaultOutput(MediaTypes.APPLICATION_JAVA);
+
+            Set<Library> additionalLibraries = context.getRegistry().findByType(com.datasonnet.spi.Library.class);
+            for (Library lib : additionalLibraries) {
+                builder = builder.withLibrary(lib);
+            }
+            return builder.build();
+        });
     }
 
     // Getter/Setter methods
diff --git a/components/camel-datasonnet/src/test/java/library/TestLib.java b/components/camel-datasonnet/src/test/java/library/TestLib.java
new file mode 100644
index 00000000000..1a1f0e8dde0
--- /dev/null
+++ b/components/camel-datasonnet/src/test/java/library/TestLib.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package library;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Function;
+
+import com.datasonnet.header.Header;
+import com.datasonnet.spi.DataFormatService;
+import com.datasonnet.spi.Library;
+import org.springframework.stereotype.Component;
+import sjsonnet.Val;
+
+@Component
+public class TestLib extends Library {
+
+    private static final TestLib INSTANCE = new TestLib();
+
+    public TestLib() {
+    }
+
+    public static TestLib getInstance() {
+        return INSTANCE;
+    }
+
+    @Override
+    public String namespace() {
+        return "testlib";
+    }
+
+    @Override
+    public Map<String, Val.Func> functions(DataFormatService dataFormats, Header header) {
+        Map<String, Val.Func> answer = new HashMap<>();
+        answer.put("sayHello", makeSimpleFunc(
+                Collections.emptyList(), //parameters list
+                new Function<List<Val>, Val>() {
+                    @Override
+                    public Val apply(List<Val> vals) {
+                        return new Val.Str("Hello, World");
+                    }
+                }));
+        return answer;
+    }
+
+    @Override
+    public Map<String, Val.Obj> modules(DataFormatService dataFormats, Header header) {
+        return Collections.emptyMap();
+    }
+
+    @Override
+    public Set<String> libsonnets() {
+        return Collections.emptySet();
+    }
+}
diff --git a/components/camel-datasonnet/src/test/java/org/apache/camel/language/datasonnet/CamelDatasonnetJavaDslTest.java b/components/camel-datasonnet/src/test/java/org/apache/camel/language/datasonnet/CamelDatasonnetJavaDslTest.java
index 00d9b482d54..2c980ff0005 100644
--- a/components/camel-datasonnet/src/test/java/org/apache/camel/language/datasonnet/CamelDatasonnetJavaDslTest.java
+++ b/components/camel-datasonnet/src/test/java/org/apache/camel/language/datasonnet/CamelDatasonnetJavaDslTest.java
@@ -21,6 +21,8 @@ import java.nio.charset.Charset;
 
 import com.datasonnet.document.Document;
 import com.datasonnet.document.MediaTypes;
+import library.TestLib;
+import org.apache.camel.BindToRegistry;
 import org.apache.camel.Exchange;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
@@ -34,6 +36,11 @@ import org.skyscreamer.jsonassert.JSONAssert;
 public class CamelDatasonnetJavaDslTest extends CamelTestSupport {
     private MockEndpoint mock;
 
+    @BindToRegistry
+    public TestLib testLib() {
+        return TestLib.getInstance();
+    }
+
     @Test
     public void testTransform() throws Exception {
         runCamelTest(loadResourceAsString("simpleMapping_payload.json"),
@@ -55,6 +62,13 @@ public class CamelDatasonnetJavaDslTest extends CamelTestSupport {
                 "direct:transformCSV");
     }
 
+    @Test
+    public void testRegistryLibraries() throws Exception {
+        runCamelTest("{}",
+                "{ \"test\":\"Hello, World\"}",
+                "direct:registryLibraries");
+    }
+
     @Override
     protected RoutesBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
@@ -82,6 +96,12 @@ public class CamelDatasonnetJavaDslTest extends CamelTestSupport {
                                 MediaTypes.APPLICATION_CSV_VALUE, MediaTypes.APPLICATION_JSON_VALUE))
                         .to("mock:direct:end");
 
+                from("direct:registryLibraries")
+                        .routeId("registryLibraries")
+                        .transform(datasonnet("{test: testlib.sayHello()}", String.class,
+                                MediaTypes.APPLICATION_JSON_VALUE, MediaTypes.APPLICATION_JSON_VALUE))
+                        .to("mock:direct:end");
+
             }
         };
     }
diff --git a/components/camel-datasonnet/src/test/java/org/apache/camel/language/datasonnet/CamelDatasonnetTest.java b/components/camel-datasonnet/src/test/java/org/apache/camel/language/datasonnet/CamelDatasonnetTest.java
index 5963796d1ea..22486236499 100644
--- a/components/camel-datasonnet/src/test/java/org/apache/camel/language/datasonnet/CamelDatasonnetTest.java
+++ b/components/camel-datasonnet/src/test/java/org/apache/camel/language/datasonnet/CamelDatasonnetTest.java
@@ -95,6 +95,13 @@ public class CamelDatasonnetTest extends CamelSpringTestSupport {
                 "direct:nullInput");
     }
 
+    @Test
+    public void testRegistryLibraries() throws Exception {
+        runCamelTest("",
+                "{ \"test\":\"Hello, World\"}",
+                "direct:registryLibraries");
+    }
+
     @Test
     public void testReadJava() throws Exception {
         Gizmo theGizmo = new Gizmo();
diff --git a/components/camel-datasonnet/src/test/resources/org/apache/camel/language.datasonnet/camel-context.xml b/components/camel-datasonnet/src/test/resources/org/apache/camel/language.datasonnet/camel-context.xml
index 55752457395..91d33d838f1 100644
--- a/components/camel-datasonnet/src/test/resources/org/apache/camel/language.datasonnet/camel-context.xml
+++ b/components/camel-datasonnet/src/test/resources/org/apache/camel/language.datasonnet/camel-context.xml
@@ -20,10 +20,13 @@
 <!-- Configures the Camel Context-->
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
         http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
 ">
+    <context:component-scan base-package="library"/>
 
     <camelContext id="main" xmlns="http://camel.apache.org/schema/spring">
         <route id="basicTransform">
@@ -175,6 +178,19 @@
             <to uri="mock:direct:end"/>
         </route>
 
+        <route id="registryLibraries">
+            <from uri="direct:registryLibraries"/>
+            <setBody>
+                <datasonnet outputMediaType="application/json" resultType="java.lang.String">
+                    {
+                        test: testlib.sayHello()
+                    }
+                </datasonnet>
+            </setBody>
+
+            <to uri="mock:direct:end"/>
+        </route>
+
     </camelContext>
 
 </beans>
diff --git a/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties b/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties
index e5655177c61..29c3afe39fa 100644
--- a/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties
+++ b/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties
@@ -340,4 +340,4 @@ xslt
 xslt-saxon
 zendesk
 zookeeper
-zookeeper-master
+zookeeper-master
\ No newline at end of file