You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2009/12/16 22:48:49 UTC
svn commit: r891440 - in /cxf/trunk/rt:
databinding/aegis/src/main/java/org/apache/cxf/aegis/
databinding/aegis/src/main/java/org/apache/cxf/aegis/type/
databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/
databinding/aegis/src/main/java/or...
Author: dkulp
Date: Wed Dec 16 21:48:48 2009
New Revision: 891440
URL: http://svn.apache.org/viewvc?rev=891440&view=rev
Log:
[CXF-2579] Add support for flattened collections to aegis
Added:
cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/XmlFlattenedArray.java
- copied, changed from r891393, cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayServiceInterface.java
cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/BeanWithFlatCollection.java
- copied, changed from r891393, cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayServiceInterface.java
Modified:
cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/AegisXMLStreamDataReader.java
cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/AbstractTypeCreator.java
cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ArrayType.java
cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java
cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/AnnotationReader.java
cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/Java5TypeCreator.java
cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayService.java
cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayServiceInterface.java
cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayTest.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/AegisJSONProviderTest.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/resources/Tags.java
Modified: cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/AegisXMLStreamDataReader.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/AegisXMLStreamDataReader.java?rev=891440&r1=891439&r2=891440&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/AegisXMLStreamDataReader.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/AegisXMLStreamDataReader.java Wed Dec 16 21:48:48 2009
@@ -87,7 +87,7 @@
ArrayType arrayType, QName concreteName) throws Exception {
setupReaderPosition(input);
ElementReader elReader = new ElementReader(input);
- return arrayType.readObject(elReader, concreteName, context);
+ return arrayType.readObject(elReader, concreteName, context, true);
}
}
Modified: cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/AbstractTypeCreator.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/AbstractTypeCreator.java?rev=891440&r1=891439&r2=891440&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/AbstractTypeCreator.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/AbstractTypeCreator.java Wed Dec 16 21:48:48 2009
@@ -257,7 +257,7 @@
if (info.getMaxOccurs() != -1) {
type.setMaxOccurs(info.getMaxOccurs());
}
-
+
type.setFlat(info.isFlat());
return type;
Modified: cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ArrayType.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ArrayType.java?rev=891440&r1=891439&r2=891440&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ArrayType.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ArrayType.java Wed Dec 16 21:48:48 2009
@@ -57,11 +57,15 @@
public ArrayType() {
}
- public Object readObject(MessageReader reader, QName flatElementName, Context context)
+ public Object readObject(MessageReader reader, QName flatElementName,
+ Context context, boolean asArray)
throws DatabindingException {
try {
Collection values = readCollection(reader, flatElementName, context);
- return makeArray(getComponentType().getTypeClass(), values);
+ if (asArray) {
+ return makeArray(getComponentType().getTypeClass(), values);
+ }
+ return values;
} catch (IllegalArgumentException e) {
throw new DatabindingException("Illegal argument.", e);
}
@@ -72,7 +76,7 @@
*/
@Override
public Object readObject(MessageReader reader, Context context) throws DatabindingException {
- return readObject(reader, null, context);
+ return readObject(reader, null, context, true);
}
protected Collection<Object> createCollection() {
@@ -222,6 +226,10 @@
if (values == null) {
return;
}
+ if (values instanceof Collection) {
+ Collection c = (Collection)values;
+ values = c.toArray();
+ }
AegisType type = getComponentType();
if (type == null) {
Modified: cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java?rev=891440&r1=891439&r2=891440&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java Wed Dec 16 21:48:48 2009
@@ -27,6 +27,7 @@
import java.lang.reflect.Proxy;
import java.lang.reflect.Type;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
import javax.xml.namespace.QName;
@@ -43,6 +44,7 @@
import org.apache.cxf.aegis.xml.MessageWriter;
import org.apache.cxf.common.classloader.ClassLoaderUtils;
import org.apache.cxf.common.xmlschema.XmlSchemaUtils;
+import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.ws.commons.schema.XmlSchema;
import org.apache.ws.commons.schema.XmlSchemaAny;
@@ -164,7 +166,9 @@
Object writeObj;
if (type.isFlatArray()) {
ArrayType aType = (ArrayType) type;
- writeObj = aType.readObject(childReader, name, context);
+ PropertyDescriptor desc = inf.getPropertyDescriptorFromMappedName(name);
+ boolean isList = List.class.isAssignableFrom(desc.getPropertyType());
+ writeObj = aType.readObject(childReader, name, context, !isList);
} else {
writeObj = type.readObject(childReader, context);
}
@@ -272,7 +276,13 @@
if (getTypeClass().isInterface()) {
m = getWriteMethodFromImplClass(impl, desc);
}
-
+ if (m == null && property instanceof List) {
+ m = desc.getReadMethod();
+ List<Object> l = CastUtils.cast((List<?>)m.invoke(object));
+ List<Object> p = CastUtils.cast((List<?>)property);
+ l.addAll(p);
+ return;
+ }
if (m == null) {
throw new DatabindingException("No write method for property " + name + " in "
+ object.getClass());
Modified: cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/AnnotationReader.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/AnnotationReader.java?rev=891440&r1=891439&r2=891440&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/AnnotationReader.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/AnnotationReader.java Wed Dec 16 21:48:48 2009
@@ -372,4 +372,16 @@
}
}
+ public boolean isFlat(Annotation[] annotations) {
+ if (annotations != null) {
+ for (Annotation a : annotations) {
+ if (a instanceof XmlFlattenedArray) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+
}
Modified: cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/Java5TypeCreator.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/Java5TypeCreator.java?rev=891440&r1=891439&r2=891440&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/Java5TypeCreator.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/Java5TypeCreator.java Wed Dec 16 21:48:48 2009
@@ -121,7 +121,7 @@
info.setType(genericType); // override basicClassInfo's of the type.
info.setAnnotations(pd.getReadMethod().getAnnotations());
info.setAegisTypeClass(castToAegisTypeClass(annotationReader.getType(pd.getReadMethod())));
-
+ info.setFlat(annotationReader.isFlat(pd.getReadMethod().getAnnotations()));
return info;
}
Copied: cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/XmlFlattenedArray.java (from r891393, cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayServiceInterface.java)
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/XmlFlattenedArray.java?p2=cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/XmlFlattenedArray.java&p1=cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayServiceInterface.java&r1=891393&r2=891440&rev=891440&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayServiceInterface.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/XmlFlattenedArray.java Wed Dec 16 21:48:48 2009
@@ -16,14 +16,19 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.cxf.aegis.type.array;
-public interface FlatArrayServiceInterface {
+package org.apache.cxf.aegis.type.java5;
- String[] getStringArrayValue();
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
- void submitStringArray(String[] array);
-
- void takeBeanWithFlatArray(BeanWithFlatArray bwfa);
+/**
+ *
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface XmlFlattenedArray {
}
Copied: cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/BeanWithFlatCollection.java (from r891393, cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayServiceInterface.java)
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/BeanWithFlatCollection.java?p2=cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/BeanWithFlatCollection.java&p1=cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayServiceInterface.java&r1=891393&r2=891440&rev=891440&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayServiceInterface.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/BeanWithFlatCollection.java Wed Dec 16 21:48:48 2009
@@ -16,14 +16,23 @@
* specific language governing permissions and limitations
* under the License.
*/
+
package org.apache.cxf.aegis.type.array;
-public interface FlatArrayServiceInterface {
+import java.util.ArrayList;
+import java.util.List;
- String[] getStringArrayValue();
+import org.apache.cxf.aegis.type.java5.XmlFlattenedArray;
- void submitStringArray(String[] array);
+/**
+ * Test bean for flat='true'
+ */
+public class BeanWithFlatCollection {
+ List<Integer> values = new ArrayList<Integer>();
- void takeBeanWithFlatArray(BeanWithFlatArray bwfa);
+ @XmlFlattenedArray
+ public List<Integer> getValues() {
+ return values;
+ }
}
Modified: cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayService.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayService.java?rev=891440&r1=891439&r2=891440&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayService.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayService.java Wed Dec 16 21:48:48 2009
@@ -22,7 +22,8 @@
String[] stringArrayValue;
BeanWithFlatArray beanWithFlatArrayValue;
-
+ BeanWithFlatCollection beanWithFlatCollection;
+
public FlatArrayService() {
}
@@ -40,4 +41,9 @@
public void takeBeanWithFlatArray(BeanWithFlatArray bwfa) {
beanWithFlatArrayValue = bwfa;
}
+
+ public BeanWithFlatCollection echoBeanWithFlatCollection(BeanWithFlatCollection c) {
+ beanWithFlatCollection = c;
+ return c;
+ }
}
Modified: cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayServiceInterface.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayServiceInterface.java?rev=891440&r1=891439&r2=891440&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayServiceInterface.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayServiceInterface.java Wed Dec 16 21:48:48 2009
@@ -25,5 +25,7 @@
void submitStringArray(String[] array);
void takeBeanWithFlatArray(BeanWithFlatArray bwfa);
-
+
+ BeanWithFlatCollection echoBeanWithFlatCollection(BeanWithFlatCollection c);
}
+
Modified: cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayTest.java?rev=891440&r1=891439&r2=891440&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayTest.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/array/FlatArrayTest.java Wed Dec 16 21:48:48 2009
@@ -110,5 +110,25 @@
client.takeBeanWithFlatArray(bwfa);
assertArrayEquals(INT_ARRAY, service.beanWithFlatArrayValue.getValues());
}
+ @Test
+ public void testFlatCollection() throws Exception {
+ ClientProxyFactoryBean proxyFac = new ClientProxyFactoryBean();
+ proxyFac.setDataBinding(new AegisDatabinding());
+ proxyFac.setAddress("local://FlatArray");
+ proxyFac.setServiceClass(FlatArrayServiceInterface.class);
+ proxyFac.setBus(getBus());
+
+ Object proxyObj = proxyFac.create();
+ FlatArrayServiceInterface client = (FlatArrayServiceInterface)proxyObj;
+ BeanWithFlatCollection bwfc = new BeanWithFlatCollection();
+ bwfc.getValues().add(1);
+ bwfc.getValues().add(2);
+ bwfc.getValues().add(3);
+ bwfc = client.echoBeanWithFlatCollection(bwfc);
+ assertEquals(3, bwfc.getValues().size());
+ assertEquals(Integer.valueOf(1), bwfc.getValues().get(0));
+ assertEquals(Integer.valueOf(2), bwfc.getValues().get(1));
+ assertEquals(Integer.valueOf(3), bwfc.getValues().get(2));
+ }
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/AegisJSONProviderTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/AegisJSONProviderTest.java?rev=891440&r1=891439&r2=891440&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/AegisJSONProviderTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/AegisJSONProviderTest.java Wed Dec 16 21:48:48 2009
@@ -25,6 +25,7 @@
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.InvalidPropertiesFormatException;
@@ -45,7 +46,6 @@
import org.junit.Assert;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
public class AegisJSONProviderTest extends Assert {
@@ -261,12 +261,12 @@
}
@Test
- @Ignore("Aegis copies duplicate ns1:tags elements into DOM which is exposed by a new Jettison writer")
public void testManyTags() throws Exception {
AegisJSONProvider<ManyTags> p = new AegisJSONProvider<ManyTags>();
p.setWriteXsiType(false);
AbstractAegisProvider.clearContexts();
p.setSerializeAsArray(true);
+ p.setArrayKeys(Arrays.asList("ns1.tags"));
Tags tags = new Tags();
tags.addTag(createTag("a", "b"));
@@ -277,13 +277,11 @@
p.writeTo(many, ManyTags.class, ManyTags.class, ManyTags.class.getAnnotations(),
MediaType.APPLICATION_JSON_TYPE, new MetadataMap<String, Object>(), os);
-
String s = os.toString();
- System.out.println(s);
- String data1 = "{\"ns1.ManyTags\":[{\"ns1.tags\":[{\"ns1.TagVO\""
- + ":{\"ns1.group\":\"b\",\"ns1.name\":\"a\"}}]}]}";
- String data2 = "{\"ns1.ManyTags\":[{\"ns1.tags\":[{\"ns1.TagVO\""
- + ":{\"ns1.name\":\"a\",\"ns1.group\":\"b\"}}]}]}";
+ String data1 = "{\"ns1.ManyTags\":{\"ns1.tags\":[{\"ns1.list\""
+ + ":{\"ns1.group\":\"b\",\"ns1.name\":\"a\"}}]}}";
+ String data2 = "{\"ns1.ManyTags\":{\"ns1.tags\":[{\"ns1.list\""
+ + ":{\"ns1.name\":\"a\",\"ns1.group\":\"b\"}}]}}";
assertTrue(data1.equals(s) || data2.equals(s));
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/resources/Tags.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/resources/Tags.java?rev=891440&r1=891439&r2=891440&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/resources/Tags.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/resources/Tags.java Wed Dec 16 21:48:48 2009
@@ -24,9 +24,10 @@
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
+import org.apache.cxf.aegis.type.java5.XmlFlattenedArray;
+
@XmlRootElement(name = "Tags")
public class Tags {
- @XmlElement
private List<TagVO> list = new ArrayList<TagVO>();
public Tags() {
@@ -41,6 +42,8 @@
list.add(tag);
}
+ @XmlFlattenedArray
+ @XmlElement(name = "list")
public List<TagVO> getTags() {
return list;
}