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 2011/12/20 12:27:00 UTC
svn commit: r1221204 - in /cxf/trunk/rt/frontend/jaxrs/src:
main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
test/java/org/apache/cxf/jaxrs/Customer.java
test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
Author: sergeyb
Date: Tue Dec 20 11:26:59 2011
New Revision: 1221204
URL: http://svn.apache.org/viewvc?rev=1221204&view=rev
Log:
[CXF-3984] Better support for Locale parameters
Modified:
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
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=1221204&r1=1221203&r2=1221204&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 Tue Dec 20 11:26:59 2011
@@ -41,6 +41,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Set;
@@ -323,7 +324,10 @@ public final class InjectionUtils {
adapterHasToBeUsed = true;
}
- Object result = null;
+ Object result = instantiateFromParameterHandler(value, pClass, message);
+ if (result != null) {
+ return result;
+ }
// check constructors accepting a single String value
try {
Constructor<?> c = pClass.getConstructor(new Class<?>[]{String.class});
@@ -374,6 +378,19 @@ public final class InjectionUtils {
return result;
}
+ private static Object instantiateFromParameterHandler(String value,
+ Class<?> pClass,
+ Message message) {
+ // TODO: Consider always checking custom parameter handlers first.
+ // Right now, Locale and Date are two special cases so it's very cheap
+ // just to check if it is Locale or not;
+ if (Locale.class == pClass) {
+ return createFromParameterHandler(value, pClass, message);
+ } else {
+ return null;
+ }
+ }
+
private static Object createFromParameterHandler(String value,
Class<?> pClass,
Message message) {
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=1221204&r1=1221203&r2=1221204&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 Tue Dec 20 11:26:59 2011
@@ -21,6 +21,7 @@ package org.apache.cxf.jaxrs;
import java.util.HashMap;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.UUID;
@@ -187,6 +188,10 @@ public class Customer extends AbstractCu
}
+ public void testLocaleParam(@QueryParam("p1") Locale l) {
+
+ }
+
public void testXmlAdapter(@QueryParam("a")
@XmlJavaTypeAdapter(CustomerBeanAdapter.class)
CustomerBean cb) {
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=1221204&r1=1221203&r2=1221204&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 Tue Dec 20 11:26:59 2011
@@ -27,6 +27,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
+import java.util.Locale;
import java.util.UUID;
import javax.servlet.ServletConfig;
@@ -62,6 +63,7 @@ import org.apache.cxf.jaxrs.JAXRSService
import org.apache.cxf.jaxrs.JAXRSServiceImpl;
import org.apache.cxf.jaxrs.SimpleFactory;
import org.apache.cxf.jaxrs.Timezone;
+import org.apache.cxf.jaxrs.ext.ParameterHandler;
import org.apache.cxf.jaxrs.impl.HttpHeadersImpl;
import org.apache.cxf.jaxrs.impl.HttpServletResponseFilter;
import org.apache.cxf.jaxrs.impl.MetadataMap;
@@ -88,6 +90,7 @@ import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageImpl;
import org.apache.cxf.transport.http.AbstractHTTPDestination;
import org.easymock.EasyMock;
+
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@@ -815,6 +818,24 @@ public class JAXRSUtilsTest extends Asse
}
@Test
+ public void testLocaleParameter() throws Exception {
+ Message messageImpl = createMessage();
+ ProviderFactory.getInstance(messageImpl).registerUserProvider(
+ new LocaleParameterHandler());
+ Class[] argType = {Locale.class};
+ Method m = Customer.class.getMethod("testLocaleParam", argType);
+
+ messageImpl.put(Message.QUERY_STRING, "p1=en_us");
+ List<Object> params = JAXRSUtils.processParameters(new OperationResourceInfo(m, null),
+ null,
+ messageImpl);
+ assertEquals(1, params.size());
+ Locale l = (Locale)params.get(0);
+ assertEquals("en", l.getLanguage());
+ assertEquals("US", l.getCountry());
+ }
+
+ @Test
public void testConstructorFirstAndParameterHandler() throws Exception {
Message messageImpl = createMessage();
ProviderFactory.getInstance(messageImpl).registerUserProvider(
@@ -1754,4 +1775,13 @@ public class JAXRSUtilsTest extends Asse
e.put(Endpoint.class, endpoint);
return m;
}
+
+ private static class LocaleParameterHandler implements ParameterHandler<Locale> {
+
+ public Locale fromString(String s) {
+ String[] values = s.split("_");
+ return values.length == 2 ? new Locale(values[0], values[1]) : new Locale(s);
+ }
+
+ }
}