/** * 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.cxf.jaxrs; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.URL; import javax.servlet.ServletRequest; import javax.ws.rs.HttpMethod; import javax.ws.rs.WebApplicationException; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Request; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import org.apache.camel.Exchange; import org.apache.camel.Message; import org.apache.camel.Processor; import org.apache.camel.RuntimeCamelException; import org.apache.camel.builder.NoErrorHandlerBuilder; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.cxf.CXFTestSupport; import org.apache.camel.component.cxf.common.message.CxfConstants; import org.apache.camel.component.cxf.jaxrs.testbean.Customer; import org.apache.camel.test.junit4.CamelTestSupport; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPut; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; import org.junit.Test; public class CxfRsConsumerTest extends CamelTestSupport { private static final String PUT_REQUEST = "<Customer><name>Mary</name><id>123</id></Customer>"; private static final String CXT = CXFTestSupport.getPort1() + "/CxfRsConsumerTest"; // START SNIPPET: example private static final String CXF_RS_ENDPOINT_URI = "cxfrs://http://localhost:" + CXT + "/rest?resourceClasses=org.apache.camel.component.cxf.jaxrs.testbean.CustomerServiceResource"; private static final String CXF_RS_ENDPOINT_URI2 = "cxfrs://http://localhost:" + CXT + "/rest2?resourceClasses=org.apache.camel.component.cxf.jaxrs.testbean.CustomerService"; private static final String CXF_RS_ENDPOINT_URI3 = "cxfrs://http://localhost:" + CXT + "/rest3?" + "resourceClasses=org.apache.camel.component.cxf.jaxrs.testbean.CustomerServiceNoAnnotations&" + "modelRef=classpath:/org/apache/camel/component/cxf/jaxrs/CustomerServiceModel.xml"; private static final String CXF_RS_ENDPOINT_URI4 = "cxfrs://http://localhost:" + CXT + "/rest4?" + "modelRef=classpath:/org/apache/camel/component/cxf/jaxrs/CustomerServiceDefaultHandlerModel.xml"; private static final String CXF_RS_ENDPOINT_URI5 = "cxfrs://http://localhost:" + CXT + "/rest5?" + "propagateContexts=true&" + "modelRef=classpath:/org/apache/camel/component/cxf/jaxrs/CustomerServiceDefaultHandlerModel.xml"; protected RouteBuilder createRouteBuilder() throws Exception { final Processor testProcessor = new TestProcessor(); final Processor testProcessor2 = new TestProcessor2(); final Processor testProcessor3 = new TestProcessor3(); return new RouteBuilder() { public void configure() { errorHandler(new NoErrorHandlerBuilder()); from(CXF_RS_ENDPOINT_URI).process(testProcessor); from(CXF_RS_ENDPOINT_URI2).process(testProcessor); from(CXF_RS_ENDPOINT_URI3).process(testProcessor); from(CXF_RS_ENDPOINT_URI4).process(testProcessor2); from(CXF_RS_ENDPOINT_URI5).process(testProcessor3); } }; } // END SNIPPET: example private void invokeGetCustomer(String uri, String expect) throws Exception { HttpGet get = new HttpGet(uri); get.addHeader("Accept", "application/json"); CloseableHttpClient httpclient = HttpClientBuilder.create().build(); try { HttpResponse response = httpclient.execute(get); assertEquals(200, response.getStatusLine().getStatusCode()); assertEquals(expect, EntityUtils.toString(response.getEntity())); } finally { httpclient.close(); } } @Test public void testGetCustomerInterface() throws Exception { doTestGetCustomer("rest"); } @Test public void testGetCustomerImpl() throws Exception { doTestGetCustomer("rest2"); } @Test public void testGetCustomerInterfaceAndModel() throws Exception { doTestGetCustomer("rest3"); } @Test public void testGetCustomerDefaultHandlerAndModel() throws Exception { doTestGetCustomer("rest4"); } @Test public void testEchoCustomerDefaultHandlerAndModel() throws Exception { WebTarget target = ClientBuilder.newClient().target("http://localhost:" + CXT + "/" + "rest4" + "/customerservice/customers"); Customer c = target.request(MediaType.APPLICATION_JSON).post(Entity.json(new Customer(333, "Barry")), Customer.class); assertEquals(333L, c.getId()); assertEquals("Barry", c.getName()); } @Test public void testGetCustomerDefaultHandlerAndModelAndContexts() throws Exception { doTestGetCustomer("rest5"); } private void doTestGetCustomer(String contextUri) throws Exception { invokeGetCustomer("http://localhost:" + CXT + "/" + contextUri + "/customerservice/customers/126", "{\"Customer\":{\"id\":126,\"name\":\"Willem\"}}"); invokeGetCustomer("http://localhost:" + CXT + "/" + contextUri + "/customerservice/customers/123", "customer response back!"); invokeGetCustomer("http://localhost:" + CXT + "/" + contextUri + "/customerservice/customers/400", "The remoteAddress is 127.0.0.1"); } @Test public void testGetWrongCustomer() throws Exception { URL url = new URL("http://localhost:" + CXT + "/rest/customerservice/customers/456"); try { url.openStream(); fail("Expect to get exception here"); } catch (FileNotFoundException exception) { // do nothing here } url = new URL("http://localhost:" + CXT + "/rest/customerservice/customers/234"); try { url.openStream(); fail("Expect to get exception here"); } catch (FileNotFoundException exception) { // do nothing here } url = new URL("http://localhost:" + CXT + "/rest/customerservice/customers/256"); try { url.openStream(); fail("Expect to get exception here"); } catch (IOException exception) { // expect the Internal error exception } } @Test public void testPutConsumer() throws Exception { HttpPut put = new HttpPut("http://localhost:" + CXT + "/rest/customerservice/customers"); StringEntity entity = new StringEntity(PUT_REQUEST, "ISO-8859-1"); entity.setContentType("text/xml; charset=ISO-8859-1"); put.addHeader("test", "header1;header2"); put.setEntity(entity); CloseableHttpClient httpclient = HttpClientBuilder.create().build(); try { HttpResponse response = httpclient.execute(put); assertEquals(200, response.getStatusLine().getStatusCode()); assertEquals("", EntityUtils.toString(response.getEntity())); } finally { httpclient.close(); } } private abstract static class AbstractTestProcessor implements Processor { public void processGetCustomer(Exchange exchange) throws Exception { Message inMessage = exchange.getIn(); String httpMethod = inMessage.getHeader(Exchange.HTTP_METHOD, String.class); assertEquals("Get a wrong http method", "GET", httpMethod); String path = inMessage.getHeader(Exchange.HTTP_PATH, String.class); // The parameter of the invocation is stored in the body of in message String id = inMessage.getBody(String.class); if ("/customerservice/customers/126".equals(path)) { Customer customer = new Customer(); customer.setId(Long.parseLong(id)); customer.setName("Willem"); // We just put the response Object into the out message body exchange.getOut().setBody(customer); } else { if ("/customerservice/customers/400".equals(path)) { // We return the remote client IP address this time org.apache.cxf.message.Message cxfMessage = inMessage.getHeader(CxfConstants.CAMEL_CXF_MESSAGE, org.apache.cxf.message.Message.class); ServletRequest request = (ServletRequest) cxfMessage.get("HTTP.REQUEST"); // Just make sure the request object is not null assertNotNull("The request object should not be null", request); Response r = Response.status(200).entity("The remoteAddress is 127.0.0.1").build(); exchange.getOut().setBody(r); return; } if ("/customerservice/customers/123".equals(path)) { // send a customer response back Response r = Response.status(200).entity("customer response back!").build(); exchange.getOut().setBody(r); return; } if ("/customerservice/customers/456".equals(path)) { Response r = Response.status(404).entity("Can't found the customer with uri " + path).build(); throw new WebApplicationException(r); } else if ("/customerservice/customers/234".equals(path)) { Response r = Response.status(404).entity("Can't found the customer with uri " + path).build(); exchange.getOut().setBody(r); exchange.getOut().setFault(true); } else { throw new RuntimeCamelException("Can't found the customer with uri " + path); } } } } private static class TestProcessor extends AbstractTestProcessor { public void process(Exchange exchange) throws Exception { Message inMessage = exchange.getIn(); // Get the operation name from in message String operationName = inMessage.getHeader(CxfConstants.OPERATION_NAME, String.class); if ("getCustomer".equals(operationName)) { processGetCustomer(exchange); } else if ("updateCustomer".equals(operationName)) { assertEquals("Get a wrong customer message header", "header1;header2", inMessage.getHeader("test")); String httpMethod = inMessage.getHeader(Exchange.HTTP_METHOD, String.class); assertEquals("Get a wrong http method", "PUT", httpMethod); Customer customer = inMessage.getBody(Customer.class); assertNotNull("The customer should not be null.", customer); // Now you can do what you want on the customer object assertEquals("Get a wrong customer name.", "Mary", customer.getName()); // set the response back exchange.getOut().setBody(Response.ok().build()); } } } private static class TestProcessor2 extends AbstractTestProcessor { public void process(Exchange exchange) throws Exception { Message inMessage = exchange.getIn(); // Get the operation name from in message String path = inMessage.getHeader(Exchange.HTTP_PATH, String.class); if (path.startsWith("/customerservice/customers")) { String httpMethod = inMessage.getHeader(Exchange.HTTP_METHOD, String.class); if (HttpMethod.GET.equals(httpMethod)) { processGetCustomer(exchange); } else if (HttpMethod.POST.equals(httpMethod)) { InputStream inBody = exchange.getIn().getBody(InputStream.class); exchange.getOut().setBody(Response.ok(inBody).build()); } } } } private static class TestProcessor3 extends AbstractTestProcessor { public void process(Exchange exchange) throws Exception { UriInfo ui = exchange.getProperty(UriInfo.class.getName(), UriInfo.class); String path = ui.getPath(); Request req = exchange.getProperty(Request.class.getName(), Request.class); String httpMethod = req.getMethod(); if (path.startsWith("customerservice/customers") && HttpMethod.GET.equals(httpMethod)) { processGetCustomer(exchange); } } } }