/**
* 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.cxf.systest.jaxrs;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.ws.rs.core.Response;
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.client.JAXRSClientFactory;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
import org.apache.cxf.transport.local.LocalConduit;
import org.apache.cxf.transport.local.LocalTransportFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class JAXRSLocalTransportTest extends AbstractBusClientServerTestBase {
private Server localServer;
@Before
public void setUp() {
JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
sf.setResourceClasses(BookStore.class, BookStoreSpring.class);
sf.setResourceProvider(BookStore.class,
new SingletonResourceProvider(new BookStore(), true));
sf.setResourceProvider(BookStoreSpring.class,
new SingletonResourceProvider(new BookStoreSpring(), true));
sf.setProvider(new JacksonJsonProvider());
List<Interceptor<? extends Message>> outInts = new ArrayList<Interceptor<? extends Message>>();
outInts.add(new CustomOutInterceptor());
sf.setOutInterceptors(outInts);
List<Interceptor<? extends Message>> inInts = new ArrayList<Interceptor<? extends Message>>();
inInts.add(new CustomInFaultyInterceptor());
sf.setInInterceptors(inInts);
sf.setTransportId(LocalTransportFactory.TRANSPORT_ID);
sf.setAddress("local://books");
localServer = sf.create();
}
@After
public void tearDown() {
if (localServer != null) {
localServer.stop();
}
}
@Test
public void testProxyPipedDispatchGet() throws Exception {
BookStore localProxy =
JAXRSClientFactory.create("local://books", BookStore.class);
Book book = localProxy.getBook("123");
assertEquals(123L, book.getId());
}
@Test
public void testProxyPipedDispatchGetBookType() throws Exception {
BookStore localProxy =
JAXRSClientFactory.create("local://books",
BookStore.class,
Collections.singletonList(new JacksonJsonProvider()));
BookType book = localProxy.getBookType();
assertEquals(124L, book.getId());
}
@Test
public void testProxyServerInFaultMapped() throws Exception {
BookStore localProxy = JAXRSClientFactory.create("local://books", BookStore.class);
Response r = localProxy.infault();
assertEquals(401, r.getStatus());
}
@Test
public void testProxyServerInFaultEscaped() throws Exception {
BookStore localProxy = JAXRSClientFactory.create("local://books", BookStore.class);
Response r = localProxy.infault2();
assertEquals(500, r.getStatus());
}
@Test
public void testProxyServerInFaultDirectDispatch() throws Exception {
BookStore localProxy = JAXRSClientFactory.create("local://books", BookStore.class);
WebClient.getConfig(localProxy).getRequestContext().put(LocalConduit.DIRECT_DISPATCH, "true");
WebClient.getConfig(localProxy).getInFaultInterceptors().add(new TestFaultInInterceptor());
Response r = localProxy.infault2();
assertEquals(500, r.getStatus());
}
@Test
public void testProxyEmtpyResponse() throws Exception {
BookStore localProxy = JAXRSClientFactory.create("local://books", BookStore.class);
assertNull(localProxy.getEmptyBook());
assertEquals(204, WebClient.client(localProxy).getResponse().getStatus());
}
@Test
public void testProxyEmptyResponseDirectDispatch() throws Exception {
BookStore localProxy = JAXRSClientFactory.create("local://books", BookStore.class);
WebClient.getConfig(localProxy).getRequestContext().put(LocalConduit.DIRECT_DISPATCH, "true");
assertNull(localProxy.getEmptyBook());
assertEquals(204, WebClient.client(localProxy).getResponse().getStatus());
}
@Test
public void testProxyServerOutFault() throws Exception {
BookStore localProxy = JAXRSClientFactory.create("local://books", BookStore.class);
Response r = localProxy.outfault();
assertEquals(403, r.getStatus());
}
@Test
public void testProxyServerOutFaultDirectDispacth() throws Exception {
BookStore localProxy = JAXRSClientFactory.create("local://books", BookStore.class);
WebClient.getConfig(localProxy).getRequestContext().put(LocalConduit.DIRECT_DISPATCH, "true");
Response r = localProxy.outfault();
assertEquals(403, r.getStatus());
}
@Test
public void testSubresourceProxyDirectDispatchGet() throws Exception {
BookStore localProxy =
JAXRSClientFactory.create("local://books", BookStore.class);
WebClient.getConfig(localProxy).getRequestContext().put(LocalConduit.DIRECT_DISPATCH, "true");
Book bookSubProxy = localProxy.getBookSubResource("123");
Book book = bookSubProxy.retrieveState();
assertEquals(123L, book.getId());
}
@Test
public void testProxyDirectDispatchPostWithGzip() throws Exception {
BookStore localProxy =
JAXRSClientFactory.create("local://books", BookStore.class);
WebClient.getConfig(localProxy).getRequestContext().put(LocalConduit.DIRECT_DISPATCH, Boolean.TRUE);
Response response = localProxy.addBook(new Book("New", 124L));
assertEquals(200, response.getStatus());
assertTrue(response.getMetadata().getFirst("Location") instanceof URI);
}
@Test
public void testProxyDirectDispatchPost() throws Exception {
BookStoreSpring localProxy =
JAXRSClientFactory.create("local://books", BookStoreSpring.class);
WebClient.getConfig(localProxy).getRequestContext().put(LocalConduit.DIRECT_DISPATCH, Boolean.TRUE);
Book response = localProxy.convertBook(new Book2("New", 124L));
assertEquals(124L, response.getId());
}
@Test
public void testProxyPipedDispatchPost() throws Exception {
BookStoreSpring localProxy =
JAXRSClientFactory.create("local://books", BookStoreSpring.class);
Book response = localProxy.convertBook(new Book2("New", 124L));
assertEquals(124L, response.getId());
}
@Test
public void testWebClientDirectDispatch() throws Exception {
WebClient localClient = WebClient.create("local://books");
WebClient.getConfig(localClient).getRequestContext().put(LocalConduit.DIRECT_DISPATCH, Boolean.TRUE);
localClient.path("bookstore/books/123");
Book book = localClient.get(Book.class);
assertEquals(123L, book.getId());
}
@Test
public void testWebClientDirectDispatchBookType() throws Exception {
WebClient localClient = WebClient.create("local://books",
Collections.singletonList(new JacksonJsonProvider()));
WebClient.getConfig(localClient).getRequestContext().put(LocalConduit.DIRECT_DISPATCH, Boolean.TRUE);
localClient.path("bookstore/booktype");
BookType book = localClient.get(BookType.class);
assertEquals(124L, book.getId());
}
@Test
public void testWebClientPipedDispatch() throws Exception {
WebClient localClient = WebClient.create("local://books");
localClient.accept("text/xml");
localClient.path("bookstore/books");
Book book = localClient.post(new Book("New", 124L), Book.class);
assertEquals(124L, book.getId());
}
@Test
public void testProxyWithQuery() throws Exception {
BookStore localProxy =
JAXRSClientFactory.create("local://books", BookStore.class);
WebClient.getConfig(localProxy).getRequestContext().put(LocalConduit.DIRECT_DISPATCH, Boolean.TRUE);
Book book = localProxy.getBookByURLQuery(new String[] {"1", "2", "3"});
assertEquals(123L, book.getId());
}
private static class TestFaultInInterceptor extends AbstractPhaseInterceptor<Message> {
TestFaultInInterceptor() {
this(Phase.PRE_STREAM);
}
TestFaultInInterceptor(String s) {
super(Phase.PRE_STREAM);
}
public void handleMessage(Message message) throws Fault {
message.getExchange().put(Message.RESPONSE_CODE, 500);
}
}
}