/**
* 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.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.InternalServerErrorException;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.jaxrs.client.JAXRSClientFactory;
import org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.cxf.jaxrs.model.AbstractResourceInfo;
import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
import org.junit.BeforeClass;
import org.junit.Test;
public class JAXRSClientServerNonSpringBookTest extends AbstractBusClientServerTestBase {
public static final int PORT = BookNonSpringServer.PORT;
@BeforeClass
public static void startServers() throws Exception {
AbstractResourceInfo.clearAllMaps();
assertTrue("server did not launch correctly",
launchServer(BookNonSpringServer.class, true));
createStaticBus();
}
@Test
public void testGetBook123Singleton() throws Exception {
getAndCompareAsStrings("http://localhost:" + PORT + "/singleton/bookstore/books/123",
"resources/expected_get_book123.txt",
"application/xml", 200);
}
@Test
public void testGetStaticResource() throws Exception {
String address = "http://localhost:" + PORT + "/singleton/staticmodel.xml";
WebClient wc = WebClient.create(address);
String response = wc.get(String.class);
assertTrue(response.startsWith("<model"));
assertEquals("application/xml+model", wc.getResponse().getMetadata().getFirst("Content-Type"));
}
@Test
public void testGetPathFromUriInfo() throws Exception {
String address = "http://localhost:" + PORT + "/application/bookstore/uifromconstructor";
WebClient wc = WebClient.create(address);
wc.accept("text/plain");
String response = wc.get(String.class);
assertEquals(address + "?prop=cxf", response);
}
@Test
public void testGetBook123UserModel() throws Exception {
getAndCompareAsStrings("http://localhost:" + PORT + "/usermodel/bookstore/books/123",
"resources/expected_get_book123.txt",
"application/xml", 200);
}
@Test
public void testGetBook123UserModelAuthorize() throws Exception {
JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
bean.setAddress("http://localhost:" + PORT + "/usermodel/bookstore/books");
bean.setUsername("Barry");
bean.setPassword("password");
bean.setModelRef("classpath:org/apache/cxf/systest/jaxrs/resources/resources.xml");
WebClient proxy = bean.createWebClient();
proxy.path("{id}/authorize", 123);
Book book = proxy.get(Book.class);
assertEquals(123L, book.getId());
}
@Test
public void testGetChapterUserModel() throws Exception {
getAndCompareAsStrings("http://localhost:" + PORT + "/usermodel/bookstore/books/123/chapter",
"resources/expected_get_chapter1_utf.txt",
"application/xml", 200);
}
@Test
public void testGetBook123UserModelInterface() throws Exception {
getAndCompareAsStrings("http://localhost:" + PORT + "/usermodel2/bookstore2/books/123",
"resources/expected_get_book123.txt",
"application/xml", 200);
}
@Test
public void testGetBooksUserModelInterface() throws Exception {
BookStoreNoAnnotationsInterface proxy =
JAXRSClientFactory.createFromModel("http://localhost:" + PORT + "/usermodel2",
BookStoreNoAnnotationsInterface.class,
"classpath:org/apache/cxf/systest/jaxrs/resources/resources2.xml", null);
Book book = new Book("From Model", 1L);
List<Book> books = new ArrayList<>();
books.add(book);
books = proxy.getBooks(books);
assertEquals(1, books.size());
assertNotSame(book, books.get(0));
assertEquals("From Model", books.get(0).getName());
}
@Test
public void testUserModelInterfaceOneWay() throws Exception {
BookStoreNoAnnotationsInterface proxy =
JAXRSClientFactory.createFromModel("http://localhost:" + PORT + "/usermodel2",
BookStoreNoAnnotationsInterface.class,
"classpath:org/apache/cxf/systest/jaxrs/resources/resources2.xml", null);
proxy.pingBookStore();
assertEquals(202, WebClient.client(proxy).getResponse().getStatus());
}
@Test
public void testGetBook123ApplicationSingleton() throws Exception {
WebClient wc = WebClient.create("http://localhost:" + PORT + "/application/bookstore/default");
wc.accept("application/xml");
Book book = wc.get(Book.class);
assertEquals("default", book.getName());
assertEquals(543L, book.getId());
}
@Test
public void testGetBook123ApplicationPerRequest() throws Exception {
getAndCompareAsStrings("http://localhost:" + PORT + "/application/bookstore2/bookheaders",
"resources/expected_get_book123.txt",
"application/xml", 200);
}
@Test
public void testGetBook123Application11Singleton() throws Exception {
getAndCompareAsStrings("http://localhost:" + PORT + "/application11/thebooks/bookstore/books/123",
"resources/expected_get_book123.txt",
"application/xml", 200);
}
@Test
public void testGetBook123Application11PerRequest() throws Exception {
Response r =
doTestPerRequest("http://localhost:" + PORT + "/application11/thebooks/bookstore2/bookheaders");
assertEquals("TheBook", r.getHeaderString("BookWriter"));
}
@Test
public void testGetBook123TwoApplications() throws Exception {
doTestPerRequest("http://localhost:" + PORT + "/application6/thebooks/bookstore2/bookheaders");
doTestPerRequest("http://localhost:" + PORT + "/application6/the%20books2/bookstore2/book%20headers");
}
private Response doTestPerRequest(String address) throws Exception {
WebClient wc = WebClient.create(address);
WebClient.getConfig(wc).getHttpConduit().getClient().setReceiveTimeout(100000000L);
wc.accept("application/xml");
Response r = wc.get();
Book book = r.readEntity(Book.class);
assertEquals("CXF in Action", book.getName());
assertEquals(123L, book.getId());
return r;
}
@Test
public void testGetNonExistentBook() throws Exception {
WebClient wc = WebClient.create("http://localhost:" + PORT
+ "/application11/thebooks/bookstore/books/321");
try {
wc.accept("*/*").get(Book.class);
fail();
} catch (InternalServerErrorException ex) {
assertEquals("No book found at all : 321", ex.getResponse().readEntity(String.class));
}
}
@Test
public void testBookWithNonExistentMethod() throws Exception {
WebClient wc = WebClient.create("http://localhost:" + PORT
+ "/application11/thebooks/bookstore/nonexistent");
try {
wc.accept("*/*").get(Book.class);
fail();
} catch (WebApplicationException ex) {
assertEquals("Nonexistent method", ex.getResponse().readEntity(String.class));
}
}
private void getAndCompareAsStrings(String address,
String resourcePath,
String acceptType,
int status) throws Exception {
String expected = getStringFromInputStream(
getClass().getResourceAsStream(resourcePath));
getAndCompare(address,
expected,
acceptType,
acceptType,
status);
}
private void getAndCompare(String address,
String expectedValue,
String acceptType,
String expectedContentType,
int expectedStatus) throws Exception {
GetMethod get = new GetMethod(address);
get.setRequestHeader("Accept", acceptType);
get.setRequestHeader("Accept-Language", "da;q=0.8,en");
get.setRequestHeader("Book", "1,2,3");
HttpClient httpClient = new HttpClient();
try {
int result = httpClient.executeMethod(get);
assertEquals(expectedStatus, result);
String content = getStringFromInputStream(get.getResponseBodyAsStream());
assertEquals("Expected value is wrong",
stripXmlInstructionIfNeeded(expectedValue), stripXmlInstructionIfNeeded(content));
if (expectedContentType != null) {
Header ct = get.getResponseHeader("Content-Type");
assertEquals("Wrong type of response", expectedContentType, ct.getValue());
}
} finally {
get.releaseConnection();
}
}
private String stripXmlInstructionIfNeeded(String str) {
if (str != null && str.startsWith("<?xml")) {
int index = str.indexOf("?>");
str = str.substring(index + 2);
}
return str;
}
private String getStringFromInputStream(InputStream in) throws Exception {
return IOUtils.toString(in);
}
}