Return-Path: X-Original-To: apmail-cxf-commits-archive@www.apache.org Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id CE780102C2 for ; Wed, 5 Mar 2014 11:22:42 +0000 (UTC) Received: (qmail 41789 invoked by uid 500); 5 Mar 2014 11:22:41 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 41750 invoked by uid 500); 5 Mar 2014 11:22:39 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 41743 invoked by uid 99); 5 Mar 2014 11:22:39 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 05 Mar 2014 11:22:39 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 17E18936CFB; Wed, 5 Mar 2014 11:22:39 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: sergeyb@apache.org To: commits@cxf.apache.org Message-Id: <14c98ee7bab146b9824c81e738a044fe@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: git commit: [CXF-5593] Passing parameter annotations to ParamConverterprovider Date: Wed, 5 Mar 2014 11:22:39 +0000 (UTC) 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 Authored: Wed Mar 5 11:22:17 2014 +0000 Committer: Sergey Beryozkin 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 ParamConverter createParameterHandler(Class paramType) { + public ParamConverter createParameterHandler(Class paramType, Annotation[] anns) { if (newParamConverters != null) { + anns = anns != null ? anns : new Annotation[]{}; for (ParamConverterProvider newParamConverter : newParamConverters) { - ParamConverter converter = newParamConverter.getConverter(paramType, null, null); + ParamConverter 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 createFromParameterHandler(String value, Class pClass, + Annotation[] anns, Message message) { T result = null; if (message != null) { ServerProviderFactory pf = ServerProviderFactory.getInstance(message); - ParamConverter pm = pf.createParameterHandler(pClass); + ParamConverter 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 h2 = pf.createParameterHandler(Customer.class); + ParamConverter 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> 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 prov = (ParamConverter)pf.createParameterHandler(pClass); + ParamConverter prov = (ParamConverter)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 types = getParametersInfo(params, ori); + MultivaluedMap types = getParametersInfo(m, params, ori); List beanParamsList = getParameters(types, ParameterType.BEAN); - List pathParams = getPathParamValues(types, beanParamsList, params, ori); + List 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 headers = getHeaders(); MultivaluedMap paramHeaders = new MetadataMap(); - 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 getParametersInfo( + private static MultivaluedMap getParametersInfo(Method m, Object[] params, OperationResourceInfo ori) { MultivaluedMap map = new MetadataMap(); @@ -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 getPathParamValues(MultivaluedMap map, - List beanParams, + private List getPathParamValues(Method m, Object[] params, + MultivaluedMap map, + List beanParams, OperationResourceInfo ori) { List list = new LinkedList(); 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 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 getParameters(MultivaluedMap map, ParameterType key) { return map.get(key) == null ? Collections.EMPTY_LIST : map.get(key); } - private void handleQueries(MultivaluedMap map, - List beanParams, + private void handleQueries(Method m, Object[] params, + MultivaluedMap map, + List beanParams, UriBuilder ub) { List 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 values = getValuesFromBeanParam(params[p.getIndex()], QueryParam.class); for (Map.Entry 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 map, - List beanParams, + private void handleMatrixes(Method m, Object[] params, + MultivaluedMap map, + List beanParams, UriBuilder ub) { List 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 values = getValuesFromBeanParam(params[p.getIndex()], MatrixParam.class); for (Map.Entry 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 headers, + private void handleHeaders(Method m, + Object[] params, + MultivaluedMap headers, List beanParams, - MultivaluedMap map, - Object[] params) { + MultivaluedMap map) { List 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 values = getValuesFromBeanParam(params[p.getIndex()], HeaderParam.class); for (Map.Entry 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 headers, + private void handleCookies(Method m, + Object[] params, + MultivaluedMap headers, List beanParams, - MultivaluedMap map, - Object[] params) { + MultivaluedMap map) { List 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 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; }