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/30 11:28:32 UTC
svn commit: r759890 - in /cxf/trunk:
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/java/org/apache/cxf/jaxrs/
rt/frontend/jaxrs/src/test/java/org/ap...
Author: sergeyb
Date: Mon Mar 30 09:28:29 2009
New Revision: 759890
URL: http://svn.apache.org/viewvc?rev=759890&view=rev
Log:
JAXRS: support for arrays
Modified:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.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/provider/ProviderFactory.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java?rev=759890&r1=759889&r2=759890&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java Mon Mar 30 09:28:29 2009
@@ -206,6 +206,7 @@
private static void handleMapper(List<Object> candidates, ProviderInfo em,
Class<?> expectedType, Message m) {
+
Type[] types = em.getProvider().getClass().getGenericInterfaces();
for (Type t : types) {
if (t instanceof ParameterizedType) {
@@ -218,6 +219,7 @@
InjectionUtils.injectContextMethods(em.getProvider(), em, m);
}
candidates.add(em.getProvider());
+ break;
}
}
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java?rev=759890&r1=759889&r2=759890&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java Mon Mar 30 09:28:29 2009
@@ -19,6 +19,7 @@
package org.apache.cxf.jaxrs.utils;
+import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
@@ -134,10 +135,14 @@
}
public static Class<?> getActualType(Type genericType) {
- if (genericType == null
- || !ParameterizedType.class.isAssignableFrom(genericType.getClass())) {
+
+ if (genericType == null) {
return null;
}
+ if (!ParameterizedType.class.isAssignableFrom(genericType.getClass())) {
+ Class<?> cls = (Class<?>)genericType;
+ return cls.isArray() ? cls.getComponentType() : null;
+ }
ParameterizedType paramType = (ParameterizedType)genericType;
return (Class<?>)paramType.getActualTypeArguments()[0];
}
@@ -320,6 +325,21 @@
return theValues;
}
+ @SuppressWarnings("unchecked")
+ public static Object injectIntoArray(Type genericType, List<String> values,
+ boolean decoded, ParameterType pathParam, Message message) {
+ Class<?> realType = InjectionUtils.getActualType(genericType);
+ values = checkPathSegment(values, realType, pathParam);
+ Object[] array = (Object[])Array.newInstance(realType, values.size());
+ for (int i = 0; i < values.size(); i++) {
+ String value = decodeValue(values.get(i), decoded, pathParam);
+ Object o = InjectionUtils.handleParameter(value, realType, pathParam, message);
+ if (o != null) {
+ array[i] = o;
+ }
+ }
+ return array;
+ }
@SuppressWarnings("unchecked")
@@ -382,16 +402,19 @@
}
}
}
-
+
+ Object value = null;
if (List.class.isAssignableFrom(paramType)) {
- return InjectionUtils.injectIntoList(genericType, paramValues, decoded, pathParam,
+ value = InjectionUtils.injectIntoList(genericType, paramValues, decoded, pathParam,
message);
} else if (Set.class.isAssignableFrom(paramType)) {
- return InjectionUtils.injectIntoSet(genericType, paramValues, false, decoded, pathParam,
+ value = InjectionUtils.injectIntoSet(genericType, paramValues, false, decoded, pathParam,
message);
} else if (SortedSet.class.isAssignableFrom(paramType)) {
- return InjectionUtils.injectIntoSet(genericType, paramValues, true, decoded, pathParam,
+ value = InjectionUtils.injectIntoSet(genericType, paramValues, true, decoded, pathParam,
message);
+ } else if (paramType.isArray()) {
+ value = InjectionUtils.injectIntoArray(genericType, paramValues, decoded, pathParam, message);
} else {
String result = null;
if (paramValues.size() > 0) {
@@ -401,11 +424,10 @@
}
if (result != null) {
result = decodeValue(result, decoded, pathParam);
- return InjectionUtils.handleParameter(result, paramType, pathParam, message);
- } else {
- return null;
+ value = InjectionUtils.handleParameter(result, paramType, pathParam, message);
}
}
+ return value;
}
public static ThreadLocalProxy createThreadLocalProxy(Class<?> type) {
Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java?rev=759890&r1=759889&r2=759890&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java Mon Mar 30 09:28:29 2009
@@ -239,7 +239,11 @@
// complete
}
- public void testCustomerParam(@QueryParam("p1") Customer c) {
+ public void testCustomerParam(@QueryParam("p1") Customer c, @QueryParam("p2") Customer[] c2) {
+ // complete
+ }
+
+ public void testCustomerParam2(@QueryParam("p1") String[] p) {
// complete
}
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=759890&r1=759889&r2=759890&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 30 09:28:29 2009
@@ -557,16 +557,34 @@
Message messageImpl = createMessage();
ProviderFactory.getInstance(messageImpl).registerUserProvider(
new CustomerParameterHandler());
- Class[] argType = {Customer.class};
+ Class[] argType = {Customer.class, Customer[].class};
Method m = Customer.class.getMethod("testCustomerParam", argType);
- messageImpl.put(Message.QUERY_STRING, "p1=Fred");
+ messageImpl.put(Message.QUERY_STRING, "p1=Fred&p2=Barry");
List<Object> params = JAXRSUtils.processParameters(new OperationResourceInfo(m, null),
null,
messageImpl);
- assertEquals(1, params.size());
+ assertEquals(2, params.size());
Customer c = (Customer)params.get(0);
assertEquals("Fred", c.getName());
+ Customer c2 = ((Customer[])params.get(1))[0];
+ assertEquals("Barry", c2.getName());
+ }
+
+ @Test
+ public void testArrayParamNoProvider() throws Exception {
+ Message messageImpl = createMessage();
+ Class[] argType = {String[].class};
+ Method m = Customer.class.getMethod("testCustomerParam2", argType);
+
+ messageImpl.put(Message.QUERY_STRING, "p1=Fred&p1=Barry");
+ List<Object> params = JAXRSUtils.processParameters(new OperationResourceInfo(m, null),
+ null,
+ messageImpl);
+ assertEquals(1, params.size());
+ String[] values = (String[])params.get(0);
+ assertEquals("Fred", values[0]);
+ assertEquals("Barry", values[1]);
}
@Test
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=759890&r1=759889&r2=759890&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 30 09:28:29 2009
@@ -191,7 +191,16 @@
String url2 = new URL(urlValue).toString();
int index = url2.lastIndexOf('/');
return doGetBook(url2.substring(index + 1));
- }
+ }
+
+ @GET
+ @Path("/bookidarray")
+ public Book getBookByURLQuery(@QueryParam("id") String[] ids) throws Exception {
+ if (ids == null || ids.length != 3) {
+ throw new WebApplicationException();
+ }
+ return doGetBook(ids[0] + ids[1] + ids[2]);
+ }
@GET
@Path("/securebooks/{bookId}/")
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=759890&r1=759889&r2=759890&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 30 09:28:29 2009
@@ -72,6 +72,14 @@
"resources/expected_get_book123.txt",
"application/xml", 200);
}
+
+ @Test
+ public void testGetBookByArrayQuery() throws Exception {
+ getAndCompareAsStrings("http://localhost:9080/bookstore/bookidarray?"
+ + "id=1&id=2&id=3",
+ "resources/expected_get_book123.txt",
+ "application/xml", 200);
+ }
@Test
public void testNoRootResourceException() throws Exception {