Repository: camel
Updated Branches:
  refs/heads/master d7fc67fa1 -> 8fb1874e0


CAMEL-9587 - camel-restlet - Make it easy to turn on gson or jackson


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/8fb1874e
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/8fb1874e
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/8fb1874e

Branch: refs/heads/master
Commit: 8fb1874e087f2fe33de5ae991d8fdfc730b224e7
Parents: d7fc67f
Author: lburgazzoli <lburgazz...@gmail.com>
Authored: Wed Apr 6 12:57:03 2016 +0200
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Fri Apr 8 13:44:41 2016 +0200

----------------------------------------------------------------------
 components/camel-restlet/pom.xml                | 11 ++++
 .../component/restlet/RestletComponent.java     | 49 +++++++++++++-
 .../component/restlet/RestletEndpoint.java      |  1 -
 .../restlet/RestletConfigurationTest.java       | 68 ++++++++++++++++++++
 parent/pom.xml                                  | 15 +++++
 .../features/src/main/resources/features.xml    | 22 +++++++
 6 files changed, 164 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/8fb1874e/components/camel-restlet/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-restlet/pom.xml b/components/camel-restlet/pom.xml
index dfb75c7..c1b2155 100644
--- a/components/camel-restlet/pom.xml
+++ b/components/camel-restlet/pom.xml
@@ -61,6 +61,17 @@
       <groupId>org.restlet.jee</groupId>
       <artifactId>org.restlet.ext.httpclient</artifactId>
     </dependency>
+    <!-- extensions -->
+    <dependency>
+      <groupId>org.restlet.jse</groupId>
+      <artifactId>org.restlet.ext.jackson</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.restlet.jse</groupId>
+      <artifactId>org.restlet.ext.gson</artifactId>
+      <optional>true</optional>
+    </dependency>
 
     <!-- camel test dependencies -->
     <dependency>

http://git-wip-us.apache.org/repos/asf/camel/blob/8fb1874e/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java
----------------------------------------------------------------------
diff --git 
a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java
 
b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java
index 573ef9e..322d0ec 100644
--- 
a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java
+++ 
b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java
@@ -21,11 +21,11 @@ import java.net.URI;
 import java.security.GeneralSecurityException;
 import java.security.InvalidParameterException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLEngine;
 
@@ -50,6 +50,7 @@ import org.restlet.data.ChallengeScheme;
 import org.restlet.data.Method;
 import org.restlet.data.Parameter;
 import org.restlet.data.Protocol;
+import org.restlet.engine.Engine;
 import org.restlet.security.ChallengeAuthenticator;
 import org.restlet.security.MapVerifier;
 import org.restlet.util.Series;
@@ -63,6 +64,7 @@ import org.slf4j.LoggerFactory;
  */
 public class RestletComponent extends HeaderFilterStrategyComponent implements 
RestConsumerFactory, RestApiConsumerFactory {
     private static final Logger LOG = 
LoggerFactory.getLogger(RestletComponent.class);
+    private static final Object LOCK = new Object();
 
     private final Map<String, Server> servers = new HashMap<String, Server>();
     private final Map<String, MethodBasedRouter> routers = new HashMap<String, 
MethodBasedRouter>();
@@ -87,6 +89,7 @@ public class RestletComponent extends 
HeaderFilterStrategyComponent implements R
     private boolean disableStreamCache;
     private int port;
     private Boolean synchronous;
+    private List<String> enabledConverters;
 
     public RestletComponent() {
         this(new Component());
@@ -149,6 +152,8 @@ public class RestletComponent extends 
HeaderFilterStrategyComponent implements R
             setProperties(this, config.getComponentProperties());
         }
 
+        cleanupConverters(enabledConverters);
+
         component.start();
     }
 
@@ -663,6 +668,32 @@ public class RestletComponent extends 
HeaderFilterStrategyComponent implements R
         this.synchronous = synchronous;
     }
 
+    public List<String> getEnabledConverters() {
+        return enabledConverters;
+    }
+
+
+    /**
+     * A list of converters to enable as full class name or simple class name.
+     * All the converters automatically registered are enabled if empty or null
+     */
+    public void setEnabledConverters(List<String> enabledConverters) {
+        if (enabledConverters != null && !enabledConverters.isEmpty()) {
+            this.enabledConverters = new ArrayList(enabledConverters);
+        }
+    }
+
+    /**
+     * A comma separated list of converters to enable as full class name or 
simple
+     * class name. All the converters automatically registered are enabled if
+     * empty or null
+     */
+    public void setEnabledConverters(String enabledConverters) {
+        if (ObjectHelper.isNotEmpty(enabledConverters)) {
+            this.enabledConverters = 
Arrays.asList(enabledConverters.split(","));
+        }
+    }
+
     @Override
     public Consumer createConsumer(CamelContext camelContext, Processor 
processor, String verb, String basePath, String uriTemplate,
                                    String consumes, String produces, 
RestConfiguration configuration, Map<String, Object> parameters) throws 
Exception {
@@ -771,4 +802,20 @@ public class RestletComponent extends 
HeaderFilterStrategyComponent implements R
         // reuse the createConsumer method we already have. The api need to 
use GET and match on uri prefix
         return createConsumer(camelContext, processor, "GET", contextPath, 
null, null, null, configuration, parameters);
     }
