Author: davsclaus Date: Wed Jun 1 15:53:30 2011 New Revision: 1130198 URL: http://svn.apache.org/viewvc?rev=1130198&view=rev Log: CAMEL-4036: Exposed the Restlet API in camel-restlet and allow end users to use those API to generate response (they are now in full control).
Added: camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletRequestAndResponseAPITest.java - copied, changed from r1130173, camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGet2Test.java 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/RestletBinding.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/RestletConsumer.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=1130198&r1=1130197&r2=1130198&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 Jun 1 15:53:30 2011 @@ -50,9 +50,12 @@ public class DefaultRestletBinding imple private static final Logger LOG = LoggerFactory.getLogger(DefaultRestletBinding.class); private HeaderFilterStrategy headerFilterStrategy; - public void populateExchangeFromRestletRequest(Request request, Exchange exchange) throws Exception { + public void populateExchangeFromRestletRequest(Request request, Response response, Exchange exchange) throws Exception { Message inMessage = exchange.getIn(); + inMessage.setHeader(RestletConstants.RESTLET_REQUEST, request); + inMessage.setHeader(RestletConstants.RESTLET_RESPONSE, response); + // extract headers from restlet for (Map.Entry<String, Object> entry : request.getAttributes().entrySet()) { if (!headerFilterStrategy.applyFilterToExternalHeaders(entry.getKey(), entry.getValue(), exchange)) { @@ -128,9 +131,7 @@ public class DefaultRestletBinding imple if (login != null && password != null) { ChallengeResponse authentication = new ChallengeResponse(ChallengeScheme.HTTP_BASIC, login, password); request.setChallengeResponse(authentication); - if (LOG.isDebugEnabled()) { - LOG.debug("Basic HTTP Authentication has been applied"); - } + LOG.debug("Basic HTTP Authentication has been applied"); } for (Map.Entry<String, Object> entry : exchange.getIn().getHeaders().entrySet()) { @@ -226,18 +227,19 @@ public class DefaultRestletBinding imple if (body == null) { // empty response response.setEntity("", MediaType.TEXT_PLAIN); + } else if (body instanceof Response) { + // its already a restlet response, so dont do anything + LOG.debug("Using existing Restlet Response from exchange body: {}", body); } else if (body instanceof InputStream) { response.setEntity(new InputRepresentation(out.getBody(InputStream.class), mediaType)); } else if (body instanceof File) { response.setEntity(new FileRepresentation(out.getBody(File.class), mediaType)); - } else if (body != null) { + } else { // fallback and use string String text = out.getBody(String.class); response.setEntity(text, mediaType); } - if (LOG.isDebugEnabled()) { - LOG.debug("Populate Restlet response from exchange body: " + body); - } + LOG.debug("Populate Restlet response from exchange body: {}", body); if (exchange.getProperty(Exchange.CHARSET_NAME) != null) { CharacterSet cs = CharacterSet.valueOf(exchange.getProperty(Exchange.CHARSET_NAME, String.class)); @@ -260,6 +262,9 @@ public class DefaultRestletBinding imple int responseCode = response.getStatus().getCode(); exchange.getOut().setHeader(Exchange.HTTP_RESPONSE_CODE, responseCode); + // set restlet response as header so end user have access to it if needed + exchange.getOut().setHeader(RestletConstants.RESTLET_RESPONSE, response); + if (response.getEntity() != null) { // get content type MediaType mediaType = response.getEntity().getMediaType(); Modified: camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletBinding.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletBinding.java?rev=1130198&r1=1130197&r2=1130198&view=diff ============================================================================== --- camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletBinding.java (original) +++ camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletBinding.java Wed Jun 1 15:53:30 2011 @@ -38,11 +38,12 @@ public interface RestletBinding { /** * Populate Camel message from Restlet request * + * * @param request message to be copied from - * @param exchange to be populated - * @throws Exception is thrown if error processing + * @param response + *@param exchange to be populated @throws Exception is thrown if error processing */ - void populateExchangeFromRestletRequest(Request request, Exchange exchange) throws Exception; + void populateExchangeFromRestletRequest(Request request, Response response, Exchange exchange) throws Exception; /** * Populate Restlet Request from Camel message 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=1130198&r1=1130197&r2=1130198&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 Jun 1 15:53:30 2011 @@ -25,6 +25,8 @@ public final class RestletConstants { public static final String RESTLET_LOGIN = "CamelRestletLogin"; public static final String RESTLET_PASSWORD = "CamelRestletPassword"; + public static final String RESTLET_REQUEST = "CamelRestletRequest"; + public static final String RESTLET_RESPONSE = "CamelRestletResponse"; private RestletConstants() { } Modified: camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletConsumer.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletConsumer.java?rev=1130198&r1=1130197&r2=1130198&view=diff ============================================================================== --- camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletConsumer.java (original) +++ camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletConsumer.java Wed Jun 1 15:53:30 2011 @@ -49,26 +49,38 @@ public class RestletConsumer extends Def try { Exchange exchange = getEndpoint().createExchange(); - RestletBinding binding = ((RestletEndpoint)getEndpoint()).getRestletBinding(); - binding.populateExchangeFromRestletRequest(request, exchange); - getProcessor().process(exchange); + + RestletBinding binding = getEndpoint().getRestletBinding(); + binding.populateExchangeFromRestletRequest(request, response, exchange); + + try { + getProcessor().process(exchange); + } catch (Exception e) { + exchange.setException(e); + } binding.populateRestletResponseFromExchange(exchange, response); + } catch (Exception e) { - throw new RuntimeCamelException(e); + throw new RuntimeCamelException("Cannot process request", e); } } }; } @Override + public RestletEndpoint getEndpoint() { + return (RestletEndpoint) super.getEndpoint(); + } + + @Override protected void doStart() throws Exception { super.doStart(); - ((RestletEndpoint)getEndpoint()).connect(this); + getEndpoint().connect(this); } @Override public void doStop() throws Exception { - ((RestletEndpoint)getEndpoint()).disconnect(this); + getEndpoint().disconnect(this); super.doStop(); } Copied: camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletRequestAndResponseAPITest.java (from r1130173, camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGet2Test.java) URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletRequestAndResponseAPITest.java?p2=camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletRequestAndResponseAPITest.java&p1=camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGet2Test.java&r1=1130173&r2=1130198&rev=1130198&view=diff ============================================================================== --- camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGet2Test.java (original) +++ camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletRequestAndResponseAPITest.java Wed Jun 1 15:53:30 2011 @@ -24,20 +24,50 @@ import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.test.junit4.CamelTestSupport; import org.junit.Test; +import org.restlet.Request; +import org.restlet.Response; +import org.restlet.data.MediaType; +import org.restlet.data.Status; /** + * Testing that end users can use the {@link Response} API from Restlet directly to have fine grained + * control of the response they want to use. + * * @version */ -public class RestletProducerGet2Test extends CamelTestSupport { +public class RestletRequestAndResponseAPITest extends CamelTestSupport { @Test - public void testRestletProducerGet2() throws Exception { + public void testRestletProducer() throws Exception { Map<String, Object> headers = new HashMap<String, Object>(); headers.put("id", 123); headers.put("beverage.beer", "Carlsberg"); - String out = template.requestBodyAndHeaders("direct:start", null, headers, String.class); - assertEquals("123;Donald Duck;Carlsberg", out); + Object out = template.requestBodyAndHeaders("direct:start", null, headers); + assertEquals("<response>Beer is Good</response>", out); + } + + @Test + public void testRestletProducer2() throws Exception { + final Map<String, Object> headers = new HashMap<String, Object>(); + headers.put("id", 123); + headers.put("beverage.beer", "Carlsberg"); + + Exchange out = template.request("direct:start", new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + exchange.getIn().setHeaders(headers); + } + }); + assertNotNull(out); + assertEquals("text/xml", out.getOut().getHeader(Exchange.CONTENT_TYPE)); + assertEquals(200, out.getOut().getHeader(Exchange.HTTP_RESPONSE_CODE)); + assertEquals("<response>Beer is Good</response>", out.getOut().getBody()); + + // the restlet response should be accessible if neeeded + Response response = out.getOut().getHeader(RestletConstants.RESTLET_RESPONSE, Response.class); + assertNotNull(response); + assertEquals(200, response.getStatus().getCode()); } @Override @@ -47,14 +77,23 @@ public class RestletProducerGet2Test ext public void configure() throws Exception { from("direct:start").to("restlet:http://localhost:9080/users/{id}/like/{beverage.beer}"); + // START SNIPPET: e1 from("restlet:http://localhost:9080/users/{id}/like/{beer}") .process(new Processor() { public void process(Exchange exchange) throws Exception { - String id = exchange.getIn().getHeader("id", String.class); - String beer = exchange.getIn().getHeader("beer", String.class); - exchange.getOut().setBody(id + ";Donald Duck;" + beer); + // the Restlet request should be available if neeeded + Request request = exchange.getIn().getHeader(RestletConstants.RESTLET_REQUEST, Request.class); + assertNotNull("Restlet Request", request); + + // use Restlet API to create the response + Response response = exchange.getIn().getHeader(RestletConstants.RESTLET_RESPONSE, Response.class); + assertNotNull("Restlet Response", response); + response.setStatus(Status.SUCCESS_OK); + response.setEntity("<response>Beer is Good</response>", MediaType.TEXT_XML); + exchange.getOut().setBody(response); } }); + // END SNIPPET: e1 } }; }