Repository: camel
Updated Branches:
  refs/heads/master a465e190f -> c69f3edf6


CAMEL-9632: Allow to specify response headers in rest-dsl model for swagger to 
use.


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

Branch: refs/heads/master
Commit: c69f3edf649b6e1a6c997c6af132bf82b4785a26
Parents: a465e19
Author: Claus Ibsen <davscl...@apache.org>
Authored: Thu Feb 25 13:04:59 2016 +0100
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Thu Feb 25 13:04:59 2016 +0100

----------------------------------------------------------------------
 .../rest/RestOperationParamDefinition.java      |   2 +-
 .../RestOperationResponseHeaderDefinition.java  | 221 +++++++++++++++++++
 .../RestOperationResponseMsgDefinition.java     |  44 +++-
 .../org/apache/camel/model/rest/jaxb.index      |   1 +
 .../rest/FromRestExplicitComponentTest.java     |   4 +-
 .../camel/component/rest/FromRestGetTest.java   |   7 +-
 .../rest/FromRestIdAndDescriptionTest.java      |   4 +-
 .../rest/SpringFromRestConfigurationTest.xml    |   4 +-
 .../component/rest/SpringFromRestGetTest.xml    |   4 +-
 .../rest/SpringFromRestIdAndDescriptionTest.xml |   4 +-
 .../apache/camel/swagger/RestSwaggerReader.java | 105 +++++++++
 .../swagger/RestSwaggerReaderDayOfWeekTest.java |   3 +
 .../component/rest/FromRestGetTest.java         |   3 +
 .../rest/FromRestConfigurationTest.xml          |   4 +-
 .../component/rest/FromRestGetTest.xml          |   4 +-
 .../rest/FromRestIdAndDescriptionTest.xml       |   4 +-
 16 files changed, 403 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/c69f3edf/camel-core/src/main/java/org/apache/camel/model/rest/RestOperationParamDefinition.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/model/rest/RestOperationParamDefinition.java
 
