Author: wtam Date: Wed Feb 4 04:06:28 2009 New Revision: 740596 URL: http://svn.apache.org/viewvc?rev=740596&view=rev Log: [CAMEL-1312] Restlet component should allow response content type and return code to be set
Added: camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletResponseTest.java (with props) Modified: camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletConstants.java camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/converter/RestletConverter.java camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletPostContentTest.java Modified: camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java?rev=740596&r1=740595&r2=740596&view=diff ============================================================================== --- camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java (original) +++ camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java Wed Feb 4 04:06:28 2009 @@ -23,6 +23,7 @@ import org.apache.camel.Exchange; import org.apache.camel.HeaderFilterStrategyAware; +import org.apache.camel.Message; import org.apache.camel.RuntimeCamelException; import org.apache.camel.converter.jaxp.StringSource; import org.apache.camel.spi.HeaderFilterStrategy; @@ -34,6 +35,7 @@ import org.restlet.data.MediaType; import org.restlet.data.Request; import org.restlet.data.Response; +import org.restlet.data.Status; /** * Default Restlet binding implementation @@ -68,6 +70,10 @@ } } + if (!request.isEntityAvailable()) { + return; + } + Form form = new Form(request.getEntity()); if (form != null) { for (Map.Entry<String, String> entry : form.getValuesMap().entrySet()) { @@ -152,15 +158,27 @@ */ public void populateRestletResponseFromExchange(Exchange exchange, Response response) { - Object body = exchange.getOut().getBody(); - MediaType mediaType = MediaType.TEXT_PLAIN; - if (body instanceof String) { + + // get content type + Message out = exchange.getOut(); + MediaType mediaType = out.getHeader(RestletConstants.MEDIA_TYPE, MediaType.class); + if (mediaType == null) { + Object body = out.getBody(); mediaType = MediaType.TEXT_PLAIN; - } else if (body instanceof StringSource || body instanceof DOMSource) { - mediaType = MediaType.TEXT_XML; + if (body instanceof String) { + mediaType = MediaType.TEXT_PLAIN; + } else if (body instanceof StringSource || body instanceof DOMSource) { + mediaType = MediaType.TEXT_XML; + } } - for (Map.Entry<String, Object> entry : exchange.getOut().getHeaders().entrySet()) { + // get response code + Integer responseCode = out.getHeader(RestletConstants.RESPONSE_CODE, Integer.class); + if (responseCode != null) { + response.setStatus(Status.valueOf(responseCode)); + } + + for (Map.Entry<String, Object> entry : out.getHeaders().entrySet()) { if (!headerFilterStrategy.applyFilterToCamelHeaders(entry.getKey(), entry.getValue())) { response.getAttributes().put(entry.getKey(), entry.getValue()); @@ -171,7 +189,7 @@ } } - String text = exchange.getOut().getBody(String.class); + String text = out.getBody(String.class); if (LOG.isDebugEnabled()) { LOG.debug("Populate Restlet response from exchange body: " + text); } Modified: camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletConstants.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletConstants.java?rev=740596&r1=740595&r2=740596&view=diff ============================================================================== --- camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletConstants.java (original) +++ camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletConstants.java Wed Feb 4 04:06:28 2009 @@ -25,6 +25,8 @@ public static final String LOGIN = "org.apache.camel.restlet.auth.login"; public static final String PASSWORD = "org.apache.camel.restlet.auth.password"; + public static final String MEDIA_TYPE = "org.apache.camel.restlet.mediaType"; + public static final String RESPONSE_CODE = "org.apache.camel.restlet.responseCode"; private RestletConstants() { } Modified: camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/converter/RestletConverter.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/converter/RestletConverter.java?rev=740596&r1=740595&r2=740596&view=diff ============================================================================== --- camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/converter/RestletConverter.java (original) +++ camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/converter/RestletConverter.java Wed Feb 4 04:06:28 2009 @@ -17,6 +17,7 @@ package org.apache.camel.component.restlet.converter; import org.apache.camel.Converter; +import org.restlet.data.MediaType; import org.restlet.data.Method; /** @@ -30,5 +31,10 @@ public Method toMethod(String name) { return Method.valueOf(name.toUpperCase()); } + + @Converter + public MediaType toMediaType(String name) { + return MediaType.valueOf(name); + } } Modified: camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletPostContentTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletPostContentTest.java?rev=740596&r1=740595&r2=740596&view=diff ============================================================================== --- camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletPostContentTest.java (original) +++ camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletPostContentTest.java Wed Feb 4 04:06:28 2009 @@ -58,10 +58,14 @@ public void testPostBody() throws Exception { HttpMethod method = new PostMethod("http://localhost:9080/users/homer"); - RequestEntity requestEntity = new StringRequestEntity(MSG_BODY, null, null); - ((EntityEnclosingMethod)method).setRequestEntity(requestEntity); - HttpClient client = new HttpClient(); - assertEquals(200, client.executeMethod(method)); + try { + RequestEntity requestEntity = new StringRequestEntity(MSG_BODY, null, null); + ((EntityEnclosingMethod)method).setRequestEntity(requestEntity); + HttpClient client = new HttpClient(); + assertEquals(200, client.executeMethod(method)); + } finally { + method.releaseConnection(); + } } } Added: camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletResponseTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletResponseTest.java?rev=740596&view=auto ============================================================================== --- camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletResponseTest.java (added) +++ camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletResponseTest.java Wed Feb 4 04:06:28 2009 @@ -0,0 +1,61 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.restlet; + +import org.apache.camel.ContextTestSupport; +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpMethod; +import org.apache.commons.httpclient.methods.PostMethod; + +/** + * + * @version $Revision$ + */ +public class RestletResponseTest extends ContextTestSupport { + + @Override + protected RouteBuilder createRouteBuilder() { + + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("restlet:http://localhost:9080/users/{username}?restletMethod=POST").process(new Processor() { + public void process(Exchange exchange) throws Exception { + exchange.getOut().setHeader(RestletConstants.RESPONSE_CODE, "417"); + exchange.getOut().setHeader(RestletConstants.MEDIA_TYPE, "application/JSON"); + } + }); + } + }; + } + + public void testCustomResponse() throws Exception { + HttpMethod method = new PostMethod("http://localhost:9080/users/homer"); + try { + HttpClient client = new HttpClient(); + assertEquals(417, client.executeMethod(method)); + assertTrue(method.getResponseHeader("Content-Type").getValue() + .startsWith("application/JSON")); + } finally { + method.releaseConnection(); + } + + } +} Propchange: camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletResponseTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletResponseTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date