+
+    protected static void cleanupConverters(List<String> converters) {
+        if (converters != null && !converters.isEmpty()) {
+            // To avoid race conditions this operation relies on a global 
lock, we
+            // could have used Engine's instance as lock so we'd lock only 
operations
+            // on the same instance but we do not know how Engine is used by 
the
+            // restlet framework
+            synchronized (LOCK) {
+                Engine.getInstance().getRegisteredConverters().removeIf(
+                    converter ->
+                        !converters.contains(converter.getClass().getName())
+                        && 
!converters.contains(converter.getClass().getSimpleName())
+                );
+            }
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/8fb1874e/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java
----------------------------------------------------------------------
diff --git 
a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java
 
b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java
index 5543313..5fb8e43 100644
--- 
a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java
+++ 
b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java
@@ -41,7 +41,6 @@ import org.restlet.data.Method;
 @UriEndpoint(scheme = "restlet", title = "Restlet", syntax = 
"restlet:protocol:host:port/uriPattern",
         consumerClass = RestletConsumer.class, label = "rest", 
lenientProperties = true)
 public class RestletEndpoint extends DefaultEndpoint implements 
HeaderFilterStrategyAware {
-
     private static final int DEFAULT_PORT = 80;
     private static final String DEFAULT_PROTOCOL = "http";
     private static final String DEFAULT_HOST = "localhost";

http://git-wip-us.apache.org/repos/asf/camel/blob/8fb1874e/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletConfigurationTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletConfigurationTest.java
 
b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletConfigurationTest.java
new file mode 100644
index 0000000..54a207d
--- /dev/null
+++ 
b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletConfigurationTest.java
@@ -0,0 +1,68 @@
+/**
+ * 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 org.apache.camel.component.restlet;
+
+import java.util.Optional;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.Test;
+import org.restlet.engine.Engine;
+import org.restlet.engine.converter.ConverterHelper;
+import org.restlet.ext.gson.GsonConverter;
+import org.restlet.ext.jackson.JacksonConverter;
+
+public class RestletConfigurationTest extends RestletTestSupport {
+    @Override
+    protected void doPreSetup() {
+        assertPresent(GsonConverter.class);
+        assertPresent(JacksonConverter.class);
+    }
+
+    @Test
+    public void testConfiguration() throws Exception {
+        assertNotPresent(GsonConverter.class);
+        assertPresent(JacksonConverter.class);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                restConfiguration()
+                    .component("restlet")
+                    .componentProperty("enabledConverters", 
"JacksonConverter");
+
+                from("direct:start")
+                    .to("restlet:http://localhost:"; + portNum + 
"/users/1/basic")
+                    .to("log:reply");
+            }
+        };
+    }
+
+    protected <T extends ConverterHelper> Optional<ConverterHelper> 
findByType(Class<T> type) {
+        return 
Engine.getInstance().getRegisteredConverters().stream().filter(type::isInstance).findFirst();
+    }
+
+    protected <T extends ConverterHelper> void assertPresent(Class<T> type) {
+        assertTrue(type.getSimpleName(), findByType(type).isPresent());
+    }
+
+    protected <T extends ConverterHelper> void assertNotPresent(Class<T> type) 
{
+        assertFalse(type.getSimpleName(), findByType(type).isPresent());
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8fb1874e/parent/pom.xml
----------------------------------------------------------------------
diff --git a/parent/pom.xml b/parent/pom.xml
index 3e03488..da8c3ec 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -465,6 +465,11 @@
     <regexp-bundle-version>1.4_1</regexp-bundle-version>
     <rest-assured-version>2.7.0</rest-assured-version>
     <restlet-version>2.3.6</restlet-version>
+    <restlet-jackson-version>2.4.4</restlet-jackson-version>
+    <restlet-woodstox-version>4.3.0</restlet-woodstox-version>
+    <restlet-yaml-version>1.13</restlet-yaml-version>
+    <restlet-gson-version>2.3.1</restlet-gson-version>
+    <restlet-joda-time-version>2.3</restlet-joda-time-version>
     <rhino-bundle-version>1.7R2_3</rhino-bundle-version>
     <rhino-version>1.7R2</rhino-version>
     <rome-bundle-version>1.0_3</rome-bundle-version>
@@ -2819,6 +2824,16 @@
         <artifactId>org.restlet.ext.httpclient</artifactId>
         <version>${restlet-version}</version>
       </dependency>
+      <dependency>
+        <groupId>org.restlet.jse</groupId>
+        <artifactId>org.restlet.ext.jackson</artifactId>
+        <version>${restlet-version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.restlet.jse</groupId>
+        <artifactId>org.restlet.ext.gson</artifactId>
+        <version>${restlet-version}</version>
+      </dependency>
 
       <!-- need this to use the new 'maven-archetype' packaging type -->
       <dependency>

http://git-wip-us.apache.org/repos/asf/camel/blob/8fb1874e/platforms/karaf/features/src/main/resources/features.xml
----------------------------------------------------------------------
diff --git a/platforms/karaf/features/src/main/resources/features.xml 
b/platforms/karaf/features/src/main/resources/features.xml
index d3cc39f..e26b738 100644
--- a/platforms/karaf/features/src/main/resources/features.xml
+++ b/platforms/karaf/features/src/main/resources/features.xml
@@ -1317,6 +1317,28 @@
     <bundle 
dependency='true'>mvn:http://maven.restlet.org@id=restlet!org.restlet.osgi/org.restlet.ext.httpclient/${restlet-version}</bundle>
     <bundle>mvn:org.apache.camel/camel-restlet/${project.version}</bundle>
   </feature>
+  <feature name='camel-restlet-jackson' version='${project.version}' 
resolver='(obr)' start-level='50'>
+    <feature version='${project.version}'>camel-restlet</feature>
+    <bundle 
dependency='true'>mvn:org.codehaus.woodstox/stax2-api/${stax2-api-bundle-version}</bundle>
+    <bundle 
dependency='true'>mvn:org.codehaus.woodstox/woodstox-core-asl/${restlet-woodstox-version}</bundle>
+    <bundle 
dependency='true'>mvn:org.yaml/snakeyaml/${restlet-yaml-version}</bundle>
+    <bundle 
dependency='true'>mvn:com.fasterxml.jackson.core/jackson-core/${restlet-jackson-version}</bundle>
+    <bundle 
dependency='true'>mvn:com.fasterxml.jackson.core/jackson-databind/${restlet-jackson-version}</bundle>
+    <bundle 
dependency='true'>mvn:com.fasterxml.jackson.core/jackson-annotations/${restlet-jackson-version}</bundle>
+    <bundle 
dependency='true'>mvn:com.fasterxml.jackson.dataformat/jackson-dataformat-csv/${restlet-jackson-version}</bundle>
+    <bundle 
dependency='true'>mvn:com.fasterxml.jackson.dataformat/jackson-dataformat-smile/${restlet-jackson-version}</bundle>
+    <bundle 
dependency='true'>mvn:com.fasterxml.jackson.dataformat/jackson-dataformat-xml/${restlet-jackson-version}</bundle>
+    <bundle 
dependency='true'>mvn:com.fasterxml.jackson.dataformat/jackson-dataformat-yaml/${restlet-jackson-version}</bundle>
+    <bundle 
dependency='true'>mvn:com.fasterxml.jackson.module/jackson-module-jaxb-annotations/${restlet-jackson-version}</bundle>
+    <bundle 
dependency='true'>mvn:com.fasterxml.jackson.module/jackson-module-jsonSchema/${restlet-jackson-version}</bundle>
+    
<bundle>mvn:http://maven.restlet.org@id=restlet!org.restlet.osgi/org.restlet.ext.jackson/${restlet-version}</bundle>
+  </feature>
+  <feature name='camel-restlet-gson' version='${project.version}' 
resolver='(obr)' start-level='50'>
+    <feature version='${project.version}'>camel-restlet</feature>
+    <bundle 
dependency='true'>mvn:joda-time/joda-time/${restlet-joda-time-version}</bundle>
+    <bundle 
dependency='true'>mvn:com.google.code.gson/gson/${restlet-gson-version}</bundle>
+    
<bundle>mvn:http://maven.restlet.org@id=restlet!org.restlet.osgi/org.restlet.ext.gson/${restlet-version}</bundle>
+  </feature>
   <feature name='camel-rmi' version='${project.version}' resolver='(obr)' 
start-level='50'>
     <feature version='${project.version}'>camel-core</feature>
     <bundle>mvn:org.apache.camel/camel-rmi/${project.version}</bundle>

Reply via email to