Author: jliu
Date: Thu Nov 29 22:20:15 2007
New Revision: 599702
URL: http://svn.apache.org/viewvc?rev=599702&view=rev
Log:
CXF-1240. support using String as return type from JAX-RS.
Added:
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/StringProvider.java
(with props)
incubator/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/
incubator/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryImplTest.java
(with props)
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/expected_get_book123_returnstring.txt
(with props)
Modified:
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactoryImpl.java
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
Modified:
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
URL:
http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java?rev=599702&r1=599701&r2=599702&view=diff
==============================================================================
---
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
(original)
+++
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
Thu Nov 29 22:20:15 2007
@@ -88,6 +88,7 @@
//TODO: support Calendar type
//}
} catch (JAXBException e) {
+ //TODO: better exception handling
e.printStackTrace();
}
}
Modified:
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactoryImpl.java
URL:
http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactoryImpl.java?rev=599702&r1=599701&r2=599702&view=diff
==============================================================================
---
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactoryImpl.java
(original)
+++
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactoryImpl.java
Thu Nov 29 22:20:15 2007
@@ -42,6 +42,7 @@
//TODO: search for EntityProviders from classpath or config file.
entityProviders.add(new JAXBElementProvider());
entityProviders.add(new JSONProvider());
+ entityProviders.add(new StringProvider());
sort();
}
@@ -101,11 +102,25 @@
return null;
}
+ public boolean registerEntityProvider(EntityProvider e) {
+ entityProviders.add(e);
+ sort();
+ return true;
+ }
+
+ public boolean deregisterEntityProvider(EntityProvider e) {
+ return entityProviders.remove(e);
+ }
+
+ public List<EntityProvider> getEntityProviders() {
+ return entityProviders;
+ }
+
private boolean matchMineTypes(String[] supportedMimeTypes, String[]
requestedMimeTypes) {
//TODO:
for (String supportedMimeType : supportedMimeTypes) {
for (String requestedMimeType : requestedMimeTypes) {
- if (supportedMimeType.equals(requestedMimeType)) {
+ if (isMineTypeSupported(requestedMimeType, supportedMimeType))
{
return true;
}
}
@@ -114,11 +129,26 @@
return false;
}
+ private boolean isMineTypeSupported(String requestedMimeType, String
supportedMimeType) {
+ // REVISIT: better algorithm
+ if (supportedMimeType.equals(requestedMimeType)) {
+ return true;
+ } else if (supportedMimeType.startsWith("*/")) {
+ return true;
+ } else if (supportedMimeType.regionMatches(0, requestedMimeType, 0,
supportedMimeType.indexOf("/"))
+ && supportedMimeType.endsWith("/*")) {
+ return true;
+ }
+
+ return false;
+ }
+
/*
- * sorts the available providers according to the media types they declare
support for.
- * Sorting of media types follows the general rule: x/y < * x < *, i.e. a
provider that
- * explicitly lists a media types is sorted before a provider that lists
*.
- * Quality parameter values are also used such that x/y;q=1.0 < x/y;q=0.7.
+ * sorts the available providers according to the media types they declare
+ * support for. Sorting of media types follows the general rule: x/y < * x
< *,
+ * i.e. a provider that explicitly lists a media types is sorted before a
+ * provider that lists *. Quality parameter values are also used such that
+ * x/y;q=1.0 < x/y;q=0.7.
*/
private void sort() {
Collections.sort(entityProviders, new EntityProviderComparator());
Added:
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/StringProvider.java
URL:
http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/StringProvider.java?rev=599702&view=auto
==============================================================================
---
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/StringProvider.java
(added)
+++
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/StringProvider.java
Thu Nov 29 22:20:15 2007
@@ -0,0 +1,56 @@
+/**
+ * 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.jaxrs.provider;
+
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.EntityProvider;
+
+import org.apache.cxf.helpers.IOUtils;
+
+public final class StringProvider implements EntityProvider<String> {
+
+ public boolean supports(Class<?> type) {
+ return type == String.class;
+ }
+
+ public String readFrom(Class<String> type, MediaType m,
MultivaluedMap<String, String> headers,
+ InputStream is) {
+ try {
+ return IOUtils.toString(is);
+ } catch (IOException e) {
+ // TODO: better exception handling
+ }
+ return null;
+ }
+
+ public void writeTo(String obj, MediaType m, MultivaluedMap<String,
Object> headers, OutputStream os) {
+ try {
+ os.write(obj.getBytes());
+ } catch (IOException e) {
+ //TODO: better exception handling
+ }
+ }
+
+}
Propchange:
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/StringProvider.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/StringProvider.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added:
incubator/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryImplTest.java
URL:
http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryImplTest.java?rev=599702&view=auto
==============================================================================
---
incubator/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryImplTest.java
(added)
+++
incubator/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryImplTest.java
Thu Nov 29 22:20:15 2007
@@ -0,0 +1,122 @@
+/**
+ * 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.jaxrs.provider;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+
+import javax.ws.rs.ConsumeMime;
+import javax.ws.rs.ProduceMime;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.EntityProvider;
+import javax.ws.rs.ext.ProviderFactory;
+
+import org.apache.cxf.helpers.IOUtils;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ProviderFactoryImplTest extends Assert {
+
+ @Before
+ public void setUp() throws Exception {
+
+ }
+
+ @Test
+ public void testSortEntityProviders() throws Exception {
+ ProviderFactoryImpl pf = new ProviderFactoryImpl();
+ pf.registerEntityProvider(new TestStringProvider());
+
+ List<EntityProvider> providers = pf.getEntityProviders();
+
+ assertTrue(indexOf(providers, TestStringProvider.class) <
indexOf(providers, StringProvider.class));
+ //REVISIT the compare algorithm
+ //assertTrue(indexOf(providers, JSONProvider.class) <
indexOf(providers, TestStringProvider.class));
+ }
+
+ @Test
+ public void testGetStringProvider() throws Exception {
+ String[] methodMimeTypes = {"text/html"};
+ EntityProvider provider =
((ProviderFactoryImpl)ProviderFactory.getInstance())
+ .createEntityProvider(String.class, methodMimeTypes, false);
+ assertTrue(provider instanceof StringProvider);
+ }
+
+ @Test
+ public void testGetStringProviderWildCard() throws Exception {
+ String[] methodMimeTypes = {"text/*"};
+ EntityProvider provider =
((ProviderFactoryImpl)ProviderFactory.getInstance())
+ .createEntityProvider(String.class, methodMimeTypes, false);
+ assertTrue(provider instanceof StringProvider);
+ }
+
+ @Test
+ public void testGetStringProviderUsingProviderDeclaration() throws
Exception {
+ String[] methodMimeTypes = {"text/html"};
+ ProviderFactoryImpl pf =
(ProviderFactoryImpl)ProviderFactory.getInstance();
+ pf.registerEntityProvider(new TestStringProvider());
+ EntityProvider provider =
((ProviderFactoryImpl)ProviderFactory.getInstance())
+ .createEntityProvider(String.class, methodMimeTypes, false);
+ assertTrue(provider instanceof TestStringProvider);
+ }
+
+ private int indexOf(List<EntityProvider> providers, Class providerType) {
+ int index = 0;
+ for (EntityProvider p : providers) {
+ if (p.getClass().isAssignableFrom(providerType)) {
+ break;
+ }
+ index++;
+ }
+ return index;
+ }
+
+ @ConsumeMime("text/html")
+ @ProduceMime("text/html")
+ private final class TestStringProvider implements EntityProvider<String> {
+
+ public boolean supports(Class<?> type) {
+ return type == String.class;
+ }
+
+ public String readFrom(Class<String> type, MediaType m,
MultivaluedMap<String, String> headers,
+ InputStream is) {
+ try {
+ return IOUtils.toString(is);
+ } catch (IOException e) {
+ // TODO: better exception handling
+ }
+ return null;
+ }
+
+ public void writeTo(String obj, MediaType m, MultivaluedMap<String,
Object> headers,
+ OutputStream os) {
+ try {
+ os.write(obj.getBytes());
+ } catch (IOException e) {
+ // TODO: better exception handling
+ }
+ }
+
+ }
+}
Propchange:
incubator/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryImplTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
incubator/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryImplTest.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified:
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
URL:
http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java?rev=599702&r1=599701&r2=599702&view=diff
==============================================================================
---
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
(original)
+++
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
Thu Nov 29 22:20:15 2007
@@ -70,11 +70,12 @@
@HttpMethod("GET")
@UriTemplate("/booknames/{bookId}/")
- public Book getBookName(@UriParam("bookId") int id) throws
BookNotFoundFault {
+ @ProduceMime("text/plain")
+ public String getBookName(@UriParam("bookId") int id) throws
BookNotFoundFault {
System.out.println("----invoking getBookName with id: " + id);
Book book = books.get(new Long(id));
if (book != null) {
- return book;
+ return book.getName();
} else {
BookNotFoundDetails details = new BookNotFoundDetails();
details.setId(id);
Modified:
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
URL:
http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java?rev=599702&r1=599701&r2=599702&view=diff
==============================================================================
---
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
(original)
+++
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
Thu Nov 29 22:20:15 2007
@@ -57,7 +57,7 @@
}
@Test
- public void testGetBook123Int() throws Exception {
+ public void testGetBook123ReturnString() throws Exception {
String endpointAddress =
"http://localhost:9080/bookstore/booknames/123";
URL url = new URL(endpointAddress);
@@ -65,7 +65,7 @@
assertNotNull(in);
InputStream expected = getClass()
- .getResourceAsStream("resources/expected_get_book123.txt");
+
.getResourceAsStream("resources/expected_get_book123_returnstring.txt");
assertEquals(getStringFromInputStream(expected),
getStringFromInputStream(in));
}
Added:
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/expected_get_book123_returnstring.txt
URL:
http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/expected_get_book123_returnstring.txt?rev=599702&view=auto
==============================================================================
---
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/expected_get_book123_returnstring.txt
(added)
+++
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/expected_get_book123_returnstring.txt
Thu Nov 29 22:20:15 2007
@@ -0,0 +1 @@
+CXF in Action
\ No newline at end of file
Propchange:
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/expected_get_book123_returnstring.txt
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/expected_get_book123_returnstring.txt
------------------------------------------------------------------------------
svn:mime-type = text/plain