You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2009/03/23 19:55:07 UTC
svn commit: r757499 - in /cxf/trunk:
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/
rt/frontend/jaxrs/src/test...
Author: sergeyb
Date: Mon Mar 23 18:55:06 2009
New Revision: 757499
URL: http://svn.apache.org/viewvc?rev=757499&view=rev
Log:
JAXRS: minor updates to do with conneg
Modified:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/SourceProvider.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/SelectMethodCandidatesTest.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/resources/TestResource.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java?rev=757499&r1=757498&r2=757499&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java Mon Mar 23 18:55:06 2009
@@ -300,10 +300,22 @@
}
private MediaType checkFinalContentType(MediaType mt) {
- if (mt.isWildcardType() && mt.isWildcardSubtype()) {
+ if (mt.isWildcardType() || mt.isWildcardSubtype()) {
return MediaType.APPLICATION_OCTET_STREAM_TYPE;
+ } else if (mt.getParameters().containsKey("q")) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(mt.getType()).append('/').append(mt.getSubtype());
+ if (mt.getParameters().size() > 1) {
+ for (String key : mt.getParameters().keySet()) {
+ if (!"q".equals(key)) {
+ sb.append(';').append(key).append('=').append(mt.getParameters().get(key));
+ }
+ }
+ }
+ return MediaType.valueOf(sb.toString());
} else {
return mt;
}
+
}
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java?rev=757499&r1=757498&r2=757499&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java Mon Mar 23 18:55:06 2009
@@ -46,8 +46,8 @@
import org.apache.cxf.jaxrs.utils.schemas.SchemaHandler;
import org.apache.cxf.staxutils.StaxUtils;
-@Produces({"application/xml", "text/xml" })
-@Consumes({"application/xml", "text/xml" })
+@Produces({"application/xml", "application/*+xml", "text/xml" })
+@Consumes({"application/xml", "application/*+xml", "text/xml" })
@Provider
public class JAXBElementProvider extends AbstractJAXBProvider {
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/SourceProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/SourceProvider.java?rev=757499&r1=757498&r2=757499&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/SourceProvider.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/SourceProvider.java Mon Mar 23 18:55:06 2009
@@ -48,8 +48,8 @@
import org.apache.cxf.jaxrs.utils.XMLSource;
@Provider
-@Produces({"application/xml", "text/xml" })
-@Consumes({"application/xml", "text/xml" })
+@Produces({"application/xml", "application/*+xml", "text/xml" })
+@Consumes({"application/xml", "application/*+xml", "text/xml" })
public class SourceProvider implements
MessageBodyReader<Object>, MessageBodyWriter<Source> {
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java?rev=757499&r1=757498&r2=757499&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java Mon Mar 23 18:55:06 2009
@@ -881,8 +881,19 @@
for (MediaType requiredType : requiredMediaTypes) {
for (MediaType userType : userMediaTypes) {
- if (requiredType.isCompatible(userType) || userType.isCompatible(requiredType)) {
-
+ boolean isCompatible =
+ requiredType.isCompatible(userType) || userType.isCompatible(requiredType);
+ if (!isCompatible && requiredType.getType().equalsIgnoreCase(userType.getType())) {
+ // check if we have composite subtypes
+ String[] subtypes1 = requiredType.getSubtype().split("\\+");
+ String[] subtypes2 = userType.getSubtype().split("\\+");
+ if (subtypes1.length == 2 && subtypes2.length == 2
+ && subtypes1[1].equalsIgnoreCase(subtypes2[1])
+ && (subtypes1[0].equals("*") || subtypes2[0].equals("*"))) {
+ isCompatible = true;
+ }
+ }
+ if (isCompatible) {
boolean parametersMatched = true;
for (Map.Entry<String, String> entry : userType.getParameters().entrySet()) {
String value = requiredType.getParameters().get(entry.getKey());
Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/SelectMethodCandidatesTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/SelectMethodCandidatesTest.java?rev=757499&r1=757498&r2=757499&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/SelectMethodCandidatesTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/SelectMethodCandidatesTest.java Mon Mar 23 18:55:06 2009
@@ -153,4 +153,51 @@
ori.getMethodToInvoke().getName());
}
+
+ @Test
+ public void testSelectBar() throws Exception {
+ JAXRSServiceFactoryBean sf = new JAXRSServiceFactoryBean();
+ sf.setResourceClasses(org.apache.cxf.jaxrs.resources.TestResource.class);
+ sf.create();
+ List<ClassResourceInfo> resources = ((JAXRSServiceImpl)sf.getService()).getClassResourceInfos();
+
+ MetadataMap<String, String> values = new MetadataMap<String, String>();
+ ClassResourceInfo resource = JAXRSUtils.selectResourceClass(resources, "/1/2/3/d/custom", values);
+
+ String contentTypes = "*/*";
+ String acceptContentTypes = "application/bar,application/foo";
+ OperationResourceInfo ori = JAXRSUtils.findTargetMethod(resource,
+ values.getFirst(URITemplate.FINAL_MATCH_GROUP),
+ "GET", values, contentTypes,
+ JAXRSUtils.sortMediaTypes(acceptContentTypes));
+ assertNotNull(ori);
+ assertEquals("readBar", ori.getMethodToInvoke().getName());
+ acceptContentTypes = "application/foo,application/bar";
+ resource = JAXRSUtils.selectResourceClass(resources, "/1/2/3/d/custom", values);
+ ori = JAXRSUtils.findTargetMethod(resource,
+ values.getFirst(URITemplate.FINAL_MATCH_GROUP),
+ "GET", values, contentTypes,
+ JAXRSUtils.sortMediaTypes(acceptContentTypes));
+ assertNotNull(ori);
+ assertEquals("readFoo", ori.getMethodToInvoke().getName());
+
+ acceptContentTypes = "application/foo;q=0.5,application/bar";
+ resource = JAXRSUtils.selectResourceClass(resources, "/1/2/3/d/custom", values);
+ ori = JAXRSUtils.findTargetMethod(resource,
+ values.getFirst(URITemplate.FINAL_MATCH_GROUP),
+ "GET", values, contentTypes,
+ JAXRSUtils.sortMediaTypes(acceptContentTypes));
+ assertNotNull(ori);
+ assertEquals("readBar", ori.getMethodToInvoke().getName());
+
+ acceptContentTypes = "application/foo,application/bar;q=0.5";
+ resource = JAXRSUtils.selectResourceClass(resources, "/1/2/3/d/custom", values);
+ ori = JAXRSUtils.findTargetMethod(resource,
+ values.getFirst(URITemplate.FINAL_MATCH_GROUP),
+ "GET", values, contentTypes,
+ JAXRSUtils.sortMediaTypes(acceptContentTypes));
+ assertNotNull(ori);
+ assertEquals("readFoo", ori.getMethodToInvoke().getName());
+
+ }
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/resources/TestResource.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/resources/TestResource.java?rev=757499&r1=757498&r2=757499&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/resources/TestResource.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/resources/TestResource.java Mon Mar 23 18:55:06 2009
@@ -89,6 +89,20 @@
public String readMethod2() {
return "This is a list method";
}
+
+ @GET
+ @Path("{id:custom}")
+ @Produces("application/bar")
+ public String readBar() {
+ return "This is a bar method";
+ }
+
+ @GET
+ @Path("{id:custom}")
+ @Produces("application/foo")
+ public String readFoo() {
+ return "This is a foo method";
+ }
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java?rev=757499&r1=757498&r2=757499&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java Mon Mar 23 18:55:06 2009
@@ -291,6 +291,15 @@
}
@Test
+ public void testIntersectMimeTypesCompositeSubtype() throws Exception {
+ List <MediaType> candidateList =
+ JAXRSUtils.intersectMimeTypes("application/bar+xml", "application/*+xml");
+
+ assertEquals(1, candidateList.size());
+ assertEquals("application/bar+xml", candidateList.get(0).toString());
+ }
+
+ @Test
public void testIntersectMimeTypes() throws Exception {
//test basic
List<MediaType> methodMimeTypes = new ArrayList<MediaType>(
Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java?rev=757499&r1=757498&r2=757499&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java Mon Mar 23 18:55:06 2009
@@ -449,7 +449,7 @@
@GET
@Path("/cdwithmultitypes/{CDId}/")
- @Produces({"application/xml", "application/json" })
+ @Produces({"application/xml", "application/bar+xml", "application/json" })
public CD getCDWithMultiContentTypes(@PathParam("CDId") String id) {
CD cd = cds.get(Long.parseLong(id));
Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java?rev=757499&r1=757498&r2=757499&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java Mon Mar 23 18:55:06 2009
@@ -24,6 +24,7 @@
import java.net.URL;
import java.net.URLConnection;
+import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.DeleteMethod;
import org.apache.commons.httpclient.methods.FileRequestEntity;
@@ -136,13 +137,11 @@
@Test
public void testNoMessageWriterFound() throws Exception {
- // TODO : more specific message is needed
String msg1 = ".No message body writer found for response class : GregorianCalendar.";
String msg2 = ".No message body writer found for response class : Calendar.";
- getAndCompareStrings("http://localhost:9080/bookstore/timetable",
- msg1, msg2,
- "*/*", 500);
+ getAndCompareStrings("http://localhost:9080/bookstore/timetable",
+ new String[]{msg1, msg2}, "*/*", 500);
}
@SuppressWarnings("deprecation")
@@ -231,6 +230,18 @@
}
@Test
+ public void testGetBookTypeAndWildcard() throws Exception {
+ getAndCompareAsStrings("http://localhost:9080/bookstore/books/123",
+ "resources/expected_get_book123.txt",
+ "application/xml;q=0.8,*/*",
+ "application/xml", 200);
+ getAndCompareAsStrings("http://localhost:9080/bookstore/books/123",
+ "resources/expected_get_book123.txt",
+ "application/*",
+ "application/xml", 200);
+ }
+
+ @Test
public void testGetBook123() throws Exception {
getAndCompareAsStrings("http://localhost:9080/bookstore/books/123",
"resources/expected_get_book123.txt",
@@ -250,7 +261,13 @@
getAndCompareAsStrings("http://localhost:9080/bookstore/books/123",
"resources/expected_get_book123json.txt",
- "application/json, application/xml", 200);
+ "application/json, application/xml",
+ "application/json", 200);
+
+ getAndCompareAsStrings("http://localhost:9080/bookstore/books/123",
+ "resources/expected_get_book123.txt",
+ "application/xml, application/json",
+ "application/xml", 200);
}
@Test
@@ -258,7 +275,7 @@
getAndCompareAsStrings("http://localhost:9080/bookstore/books/123",
"resources/expected_get_book123.txt",
- "*/*", 200);
+ "*/*", "application/xml", 200);
}
@@ -302,14 +319,14 @@
public void testGetBookByHeader() throws Exception {
getAndCompareAsStrings("http://localhost:9080/bookstore/bookheaders",
"resources/expected_get_book123.txt",
- "application/xml;q=0.5,text/xml", 200);
+ "application/xml;q=0.5,text/xml", "text/xml", 200);
}
@Test
public void testGetBookByHeaderDefault() throws Exception {
getAndCompareAsStrings("http://localhost:9080/bookstore/bookheaders2",
"resources/expected_get_book123.txt",
- "application/xml;q=0.5,text/xml", 200);
+ "application/xml;q=0.5,text/xml", "text/xml", 200);
}
@Test
@@ -334,14 +351,15 @@
getAndCompareAsStrings("http://localhost:9080/bookstore/books/123",
"resources/expected_get_book123json.txt",
- "application/xml;q=0.1,application/json", 200);
+ "application/xml;q=0.1,application/json", "application/json", 200);
}
@Test
public void testGetBook123FromSubObject() throws Exception {
getAndCompareAsStrings(
"http://localhost:9080/bookstore/booksubresourceobject/123/chaptersobject/sub/1",
- "resources/expected_get_chapter1.txt", "application/xml", 200);
+ "resources/expected_get_chapter1.txt", "application/xml",
+ "application/xml;charset=iso-8859-1", 200);
}
@Test
@@ -349,7 +367,7 @@
getAndCompareAsStrings("http://localhost:9080/bookstore/booksubresource/123/chapters/1",
"resources/expected_get_chapter1.txt",
- "application/xml", 200);
+ "application/xml", "application/xml;charset=iso-8859-1", 200);
}
@Test
@@ -360,7 +378,7 @@
"application/xml", 200);
getAndCompareAsStrings("http://localhost:9080/bookstore/booksubresource/123/chapters/sub/1/recurse2",
"resources/expected_get_chapter1.txt",
- "application/xml", 200);
+ "application/xml", "application/xml;charset=iso-8859-1", 200);
}
@Test
@@ -375,7 +393,7 @@
getAndCompareAsStrings("http://localhost:9080/bookstore/books/126",
"resources/expected_get_book_notfound.txt",
- "application/xml", 500);
+ "application/xml", "text/xml; charset=utf-8", 500);
}
@Test
@@ -661,7 +679,15 @@
getAndCompareAsStrings("http://localhost:9080/bookstore/cdwithmultitypes/123",
"resources/expected_get_cd.txt",
- "application/json;q=0.8,application/xml", 200);
+ "application/json;q=0.8,application/xml,*/*", "application/xml", 200);
+ }
+
+ @Test
+ public void testGetCDWithMultiContentTypesCustomXML() throws Exception {
+
+ getAndCompareAsStrings("http://localhost:9080/bookstore/cdwithmultitypes/123",
+ "resources/expected_get_cd.txt",
+ "application/bar+xml", "application/bar+xml", 200);
}
@Test
@@ -671,7 +697,7 @@
"application/json", 200);
getAndCompareAsStrings("http://localhost:9080/bookstore/cdwithmultitypes/123",
"resources/expected_get_cdjson.txt",
- "application/xml;q=0.9,application/json", 200);
+ "*/*,application/xml;q=0.9,application/json", "application/json", 200);
}
@Test
@@ -681,7 +707,7 @@
"[class org.apache.cxf.systest.jaxrs.BookStore, "
+ "class org.apache.cxf.systest.jaxrs.Book, "
+ "class org.apache.cxf.systest.jaxrs.Chapter]",
- "text/plain", 200);
+ "text/plain", "text/plain", 200);
}
@Test
@@ -691,7 +717,7 @@
"[class org.apache.cxf.systest.jaxrs.BookStore, "
+ "class org.apache.cxf.systest.jaxrs.Book, "
+ "class org.apache.cxf.systest.jaxrs.Chapter]",
- "text/plain", 200);
+ "text/plain", "text/plain", 200);
}
@Test
@@ -701,8 +727,7 @@
+ "/bookstore/booksubresource/123/chapters/sub/1/matched!uris]";
getAndCompare("http://localhost:9080/bookstore/"
+ "booksubresource/123/chapters/sub/1/matched%21uris?decode=true",
- expected,
- "text/plain", 200);
+ expected, "text/plain", "text/plain", 200);
}
@Test
@@ -714,7 +739,7 @@
getAndCompare("http://localhost:9080/bookstore/"
+ "booksubresource/123/chapters/sub/1/matched%21uris?decode=false",
expected,
- "text/plain", 200);
+ "text/plain", "text/plain", 200);
}
private void getAndCompareAsStrings(String address,
@@ -726,6 +751,21 @@
getAndCompare(address,
expected,
acceptType,
+ acceptType,
+ status);
+ }
+
+ private void getAndCompareAsStrings(String address,
+ String resourcePath,
+ String acceptType,
+ String expectedContentType,
+ int status) throws Exception {
+ String expected = getStringFromInputStream(
+ getClass().getResourceAsStream(resourcePath));
+ getAndCompare(address,
+ expected,
+ acceptType,
+ expectedContentType,
status);
}
@@ -733,6 +773,18 @@
String expectedValue,
String acceptType,
int expectedStatus) throws Exception {
+ getAndCompare(address,
+ expectedValue,
+ acceptType,
+ null,
+ expectedStatus);
+ }
+
+ 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");
@@ -747,16 +799,20 @@
if (expectedStatus == 200) {
assertEquals("123", get.getResponseHeader("BookId").getValue());
}
+ if (expectedContentType != null) {
+ Header ct = get.getResponseHeader("Content-Type");
+ assertEquals("Wrong type of response", expectedContentType, ct.getValue());
+ }
} finally {
get.releaseConnection();
}
}
private void getAndCompareStrings(String address,
- String expectedValue1,
- String expectedValue2,
+ String[] expectedValue,
String acceptType,
int expectedStatus) throws Exception {
+ assertEquals(2, expectedValue.length);
GetMethod get = new GetMethod(address);
get.setRequestHeader("Accept", acceptType);
HttpClient httpClient = new HttpClient();
@@ -765,7 +821,7 @@
assertEquals(expectedStatus, result);
String jsonContent = getStringFromInputStream(get.getResponseBodyAsStream());
assertTrue("Expected value is wrong",
- expectedValue1.equals(jsonContent) || expectedValue2.equals(jsonContent));
+ expectedValue[0].equals(jsonContent) || expectedValue[1].equals(jsonContent));
} finally {
get.releaseConnection();
}