0
votes

We are busy upgrading our camel routes from 2.x to 3.2 and we have run into a problem with the usage of JavaScript. In our applications JavaScript is used extensively to transform simple JSON to other JSON. We use XML DSL extensively as well. Our typical pattern is something like this simplified code:

   <transform id="transform_customer_response">
   <javaScript>
      <![CDATA[
           (function map() {
                var msg = {
                             name: request.body.name,
                             hash: request.headers.hash
                          };            
                return JSON.stringify(msg);
                })()
        ]>
     </javaScript>
   </transform>

I understand the the <javaScript> language component has been deprecated and removed in Camel 3 as the latest documentation does not show this. However it seems that JavaScript is still supported through the <language language="javascript"> tag.

Other background information:

  1. Springboot Version: 2.2.6.RELEASE
  2. Apache Camel Version: 3.2.0
  3. JDK/VM: OpenJDK 64-Bit Server VM GraalVM CE 20.0.0 (build 11.0.6+9-jvmci-20.0-b02, mixed mode, sharing)
  4. Link to Camel documentation here: https://camel.apache.org/components/3.2.x/language-component.html

I tried translating this above code to the piece below but get an No language could be found for: javascript exception.

<language language="javascript">


                            (function map() {
                                var msg = {
                                    name: request.body.name,
                                    hash: request.headers.hash
                                };          
                                return JSON.stringify(msg);
                            })()


            </language>


Full Stack Trace:

org.apache.camel.FailedToCreateRouteException: Failed to create route createCustomerRoute at: >>> Transform[javascript{


                            (function map() {
                                var msg = {
                                    name: request.body.name,
                                    hash: request.headers.hash
                                };          
                                return JSON.stringify(msg);
                            })()


            }] <<< in route: Route(createCustomerRoute)[From[direct:create_customer] -> [... because of No language could be found for: javascript
    at org.apache.camel.reifier.RouteReifier.doCreateRoute(RouteReifier.java:393) ~[camel-core-engine-3.2.0.jar:3.2.0]
    at org.apache.camel.reifier.RouteReifier.createRoute(RouteReifier.java:117) ~[camel-core-engine-3.2.0.jar:3.2.0]
    at `No language could be found for: javascript`org.apache.camel.impl.DefaultCamelContext.startRouteDefinitions(DefaultCamelContext.java:353) ~[camel-core-engine-3.2.0.jar:3.2.0]
    at org.apache.camel.impl.DefaultCamelContext.startRouteDefinitions(DefaultCamelContext.java:327) ~[camel-core-engine-3.2.0.jar:3.2.0]
    at org.apache.camel.impl.engine.AbstractCamelContext.doInit(AbstractCamelContext.java:2598) ~[camel-base-3.2.0.jar:3.2.0]
    at org.apache.camel.support.service.BaseService.init(BaseService.java:83) ~[camel-api-3.2.0.jar:3.2.0]
    at org.apache.camel.impl.engine.AbstractCamelContext.init(AbstractCamelContext.java:2431) ~[camel-base-3.2.0.jar:3.2.0]
    at org.apache.camel.support.service.BaseService.start(BaseService.java:111) ~[camel-api-3.2.0.jar:3.2.0]
    at org.apache.camel.impl.engine.AbstractCamelContext.start(AbstractCamelContext.java:2448) ~[camel-base-3.2.0.jar:3.2.0]
    at org.apache.camel.spring.SpringCamelContext.start(SpringCamelContext.java:121) ~[camel-spring-3.2.0.jar:3.2.0]
    at org.apache.camel.spring.CamelContextFactoryBean.start(CamelContextFactoryBean.java:373) ~[camel-spring-3.2.0.jar:3.2.0]
    at org.apache.camel.spring.CamelContextFactoryBean.onApplicationEvent(CamelContextFactoryBean.java:420) ~[camel-spring-3.2.0.jar:3.2.0]
    at org.apache.camel.spring.CamelContextFactoryBean.onApplicationEvent(CamelContextFactoryBean.java:94) ~[camel-spring-3.2.0.jar:3.2.0]
    at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:403) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:360) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:897) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:162) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:553) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
    at com.ventia.nexusarchetype.NexusArchetypeApplication.main(NexusArchetypeApplication.java:12) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.2.6.RELEASE.jar:2.2.6.RELEASE]
Caused by: org.apache.camel.NoSuchLanguageException: No language could be found for: javascript
    at org.apache.camel.impl.engine.DefaultLanguageResolver.noSpecificLanguageFound(DefaultLanguageResolver.java:92) ~[camel-base-3.2.0.jar:3.2.0]
    at org.apache.camel.impl.engine.DefaultLanguageResolver.resolveLanguage(DefaultLanguageResolver.java:68) ~[camel-base-3.2.0.jar:3.2.0]
    at org.apache.camel.impl.engine.AbstractCamelContext.resolveLanguage(AbstractCamelContext.java:1726) ~[camel-base-3.2.0.jar:3.2.0]
    at `No language could be found for: javascript`org.apache.camel.reifier.language.ExpressionReifier.createExpression(ExpressionReifier.java:116) ~[camel-core-engine-3.2.0.jar:3.2.0]
    at org.apache.camel.reifier.AbstractReifier.createExpression(AbstractReifier.java:102) ~[camel-core-engine-3.2.0.jar:3.2.0]
    at org.apache.camel.reifier.TransformReifier.createProcessor(TransformReifier.java:34) ~[camel-core-engine-3.2.0.jar:3.2.0]
    at org.apache.camel.reifier.ProcessorReifier.makeProcessor(ProcessorReifier.java:766) ~[camel-core-engine-3.2.0.jar:3.2.0]
    at org.apache.camel.reifier.ProcessorReifier.addRoutes(ProcessorReifier.java:511) ~[camel-core-engine-3.2.0.jar:3.2.0]
    at org.apache.camel.reifier.RouteReifier.doCreateRoute(RouteReifier.java:391) ~[camel-core-engine-3.2.0.jar:3.2.0]
    ... 32 common frames omitted

I have tried with groovy which produced No language could be found for: groovy. I then add a dependency for groovy as shown below:

        <dependency>
            <groupId>org.apache.camel.springboot</groupId>
            <artifactId>camel-groovy-starter</artifactId>

            <!-- use the same version as your Camel core version -->
        </dependency>

This works I can transform a body using groovy and there is no issues. So I am missing a javascript dependency/start yet when I tried adding the depdency below it is not found. I checked maven as well I cannot find a camel-javascript-starter for Camel 3.2.


        <dependency>
            <groupId>org.apache.camel.springboot</groupId>
            <artifactId>camel-javascript-starter</artifactId>

            <!-- use the same version as your Camel core version -->
        </dependency>

It really looks like JavaScript has been deprecated completely. However the documentation still alludes to it being available.

See a snippet of documentation below:

languageName:

Required Sets the name of the language to use. The value can be one of: bean, constant, exchangeProperty, file, groovy, header, javascript, jsonpath, mvel, ognl, , ref, simple, spel, sql, terser, tokenize, xpath, xquery, xtokenize

In short either there is a missing dependecy for Camel 3.2 or Javascript has been deprecatted. Or am I missing something completely.

1

1 Answers

1
votes

Javascript language is part of camel-script dependency. It has been deprecated in 2.x and removed in 3.x with CAMEL-13113. This is because Nashorn engine, which is heavily used in camel-script, is deprecated in JDK11 (JEP 335) and is scheduled to be removed from next JDK release (JEP 372).

Currently there is no direct replacement in Apache Camel. I have logged CAMEL-14970 to find alternative engine.