b/camel-core/src/main/java/org/apache/camel/model/rest/RestOperationParamDefinition.java
index 122cc03..c60db00 100644
--- 
a/camel-core/src/main/java/org/apache/camel/model/rest/RestOperationParamDefinition.java
+++ 
b/camel-core/src/main/java/org/apache/camel/model/rest/RestOperationParamDefinition.java
@@ -187,7 +187,7 @@ public class RestOperationParamDefinition {
     }
 
     /**
-     * Sets the Swagger Parameter list of allowable values.
+     * Sets the Swagger Parameter list of allowable values (enum).
      */
     public void setAllowableValues(List<String> allowableValues) {
         this.allowableValues = allowableValues;

http://git-wip-us.apache.org/repos/asf/camel/blob/c69f3edf/camel-core/src/main/java/org/apache/camel/model/rest/RestOperationResponseHeaderDefinition.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/model/rest/RestOperationResponseHeaderDefinition.java
 
b/camel-core/src/main/java/org/apache/camel/model/rest/RestOperationResponseHeaderDefinition.java
new file mode 100644
index 0000000..9b8dc86
--- /dev/null
+++ 
b/camel-core/src/main/java/org/apache/camel/model/rest/RestOperationResponseHeaderDefinition.java
@@ -0,0 +1,221 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.util.ObjectHelper;
+
+/**
+ * To specify the rest operation response headers using Swagger.
+ * <p>
+ * This maps to the Swagger Response Header Object.
+ */
+@Metadata(label = "rest")
+@XmlRootElement(name = "responseHeader")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class RestOperationResponseHeaderDefinition {
+
+    @XmlTransient
+    private RestOperationResponseMsgDefinition response;
+
+    @XmlAttribute(required = true)
+    private String name;
+
+    @XmlAttribute
+    @Metadata(defaultValue = "")
+    private String description;
+
+    @XmlAttribute
+    @Metadata(defaultValue = "csv")
+    private CollectionFormat collectionFormat;
+
+    @XmlAttribute
+    @Metadata(defaultValue = "string")
+    private String arrayType;
+
+    @XmlAttribute
+    @Metadata(defaultValue = "string")
+    private String dataType;
+
+    @XmlElementWrapper(name = "allowableValues")
+    @XmlElement(name = "value")
+    private List<String> allowableValues;
+
+    public 
RestOperationResponseHeaderDefinition(RestOperationResponseMsgDefinition 
response) {
+        this();
+        this.response = response;
+    }
+
+    public RestOperationResponseHeaderDefinition() {
+        this.collectionFormat = CollectionFormat.csv;
+        this.arrayType = "string";
+        this.dataType = "string";
+    }
+
+    /**
+     * Ends the configuration of this response message
+     */
+    public RestOperationResponseMsgDefinition endResponseHeader() {
+        return response;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public CollectionFormat getCollectionFormat() {
+        return collectionFormat;
+    }
+
+    /**
+     * Sets the Swagger Parameter collection format.
+     */
+    public void setCollectionFormat(CollectionFormat collectionFormat) {
+        this.collectionFormat = collectionFormat;
+    }
+
+
+    public String getArrayType() {
+        return arrayType;
+    }
+
+    /**
+     * Sets the Swagger Parameter array type.
+     * Required if data type is "array". Describes the type of items in the 
array.
+     */
+    public void setArrayType(String arrayType) {
+        this.arrayType = arrayType;
+    }
+
+    public String getDataType() {
+        return dataType;
+    }
+
+    /**
+     * Sets the Swagger header data type.
+     */
+    public void setDataType(String dataType) {
+        this.dataType = dataType;
+    }
+
+    public List<String> getAllowableValues() {
+        if (allowableValues != null) {
+            return allowableValues;
+        }
+
+        return new ArrayList<String>();
+    }
+
+    /**
+     * Sets the Swagger Parameter list of allowable values.
+     */
+    public void setAllowableValues(List<String> allowableValues) {
+        this.allowableValues = allowableValues;
+    }
+
+    /**
+     * Name of the parameter.
+     * <p>
+     * This option is mandatory.
+     */
+    public RestOperationResponseHeaderDefinition name(String name) {
+        setName(name);
+        return this;
+    }
+
+    /**
+     * Description of the parameter.
+     */
+    public RestOperationResponseHeaderDefinition description(String name) {
+        setDescription(name);
+        return this;
+    }
+
+    /**
+     * Sets the collection format.
+     */
+    public RestOperationResponseHeaderDefinition 
collectionFormat(CollectionFormat collectionFormat) {
+        setCollectionFormat(collectionFormat);
+        return this;
+    }
+
+    /**
+     * The data type of the array data type
+     */
+    public RestOperationResponseHeaderDefinition arrayType(String arrayType) {
+        setArrayType(arrayType);
+        return this;
+    }
+
+    /**
+     * The data type of the header such as <tt>string</tt>, <tt>integer</tt>, 
<tt>boolean</tt>
+     */
+    public RestOperationResponseHeaderDefinition dataType(String type) {
+        setDataType(type);
+        return this;
+    }
+
+    /**
+     * Allowed values of the header when its an enum type
+     */
+    public RestOperationResponseHeaderDefinition allowableValues(List<String> 
allowableValues) {
+        setAllowableValues(allowableValues);
+        return this;
+    }
+
+    /**
+     * Allowed values of the parameter when its an enum type
+     */
+    public RestOperationResponseHeaderDefinition allowableValues(String... 
allowableValues) {
+        setAllowableValues(Arrays.asList(allowableValues));
+        return this;
+    }
+
+    /**
+     * Ends the configuration of this header
+     */
+    public RestOperationResponseMsgDefinition endHeader() {
+        // name and type is mandatory
+        ObjectHelper.notEmpty(name, "name");
+        ObjectHelper.notEmpty(dataType, "dataType");
+        return response;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/c69f3edf/camel-core/src/main/java/org/apache/camel/model/rest/RestOperationResponseMsgDefinition.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/model/rest/RestOperationResponseMsgDefinition.java
 
b/camel-core/src/main/java/org/apache/camel/model/rest/RestOperationResponseMsgDefinition.java
index 7705e96..ee7a3c5 100644
--- 
a/camel-core/src/main/java/org/apache/camel/model/rest/RestOperationResponseMsgDefinition.java
+++ 
b/camel-core/src/main/java/org/apache/camel/model/rest/RestOperationResponseMsgDefinition.java
@@ -5,9 +5,9 @@
  * 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
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
  * 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.
@@ -16,13 +16,17 @@
  */
 package org.apache.camel.model.rest;
 
+import java.util.ArrayList;
+import java.util.List;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.spi.Metadata;
+import org.apache.camel.util.ObjectHelper;
 
 /**
  * To specify the rest operation response messages using Swagger.
@@ -48,15 +52,21 @@ public class RestOperationResponseMsgDefinition {
     @Metadata(defaultValue = "")
     private String responseModel;
 
+    @XmlElement(name = "header")
+    private List<RestOperationResponseHeaderDefinition> headers;
+
     public RestOperationResponseMsgDefinition(VerbDefinition verb) {
+        this();
         this.verb = verb;
     }
 
     public RestOperationResponseMsgDefinition() {
+        this.code = "200";
+        this.message = "success";
     }
 
     public String getCode() {
-        return code != null ? code : "200";
+        return code;
     }
 
     public void setCode(String code) {
@@ -72,13 +82,21 @@ public class RestOperationResponseMsgDefinition {
     }
 
     public String getMessage() {
-        return message != null ? message : "success";
+        return message;
     }
 
     public void setMessage(String message) {
         this.message = message;
     }
 
+    public List<RestOperationResponseHeaderDefinition> getHeaders() {
+        return headers;
+    }
+
+    public void setHeaders(List<RestOperationResponseHeaderDefinition> 
headers) {
+        this.headers = headers;
+    }
+
     /**
      * The response code such as a HTTP status code.
      */
@@ -113,9 +131,25 @@ public class RestOperationResponseMsgDefinition {
     }
 
     /**
+     * Adds a response header
+     */
+    public RestOperationResponseHeaderDefinition header(String name) {
+        if (headers == null) {
+            headers = new ArrayList<RestOperationResponseHeaderDefinition>();
+        }
+        RestOperationResponseHeaderDefinition header = new 
RestOperationResponseHeaderDefinition(this);
+        header.setName(name);
+        headers.add(header);
+        return header;
+    }
+
+    /**
      * Ends the configuration of this response message
      */
     public RestDefinition endResponseMessage() {
+        // code and message is mandatory
+        ObjectHelper.notEmpty(code, "code");
+        ObjectHelper.notEmpty(message, "message");
         verb.getResponseMsgs().add(this);
         return verb.getRest();
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/c69f3edf/camel-core/src/main/resources/org/apache/camel/model/rest/jaxb.index
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/resources/org/apache/camel/model/rest/jaxb.index 
b/camel-core/src/main/resources/org/apache/camel/model/rest/jaxb.index
index ef0d1ac..809e195 100644
--- a/camel-core/src/main/resources/org/apache/camel/model/rest/jaxb.index
+++ b/camel-core/src/main/resources/org/apache/camel/model/rest/jaxb.index
@@ -28,6 +28,7 @@ RestDefinition
 RestHostNameResolver
 RestOperationParamDefinition
 RestOperationResponseMsgDefinition
+RestOperationResponseHeaderDefinition
 RestParamType
 RestPropertyDefinition
 RestsDefinition

http://git-wip-us.apache.org/repos/asf/camel/blob/c69f3edf/camel-core/src/test/java/org/apache/camel/component/rest/FromRestExplicitComponentTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/component/rest/FromRestExplicitComponentTest.java
 
b/camel-core/src/test/java/org/apache/camel/component/rest/FromRestExplicitComponentTest.java
index 2a13baf..44d56e8 100644
--- 
a/camel-core/src/test/java/org/apache/camel/component/rest/FromRestExplicitComponentTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/component/rest/FromRestExplicitComponentTest.java
@@ -41,7 +41,9 @@ public class FromRestExplicitComponentTest extends 
FromRestGetTest {
                         param().type(RestParamType.query).description("header 
param description2").dataType("string").allowableValues("a", "b", "c", "d")
                         
.defaultValue("b").collectionFormat(CollectionFormat.multi).name("header_letter").required(false).access("acc2")
                         .endParam()
-                        .responseMessage().code(300).message("test 
msg").responseModel(Integer.class).endResponseMessage()
+                        .responseMessage().code(300).message("test 
msg").responseModel(Integer.class)
+                            .header("rate").description("Rate 
limit").dataType("integer").endHeader()
+                        .endResponseMessage()
                         .responseMessage().code("error").message("does not 
work").endResponseMessage()
                         .to("direct:bye")
                         .post().to("mock:update");

http://git-wip-us.apache.org/repos/asf/camel/blob/c69f3edf/camel-core/src/test/java/org/apache/camel/component/rest/FromRestGetTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/component/rest/FromRestGetTest.java 
b/camel-core/src/test/java/org/apache/camel/component/rest/FromRestGetTest.java
index 35081a2..7fb9e17 100644
--- 
a/camel-core/src/test/java/org/apache/camel/component/rest/FromRestGetTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/component/rest/FromRestGetTest.java
@@ -81,6 +81,9 @@ public class FromRestGetTest extends ContextTestSupport {
         assertEquals("acc2", 
rest.getVerbs().get(0).getParams().get(1).getAccess());
 
         assertEquals("300", 
rest.getVerbs().get(0).getResponseMsgs().get(0).getCode());
+        assertEquals("rate", 
rest.getVerbs().get(0).getResponseMsgs().get(0).getHeaders().get(0).getName());
+        assertEquals("Rate limit", 
rest.getVerbs().get(0).getResponseMsgs().get(0).getHeaders().get(0).getDescription());
+        assertEquals("integer", 
rest.getVerbs().get(0).getResponseMsgs().get(0).getHeaders().get(0).getDataType());
         assertEquals("error", 
rest.getVerbs().get(0).getResponseMsgs().get(1).getCode());
         assertEquals("test msg", 
rest.getVerbs().get(0).getResponseMsgs().get(0).getMessage());
         assertEquals(Integer.class.getCanonicalName(), 
rest.getVerbs().get(0).getResponseMsgs().get(0).getResponseModel());
@@ -116,7 +119,9 @@ public class FromRestGetTest extends ContextTestSupport {
                         param().type(RestParamType.query).description("header 
param description2").dataType("string").allowableValues("a", "b", "c", "d")
                         
.defaultValue("b").collectionFormat(CollectionFormat.multi).name("header_letter").required(false).access("acc2")
                         .endParam()
-                        .responseMessage().code(300).message("test 
msg").responseModel(Integer.class).endResponseMessage()
+                        .responseMessage().code(300).message("test 
msg").responseModel(Integer.class)
+                            .header("rate").description("Rate 
limit").dataType("integer").endHeader()
+                        .endResponseMessage()
                         .responseMessage().code("error").message("does not 
work").endResponseMessage()
                         .to("direct:bye")
                         .post().to("mock:update");

http://git-wip-us.apache.org/repos/asf/camel/blob/c69f3edf/camel-core/src/test/java/org/apache/camel/component/rest/FromRestIdAndDescriptionTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/component/rest/FromRestIdAndDescriptionTest.java
 
b/camel-core/src/test/java/org/apache/camel/component/rest/FromRestIdAndDescriptionTest.java
index 68941b0..c857505 100644
--- 
a/camel-core/src/test/java/org/apache/camel/component/rest/FromRestIdAndDescriptionTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/component/rest/FromRestIdAndDescriptionTest.java
@@ -59,7 +59,9 @@ public class FromRestIdAndDescriptionTest extends 
FromRestGetTest {
                         param().type(RestParamType.query).description("header 
param description2").dataType("string").allowableValues("a", "b", "c", "d")
                         
.defaultValue("b").collectionFormat(CollectionFormat.multi).name("header_letter").required(false).access("acc2")
                         .endParam()
-                        .responseMessage().code(300).message("test 
msg").responseModel(Integer.class).endResponseMessage()
+                        .responseMessage().code(300).message("test 
msg").responseModel(Integer.class)
+                            .header("rate").description("Rate 
limit").dataType("integer").endHeader()
+                        .endResponseMessage()
                         .responseMessage().code("error").message("does not 
work").endResponseMessage()
                         .to("direct:bye")
                         .post().description("Updates the bye 
message").to("mock:update");

http://git-wip-us.apache.org/repos/asf/camel/blob/c69f3edf/components/camel-spring/src/test/resources/org/apache/camel/component/rest/SpringFromRestConfigurationTest.xml
----------------------------------------------------------------------
diff --git 
a/components/camel-spring/src/test/resources/org/apache/camel/component/rest/SpringFromRestConfigurationTest.xml
 
b/components/camel-spring/src/test/resources/org/apache/camel/component/rest/SpringFromRestConfigurationTest.xml
index ab2f2ee..4c543c7 100644
--- 
a/components/camel-spring/src/test/resources/org/apache/camel/component/rest/SpringFromRestConfigurationTest.xml
+++ 
b/components/camel-spring/src/test/resources/org/apache/camel/component/rest/SpringFromRestConfigurationTest.xml
@@ -60,7 +60,9 @@
                   <value>d</value>
               </allowableValues>
           </param>
-          <responseMessage code="300" message="test msg" 
responseModel="java.lang.Integer"/>
+          <responseMessage code="300" message="test msg" 
responseModel="java.lang.Integer">
+            <header name="rate" description="Rate limit" dataType="integer"/>
+          </responseMessage>
           <responseMessage code="error" message="does not work"/>
         <to uri="direct:bye"/>
       </get>

http://git-wip-us.apache.org/repos/asf/camel/blob/c69f3edf/components/camel-spring/src/test/resources/org/apache/camel/component/rest/SpringFromRestGetTest.xml
----------------------------------------------------------------------
diff --git 
a/components/camel-spring/src/test/resources/org/apache/camel/component/rest/SpringFromRestGetTest.xml
 
b/components/camel-spring/src/test/resources/org/apache/camel/component/rest/SpringFromRestGetTest.xml
index 66833de..f98b41c 100644
--- 
a/components/camel-spring/src/test/resources/org/apache/camel/component/rest/SpringFromRestGetTest.xml
+++ 
b/components/camel-spring/src/test/resources/org/apache/camel/component/rest/SpringFromRestGetTest.xml
@@ -50,7 +50,9 @@
                   <value>d</value>
               </allowableValues>
           </param>
-          <responseMessage code="300" message="test msg" 
responseModel="java.lang.Integer"/>
+          <responseMessage code="300" message="test msg" 
responseModel="java.lang.Integer">
+            <header name="rate" description="Rate limit" dataType="integer"/>
+          </responseMessage>
           <responseMessage code="error" message="does not work"/>
           <to uri="direct:bye"/>
       </get>

http://git-wip-us.apache.org/repos/asf/camel/blob/c69f3edf/components/camel-spring/src/test/resources/org/apache/camel/component/rest/SpringFromRestIdAndDescriptionTest.xml
----------------------------------------------------------------------
diff --git 
a/components/camel-spring/src/test/resources/org/apache/camel/component/rest/SpringFromRestIdAndDescriptionTest.xml
 
b/components/camel-spring/src/test/resources/org/apache/camel/component/rest/SpringFromRestIdAndDescriptionTest.xml
index 5e838fd..d69d494 100644
--- 
a/components/camel-spring/src/test/resources/org/apache/camel/component/rest/SpringFromRestIdAndDescriptionTest.xml
+++ 
b/components/camel-spring/src/test/resources/org/apache/camel/component/rest/SpringFromRestIdAndDescriptionTest.xml
@@ -54,7 +54,9 @@
                   <value>d</value>
               </allowableValues>
           </param>
-          <responseMessage code="300" message="test msg" 
responseModel="java.lang.Integer"/>
+          <responseMessage code="300" message="test msg" 
responseModel="java.lang.Integer">
+            <header name="rate" description="Rate limit" dataType="integer"/>
+          </responseMessage>
           <responseMessage code="error" message="does not work"/>
         <to uri="direct:bye"/>
       </get>

http://git-wip-us.apache.org/repos/asf/camel/blob/c69f3edf/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerReader.java
----------------------------------------------------------------------
diff --git 
a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerReader.java
 
b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerReader.java
index 29b2e72..bc01e37 100644
--- 
a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerReader.java
+++ 
b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerReader.java
@@ -53,6 +53,7 @@ import io.swagger.models.properties.RefProperty;
 import io.swagger.models.properties.StringProperty;
 import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.model.rest.RestOperationParamDefinition;
+import org.apache.camel.model.rest.RestOperationResponseHeaderDefinition;
 import org.apache.camel.model.rest.RestOperationResponseMsgDefinition;
 import org.apache.camel.model.rest.RestParamType;
 import org.apache.camel.model.rest.VerbDefinition;
@@ -303,6 +304,110 @@ public class RestSwaggerReader {
                     response.setSchema(prop);
                 }
                 response.setDescription(msg.getMessage());
+
+                // add headers
+                if (msg.getHeaders() != null) {
+                    for (RestOperationResponseHeaderDefinition header : 
msg.getHeaders()) {
+                        String name = header.getName();
+                        String type = header.getDataType();
+                        if ("string".equals(type)) {
+                            StringProperty sp = new StringProperty();
+                            sp.setName(name);
+                            sp.setDescription(header.getDescription());
+                            if (header.getAllowableValues() != null) {
+                                sp.setEnum(header.getAllowableValues());
+                            }
+                            response.addHeader(name, sp);
+                        } else if ("int".equals(type) || 
"integer".equals(type)) {
+                            IntegerProperty ip = new IntegerProperty();
+                            ip.setName(name);
+                            ip.setDescription(header.getDescription());
+
+                            List<Integer> values;
+                            if (!header.getAllowableValues().isEmpty()) {
+                                values = new ArrayList<Integer>();
+                                for (String text : 
header.getAllowableValues()) {
+                                    values.add(Integer.valueOf(text));
+                                }
+                                ip.setEnum(values);
+                            }
+                            response.addHeader(name, ip);
+                        } else if ("long".equals(type)) {
+                            LongProperty lp = new LongProperty();
+                            lp.setName(name);
+                            lp.setDescription(header.getDescription());
+
+                            List<Long> values;
+                            if (!header.getAllowableValues().isEmpty()) {
+                                values = new ArrayList<Long>();
+                                for (String text : 
header.getAllowableValues()) {
+                                    values.add(Long.valueOf(text));
+                                }
+                                lp.setEnum(values);
+                            }
+                            response.addHeader(name, lp);
+                        } else if ("float".equals(type)) {
+                            FloatProperty lp = new FloatProperty();
+                            lp.setName(name);
+                            lp.setDescription(header.getDescription());
+
+                            List<Float> values;
+                            if (!header.getAllowableValues().isEmpty()) {
+                                values = new ArrayList<Float>();
+                                for (String text : 
header.getAllowableValues()) {
+                                    values.add(Float.valueOf(text));
+                                }
+                                lp.setEnum(values);
+                            }
+                            response.addHeader(name, lp);
+                        } else if ("double".equals(type)) {
+                            DoubleProperty dp = new DoubleProperty();
+                            dp.setName(name);
+                            dp.setDescription(header.getDescription());
+
+                            List<Double> values;
+                            if (!header.getAllowableValues().isEmpty()) {
+                                values = new ArrayList<Double>();
+                                for (String text : 
header.getAllowableValues()) {
+                                    values.add(Double.valueOf(text));
+                                }
+                                dp.setEnum(values);
+                            }
+                            response.addHeader(name, dp);
+                        } else if ("boolean".equals(type)) {
+                            BooleanProperty bp = new BooleanProperty();
+                            bp.setName(name);
+                            bp.setDescription(header.getDescription());
+                            response.addHeader(name, bp);
+                        } else if ("array".equals(type)) {
+                            ArrayProperty ap = new ArrayProperty();
+                            ap.setName(name);
+                            ap.setDescription(header.getDescription());
+                            if (header.getArrayType() != null) {
+                                if 
(header.getArrayType().equalsIgnoreCase("string")) {
+                                    ap.setItems(new StringProperty());
+                                }
+                                if 
(header.getArrayType().equalsIgnoreCase("int") || 
header.getArrayType().equalsIgnoreCase("integer")) {
+                                    ap.setItems(new IntegerProperty());
+                                }
+                                if 
(header.getArrayType().equalsIgnoreCase("long")) {
+                                    ap.setItems(new LongProperty());
+                                }
+                                if 
(header.getArrayType().equalsIgnoreCase("float")) {
+                                    ap.setItems(new FloatProperty());
+                                }
+                                if 
(header.getArrayType().equalsIgnoreCase("double")) {
+                                    ap.setItems(new DoubleProperty());
+                                }
+                                if 
(header.getArrayType().equalsIgnoreCase("boolean")) {
+                                    ap.setItems(new BooleanProperty());
+                                }
+                            }
+                            response.addHeader(name, ap);
+                        }
+                    }
+                }
+
                 op.addResponse(msg.getCode(), response);
             }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/c69f3edf/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/RestSwaggerReaderDayOfWeekTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/RestSwaggerReaderDayOfWeekTest.java
 
b/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/RestSwaggerReaderDayOfWeekTest.java
index 01f949f..3a138cd 100644
--- 
a/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/RestSwaggerReaderDayOfWeekTest.java
+++ 
b/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/RestSwaggerReaderDayOfWeekTest.java
@@ -53,6 +53,7 @@ public class RestSwaggerReaderDayOfWeekTest extends 
CamelTestSupport {
                         .endParam()
                         .responseMessage()
                             .code(200).responseModel(DayResponse.class)
+                            .header("X-Rate-Limit-Limit").description("The 
number of allowed requests in the current 
period").dataType("integer").endHeader()
                         .endResponseMessage()
                         .to("log:week");
             }
@@ -85,6 +86,8 @@ public class RestSwaggerReaderDayOfWeekTest extends 
CamelTestSupport {
         assertTrue(json.contains("\"enum\" : [ \"monday\", \"tuesday\", 
\"wednesday\", \"thursday\", \"friday\" ]"));
         assertTrue(json.contains("\"$ref\" : \"#/definitions/DayResponse\""));
         assertTrue(json.contains("\"format\" : 
\"org.apache.camel.swagger.DayResponse\""));
+        assertTrue(json.contains("\"X-Rate-Limit-Limit\" : {"));
+        assertTrue(json.contains("\"description\" : \"The number of allowed 
requests in the current period\""));
 
         context.stop();
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/c69f3edf/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/component/rest/FromRestGetTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/component/rest/FromRestGetTest.java
 
b/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/component/rest/FromRestGetTest.java
index d13020f..deefa84 100644
--- 
a/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/component/rest/FromRestGetTest.java
+++ 
b/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/component/rest/FromRestGetTest.java
@@ -78,6 +78,9 @@ public class FromRestGetTest extends 
CamelBlueprintTestSupport {
         assertEquals("acc2", 
rest.getVerbs().get(0).getParams().get(1).getAccess());
 
         assertEquals("300", 
rest.getVerbs().get(0).getResponseMsgs().get(0).getCode());
+        assertEquals("rate", 
rest.getVerbs().get(0).getResponseMsgs().get(0).getHeaders().get(0).getName());
+        assertEquals("Rate limit", 
rest.getVerbs().get(0).getResponseMsgs().get(0).getHeaders().get(0).getDescription());
+        assertEquals("integer", 
rest.getVerbs().get(0).getResponseMsgs().get(0).getHeaders().get(0).getDataType());
         assertEquals("test msg", 
rest.getVerbs().get(0).getResponseMsgs().get(0).getMessage());
         assertEquals(Integer.class.getCanonicalName(), 
rest.getVerbs().get(0).getResponseMsgs().get(0).getResponseModel());
         

http://git-wip-us.apache.org/repos/asf/camel/blob/c69f3edf/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/component/rest/FromRestConfigurationTest.xml
----------------------------------------------------------------------
diff --git 
a/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/component/rest/FromRestConfigurationTest.xml
 
b/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/component/rest/FromRestConfigurationTest.xml
index b1ff47c..997186d 100644
--- 
a/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/component/rest/FromRestConfigurationTest.xml
+++ 
b/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/component/rest/FromRestConfigurationTest.xml
@@ -55,7 +55,9 @@
               <value>d</value>
           </allowableValues>
         </param>
-        <responseMessage code="300" message="test msg" 
responseModel="java.lang.Integer"/>
+        <responseMessage code="300" message="test msg" 
responseModel="java.lang.Integer">
+          <header name="rate" description="Rate limit" dataType="integer"/>
+        </responseMessage>
         <to uri="direct:bye"/>
       </get>
       <post>

http://git-wip-us.apache.org/repos/asf/camel/blob/c69f3edf/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/component/rest/FromRestGetTest.xml
----------------------------------------------------------------------
diff --git 
a/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/component/rest/FromRestGetTest.xml
 
b/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/component/rest/FromRestGetTest.xml
index ec18aa7..bc87c1c 100644
--- 
a/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/component/rest/FromRestGetTest.xml
+++ 
b/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/component/rest/FromRestGetTest.xml
@@ -48,7 +48,9 @@
                <value>d</value>
             </allowableValues>
          </param>
-          <responseMessage code="300" message="test msg" 
responseModel="java.lang.Integer"/>
+          <responseMessage code="300" message="test msg" 
responseModel="java.lang.Integer">
+            <header name="rate" description="Rate limit" dataType="integer"/>
+          </responseMessage>
          <to uri="direct:bye"/>
       </get>
       <post>

http://git-wip-us.apache.org/repos/asf/camel/blob/c69f3edf/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/component/rest/FromRestIdAndDescriptionTest.xml
----------------------------------------------------------------------
diff --git 
a/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/component/rest/FromRestIdAndDescriptionTest.xml
 
b/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/component/rest/FromRestIdAndDescriptionTest.xml
index 1c380bc..3af51df 100644
--- 
a/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/component/rest/FromRestIdAndDescriptionTest.xml
+++ 
b/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/component/rest/FromRestIdAndDescriptionTest.xml
@@ -52,7 +52,9 @@
                   <value>d</value>
               </allowableValues>
           </param>
-          <responseMessage code="300" message="test msg" 
responseModel="java.lang.Integer"/>
+          <responseMessage code="300" message="test msg" 
responseModel="java.lang.Integer">
+            <header name="rate" description="Rate limit" dataType="integer"/>
+          </responseMessage>
         <to uri="direct:bye"/>
       </get>
       <post>

Reply via email to