You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2017/03/28 16:35:32 UTC
camel git commit: CAMEL-11073: camel-rest - Spring boot option named
c-o-r-s
Repository: camel
Updated Branches:
refs/heads/master 365ac51a0 -> 23c460f31
CAMEL-11073: camel-rest - Spring boot option named c-o-r-s
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/23c460f3
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/23c460f3
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/23c460f3
Branch: refs/heads/master
Commit: 23c460f3144c2f280d8e87a5b95d503e0661c934
Parents: 365ac51
Author: lburgazzoli <lb...@gmail.com>
Authored: Tue Mar 28 18:34:55 2017 +0200
Committer: lburgazzoli <lb...@gmail.com>
Committed: Tue Mar 28 18:34:55 2017 +0200
----------------------------------------------------------------------
.../spring/boot/CamelRestAutoConfiguration.java | 60 ---
.../boot/CamelRestConfigurationProperties.java | 233 ------------
.../main/resources/META-INF/spring.factories | 1 -
.../apache/camel/spring/boot/CamelRestTest.java | 167 ---------
.../camel-core-starter/pom.xml | 5 +
...onfigurationDefinitionAutoConfiguration.java | 65 ++++
.../RestConfigurationDefinitionProperties.java | 374 +++++++++++++++++++
.../main/resources/META-INF/spring.factories | 4 +-
.../model/rest/springboot/CamelRestTest.java | 167 +++++++++
.../src/test/resources/application.properties | 0
.../src/test/resources/logback.xml | 40 ++
.../SpringBootAutoConfigurationMojo.java | 234 +++++++++---
12 files changed, 844 insertions(+), 506 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/23c460f3/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelRestAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelRestAutoConfiguration.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelRestAutoConfiguration.java
deleted file mode 100644
index ef58774..0000000
--- a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelRestAutoConfiguration.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * 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.spring.boot;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.model.rest.RestConstants;
-import org.apache.camel.spi.RestConfiguration;
-import org.apache.camel.util.IntrospectionSupport;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-@ConditionalOnProperty(name = "camel.rest.enabled", matchIfMissing = true)
-@ConditionalOnBean(CamelAutoConfiguration.class)
-@AutoConfigureAfter(CamelAutoConfiguration.class)
-@EnableConfigurationProperties(CamelRestConfigurationProperties.class)
-public class CamelRestAutoConfiguration {
- @Autowired
- private CamelContext camelContext;
- @Autowired
- private CamelRestConfigurationProperties config;
-
- @Bean(name = RestConstants.DEFAULT_REST_CONFIGURATION_ID)
- @ConditionalOnClass(CamelContext.class)
- @ConditionalOnMissingBean
- public RestConfiguration restConfiguration() throws Exception {
- final RestConfiguration configuration = new RestConfiguration();
-
- // Copy properties
- IntrospectionSupport.setProperties(
- camelContext,
- camelContext.getTypeConverter(),
- configuration,
- IntrospectionSupport.getNonNullProperties(config)
- );
-
- return configuration;
- }
-}
http://git-wip-us.apache.org/repos/asf/camel/blob/23c460f3/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelRestConfigurationProperties.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelRestConfigurationProperties.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelRestConfigurationProperties.java
deleted file mode 100644
index cf1c855..0000000
--- a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelRestConfigurationProperties.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/**
- * 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.spring.boot;
-
-import java.util.Map;
-
-import org.apache.camel.spi.RestConfiguration;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
-@ConfigurationProperties(prefix = "camel.rest")
-public class CamelRestConfigurationProperties {
- // Delegate it so we do not have the CamelRestConfigurationProperties
- // registered available also as RestConfiguration
- private final RestConfiguration delegate;
-
- public CamelRestConfigurationProperties() {
- this.delegate = new RestConfiguration();
- }
-
- public String getComponent() {
- return delegate.getComponent();
- }
-
- public void setComponent(String componentName) {
- delegate.setComponent(componentName);
- }
-
- public String getApiComponent() {
- return delegate.getApiComponent();
- }
-
- public void setApiComponent(String apiComponent) {
- delegate.setApiComponent(apiComponent);
- }
-
- public String getProducerComponent() {
- return delegate.getProducerComponent();
- }
-
- public void setProducerComponent(String componentName) {
- delegate.setProducerComponent(componentName);
- }
-
- public String getProducerApiDoc() {
- return delegate.getProducerApiDoc();
- }
-
- public void setProducerApiDoc(String producerApiDoc) {
- delegate.setProducerApiDoc(producerApiDoc);
- }
-
- public String getHost() {
- return delegate.getHost();
- }
-
- public void setHost(String host) {
- delegate.setHost(host);
- }
-
- public String getScheme() {
- return delegate.getScheme();
- }
-
- public void setScheme(String scheme) {
- delegate.setScheme(scheme);
- }
-
- public int getPort() {
- return delegate.getPort();
- }
-
- public void setPort(int port) {
- delegate.setPort(port);
- }
-
- public String getContextPath() {
- return delegate.getContextPath();
- }
-
- public void setContextPath(String contextPath) {
- delegate.setContextPath(contextPath);
- }
-
- public String getApiContextPath() {
- return delegate.getApiContextPath();
- }
-
- public void setApiContextPath(String contextPath) {
- delegate.setApiContextPath(contextPath);
- }
-
- public String getApiContextRouteId() {
- return delegate.getApiContextRouteId();
- }
-
- public void setApiContextRouteId(String apiContextRouteId) {
- delegate.setApiContextRouteId(apiContextRouteId);
- }
-
- public String getApiContextIdPattern() {
- return delegate.getApiContextIdPattern();
- }
-
- public void setApiContextIdPattern(String apiContextIdPattern) {
- delegate.setApiContextIdPattern(apiContextIdPattern);
- }
-
- public boolean isApiContextListing() {
- return delegate.isApiContextListing();
- }
-
- public void setApiContextListing(boolean apiContextListing) {
- delegate.setApiContextListing(apiContextListing);
- }
-
- public RestConfiguration.RestHostNameResolver getRestHostNameResolver() {
- return delegate.getRestHostNameResolver();
- }
-
- public void setRestHostNameResolver(RestConfiguration.RestHostNameResolver restHostNameResolver) {
- delegate.setRestHostNameResolver(restHostNameResolver);
- }
-
- public void setRestHostNameResolver(String restHostNameResolver) {
- delegate.setRestHostNameResolver(restHostNameResolver);
- }
-
- public RestConfiguration.RestBindingMode getBindingMode() {
- return delegate.getBindingMode();
- }
-
- public void setBindingMode(RestConfiguration.RestBindingMode bindingMode) {
- delegate.setBindingMode(bindingMode);
- }
-
- public void setBindingMode(String bindingMode) {
- delegate.setBindingMode(bindingMode);
- }
-
- public boolean isSkipBindingOnErrorCode() {
- return delegate.isSkipBindingOnErrorCode();
- }
-
- public void setSkipBindingOnErrorCode(boolean skipBindingOnErrorCode) {
- delegate.setSkipBindingOnErrorCode(skipBindingOnErrorCode);
- }
-
- public boolean isEnableCORS() {
- return delegate.isEnableCORS();
- }
-
- public void setEnableCORS(boolean enableCORS) {
- delegate.setEnableCORS(enableCORS);
- }
-
- public String getJsonDataFormat() {
- return delegate.getJsonDataFormat();
- }
-
- public void setJsonDataFormat(String name) {
- delegate.setJsonDataFormat(name);
- }
-
- public String getXmlDataFormat() {
- return delegate.getXmlDataFormat();
- }
-
- public void setXmlDataFormat(String name) {
- delegate.setXmlDataFormat(name);
- }
-
- public Map<String, Object> getComponentProperties() {
- return delegate.getComponentProperties();
- }
-
- public void setComponentProperties(Map<String, Object> componentProperties) {
- delegate.setComponentProperties(componentProperties);
- }
-
- public Map<String, Object> getEndpointProperties() {
- return delegate.getEndpointProperties();
- }
-
- public void setEndpointProperties(Map<String, Object> endpointProperties) {
- delegate.setEndpointProperties(endpointProperties);
- }
-
- public Map<String, Object> getConsumerProperties() {
- return delegate.getConsumerProperties();
- }
-
- public void setConsumerProperties(Map<String, Object> consumerProperties) {
- delegate.setConsumerProperties(consumerProperties);
- }
-
- public Map<String, Object> getDataFormatProperties() {
- return delegate.getDataFormatProperties();
- }
-
- public void setDataFormatProperties(Map<String, Object> dataFormatProperties) {
- delegate.setDataFormatProperties(dataFormatProperties);
- }
-
- public Map<String, Object> getApiProperties() {
- return delegate.getApiProperties();
- }
-
- public void setApiProperties(Map<String, Object> apiProperties) {
- delegate.setApiProperties(apiProperties);
- }
-
- public Map<String, String> getCorsHeaders() {
- return delegate.getCorsHeaders();
- }
-
- public void setCorsHeaders(Map<String, String> corsHeaders) {
- delegate.setCorsHeaders(corsHeaders);
- }
-}
http://git-wip-us.apache.org/repos/asf/camel/blob/23c460f3/components/camel-spring-boot/src/main/resources/META-INF/spring.factories
----------------------------------------------------------------------
diff --git a/components/camel-spring-boot/src/main/resources/META-INF/spring.factories b/components/camel-spring-boot/src/main/resources/META-INF/spring.factories
index 10f5de7..ef14820 100644
--- a/components/camel-spring-boot/src/main/resources/META-INF/spring.factories
+++ b/components/camel-spring-boot/src/main/resources/META-INF/spring.factories
@@ -17,7 +17,6 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.apache.camel.spring.boot.CamelAutoConfiguration,\
-org.apache.camel.spring.boot.CamelRestAutoConfiguration,\
org.apache.camel.spring.boot.cloud.CamelCloudAutoConfiguration,\
org.apache.camel.spring.boot.cloud.CamelCloudServiceCallConfigurationAutoConfiguration,\
org.apache.camel.spring.boot.cloud.CamelCloudServiceDiscoveryAutoConfiguration,\
http://git-wip-us.apache.org/repos/asf/camel/blob/23c460f3/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/CamelRestTest.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/CamelRestTest.java b/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/CamelRestTest.java
deleted file mode 100644
index ab7fe56..0000000
--- a/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/CamelRestTest.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/**
- * 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.spring.boot;
-
-import java.util.Map;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.Consumer;
-import org.apache.camel.Processor;
-import org.apache.camel.ProducerTemplate;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.seda.SedaEndpoint;
-import org.apache.camel.impl.ActiveMQUuidGenerator;
-import org.apache.camel.spi.RestApiConsumerFactory;
-import org.apache.camel.spi.RestConfiguration;
-import org.apache.camel.spi.RestConsumerFactory;
-import org.apache.camel.util.CamelContextHelper;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.test.annotation.DirtiesContext;
-import org.springframework.test.context.junit4.SpringRunner;
-
-
-@DirtiesContext
-@RunWith(SpringRunner.class)
-@EnableAutoConfiguration
-@SpringBootTest(
- classes = {
- CamelRestTest.class,
- CamelRestTest.TestConfiguration.class
- },
- properties = {
- "debug=false",
- "camel.springboot.xml-rests=false",
- "camel.springboot.xml-routes=false",
- "camel.rest.enabled=true",
- "camel.rest.component=dummy-rest",
- "camel.rest.host=localhost"
- }
-)
-public class CamelRestTest {
- @Autowired
- private CamelContext context;
-
- @Test
- public void test() throws Exception {
- ProducerTemplate template = context.createProducerTemplate();
- String result = template.requestBody("seda:get-say-hello", "test", String.class);
-
- Assert.assertEquals("Hello World", result);
- }
-
- // ***********************************
- // Configuration
- // ***********************************
-
- @Configuration
- public static class TestConfiguration {
- @Bean(name = "dummy-rest")
- public RestConsumerFactory dummyRestConsumerFactory() {
- return new TestConsumerFactory();
- }
-
- @Bean
- public RouteBuilder routeBuilder() {
- return new RouteBuilder() {
- @Override
- public void configure() throws Exception {
- rest("/say/hello")
- .get().to("direct:hello");
- from("direct:hello")
- .transform().constant("Hello World");
- }
- };
- }
- }
-
- // ***********************************
- // Rest Helpers
- // ***********************************
-
- private static final class TestConsumerFactory implements RestConsumerFactory, RestApiConsumerFactory {
- private Object dummy;
-
- public Object getDummy() {
- return dummy;
- }
-
- public void setDummy(Object dummy) {
- this.dummy = dummy;
- }
-
- @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 {
-
- // just use a seda endpoint for testing purpose
- String id;
- if (uriTemplate != null) {
- id = ActiveMQUuidGenerator.generateSanitizedId(basePath + uriTemplate);
- } else {
- id = ActiveMQUuidGenerator.generateSanitizedId(basePath);
- }
- // remove leading dash as we add that ourselves
- if (id.startsWith("-")) {
- id = id.substring(1);
- }
-
- if (configuration.getConsumerProperties() != null) {
- String ref = (String) configuration.getConsumerProperties().get("dummy");
- if (ref != null) {
- dummy = CamelContextHelper.mandatoryLookup(camelContext, ref.substring(1));
- }
- }
-
- SedaEndpoint seda = camelContext.getEndpoint("seda:" + verb + "-" + id, SedaEndpoint.class);
- return seda.createConsumer(processor);
- }
-
- @Override
- public Consumer createApiConsumer(
- CamelContext camelContext,
- Processor processor,
- String contextPath,
- RestConfiguration configuration,
- Map<String, Object> parameters) throws Exception {
-
- // just use a seda endpoint for testing purpose
- String id = ActiveMQUuidGenerator.generateSanitizedId(contextPath);
- // remove leading dash as we add that ourselves
- if (id.startsWith("-")) {
- id = id.substring(1);
- }
-
- SedaEndpoint seda = camelContext.getEndpoint("seda:api:" + "-" + id, SedaEndpoint.class);
- return seda.createConsumer(processor);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/camel/blob/23c460f3/platforms/spring-boot/components-starter/camel-core-starter/pom.xml
----------------------------------------------------------------------
diff --git a/platforms/spring-boot/components-starter/camel-core-starter/pom.xml b/platforms/spring-boot/components-starter/camel-core-starter/pom.xml
index d441b3f..49159da 100644
--- a/platforms/spring-boot/components-starter/camel-core-starter/pom.xml
+++ b/platforms/spring-boot/components-starter/camel-core-starter/pom.xml
@@ -37,6 +37,11 @@
<artifactId>camel-core</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-spring-boot-starter</artifactId>
+ <scope>test</scope>
+ </dependency>
<!--START OF GENERATED CODE-->
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
http://git-wip-us.apache.org/repos/asf/camel/blob/23c460f3/platforms/spring-boot/components-starter/camel-core-starter/src/main/java/org/apache/camel/model/rest/springboot/RestConfigurationDefinitionAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/platforms/spring-boot/components-starter/camel-core-starter/src/main/java/org/apache/camel/model/rest/springboot/RestConfigurationDefinitionAutoConfiguration.java b/platforms/spring-boot/components-starter/camel-core-starter/src/main/java/org/apache/camel/model/rest/springboot/RestConfigurationDefinitionAutoConfiguration.java
new file mode 100644
index 0000000..3ea9cbe
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-core-starter/src/main/java/org/apache/camel/model/rest/springboot/RestConfigurationDefinitionAutoConfiguration.java
@@ -0,0 +1,65 @@
+/**
+ * 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.model.rest.springboot;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.camel.CamelContext;
+import org.apache.camel.model.rest.RestConstants;
+import org.apache.camel.spi.RestConfiguration;
+import org.apache.camel.util.IntrospectionSupport;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
+
+/**
+ * Generated by camel-package-maven-plugin - do not edit this file!
+ */
+@Configuration
+@ConditionalOnBean(type = "org.apache.camel.spring.boot.CamelAutoConfiguration")
+@ConditionalOnProperty(name = "camel.rest.enabled", matchIfMissing = true)
+@AutoConfigureAfter(name = "org.apache.camel.spring.boot.CamelAutoConfiguration")
+@EnableConfigurationProperties(RestConfigurationDefinitionProperties.class)
+public class RestConfigurationDefinitionAutoConfiguration {
+
+ @Autowired
+ private CamelContext camelContext;
+ @Autowired
+ private RestConfigurationDefinitionProperties config;
+
+ @Lazy
+ @Bean(name = RestConstants.DEFAULT_REST_CONFIGURATION_ID)
+ @ConditionalOnClass(CamelContext.class)
+ @ConditionalOnMissingBean
+ public RestConfiguration configureRestConfigurationDefinition()
+ throws Exception {
+ Map<String, Object> properties = new HashMap<>();
+ IntrospectionSupport.getProperties(config, properties, null, false);
+ RestConfiguration definition = new RestConfiguration();
+ IntrospectionSupport.setProperties(camelContext,
+ camelContext.getTypeConverter(), definition, properties);
+ definition.setEnableCORS(config.getEnableCors());
+ return definition;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/camel/blob/23c460f3/platforms/spring-boot/components-starter/camel-core-starter/src/main/java/org/apache/camel/model/rest/springboot/RestConfigurationDefinitionProperties.java
----------------------------------------------------------------------
diff --git a/platforms/spring-boot/components-starter/camel-core-starter/src/main/java/org/apache/camel/model/rest/springboot/RestConfigurationDefinitionProperties.java b/platforms/spring-boot/components-starter/camel-core-starter/src/main/java/org/apache/camel/model/rest/springboot/RestConfigurationDefinitionProperties.java
new file mode 100644
index 0000000..ec134c2
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-core-starter/src/main/java/org/apache/camel/model/rest/springboot/RestConfigurationDefinitionProperties.java
@@ -0,0 +1,374 @@
+/**
+ * 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.model.rest.springboot;
+
+import java.util.List;
+import org.apache.camel.model.rest.RestBindingMode;
+import org.apache.camel.model.rest.RestHostNameResolver;
+import org.apache.camel.model.rest.RestPropertyDefinition;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * To configure rest
+ *
+ * Generated by camel-package-maven-plugin - do not edit this file!
+ */
+@ConfigurationProperties(prefix = "camel.rest")
+public class RestConfigurationDefinitionProperties {
+
+ /**
+ * The Camel Rest component to use for the REST transport (consumer) such as
+ * restlet spark-rest. If no component has been explicit configured then
+ * Camel will lookup if there is a Camel component that integrates with the
+ * Rest DSL or if a org.apache.camel.spi.RestConsumerFactory is registered
+ * in the registry. If either one is found then that is being used.
+ */
+ private String component;
+ /**
+ * The name of the Camel component to use as the REST API (such as swagger)
+ */
+ private String apiComponent = "swagger";
+ /**
+ * Sets the name of the Camel component to use as the REST producer
+ */
+ private String producerComponent;
+ /**
+ * The scheme to use for exposing the REST service. Usually http or https is
+ * supported. The default value is http
+ */
+ private String scheme;
+ /**
+ * The hostname to use for exposing the REST service.
+ */
+ private String host;
+ /**
+ * The port number to use for exposing the REST service. Notice if you use
+ * servlet component then the port number configured here does not apply as
+ * the port number in use is the actual port number the servlet component is
+ * using. eg if using Apache Tomcat its the tomcat http port if using Apache
+ * Karaf its the HTTP service in Karaf that uses port 8181 by default etc.
+ * Though in those situations setting the port number here allows tooling
+ * and JMX to know the port number so its recommended to set the port number
+ * to the number that the servlet engine uses.
+ */
+ private String port;
+ /**
+ * Sets the location of the api document (swagger api) the REST producer
+ * will use to validate the REST uri and query parameters are valid
+ * accordingly to the api document. This requires adding camel-swagger-java
+ * to the classpath and any miss configuration will let Camel fail on
+ * startup and report the error(s). The location of the api document is
+ * loaded from classpath by default but you can use file: or http: to refer
+ * to resources to load from file or http url.
+ */
+ private String producerApiDoc;
+ /**
+ * Sets a leading context-path the REST services will be using. This can be
+ * used when using components such as camel-servlet where the deployed web
+ * application is deployed using a context-path. Or for components such as
+ * camel-jetty or camel-netty4-http that includes a HTTP server.
+ */
+ private String contextPath;
+ /**
+ * Sets a leading API context-path the REST API services will be using. This
+ * can be used when using components such as camel-servlet where the
+ * deployed web application is deployed using a context-path.
+ */
+ private String apiContextPath;
+ /**
+ * Sets the route id to use for the route that services the REST API. The
+ * route will by default use an auto assigned route id.
+ */
+ private String apiContextRouteId;
+ /**
+ * Sets an CamelContext id pattern to only allow Rest APIs from rest
+ * services within CamelContext's which name matches the pattern. The
+ * pattern name refers to the CamelContext name to match on the current
+ * CamelContext only. For any other value the pattern uses the rules from
+ * link org.apache.camel.util.EndpointHelpermatchPattern(String String)
+ */
+ private String apiContextIdPattern;
+ /**
+ * Sets whether listing of all available CamelContext's with REST services
+ * in the JVM is enabled. If enabled it allows to discover these contexts if
+ * false then only the current CamelContext is in use.
+ */
+ private Boolean apiContextListing = false;
+ /**
+ * If no hostname has been explicit configured then this resolver is used to
+ * compute the hostname the REST service will be using.
+ */
+ private RestHostNameResolver hostNameResolver;
+ /**
+ * Sets the binding mode to use. The default value is off
+ */
+ private RestBindingMode bindingMode;
+ /**
+ * Whether to skip binding on output if there is a custom HTTP error code
+ * header. This allows to build custom error messages that do not bind to
+ * json / xml etc as success messages otherwise will do.
+ */
+ private Boolean skipBindingOnErrorCode = false;
+ /**
+ * Whether to enable CORS headers in the HTTP response. The default value is
+ * false.
+ */
+ private Boolean enableCors = false;
+ /**
+ * Name of specific json data format to use. By default json-jackson will be
+ * used. Important: This option is only for setting a custom name of the
+ * data format not to refer to an existing data format instance.
+ */
+ private String jsonDataFormat;
+ /**
+ * Name of specific XML data format to use. By default jaxb will be used.
+ * Important: This option is only for setting a custom name of the data
+ * format not to refer to an existing data format instance.
+ */
+ private String xmlDataFormat;
+ /**
+ * Allows to configure as many additional properties for the rest component
+ * in use.
+ */
+ private List<RestPropertyDefinition> componentProperty;
+ /**
+ * Allows to configure as many additional properties for the rest endpoint
+ * in use.
+ */
+ private List<RestPropertyDefinition> endpointProperty;
+ /**
+ * Allows to configure as many additional properties for the rest consumer
+ * in use.
+ */
+ private List<RestPropertyDefinition> consumerProperty;
+ /**
+ * Allows to configure as many additional properties for the data formats in
+ * use. For example set property prettyPrint to true to have json outputted
+ * in pretty mode. The properties can be prefixed to denote the option is
+ * only for either JSON or XML and for either the IN or the OUT. The
+ * prefixes are: json.in. json.out. xml.in. xml.out. For example a key with
+ * value xml.out.mustBeJAXBElement is only for the XML data format for the
+ * outgoing. A key without a prefix is a common key for all situations.
+ */
+ private List<RestPropertyDefinition> dataFormatProperty;
+ /**
+ * Allows to configure as many additional properties for the api
+ * documentation (swagger). For example set property api.title to my cool
+ * stuff
+ */
+ private List<RestPropertyDefinition> apiProperty;
+ /**
+ * Allows to configure custom CORS headers.
+ */
+ private List<RestPropertyDefinition> corsHeaders;
+
+ public String getComponent() {
+ return component;
+ }
+
+ public void setComponent(String component) {
+ this.component = component;
+ }
+
+ public String getApiComponent() {
+ return apiComponent;
+ }
+
+ public void setApiComponent(String apiComponent) {
+ this.apiComponent = apiComponent;
+ }
+
+ public String getProducerComponent() {
+ return producerComponent;
+ }
+
+ public void setProducerComponent(String producerComponent) {
+ this.producerComponent = producerComponent;
+ }
+
+ public String getScheme() {
+ return scheme;
+ }
+
+ public void setScheme(String scheme) {
+ this.scheme = scheme;
+ }
+
+ public String getHost() {
+ return host;
+ }
+
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+ public String getPort() {
+ return port;
+ }
+
+ public void setPort(String port) {
+ this.port = port;
+ }
+
+ public String getProducerApiDoc() {
+ return producerApiDoc;
+ }
+
+ public void setProducerApiDoc(String producerApiDoc) {
+ this.producerApiDoc = producerApiDoc;
+ }
+
+ public String getContextPath() {
+ return contextPath;
+ }
+
+ public void setContextPath(String contextPath) {
+ this.contextPath = contextPath;
+ }
+
+ public String getApiContextPath() {
+ return apiContextPath;
+ }
+
+ public void setApiContextPath(String apiContextPath) {
+ this.apiContextPath = apiContextPath;
+ }
+
+ public String getApiContextRouteId() {
+ return apiContextRouteId;
+ }
+
+ public void setApiContextRouteId(String apiContextRouteId) {
+ this.apiContextRouteId = apiContextRouteId;
+ }
+
+ public String getApiContextIdPattern() {
+ return apiContextIdPattern;
+ }
+
+ public void setApiContextIdPattern(String apiContextIdPattern) {
+ this.apiContextIdPattern = apiContextIdPattern;
+ }
+
+ public Boolean getApiContextListing() {
+ return apiContextListing;
+ }
+
+ public void setApiContextListing(Boolean apiContextListing) {
+ this.apiContextListing = apiContextListing;
+ }
+
+ public RestHostNameResolver getHostNameResolver() {
+ return hostNameResolver;
+ }
+
+ public void setHostNameResolver(RestHostNameResolver hostNameResolver) {
+ this.hostNameResolver = hostNameResolver;
+ }
+
+ public RestBindingMode getBindingMode() {
+ return bindingMode;
+ }
+
+ public void setBindingMode(RestBindingMode bindingMode) {
+ this.bindingMode = bindingMode;
+ }
+
+ public Boolean getSkipBindingOnErrorCode() {
+ return skipBindingOnErrorCode;
+ }
+
+ public void setSkipBindingOnErrorCode(Boolean skipBindingOnErrorCode) {
+ this.skipBindingOnErrorCode = skipBindingOnErrorCode;
+ }
+
+ public Boolean getEnableCors() {
+ return enableCors;
+ }
+
+ public void setEnableCors(Boolean enableCors) {
+ this.enableCors = enableCors;
+ }
+
+ public String getJsonDataFormat() {
+ return jsonDataFormat;
+ }
+
+ public void setJsonDataFormat(String jsonDataFormat) {
+ this.jsonDataFormat = jsonDataFormat;
+ }
+
+ public String getXmlDataFormat() {
+ return xmlDataFormat;
+ }
+
+ public void setXmlDataFormat(String xmlDataFormat) {
+ this.xmlDataFormat = xmlDataFormat;
+ }
+
+ public List<RestPropertyDefinition> getComponentProperty() {
+ return componentProperty;
+ }
+
+ public void setComponentProperty(
+ List<RestPropertyDefinition> componentProperty) {
+ this.componentProperty = componentProperty;
+ }
+
+ public List<RestPropertyDefinition> getEndpointProperty() {
+ return endpointProperty;
+ }
+
+ public void setEndpointProperty(
+ List<RestPropertyDefinition> endpointProperty) {
+ this.endpointProperty = endpointProperty;
+ }
+
+ public List<RestPropertyDefinition> getConsumerProperty() {
+ return consumerProperty;
+ }
+
+ public void setConsumerProperty(
+ List<RestPropertyDefinition> consumerProperty) {
+ this.consumerProperty = consumerProperty;
+ }
+
+ public List<RestPropertyDefinition> getDataFormatProperty() {
+ return dataFormatProperty;
+ }
+
+ public void setDataFormatProperty(
+ List<RestPropertyDefinition> dataFormatProperty) {
+ this.dataFormatProperty = dataFormatProperty;
+ }
+
+ public List<RestPropertyDefinition> getApiProperty() {
+ return apiProperty;
+ }
+
+ public void setApiProperty(List<RestPropertyDefinition> apiProperty) {
+ this.apiProperty = apiProperty;
+ }
+
+ public List<RestPropertyDefinition> getCorsHeaders() {
+ return corsHeaders;
+ }
+
+ public void setCorsHeaders(List<RestPropertyDefinition> corsHeaders) {
+ this.corsHeaders = corsHeaders;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/camel/blob/23c460f3/platforms/spring-boot/components-starter/camel-core-starter/src/main/resources/META-INF/spring.factories
----------------------------------------------------------------------
diff --git a/platforms/spring-boot/components-starter/camel-core-starter/src/main/resources/META-INF/spring.factories b/platforms/spring-boot/components-starter/camel-core-starter/src/main/resources/META-INF/spring.factories
index a42ae0c..44a3c18 100644
--- a/platforms/spring-boot/components-starter/camel-core-starter/src/main/resources/META-INF/spring.factories
+++ b/platforms/spring-boot/components-starter/camel-core-starter/src/main/resources/META-INF/spring.factories
@@ -54,4 +54,6 @@ org.apache.camel.component.dataset.springboot.DataSetComponentAutoConfiguration,
org.apache.camel.component.binding.springboot.BindingNameComponentAutoConfiguration,\
org.apache.camel.component.bean.springboot.BeanComponentAutoConfiguration,\
org.apache.camel.component.dataformat.springboot.DataFormatComponentAutoConfiguration,\
-org.apache.camel.component.rest.springboot.RestApiComponentAutoConfiguration
+org.apache.camel.component.rest.springboot.RestApiComponentAutoConfiguration,\
+org.apache.camel.model.rest.springboot.RestConfigurationDefinitionAutoConfiguration
+
http://git-wip-us.apache.org/repos/asf/camel/blob/23c460f3/platforms/spring-boot/components-starter/camel-core-starter/src/test/java/org/apache/camel/model/rest/springboot/CamelRestTest.java
----------------------------------------------------------------------
diff --git a/platforms/spring-boot/components-starter/camel-core-starter/src/test/java/org/apache/camel/model/rest/springboot/CamelRestTest.java b/platforms/spring-boot/components-starter/camel-core-starter/src/test/java/org/apache/camel/model/rest/springboot/CamelRestTest.java
new file mode 100644
index 0000000..cae2ae4
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-core-starter/src/test/java/org/apache/camel/model/rest/springboot/CamelRestTest.java
@@ -0,0 +1,167 @@
+/**
+ * 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.model.rest.springboot;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.seda.SedaEndpoint;
+import org.apache.camel.impl.ActiveMQUuidGenerator;
+import org.apache.camel.spi.RestApiConsumerFactory;
+import org.apache.camel.spi.RestConfiguration;
+import org.apache.camel.spi.RestConsumerFactory;
+import org.apache.camel.util.CamelContextHelper;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.junit4.SpringRunner;
+
+
+@DirtiesContext
+@RunWith(SpringRunner.class)
+@EnableAutoConfiguration
+@SpringBootTest(
+ classes = {
+ CamelRestTest.class,
+ CamelRestTest.TestConfiguration.class
+ },
+ properties = {
+ "debug=false",
+ "camel.springboot.xml-rests=false",
+ "camel.springboot.xml-routes=false",
+ "camel.rest.enabled=true",
+ "camel.rest.component=dummy-rest",
+ "camel.rest.host=localhost"
+ }
+)
+public class CamelRestTest {
+ @Autowired
+ private CamelContext context;
+
+ @Test
+ public void test() throws Exception {
+ ProducerTemplate template = context.createProducerTemplate();
+ String result = template.requestBody("seda:get-say-hello", "test", String.class);
+
+ Assert.assertEquals("Hello World", result);
+ }
+
+ // ***********************************
+ // Configuration
+ // ***********************************
+
+ @Configuration
+ public static class TestConfiguration {
+ @Bean(name = "dummy-rest")
+ public RestConsumerFactory dummyRestConsumerFactory() {
+ return new TestConsumerFactory();
+ }
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ rest("/say/hello")
+ .get().to("direct:hello");
+ from("direct:hello")
+ .transform().constant("Hello World");
+ }
+ };
+ }
+ }
+
+ // ***********************************
+ // Rest Helpers
+ // ***********************************
+
+ private static final class TestConsumerFactory implements RestConsumerFactory, RestApiConsumerFactory {
+ private Object dummy;
+
+ public Object getDummy() {
+ return dummy;
+ }
+
+ public void setDummy(Object dummy) {
+ this.dummy = dummy;
+ }
+
+ @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 {
+
+ // just use a seda endpoint for testing purpose
+ String id;
+ if (uriTemplate != null) {
+ id = ActiveMQUuidGenerator.generateSanitizedId(basePath + uriTemplate);
+ } else {
+ id = ActiveMQUuidGenerator.generateSanitizedId(basePath);
+ }
+ // remove leading dash as we add that ourselves
+ if (id.startsWith("-")) {
+ id = id.substring(1);
+ }
+
+ if (configuration.getConsumerProperties() != null) {
+ String ref = (String) configuration.getConsumerProperties().get("dummy");
+ if (ref != null) {
+ dummy = CamelContextHelper.mandatoryLookup(camelContext, ref.substring(1));
+ }
+ }
+
+ SedaEndpoint seda = camelContext.getEndpoint("seda:" + verb + "-" + id, SedaEndpoint.class);
+ return seda.createConsumer(processor);
+ }
+
+ @Override
+ public Consumer createApiConsumer(
+ CamelContext camelContext,
+ Processor processor,
+ String contextPath,
+ RestConfiguration configuration,
+ Map<String, Object> parameters) throws Exception {
+
+ // just use a seda endpoint for testing purpose
+ String id = ActiveMQUuidGenerator.generateSanitizedId(contextPath);
+ // remove leading dash as we add that ourselves
+ if (id.startsWith("-")) {
+ id = id.substring(1);
+ }
+
+ SedaEndpoint seda = camelContext.getEndpoint("seda:api:" + "-" + id, SedaEndpoint.class);
+ return seda.createConsumer(processor);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/23c460f3/platforms/spring-boot/components-starter/camel-core-starter/src/test/resources/application.properties
----------------------------------------------------------------------
diff --git a/platforms/spring-boot/components-starter/camel-core-starter/src/test/resources/application.properties b/platforms/spring-boot/components-starter/camel-core-starter/src/test/resources/application.properties
new file mode 100644
index 0000000..e69de29
http://git-wip-us.apache.org/repos/asf/camel/blob/23c460f3/platforms/spring-boot/components-starter/camel-core-starter/src/test/resources/logback.xml
----------------------------------------------------------------------
diff --git a/platforms/spring-boot/components-starter/camel-core-starter/src/test/resources/logback.xml b/platforms/spring-boot/components-starter/camel-core-starter/src/test/resources/logback.xml
new file mode 100644
index 0000000..185b32e
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-core-starter/src/test/resources/logback.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
+<configuration>
+
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <!-- encoders are assigned the type
+ ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
+ <encoder>
+ <pattern>%d{HH:mm:ss.SSS} [%-15.15thread] %-5level %-30.30logger - %msg%n</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="FILE" class="ch.qos.logback.core.FileAppender">
+ <encoder>
+ <pattern>%d{HH:mm:ss.SSS} [%-15.15thread] %-5level %-30.30logger - %msg%n</pattern>
+ </encoder>
+ <file>target/camel-core-starter-test.log</file>
+ </appender>
+
+ <root level="INFO">
+ <!--<appender-ref ref="STDOUT"/>-->
+ <appender-ref ref="FILE"/>
+ </root>
+
+</configuration>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/camel/blob/23c460f3/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootAutoConfigurationMojo.java
----------------------------------------------------------------------
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootAutoConfigurationMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootAutoConfigurationMojo.java
index 4af0892..d7eac27 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootAutoConfigurationMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootAutoConfigurationMojo.java
@@ -71,12 +71,14 @@ import org.jboss.forge.roaster.model.source.MethodSource;
import org.jboss.forge.roaster.model.source.PropertySource;
import org.jboss.forge.roaster.model.util.Formatter;
import org.jboss.forge.roaster.model.util.Strings;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
import org.springframework.boot.bind.RelaxedPropertyResolver;
import org.springframework.boot.context.properties.DeprecatedConfigurationProperty;
@@ -207,7 +209,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo {
String pkg = model.getJavaType().substring(0, pos) + ".springboot";
// Generate properties, auto-configuration happens in camel-hystrix-starter
- createOtherModelConfigurationSource(pkg, model, "camel.hystrix");
+ createOtherModelConfigurationSource(pkg, model, "camel.hystrix", true);
}
// Consul
@@ -219,7 +221,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo {
String pkg = model.getJavaType().substring(0, pos) + ".springboot";
// Generate properties, auto-configuration happens in camel-consul-starter
- createOtherModelConfigurationSource(pkg, model, "camel.cloud.consul.service-discovery");
+ createOtherModelConfigurationSource(pkg, model, "camel.cloud.consul.service-discovery", true);
}
// DNS
@@ -231,7 +233,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo {
String pkg = model.getJavaType().substring(0, pos) + ".springboot";
// Generate properties, auto-configuration happens in camel-dns-starter
- createOtherModelConfigurationSource(pkg, model, "camel.cloud.dns.service-discovery");
+ createOtherModelConfigurationSource(pkg, model, "camel.cloud.dns.service-discovery", true);
}
// Etcd
@@ -243,7 +245,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo {
String pkg = model.getJavaType().substring(0, pos) + ".springboot";
// Generate properties, auto-configuration happens in camel-etcd-starter
- createOtherModelConfigurationSource(pkg, model, "camel.cloud.etcd.service-discovery");
+ createOtherModelConfigurationSource(pkg, model, "camel.cloud.etcd.service-discovery", true);
}
// Kubernetes
@@ -255,14 +257,27 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo {
String pkg = model.getJavaType().substring(0, pos) + ".springboot";
// Generate properties, auto-configuration happens in camel-kubernetes-starter
- createOtherModelConfigurationSource(pkg, model, "camel.cloud.kubernetes.service-discovery");
+ createOtherModelConfigurationSource(pkg, model, "camel.cloud.kubernetes.service-discovery", true);
+ }
+
+ // Rest
+ json = loadModelJson(files, "restConfiguration");
+ if (json != null) {
+ OtherModel model = generateOtherModel(json);
+
+ int pos = model.getJavaType().lastIndexOf(".");
+ String pkg = model.getJavaType().substring(0, pos) + ".springboot";
+
+ // Generate properties, auto-configuration happens in camel-kubernetes-starter
+ createRestConfigurationSource(pkg, model, "camel.rest");
+ createRestModuleAutoConfigurationSource(pkg, model);
}
}
- private void createOtherModelConfigurationSource(String packageName, OtherModel model, String propertiesPrefix) throws MojoFailureException {
+ private void createOtherModelConfigurationSource(String packageName, OtherModel model, String propertiesPrefix, boolean generatedNestedConfig) throws MojoFailureException {
final int pos = model.getJavaType().lastIndexOf(".");
- final String commonName = model.getJavaType().substring(pos + 1) + "Common";
- final String configName = model.getJavaType().substring(pos + 1) + "Properties";
+ final String commonName = model.getJavaType().substring(pos + 1) + (generatedNestedConfig ? "Common" : "Properties");
+ final String configName = model.getJavaType().substring(pos + 1) + (generatedNestedConfig ? "Properties" : null);
// Common base class
JavaClassSource commonClass = Roaster.create(JavaClassSource.class);
@@ -310,51 +325,182 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo {
}
}
+ sortImports(commonClass);
+ writeSourceIfChanged(commonClass, packageName.replaceAll("\\.", "\\/") + "/" + commonName + ".java");
+
// Config class
- JavaClassSource configClass = Roaster.create(JavaClassSource.class);
- configClass.setPackage(packageName);
- configClass.setName(configName);
- configClass.extendSuperType(commonClass);
- configClass.addAnnotation("org.springframework.boot.context.properties.ConfigurationProperties").setStringValue("prefix", propertiesPrefix);
- configClass.addImport(Map.class);
- configClass.addImport(HashMap.class);
- configClass.removeImport(commonClass);
-
- configClass.addField()
- .setName("enabled")
- .setType(boolean.class)
+ if (generatedNestedConfig) {
+ JavaClassSource configClass = Roaster.create(JavaClassSource.class);
+ configClass.setPackage(packageName);
+ configClass.setName(configName);
+ configClass.extendSuperType(commonClass);
+ configClass.addAnnotation("org.springframework.boot.context.properties.ConfigurationProperties").setStringValue("prefix", propertiesPrefix);
+ configClass.addImport(Map.class);
+ configClass.addImport(HashMap.class);
+ configClass.removeImport(commonClass);
+
+ configClass.addField()
+ .setName("enabled")
+ .setType(boolean.class)
+ .setPrivate()
+ .setLiteralInitializer("true")
+ .getJavaDoc().setFullText("Enable the component");
+ configClass.addField("Map<String, " + commonName + "> configurations = new HashMap<>()")
+ .setPrivate()
+ .getJavaDoc().setFullText("Define additional configuration definitions");
+
+ MethodSource<JavaClassSource> method;
+
+ method = configClass.addMethod();
+ method.setName("getConfigurations");
+ method.setReturnType("Map<String, " + commonName + ">");
+ method.setPublic();
+ method.setBody("return configurations;");
+
+ method = configClass.addMethod();
+ method.setName("isEnabled");
+ method.setReturnType(boolean.class);
+ method.setPublic();
+ method.setBody("return enabled;");
+
+ method = configClass.addMethod();
+ method.setName("setEnabled");
+ method.addParameter(boolean.class, "enabled");
+ method.setPublic();
+ method.setBody("this.enabled = enabled;");
+
+
+ sortImports(configClass);
+ writeSourceIfChanged(configClass, packageName.replaceAll("\\.", "\\/") + "/" + configName + ".java");
+ }
+ }
+
+ private void createRestConfigurationSource(String packageName, OtherModel model, String propertiesPrefix) throws MojoFailureException {
+ final int pos = model.getJavaType().lastIndexOf(".");
+ final String className = model.getJavaType().substring(pos + 1) + "Properties";
+
+ // Common base class
+ JavaClassSource javaClass = Roaster.create(JavaClassSource.class);
+ javaClass.setPackage(packageName);
+ javaClass.setName(className);
+ javaClass.addAnnotation("org.springframework.boot.context.properties.ConfigurationProperties").setStringValue("prefix", propertiesPrefix);
+
+ String doc = "Generated by camel-package-maven-plugin - do not edit this file!";
+ if (!Strings.isBlank(model.getDescription())) {
+ doc = model.getDescription() + "\n\n" + doc;
+ }
+ javaClass.getJavaDoc().setFullText(doc);
+
+ for (OtherOptionModel option : model.getOptions()) {
+ String type = option.getJavaType();
+ String name = option.getName();
+
+ if ("id".equalsIgnoreCase(name) || "parent".equalsIgnoreCase(name) || "camelContext".equalsIgnoreCase(name)) {
+ // Skip them as they should not be set via spring boot
+ continue;
+ }
+
+ if ("java.util.List<org.apache.camel.model.PropertyDefinition>".equalsIgnoreCase(type)) {
+ type = "java.util.Map<java.lang.String, java.lang.String>";
+ }
+
+ if ("enableCORS".equalsIgnoreCase(name)) {
+ name = "enableCors";
+ }
+
+ // generate inner class for non-primitive options
+ PropertySource<JavaClassSource> prop = javaClass.addProperty(type, name);
+ if (!Strings.isBlank(option.getDescription())) {
+ prop.getField().getJavaDoc().setFullText(option.getDescription());
+ }
+ if (!Strings.isBlank(option.getDefaultValue())) {
+ if ("java.lang.String".equals(type)) {
+ prop.getField().setStringInitializer(option.getDefaultValue());
+ } else if ("long".equals(type) || "java.lang.Long".equals(type)) {
+ // the value should be a Long number
+ String value = option.getDefaultValue() + "L";
+ prop.getField().setLiteralInitializer(value);
+ } else if ("integer".equals(option.getType()) || "boolean".equals(option.getType())) {
+ prop.getField().setLiteralInitializer(option.getDefaultValue());
+ } else if (!Strings.isBlank(option.getEnums())) {
+ String enumShortName = type.substring(type.lastIndexOf(".") + 1);
+ prop.getField().setLiteralInitializer(enumShortName + "." + option.getDefaultValue());
+ javaClass.addImport(model.getJavaType());
+ }
+ }
+ }
+
+ sortImports(javaClass);
+ writeSourceIfChanged(javaClass, packageName.replaceAll("\\.", "\\/") + "/" + className + ".java");
+ }
+
+ private void createRestModuleAutoConfigurationSource(String packageName, OtherModel model) throws MojoFailureException {
+ final JavaClassSource javaClass = Roaster.create(JavaClassSource.class);
+ final int pos = model.getJavaType().lastIndexOf(".");
+ final String name = model.getJavaType().substring(pos + 1) + "AutoConfiguration";
+ final String configType = model.getJavaType().substring(pos + 1) + "Properties";
+
+ javaClass.setPackage(packageName);
+ javaClass.setName(name);
+
+ String doc = "Generated by camel-package-maven-plugin - do not edit this file!";
+ javaClass.getJavaDoc().setFullText(doc);
+
+ javaClass.addAnnotation(Configuration.class);
+ javaClass.addAnnotation(ConditionalOnBean.class).setStringValue("type", "org.apache.camel.spring.boot.CamelAutoConfiguration");
+ javaClass.addAnnotation(ConditionalOnProperty.class).setStringValue("name", "camel.rest.enabled").setLiteralValue("matchIfMissing", "true");
+ javaClass.addAnnotation(AutoConfigureAfter.class).setStringValue("name", "org.apache.camel.spring.boot.CamelAutoConfiguration");
+ javaClass.addAnnotation(EnableConfigurationProperties.class).setLiteralValue("value", configType + ".class");
+
+ javaClass.addImport("java.util.Map");
+ javaClass.addImport("java.util.HashMap");
+ javaClass.addImport("org.apache.camel.util.IntrospectionSupport");
+ javaClass.addImport("org.apache.camel.CamelContext");
+ javaClass.addImport("org.apache.camel.model.rest.RestConstants");
+ javaClass.addImport("org.apache.camel.spi.RestConfiguration");
+
+ javaClass.addField()
+ .setName("camelContext")
+ .setType("org.apache.camel.CamelContext")
.setPrivate()
- .setLiteralInitializer("true")
- .getJavaDoc().setFullText("Enable the component");
- configClass.addField("Map<String, " + commonName + "> configurations = new HashMap<>()")
+ .addAnnotation(Autowired.class);
+ javaClass.addField()
+ .setName("config")
+ .setType(configType)
.setPrivate()
- .getJavaDoc().setFullText("Define additional configuration definitions");
+ .addAnnotation(Autowired.class);
MethodSource<JavaClassSource> method;
- method = configClass.addMethod();
- method.setName("getConfigurations");
- method.setReturnType("Map<String, " + commonName + ">");
- method.setPublic();
- method.setBody("return configurations;");
-
- method = configClass.addMethod();
- method.setName("isEnabled");
- method.setReturnType(boolean.class);
+ // Configuration
+ method = javaClass.addMethod();
+ method.setName("configure" + model.getShortJavaType());
method.setPublic();
- method.setBody("return enabled;");
-
- method = configClass.addMethod();
- method.setName("setEnabled");
- method.addParameter(boolean.class, "enabled");
- method.setPublic();
- method.setBody("this.enabled = enabled;");
+ method.addThrows(Exception.class);
+ method.setReturnType("org.apache.camel.spi.RestConfiguration");
+ method.addAnnotation(Lazy.class);
+ method.addAnnotation(Bean.class).setLiteralValue("name", "RestConstants.DEFAULT_REST_CONFIGURATION_ID");
+ method.addAnnotation(ConditionalOnClass.class).setLiteralValue("value", "CamelContext.class");
+ method.addAnnotation(ConditionalOnMissingBean.class);
+ method.setBody(""
+ + "Map<String, Object> properties = new HashMap<>();\n"
+ + "IntrospectionSupport.getProperties(config, properties, null, false);\n"
+ + "\n"
+ + "RestConfiguration definition = new RestConfiguration();\n"
+ + "IntrospectionSupport.setProperties(camelContext, camelContext.getTypeConverter(), definition, properties);\n"
+ + "\n"
+ + "// Workaround for spring-boot properties name as It would appear\n"
+ + "// as enable-c-o-r-s if left uppercase in Configuration\n"
+ + "definition.setEnableCORS(config.getEnableCors());\n"
+ + "\n"
+ + "return definition;"
+ );
- sortImports(commonClass);
- sortImports(configClass);
+ sortImports(javaClass);
- writeSourceIfChanged(commonClass, packageName.replaceAll("\\.", "\\/") + "/" + commonName + ".java");
- writeSourceIfChanged(configClass, packageName.replaceAll("\\.", "\\/") + "/" + configName + ".java");
+ String fileName = packageName.replaceAll("\\.", "\\/") + "/" + name + ".java";
+ writeSourceIfChanged(javaClass, fileName);
+ writeComponentSpringFactorySource(packageName, name);
}
private void executeComponent() throws MojoExecutionException, MojoFailureException {