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 2014/03/05 12:22:39 UTC
git commit: [CXF-5593] Passing parameter annotations to
ParamConverterprovider
Repository: cxf
Updated Branches:
refs/heads/master 8c6f01701 -> b218997b9
[CXF-5593] Passing parameter annotations to ParamConverterprovider
Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/b218997b
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/b218997b
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/b218997b
Branch: refs/heads/master
Commit: b218997b9bfe0f4a7475e25d2c1efaac0e5bf9e5
Parents: 8c6f017
Author: Sergey Beryozkin <sb...@talend.com>
Authored: Wed Mar 5 11:22:17 2014 +0000
Committer: Sergey Beryozkin <sb...@talend.com>
Committed: Wed Mar 5 11:22:17 2014 +0000
----------------------------------------------------------------------
.../cxf/jaxrs/provider/ProviderFactory.java | 5 +-
.../apache/cxf/jaxrs/utils/InjectionUtils.java | 5 +-
.../cxf/jaxrs/provider/ProviderFactoryTest.java | 2 +-
.../apache/cxf/jaxrs/client/AbstractClient.java | 34 +++----
.../cxf/jaxrs/client/ClientProxyImpl.java | 94 +++++++++++---------
.../org/apache/cxf/jaxrs/client/WebClient.java | 4 +-
6 files changed, 77 insertions(+), 67 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cxf/blob/b218997b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
index 2f180e7..1810743 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
@@ -267,11 +267,12 @@ public abstract class ProviderFactory {
return null;
}
- public <T> ParamConverter<T> createParameterHandler(Class<T> paramType) {
+ public <T> ParamConverter<T> createParameterHandler(Class<T> paramType, Annotation[] anns) {
if (newParamConverters != null) {
+ anns = anns != null ? anns : new Annotation[]{};
for (ParamConverterProvider newParamConverter : newParamConverters) {
- ParamConverter<T> converter = newParamConverter.getConverter(paramType, null, null);
+ ParamConverter<T> converter = newParamConverter.getConverter(paramType, paramType, anns);
if (converter != null) {
return converter;
}
http://git-wip-us.apache.org/repos/asf/cxf/blob/b218997b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
index badeead..de587dd 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
@@ -350,7 +350,7 @@ public final class InjectionUtils {
value = decodeValue(value, decoded, pType);
- Object result = createFromParameterHandler(value, pClass, message);
+ Object result = createFromParameterHandler(value, pClass, paramAnns, message);
if (result != null) {
return pClass.cast(result);
}
@@ -435,11 +435,12 @@ public final class InjectionUtils {
private static <T> T createFromParameterHandler(String value,
Class<T> pClass,
+ Annotation[] anns,
Message message) {
T result = null;
if (message != null) {
ServerProviderFactory pf = ServerProviderFactory.getInstance(message);
- ParamConverter<T> pm = pf.createParameterHandler(pClass);
+ ParamConverter<T> pm = pf.createParameterHandler(pClass, anns);
if (pm != null) {
result = pm.fromString(value);
}
http://git-wip-us.apache.org/repos/asf/cxf/blob/b218997b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java
index 3d1f769..0f5631c 100644
--- a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java
+++ b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java
@@ -272,7 +272,7 @@ public class ProviderFactoryTest extends Assert {
ProviderFactory pf = ServerProviderFactory.getInstance();
ParamConverterProvider h = new CustomerParameterHandler();
pf.registerUserProvider(h);
- ParamConverter<Customer> h2 = pf.createParameterHandler(Customer.class);
+ ParamConverter<Customer> h2 = pf.createParameterHandler(Customer.class, null);
assertSame(h2, h);
}
http://git-wip-us.apache.org/repos/asf/cxf/blob/b218997b/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
----------------------------------------------------------------------
diff --git a/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java b/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
index fd52e37..e57488a 100644
--- a/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
+++ b/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
@@ -116,7 +116,7 @@ public abstract class AbstractClient implements Client {
* {@inheritDoc}
*/
public Client query(String name, Object ...values) {
- addMatrixQueryParamsToBuilder(getCurrentBuilder(), name, ParameterType.QUERY, values);
+ addMatrixQueryParamsToBuilder(getCurrentBuilder(), name, ParameterType.QUERY, null, values);
return this;
}
@@ -131,10 +131,10 @@ public abstract class AbstractClient implements Client {
if (values.length > 1) {
throw new IllegalArgumentException("Content-Type can have a single value only");
}
- type(convertParamValue(values[0]));
+ type(convertParamValue(values[0], null));
} else {
for (Object o : values) {
- possiblyAddHeader(name, convertParamValue(o));
+ possiblyAddHeader(name, convertParamValue(o, null));
}
}
return this;
@@ -651,6 +651,7 @@ public abstract class AbstractClient implements Client {
protected void addMatrixQueryParamsToBuilder(UriBuilder ub,
String paramName,
ParameterType pt,
+ Annotation[] anns,
Object... pValues) {
if (pt != ParameterType.MATRIX && pt != ParameterType.QUERY) {
throw new IllegalArgumentException("This method currently deal "
@@ -663,10 +664,10 @@ public abstract class AbstractClient implements Client {
Collection<?> c = pValue.getClass().isArray()
? Arrays.asList((Object[]) pValue) : (Collection<?>) pValue;
for (Iterator<?> it = c.iterator(); it.hasNext();) {
- convertMatrixOrQueryToBuilder(ub, paramName, it.next(), pt);
+ convertMatrixOrQueryToBuilder(ub, paramName, it.next(), pt, anns);
}
} else {
- convertMatrixOrQueryToBuilder(ub, paramName, pValue, pt);
+ convertMatrixOrQueryToBuilder(ub, paramName, pValue, pt, anns);
}
}
} else {
@@ -678,7 +679,7 @@ public abstract class AbstractClient implements Client {
InjectionUtils.extractValuesFromBean(pValue, "");
for (Map.Entry<String, List<Object>> entry : values.entrySet()) {
for (Object v : entry.getValue()) {
- convertMatrixOrQueryToBuilder(ub, entry.getKey(), v, pt);
+ convertMatrixOrQueryToBuilder(ub, entry.getKey(), v, pt, anns);
}
}
}
@@ -687,8 +688,9 @@ public abstract class AbstractClient implements Client {
private void convertMatrixOrQueryToBuilder(UriBuilder ub,
String paramName,
Object pValue,
- ParameterType pt) {
- Object convertedValue = convertParamValue(pValue);
+ ParameterType pt,
+ Annotation[] anns) {
+ Object convertedValue = convertParamValue(pValue, anns);
addMatrixOrQueryToBuilder(ub, paramName, pt, convertedValue);
}
@@ -704,24 +706,16 @@ public abstract class AbstractClient implements Client {
}
- protected String convertParamValue(Object pValue) {
+ protected String convertParamValue(Object pValue, Annotation[] anns) {
if (pValue == null) {
return null;
}
- Class<?> pClass = pValue.getClass();
- if (pClass == String.class || pClass.isPrimitive()) {
- return pValue.toString();
- }
-
- // A little scope for some optimization exists, particularly,
- // it is feasible a complex object may need to be repeatedly converted
- // so we can keep a map of ParamConverter on the bus, that said
- // it seems an over-optimization at this stage, it's a 5% case;
- // typical requests have a limited number of simple URI parameters
ProviderFactory pf = ClientProviderFactory.getInstance(cfg.getBus());
if (pf != null) {
+ Class<?> pClass = pValue.getClass();
+
@SuppressWarnings("unchecked")
- ParamConverter<Object> prov = (ParamConverter<Object>)pf.createParameterHandler(pClass);
+ ParamConverter<Object> prov = (ParamConverter<Object>)pf.createParameterHandler(pClass, anns);
if (prov != null) {
return prov.toString(pValue);
}
http://git-wip-us.apache.org/repos/asf/cxf/blob/b218997b/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
----------------------------------------------------------------------
diff --git a/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java b/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
index f373d62..62a4dbd 100644
--- a/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
+++ b/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
@@ -160,11 +160,11 @@ public class ClientProxyImpl extends AbstractClient implements
reportInvalidResourceMethod(m, "INVALID_RESOURCE_METHOD");
}
- MultivaluedMap<ParameterType, Parameter> types = getParametersInfo(params, ori);
+ MultivaluedMap<ParameterType, Parameter> types = getParametersInfo(m, params, ori);
List<Parameter> beanParamsList = getParameters(types, ParameterType.BEAN);
- List<Object> pathParams = getPathParamValues(types, beanParamsList, params, ori);
+ List<Object> pathParams = getPathParamValues(m, params, types, beanParamsList, ori);
int bodyIndex = getBodyIndex(types, ori);
@@ -174,15 +174,15 @@ public class ClientProxyImpl extends AbstractClient implements
}
addNonEmptyPath(builder, ori.getURITemplate().getValue());
- handleMatrixes(types, beanParamsList, params, builder);
- handleQueries(types, beanParamsList, params, builder);
+ handleMatrixes(m, params, types, beanParamsList, builder);
+ handleQueries(m, params, types, beanParamsList, builder);
URI uri = builder.buildFromEncoded(pathParams.toArray()).normalize();
MultivaluedMap<String, String> headers = getHeaders();
MultivaluedMap<String, String> paramHeaders = new MetadataMap<String, String>();
- handleHeaders(paramHeaders, beanParamsList, types, params);
- handleCookies(paramHeaders, beanParamsList, types, params);
+ handleHeaders(m, params, paramHeaders, beanParamsList, types);
+ handleCookies(m, params, paramHeaders, beanParamsList, types);
if (ori.isSubResourceLocator()) {
ClassResourceInfo subCri = cri.getSubResource(m.getReturnType(), m.getReturnType());
@@ -228,7 +228,7 @@ public class ClientProxyImpl extends AbstractClient implements
}
}
- private static MultivaluedMap<ParameterType, Parameter> getParametersInfo(
+ private static MultivaluedMap<ParameterType, Parameter> getParametersInfo(Method m,
Object[] params, OperationResourceInfo ori) {
MultivaluedMap<ParameterType, Parameter> map =
new MetadataMap<ParameterType, Parameter>();
@@ -240,7 +240,7 @@ public class ClientProxyImpl extends AbstractClient implements
int requestBodyParam = 0;
int multipartParam = 0;
for (Parameter p : parameters) {
- if (isIgnorableParameter(ori, p)) {
+ if (isIgnorableParameter(m, p)) {
continue;
}
if (p.getType() == ParameterType.REQUEST_BODY) {
@@ -263,16 +263,13 @@ public class ClientProxyImpl extends AbstractClient implements
return map;
}
- private static boolean isIgnorableParameter(OperationResourceInfo ori, Parameter p) {
+ private static boolean isIgnorableParameter(Method m, Parameter p) {
if (p.getType() == ParameterType.CONTEXT) {
return true;
}
- if (p.getType() == ParameterType.REQUEST_BODY) {
- Method m = ori.getAnnotatedMethod();
- if (m != null
- && m.getParameterTypes()[p.getIndex()] == AsyncResponse.class) {
- return true;
- }
+ if (p.getType() == ParameterType.REQUEST_BODY
+ && m.getParameterTypes()[p.getIndex()] == AsyncResponse.class) {
+ return true;
}
return false;
}
@@ -384,9 +381,10 @@ public class ClientProxyImpl extends AbstractClient implements
return types;
}
- private List<Object> getPathParamValues(MultivaluedMap<ParameterType, Parameter> map,
- List<Parameter> beanParams,
+ private List<Object> getPathParamValues(Method m,
Object[] params,
+ MultivaluedMap<ParameterType, Parameter> map,
+ List<Parameter> beanParams,
OperationResourceInfo ori) {
List<Object> list = new LinkedList<Object>();
if (isRoot) {
@@ -416,9 +414,9 @@ public class ClientProxyImpl extends AbstractClient implements
for (String varName : methodVars) {
Parameter p = paramsMap.remove(varName);
if (p != null) {
- list.add(convertParamValue(params[p.getIndex()]));
+ list.add(convertParamValue(params[p.getIndex()], getParamAnnotations(m, p)));
} else if (beanParamValues.containsKey(varName)) {
- list.add(convertParamValue(beanParamValues.get(varName)));
+ list.add(convertParamValue(beanParamValues.get(varName), null));
}
}
@@ -428,7 +426,7 @@ public class ClientProxyImpl extends AbstractClient implements
for (Iterator<String> it = valuesMap.keySet().iterator(); it.hasNext(); index++) {
if (it.next().equals(p.getName()) && index < list.size()) {
list.remove(index);
- list.add(index, convertParamValue(params[p.getIndex()]));
+ list.add(index, convertParamValue(params[p.getIndex()], null));
break;
}
}
@@ -439,27 +437,34 @@ public class ClientProxyImpl extends AbstractClient implements
return list;
}
+ private static Annotation[] getParamAnnotations(Method m, Parameter p) {
+ return m.getParameterAnnotations()[p.getIndex()];
+ }
+
@SuppressWarnings("unchecked")
private static List<Parameter> getParameters(MultivaluedMap<ParameterType, Parameter> map,
ParameterType key) {
return map.get(key) == null ? Collections.EMPTY_LIST : map.get(key);
}
- private void handleQueries(MultivaluedMap<ParameterType, Parameter> map,
- List<Parameter> beanParams,
+ private void handleQueries(Method m,
Object[] params,
+ MultivaluedMap<ParameterType, Parameter> map,
+ List<Parameter> beanParams,
UriBuilder ub) {
List<Parameter> qs = getParameters(map, ParameterType.QUERY);
for (Parameter p : qs) {
if (params[p.getIndex()] != null) {
- addMatrixQueryParamsToBuilder(ub, p.getName(), ParameterType.QUERY, params[p.getIndex()]);
+ addMatrixQueryParamsToBuilder(ub, p.getName(), ParameterType.QUERY,
+ getParamAnnotations(m, p), params[p.getIndex()]);
}
}
for (Parameter p : beanParams) {
Map<String, Object> values = getValuesFromBeanParam(params[p.getIndex()], QueryParam.class);
for (Map.Entry<String, Object> entry : values.entrySet()) {
if (entry.getValue() != null) {
- addMatrixQueryParamsToBuilder(ub, entry.getKey(), ParameterType.QUERY, entry.getValue());
+ addMatrixQueryParamsToBuilder(ub, entry.getKey(), ParameterType.QUERY,
+ getParamAnnotations(m, p), entry.getValue());
}
}
}
@@ -485,21 +490,24 @@ public class ClientProxyImpl extends AbstractClient implements
return values;
}
- private void handleMatrixes(MultivaluedMap<ParameterType, Parameter> map,
- List<Parameter> beanParams,
+ private void handleMatrixes(Method m,
Object[] params,
+ MultivaluedMap<ParameterType, Parameter> map,
+ List<Parameter> beanParams,
UriBuilder ub) {
List<Parameter> mx = getParameters(map, ParameterType.MATRIX);
for (Parameter p : mx) {
if (params[p.getIndex()] != null) {
- addMatrixQueryParamsToBuilder(ub, p.getName(), ParameterType.MATRIX, params[p.getIndex()]);
+ addMatrixQueryParamsToBuilder(ub, p.getName(), ParameterType.MATRIX,
+ getParamAnnotations(m, p), params[p.getIndex()]);
}
}
for (Parameter p : beanParams) {
Map<String, Object> values = getValuesFromBeanParam(params[p.getIndex()], MatrixParam.class);
for (Map.Entry<String, Object> entry : values.entrySet()) {
if (entry.getValue() != null) {
- addMatrixQueryParamsToBuilder(ub, entry.getKey(), ParameterType.MATRIX, entry.getValue());
+ addMatrixQueryParamsToBuilder(ub, entry.getKey(), ParameterType.MATRIX,
+ getParamAnnotations(m, p), entry.getValue());
}
}
}
@@ -531,10 +539,11 @@ public class ClientProxyImpl extends AbstractClient implements
Collection<?> c = pValue.getClass().isArray()
? Arrays.asList((Object[]) pValue) : (Collection<?>) pValue;
for (Iterator<?> it = c.iterator(); it.hasNext();) {
- FormUtils.addPropertyToForm(form, name, convertParamValue(it.next()));
+ FormUtils.addPropertyToForm(form, name, convertParamValue(it.next(), null));
}
} else {
- FormUtils.addPropertyToForm(form, name, name.isEmpty() ? pValue : convertParamValue(pValue));
+ FormUtils.addPropertyToForm(form, name, name.isEmpty()
+ ? pValue : convertParamValue(pValue, null));
}
}
@@ -556,21 +565,23 @@ public class ClientProxyImpl extends AbstractClient implements
return atts;
}
- private void handleHeaders(MultivaluedMap<String, String> headers,
+ private void handleHeaders(Method m,
+ Object[] params,
+ MultivaluedMap<String, String> headers,
List<Parameter> beanParams,
- MultivaluedMap<ParameterType, Parameter> map,
- Object[] params) {
+ MultivaluedMap<ParameterType, Parameter> map) {
List<Parameter> hs = getParameters(map, ParameterType.HEADER);
for (Parameter p : hs) {
if (params[p.getIndex()] != null) {
- headers.add(p.getName(), convertParamValue(params[p.getIndex()]));
+ headers.add(p.getName(), convertParamValue(params[p.getIndex()], getParamAnnotations(m, p)));
}
}
for (Parameter p : beanParams) {
Map<String, Object> values = getValuesFromBeanParam(params[p.getIndex()], HeaderParam.class);
for (Map.Entry<String, Object> entry : values.entrySet()) {
if (entry.getValue() != null) {
- headers.add(entry.getKey(), convertParamValue(entry.getValue()));
+ headers.add(entry.getKey(),
+ convertParamValue(entry.getValue(), getParamAnnotations(m, p)));
}
}
}
@@ -582,15 +593,17 @@ public class ClientProxyImpl extends AbstractClient implements
aMethod.getParameterAnnotations()[index], Multipart.class) : null;
}
- private void handleCookies(MultivaluedMap<String, String> headers,
+ private void handleCookies(Method m,
+ Object[] params,
+ MultivaluedMap<String, String> headers,
List<Parameter> beanParams,
- MultivaluedMap<ParameterType, Parameter> map,
- Object[] params) {
+ MultivaluedMap<ParameterType, Parameter> map) {
List<Parameter> cs = getParameters(map, ParameterType.COOKIE);
for (Parameter p : cs) {
if (params[p.getIndex()] != null) {
headers.add(HttpHeaders.COOKIE,
- p.getName() + '=' + convertParamValue(params[p.getIndex()].toString()));
+ p.getName() + '='
+ + convertParamValue(params[p.getIndex()].toString(), getParamAnnotations(m, p)));
}
}
for (Parameter p : beanParams) {
@@ -598,7 +611,8 @@ public class ClientProxyImpl extends AbstractClient implements
for (Map.Entry<String, Object> entry : values.entrySet()) {
if (entry.getValue() != null) {
headers.add(HttpHeaders.COOKIE,
- entry.getKey() + "=" + convertParamValue(entry.getValue()));
+ entry.getKey() + "="
+ + convertParamValue(entry.getValue(), getParamAnnotations(m, p)));
}
}
}
http://git-wip-us.apache.org/repos/asf/cxf/blob/b218997b/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
----------------------------------------------------------------------
diff --git a/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java b/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
index 3560cd8..9ef890e 100644
--- a/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
+++ b/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
@@ -614,7 +614,7 @@ public class WebClient extends AbstractClient {
* @return updated WebClient
*/
public WebClient path(Object path) {
- getCurrentBuilder().path(convertParamValue(path));
+ getCurrentBuilder().path(convertParamValue(path, null));
return this;
}
@@ -643,7 +643,7 @@ public class WebClient extends AbstractClient {
* @return updated WebClient
*/
public WebClient matrix(String name, Object ...values) {
- addMatrixQueryParamsToBuilder(getCurrentBuilder(), name, ParameterType.MATRIX, values);
+ addMatrixQueryParamsToBuilder(getCurrentBuilder(), name, ParameterType.MATRIX, null, values);
return this;
}