blob: 8c5d9869d037c838fa7c373deb466221a0a3cf1f [file] [log] [blame]
/**
* 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.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.cxf.CXFTestSupport;
import org.apache.camel.spring.Main;
import org.apache.camel.test.junit4.TestSupport;
import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.jaxrs.client.JAXRSClientFactory;
import org.apache.cxf.jaxrs.ext.multipart.Multipart;
import org.junit.Test;
public class CxfRsRelayTest extends TestSupport {
private static int port6 = CXFTestSupport.getPort6();
/**
* A sample service "interface" (technically, it is a class since we will
* use proxy-client. That interface exposes three methods over-loading each
* other : we are testing the appropriate one will be chosen at runtime.
*
*/
@WebService
@Path("/rootpath")
@Consumes("multipart/form-data")
@Produces("application/xml")
public static class UploadService {
@WebMethod
@POST
@Path("/path1")
@Consumes("multipart/form-data")
public void upload(@Multipart(value = "content", type = "application/octet-stream") java.lang.Number content,
@Multipart(value = "name", type = "text/plain") String name) {
}
@WebMethod
@GET
@Path("/path2")
@Consumes("text/plain")
private void upload() {
}
@WebMethod
@POST
@Path("/path3")
@Consumes("multipart/form-data")
public void upload(@Multipart(value = "content", type = "application/octet-stream") InputStream content,
@Multipart(value = "name", type = "text/plain") String name) {
}
}
private static final String SAMPLE_CONTENT_PATH = "/org/apache/camel/component/cxf/jaxrs/CxfRsSpringRelay.xml";
private static final String SAMPLE_NAME = "CxfRsSpringRelay.xml";
private static final CountDownLatch LATCH = new CountDownLatch(1);
private static String content;
private static String name;
/**
* That test builds a route chaining two cxfrs endpoints. It shows a request
* sent to the first one will be correctly transferred and consumed by the
* other one.
*/
@Test
public void testJaxrsRelayRoute() throws Exception {
final Main main = new Main();
try {
main.setApplicationContextUri("org/apache/camel/component/cxf/jaxrs/CxfRsSpringRelay.xml");
main.start();
Thread t = new Thread(new Runnable() {
/**
* Sends a request to the first endpoint in the route
*/
public void run() {
try {
JAXRSClientFactory.create("http://localhost:" + port6 + "/CxfRsRelayTest/rest", UploadService.class)
.upload(CamelRouteBuilder.class.getResourceAsStream(SAMPLE_CONTENT_PATH),
SAMPLE_NAME);
} catch (Exception e) {
log.warn("Error uploading to http://localhost:" + port6 + "/CxfRsRelayTest/rest", e);
}
}
});
t.start();
LATCH.await(10, TimeUnit.SECONDS);
assertEquals(SAMPLE_NAME, name);
StringWriter writer = new StringWriter();
IOUtils.copyAndCloseInput(new InputStreamReader(CamelRouteBuilder.class
.getResourceAsStream(SAMPLE_CONTENT_PATH)), writer);
assertEquals(writer.toString(), content);
} finally {
main.stop();
}
}
/**
* Route builder to be used with
* org/apache/camel/component/cxf/jaxrs/CxfRsSpringRelay.xml
*
*/
public static class CamelRouteBuilder extends RouteBuilder {
@Override
public void configure() throws InterruptedException {
from("upload1").removeHeader(Exchange.CONTENT_TYPE).to("upload2Client");
from("upload2").process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
// once the message arrives in the second endpoint, stores
// the message components and warns results can be compared
content = exchange.getIn().getHeader("content", String.class);
name = exchange.getIn().getHeader("name", String.class);
LATCH.countDown();
}
});
}
}
}