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 2012/10/10 13:57:11 UTC
svn commit: r1396553 - in /cxf/branches/2.6.x-fixes: ./
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ systes...
Author: sergeyb
Date: Wed Oct 10 11:57:11 2012
New Revision: 1396553
URL: http://svn.apache.org/viewvc?rev=1396553&view=rev
Log:
Merged revisions 1396302,1396550 via svnmerge from
https://svn.apache.org/repos/asf/cxf/trunk
........
r1396302 | sergeyb | 2012-10-09 21:42:29 +0100 (Tue, 09 Oct 2012) | 1 line
[CXF-4552] Collections of parts annotated with @Multipart are nor processed with form data payloads containing a single file only
........
r1396550 | sergeyb | 2012-10-10 12:40:35 +0100 (Wed, 10 Oct 2012) | 1 line
[CXF-4349] Reverting some of the updates, using a workaround to get xsi:type generated
........
Modified:
cxf/branches/2.6.x-fixes/ (props changed)
cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java
cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java
cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java
Propchange: cxf/branches/2.6.x-fixes/
------------------------------------------------------------------------------
Merged /cxf/trunk:r1396302,1396550
Propchange: cxf/branches/2.6.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.
Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java?rev=1396553&r1=1396552&r2=1396553&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java (original)
+++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java Wed Oct 10 11:57:11 2012
@@ -637,13 +637,9 @@ public class ClientProxyImpl extends Abs
Object body = objs.get(0);
try {
if (bodyIndex != -1) {
- Class<?> paramClass = method.getParameterTypes()[bodyIndex];
Type paramType = method.getGenericParameterTypes()[bodyIndex];
- boolean isAssignable = paramClass.isAssignableFrom(body.getClass());
- writeBody(body, outMessage,
- isAssignable ? paramClass : body.getClass(),
- isAssignable ? paramType : body.getClass(),
+ writeBody(body, outMessage, body.getClass(), paramType,
anns, headers, os);
} else {
writeBody(body, outMessage, body.getClass(), body.getClass(),
Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java?rev=1396553&r1=1396552&r2=1396553&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java (original)
+++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java Wed Oct 10 11:57:11 2012
@@ -207,8 +207,7 @@ public class JAXRSOutInterceptor extends
invoked = ori == null ? null : ori.getAnnotatedMethod() == null
? ori.getMethodToInvoke() : ori.getAnnotatedMethod();
}
-
- Class<?> targetType = getRawResponseClass(invoked, responseObj);
+ Class<?> targetType = getRawResponseClass(responseObj);
Type genericType = getGenericResponseType(invoked, responseObj, targetType);
if (genericType instanceof TypeVariable) {
genericType = InjectionUtils.getSuperType(ori.getClassResourceInfo().getServiceClass(),
@@ -433,14 +432,12 @@ public class JAXRSOutInterceptor extends
}
- private Class<?> getRawResponseClass(Method invoked, Object targetObject) {
+ private Class<?> getRawResponseClass(Object targetObject) {
if (GenericEntity.class.isAssignableFrom(targetObject.getClass())) {
return ((GenericEntity<?>)targetObject).getRawType();
} else {
Class<?> targetClass = targetObject.getClass();
- Class<?> responseClass = invoked == null
- || !invoked.getReturnType().isAssignableFrom(targetClass) ? targetClass : invoked.getReturnType();
- return ClassHelper.getRealClassFromClass(responseClass);
+ return ClassHelper.getRealClassFromClass(targetClass);
}
}
Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java?rev=1396553&r1=1396552&r2=1396553&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java (original)
+++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java Wed Oct 10 11:57:11 2012
@@ -118,7 +118,7 @@ public abstract class AbstractJAXBProvid
private String collectionWrapperName;
private Map<String, String> collectionWrapperMap;
- private List<String> jaxbElementClassNames = Collections.emptyList();
+ private List<String> jaxbElementClassNames;
private Map<String, Object> cProperties;
private Map<String, Object> uProperties;
@@ -226,19 +226,34 @@ public abstract class AbstractJAXBProvid
protected Object convertToJaxbElementIfNeeded(Object obj, Class<?> cls, Type genericType)
throws Exception {
- boolean asJaxbElement = jaxbElementClassNames.contains(cls.getName());
+ Class<?> jaxbElementCls = jaxbElementClassNames == null ? null : getJaxbElementClass(cls);
+ boolean asJaxbElement = jaxbElementCls != null;
if (!asJaxbElement && isXmlRoot(cls)) {
return obj;
}
-
+ if (jaxbElementCls == null) {
+ jaxbElementCls = cls;
+ }
QName name = null;
- String expandedName = jaxbElementClassMap.get(cls.getName());
+ String expandedName = jaxbElementClassMap.get(jaxbElementCls.getName());
if (expandedName != null) {
name = JAXRSUtils.convertStringToQName(expandedName);
} else if (marshalAsJaxbElement || asJaxbElement) {
- name = getJaxbQName(cls, genericType, obj, false);
+ name = getJaxbQName(jaxbElementCls, genericType, obj, false);
}
- return name != null ? new JAXBElement<Object>(name, (Class)cls, null, obj) : obj;
+ return name != null ? new JAXBElement<Object>(name, (Class)jaxbElementCls, null, obj) : obj;
+ }
+
+ protected Class<?> getJaxbElementClass(Class<?> cls) {
+ if (cls == Object.class) {
+ return null;
+ }
+ if (jaxbElementClassNames.contains(cls.getName())) {
+ return cls;
+ } else {
+ return getJaxbElementClass(cls.getSuperclass());
+ }
+
}
public void setCollectionWrapperName(String wName) {
Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java?rev=1396553&r1=1396552&r2=1396553&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java (original)
+++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java Wed Oct 10 11:57:11 2012
@@ -195,25 +195,38 @@ public class MultipartProvider extends A
} else if (Attachment.class.isAssignableFrom(c)) {
return multipart;
} else {
+ boolean isCollection = Collection.class.isAssignableFrom(c);
+ boolean isRecursive = false;
if (mediaTypeSupported(multipart.getContentType())) {
mc.put("org.apache.cxf.multipart.embedded", true);
mc.put("org.apache.cxf.multipart.embedded.ctype", multipart.getContentType());
mc.put("org.apache.cxf.multipart.embedded.input",
multipart.getDataHandler().getInputStream());
anns = new Annotation[]{};
+ isRecursive = true;
}
- MessageBodyReader<T> r =
- mc.getProviders().getMessageBodyReader(c, t, anns, multipart.getContentType());
- if (r != null) {
- InputStream is = multipart.getDataHandler().getInputStream();
- is = decodeIfNeeded(multipart, is);
- return r.readFrom(c, t, anns, multipart.getContentType(), multipart.getHeaders(),
- is);
+ if (isCollection && !isRecursive) {
+ c = convertTypeToClass(t);
+ return Collections.singletonList(fromAttachment(multipart, c, c, anns));
+ } else {
+ MessageBodyReader<T> r =
+ mc.getProviders().getMessageBodyReader(c, t, anns, multipart.getContentType());
+ if (r != null) {
+ InputStream is = multipart.getDataHandler().getInputStream();
+ is = decodeIfNeeded(multipart, is);
+ return r.readFrom(c, t, anns, multipart.getContentType(), multipart.getHeaders(),
+ is);
+ }
}
}
return null;
}
+ @SuppressWarnings("unchecked")
+ private <T> Class<T> convertTypeToClass(Type t) {
+ return (Class<T>)InjectionUtils.getActualType(t, 0);
+ }
+
private InputStream decodeIfNeeded(Attachment multipart, InputStream is) {
String value = multipart.getHeader("Content-Transfer-Encoding");
if ("base64".equals(value) || "quoted-printable".equals(value)) {
Modified: cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java?rev=1396553&r1=1396552&r2=1396553&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java (original)
+++ cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java Wed Oct 10 11:57:11 2012
@@ -126,6 +126,12 @@ public class BookStore {
}
@GET
+ @Path("object")
+ public Object getBookAsObject() {
+ return new Book("Book as Object", 125L);
+ }
+
+ @GET
@Path("/default")
@Produces("application/xml")
public Book getDefaultBook() {
Modified: cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java?rev=1396553&r1=1396552&r2=1396553&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java (original)
+++ cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java Wed Oct 10 11:57:11 2012
@@ -78,7 +78,7 @@ public class JAXRSClientServerBookTest e
public static void startServers() throws Exception {
AbstractResourceInfo.clearAllMaps();
assertTrue("server did not launch correctly",
- launchServer(BookServer.class));
+ launchServer(BookServer.class, true));
createStaticBus();
}
@@ -184,6 +184,16 @@ public class JAXRSClientServerBookTest e
}
@Test
+ public void testGetBookAsObject() throws Exception {
+
+ String endpointAddress =
+ "http://localhost:" + PORT + "/bookstore/object";
+ WebClient wc = WebClient.create(endpointAddress);
+ Book b = wc.get(Book.class);
+ assertEquals("Book as Object", b.getName());
+ }
+
+ @Test
public void testProcessingInstruction() throws Exception {
String base = "http://localhost:" + PORT;
String endpointAddress = base + "/bookstore/name-in-query";
Modified: cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java?rev=1396553&r1=1396552&r2=1396553&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java (original)
+++ cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java Wed Oct 10 11:57:11 2012
@@ -135,6 +135,12 @@ public class JAXRSMultipartTest extends
}
@Test
+ public void testBookJSONFormOneFileWhereManyExpected() throws Exception {
+ String address = "http://localhost:" + PORT + "/bookstore/books/filesform/singlefile";
+ doAddFormBook(address, "attachmentFormJsonFile", 200);
+ }
+
+ @Test
public void testBookJSONFormTwoFilesMixUp() throws Exception {
String address = "http://localhost:" + PORT + "/bookstore/books/filesform/mixup";
doAddFormBook(address, "attachmentFormJsonFiles", 200);
Modified: cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java?rev=1396553&r1=1396552&r2=1396553&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java (original)
+++ cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java Wed Oct 10 11:57:11 2012
@@ -444,6 +444,26 @@ public class MultipartStore {
}
@POST
+ @Path("/books/filesform/singlefile")
+ @Produces("text/xml")
+ @Consumes("multipart/form-data")
+ public Response addBookFilesFormSingleFile(@Multipart("owner") String name,
+ @Multipart("file") List<Book> books)
+ throws Exception {
+ if (books.size() != 1) {
+ throw new WebApplicationException();
+ }
+ Book b = books.get(0);
+ if (!"CXF in Action - 1".equals(b.getName())
+ || !"Larry".equals(name)) {
+ throw new WebApplicationException();
+ }
+ b.setId(124);
+ b.setName("CXF in Action - 2");
+ return Response.ok(b).build();
+ }
+
+ @POST
@Path("/books/filesform/mixup")
@Produces("text/xml")
@Consumes("multipart/form-data")