You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Sergey Beryozkin (JIRA)" <ji...@apache.org> on 2010/11/24 19:27:14 UTC

[jira] Resolved: (CXF-3148) CXF converts collections to arrays during serialization

     [ https://issues.apache.org/jira/browse/CXF-3148?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Sergey Beryozkin resolved CXF-3148.
-----------------------------------

       Resolution: Fixed
    Fix Version/s: 2.4
                   2.3.1
                   2.2.12
         Assignee: Sergey Beryozkin

Fix has been applied, thanks

> CXF converts collections to arrays during serialization
> -------------------------------------------------------
>
>                 Key: CXF-3148
>                 URL: https://issues.apache.org/jira/browse/CXF-3148
>             Project: CXF
>          Issue Type: Bug
>          Components: JAX-RS
>    Affects Versions: 2.3.0
>            Reporter: Dobes Vandermeer
>            Assignee: Sergey Beryozkin
>             Fix For: 2.2.12, 2.3.1, 2.4
>
>
> In org.apache.cxf.jaxrs.provider.JAXBElementProvider.marshalCollection(Class<?>, Object, Class<?>, Type, String, OutputStream, MediaType), it converts the resulting collection into an array before serializing it.
> Unfortunately, this prevents us from using a collection that lazily loads its contents from the DB as it goes, since toArray() would require us to create and return all the results immediately.
> Ideally this method would be changed to operate in a manner that is "friendly" to lazy collections, by only using the collection's iterator (once).
> This version iterates over the collection only once, which would be the most efficient for collections that are backed by out of memory storage:
> {code}
> 	protected void marshalCollection(Class<?> originalCls, Object actualObject, Class<?> actualClass, Type genericType, String encoding,
> 			OutputStream os, MediaType m) throws Exception {
> 		Collection c = originalCls.isArray() ? Arrays.asList((Object[]) actualObject) : (Collection) actualObject;
> 		
> 		Iterator it = c.iterator();
> 		
> 		boolean empty = false == it.hasNext();
> 		Object firstObj = empty?null:it.next();
> 		QName qname = null;
> 		if (firstObj instanceof JAXBElement) {
> 			JAXBElement el = (JAXBElement) firstObj;
> 			qname = el.getName();
> 			actualClass = el.getDeclaredType();
> 		} else {
> 			qname = getCollectionWrapperQName(actualClass, genericType, actualObject, true);
> 		}
> 		if (qname == null) {
> 			String message = new org.apache.cxf.common.i18n.Message("NO_COLLECTION_ROOT", BUNDLE).toString();
> 			throw new WebApplicationException(Response.serverError().entity(message).build());
> 		}
> 		String startTag = null;
> 		String endTag = null;
> 		if (qname.getNamespaceURI().length() > 0) {
> 			startTag = "<ns1:" + qname.getLocalPart() + " xmlns:ns1=\"" + qname.getNamespaceURI() + "\">";
> 			endTag = "</ns1:" + qname.getLocalPart() + ">";
> 		} else {
> 			startTag = "<" + qname.getLocalPart() + ">";
> 			endTag = "</" + qname.getLocalPart() + ">";
> 		}
> 		os.write(startTag.getBytes());
> 		if(!empty) {
> 			marshalCollectionMember(firstObj instanceof JAXBElement ? ((JAXBElement) firstObj).getValue() : firstObj, actualClass, genericType, encoding, os, m, qname
> 					.getNamespaceURI());
> 			while (it.hasNext()) {
> 				Object o = it.next();
> 				marshalCollectionMember(o instanceof JAXBElement ? ((JAXBElement) o).getValue() : o, actualClass, genericType, encoding, os, m, qname
> 						.getNamespaceURI());
> 			}
> 		}
> 		os.write(endTag.getBytes());
> 	}
> {code}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.