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 2013/09/02 13:52:50 UTC
svn commit: r1519399 - in /cxf/branches/2.7.x-fixes: ./
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/
systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/
Author: sergeyb
Date: Mon Sep 2 11:52:50 2013
New Revision: 1519399
URL: http://svn.apache.org/r1519399
Log:
Merged revisions 1519395 via svnmerge from
https://svn.apache.org/repos/asf/cxf/trunk
........
r1519395 | sergeyb | 2013-09-02 12:31:04 +0100 (Mon, 02 Sep 2013) | 1 line
[CXF-5247] Support for BeanParam in rs client proxies
........
Modified:
cxf/branches/2.7.x-fixes/ (props changed)
cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
Propchange: cxf/branches/2.7.x-fixes/
------------------------------------------------------------------------------
Merged /cxf/trunk:r1519395
Propchange: cxf/branches/2.7.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.
Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java?rev=1519399&r1=1519398&r2=1519399&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java (original)
+++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java Mon Sep 2 11:52:50 2013
@@ -29,6 +29,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
@@ -37,6 +38,12 @@ import java.util.Map;
import java.util.ResourceBundle;
import java.util.logging.Logger;
+import javax.ws.rs.CookieParam;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.MatrixParam;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.client.ClientException;
import javax.ws.rs.container.AsyncResponse;
@@ -149,7 +156,9 @@ public class ClientProxyImpl extends Abs
}
MultivaluedMap<ParameterType, Parameter> types = getParametersInfo(params, ori);
- List<Object> pathParams = getPathParamValues(types, params, ori);
+ List<Parameter> beanParamsList = getParameters(types, ParameterType.BEAN);
+
+ List<Object> pathParams = getPathParamValues(types, beanParamsList, params, ori);
int bodyIndex = getBodyIndex(types, ori);
@@ -159,15 +168,15 @@ public class ClientProxyImpl extends Abs
}
addNonEmptyPath(builder, ori.getURITemplate().getValue());
- handleMatrixes(types, params, builder);
- handleQueries(types, params, builder);
+ handleMatrixes(types, beanParamsList, params, builder);
+ handleQueries(types, beanParamsList, params, builder);
URI uri = builder.buildFromEncoded(pathParams.toArray()).normalize();
MultivaluedMap<String, String> headers = getHeaders();
MultivaluedMap<String, String> paramHeaders = new MetadataMap<String, String>();
- handleHeaders(paramHeaders, types, params);
- handleCookies(paramHeaders, types, params);
+ handleHeaders(paramHeaders, beanParamsList, types, params);
+ handleCookies(paramHeaders, beanParamsList, types, params);
if (ori.isSubResourceLocator()) {
ClassResourceInfo subCri = cri.getSubResource(m.getReturnType(), m.getReturnType());
@@ -198,7 +207,7 @@ public class ClientProxyImpl extends Abs
if (bodyIndex != -1) {
body = params[bodyIndex];
} else if (types.containsKey(ParameterType.FORM)) {
- body = handleForm(types, params);
+ body = handleForm(types, beanParamsList, params);
} else if (types.containsKey(ParameterType.REQUEST_BODY)) {
body = handleMultipart(types, ori, params);
}
@@ -370,6 +379,7 @@ public class ClientProxyImpl extends Abs
}
private List<Object> getPathParamValues(MultivaluedMap<ParameterType, Parameter> map,
+ List<Parameter> beanParams,
Object[] params,
OperationResourceInfo ori) {
List<Object> list = new LinkedList<Object>();
@@ -392,10 +402,17 @@ public class ClientProxyImpl extends Abs
}
}
+ Map<String, Object> beanParamValues = new HashMap<String, Object>(beanParams.size());
+ for (Parameter p : beanParams) {
+ beanParamValues.putAll(getValuesFromBeanParam(params[p.getIndex()], PathParam.class));
+ }
+
for (String varName : methodVars) {
Parameter p = paramsMap.remove(varName);
if (p != null) {
list.add(convertParamValue(params[p.getIndex()]));
+ } else if (beanParamValues.containsKey(varName)) {
+ list.add(convertParamValue(beanParamValues.get(varName)));
}
}
@@ -421,18 +438,47 @@ public class ClientProxyImpl extends Abs
return map.get(key) == null ? Collections.EMPTY_LIST : map.get(key);
}
- private void handleQueries(MultivaluedMap<ParameterType, Parameter> map,
- Object[] params,
- UriBuilder ub) {
+ private void handleQueries(MultivaluedMap<ParameterType, Parameter> map,
+ List<Parameter> beanParams,
+ Object[] params,
+ 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()]);
}
}
+ 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());
+ }
+ }
+ }
}
- private void handleMatrixes(MultivaluedMap<ParameterType, Parameter> map, Object[] params,
+ private Map<String, Object> getValuesFromBeanParam(Object bean, Class<? extends Annotation> annClass) {
+ Map<String, Object> values = new HashMap<String, Object>();
+
+ for (Method m : bean.getClass().getMethods()) {
+ if (m.getAnnotation(annClass) != null) {
+ try {
+ String propertyName = m.getName().substring(3);
+ Method getter = bean.getClass().getMethod("get" + propertyName, new Class[]{});
+ Object value = getter.invoke(bean, new Object[]{});
+ values.put(propertyName.toLowerCase(), value);
+ } catch (Throwable t) {
+ // ignore
+ }
+ }
+ }
+ return values;
+ }
+
+ private void handleMatrixes(MultivaluedMap<ParameterType, Parameter> map,
+ List<Parameter> beanParams,
+ Object[] params,
UriBuilder ub) {
List<Parameter> mx = getParameters(map, ParameterType.MATRIX);
for (Parameter p : mx) {
@@ -440,34 +486,54 @@ public class ClientProxyImpl extends Abs
addMatrixQueryParamsToBuilder(ub, p.getName(), ParameterType.MATRIX, 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());
+ }
+ }
+ }
}
private MultivaluedMap<String, String> handleForm(MultivaluedMap<ParameterType, Parameter> map,
+ List<Parameter> beanParams,
Object[] params) {
MultivaluedMap<String, String> form = new MetadataMap<String, String>();
List<Parameter> fm = getParameters(map, ParameterType.FORM);
for (Parameter p : fm) {
- Object pValue = params[p.getIndex()];
- if (pValue != null) {
- if (InjectionUtils.isSupportedCollectionOrArray(pValue.getClass())) {
- Collection<?> c = pValue.getClass().isArray()
- ? Arrays.asList((Object[]) pValue) : (Collection<?>) pValue;
- for (Iterator<?> it = c.iterator(); it.hasNext();) {
- FormUtils.addPropertyToForm(form, p.getName(), convertParamValue(it.next()));
- }
- } else {
- String name = p.getName();
- FormUtils.addPropertyToForm(form, name, name.isEmpty() ? pValue : convertParamValue(pValue));
- }
-
+ addFormValue(form, p.getName(), params[p.getIndex()]);
+ }
+ for (Parameter p : beanParams) {
+ Map<String, Object> values = getValuesFromBeanParam(params[p.getIndex()], FormParam.class);
+ for (Map.Entry<String, Object> entry : values.entrySet()) {
+ addFormValue(form, entry.getKey(), entry.getValue());
}
}
return form;
}
+ private void addFormValue(MultivaluedMap<String, String> form, String name, Object pValue) {
+ if (pValue != null) {
+ if (InjectionUtils.isSupportedCollectionOrArray(pValue.getClass())) {
+ 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()));
+ }
+ } else {
+ FormUtils.addPropertyToForm(form, name, name.isEmpty() ? pValue : convertParamValue(pValue));
+ }
+
+ }
+
+ }
+
+
+
private List<Attachment> handleMultipart(MultivaluedMap<ParameterType, Parameter> map,
OperationResourceInfo ori,
Object[] params) {
@@ -484,13 +550,23 @@ public class ClientProxyImpl extends Abs
}
private void handleHeaders(MultivaluedMap<String, String> headers,
- MultivaluedMap<ParameterType, Parameter> map, Object[] params) {
+ List<Parameter> beanParams,
+ MultivaluedMap<ParameterType, Parameter> map,
+ Object[] params) {
List<Parameter> hs = getParameters(map, ParameterType.HEADER);
for (Parameter p : hs) {
if (params[p.getIndex()] != null) {
headers.add(p.getName(), convertParamValue(params[p.getIndex()]));
}
}
+ 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()));
+ }
+ }
+ }
}
private static Multipart getMultipart(OperationResourceInfo ori, int index) {
@@ -500,7 +576,9 @@ public class ClientProxyImpl extends Abs
}
private void handleCookies(MultivaluedMap<String, String> headers,
- MultivaluedMap<ParameterType, Parameter> map, Object[] params) {
+ List<Parameter> beanParams,
+ MultivaluedMap<ParameterType, Parameter> map,
+ Object[] params) {
List<Parameter> cs = getParameters(map, ParameterType.COOKIE);
for (Parameter p : cs) {
if (params[p.getIndex()] != null) {
@@ -509,6 +587,15 @@ public class ClientProxyImpl extends Abs
+ convertParamValue(params[p.getIndex()].toString()));
}
}
+ for (Parameter p : beanParams) {
+ Map<String, Object> values = getValuesFromBeanParam(params[p.getIndex()], CookieParam.class);
+ for (Map.Entry<String, Object> entry : values.entrySet()) {
+ if (entry.getValue() != null) {
+ headers.add(HttpHeaders.COOKIE,
+ entry.getKey() + "=" + convertParamValue(entry.getValue()));
+ }
+ }
+ }
}
private Object doChainedInvocation(URI uri,
Modified: cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java?rev=1519399&r1=1519398&r2=1519399&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java (original)
+++ cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java Mon Sep 2 11:52:50 2013
@@ -235,11 +235,11 @@ public class BookStore {
}
@GET
- @Path("/beanparam")
+ @Path("/beanparam/{id}")
@Produces("application/xml")
public Book getBeanParamBook(@BeanParam BookBean bean) {
- long id = bean.getId() + bean.getId1();
+ long id = bean.getId() + bean.getId2() + bean.getId3();
return books.get(id);
}
@@ -251,7 +251,7 @@ public class BookStore {
}
@GET
- @Path("/beanparam2")
+ @Path("/beanparam2/{id}")
@Produces("application/xml")
public Book getBeanParamBook2() {
return getBeanParamBook(theBookBean);
@@ -1470,28 +1470,40 @@ public class BookStore {
public static class BookBean {
private long id;
- private long id1;
+ private long id2;
+ private long id3;
public long getId() {
return id;
}
- @QueryParam("id")
+ @PathParam("id")
public void setId(long id) {
this.id = id;
}
+ public long getId2() {
+ return id2;
+ }
+
+ @QueryParam("id2")
+ public void setId2(long id2) {
+ this.id2 = id2;
+ }
+
@Context
public void setUriInfo(UriInfo ui) {
- String id1Value = ui.getQueryParameters().getFirst("id1");
- if (id1Value != null) {
- this.id1 = Long.valueOf(id1Value);
+ String id3Value = ui.getQueryParameters().getFirst("id3");
+ if (id3Value != null) {
+ this.id3 = Long.valueOf(id3Value);
}
}
- public long getId1() {
- return id1;
+ public long getId3() {
+ return id3;
}
+
+
}
public static class BookNotReturnedException extends RuntimeException {
Modified: cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java?rev=1519399&r1=1519398&r2=1519399&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java (original)
+++ cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java Mon Sep 2 11:52:50 2013
@@ -239,8 +239,9 @@ public class JAXRSClientServerBookTest e
private void doTestUseParamBeanWebClient(String address) {
WebClient wc = WebClient.create(address);
- wc.query("id", "120");
- wc.query("id1", "3");
+ wc.path("100");
+ wc.query("id2", "20");
+ wc.query("id3", "3");
Book book = wc.get(Book.class);
assertEquals(123L, book.getId());
}
@@ -304,6 +305,18 @@ public class JAXRSClientServerBookTest e
}
@Test
+ public void testProxyBeanParam() throws Exception {
+ BookStore store = JAXRSClientFactory.create("http://localhost:" + PORT, BookStore.class);
+ BookStore.BookBean bean = new BookStore.BookBean();
+ bean.setId(100L);
+ bean.setId2(23L);
+
+ Book book = store.getBeanParamBook(bean);
+ assertEquals(123L, book.getId());
+
+ }
+
+ @Test
public void testGetBookWithCustomHeader() throws Exception {
String endpointAddress =