You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by bi...@apache.org on 2009/08/21 17:34:30 UTC
svn commit: r806602 - in /cxf/trunk/rt:
databinding/aegis/src/main/java/org/apache/cxf/aegis/
databinding/aegis/src/main/java/org/apache/cxf/aegis/type/
frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/
frontend/jaxrs/src/test/java/org/apache...
Author: bimargulies
Date: Fri Aug 21 15:34:27 2009
New Revision: 806602
URL: http://svn.apache.org/viewvc?rev=806602&view=rev
Log:
Merge branch 'benson' into trunk
Modified:
cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/AegisXMLStreamDataWriter.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/TypeCreator.java
cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/TypeUtil.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractAegisProvider.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AegisElementProvider.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/AegisProviderTest.java
Modified: cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/AegisXMLStreamDataWriter.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/AegisXMLStreamDataWriter.java?rev=806602&r1=806601&r2=806602&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/AegisXMLStreamDataWriter.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/AegisXMLStreamDataWriter.java Fri Aug 21 15:34:27 2009
@@ -39,7 +39,7 @@
}
/**
- * Write an object to the output.
+ * Write an object to the output. This method always writes xsi:type attributes.
* @param obj The object to write.
* @param elementName the QName of the XML Element.
* @param optional set this for minOccurs = 0. It omits null elements.
@@ -58,7 +58,7 @@
throw new DatabindingException(message);
}
- if (obj != null) {
+ if (obj != null && aegisType == null) {
aegisType = TypeUtil.getWriteType(aegisContext, obj, aegisType);
}
@@ -77,6 +77,10 @@
ElementWriter writer = new ElementWriter(output);
MessageWriter w2 = writer.getElementWriter(elementName);
+ if (aegisType != null && aegisType.getSchemaType() != null) {
+ // if we know the type, write it. We are standalone, and the reader needs it.
+ w2.writeXsiType(aegisType.getSchemaType());
+ }
aegisType.writeObject(obj, w2, context);
w2.close();
}
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=806602&r1=806601&r2=806602&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 Fri Aug 21 15:34:27 2009
@@ -21,6 +21,7 @@
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
import java.util.Collection;
import java.util.Map;
@@ -90,7 +91,7 @@
info.setDescription("field " + f.getName() + " in " + f.getDeclaringClass());
return info;
}
-
+
public TypeClassInfo createBasicClassInfo(Class typeClass) {
TypeClassInfo info = new TypeClassInfo();
info.setDescription("class '" + typeClass.getName() + '\'');
@@ -393,6 +394,29 @@
info.setDescription("field " + f.getName() + " in " + f.getDeclaringClass());
return createTypeForClass(info);
}
+
+ /**
+ * Create an Aegis type from a reflected type description.
+ * This will only work for the restricted set of collection
+ * types supported by Aegis.
+ * @param t the reflected type.
+ * @return the type
+ */
+ public Type createType(java.lang.reflect.Type t) {
+ TypeClassInfo info = new TypeClassInfo();
+ info.setGenericType(t);
+ if (t instanceof ParameterizedType) {
+ ParameterizedType pt = (ParameterizedType) t;
+ java.lang.reflect.Type rawType = pt.getRawType();
+ if (rawType instanceof Class) {
+ info.setTypeClass((Class)rawType);
+ }
+ }
+
+ info.setDescription("reflected type " + t.toString());
+ return createTypeForClass(info);
+
+ }
public Type createType(Class clazz) {
TypeClassInfo info = createBasicClassInfo(clazz);
Modified: cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/TypeCreator.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/TypeCreator.java?rev=806602&r1=806601&r2=806602&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/TypeCreator.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/TypeCreator.java Fri Aug 21 15:34:27 2009
@@ -42,6 +42,8 @@
Type createType(Method m, int index);
Type createType(PropertyDescriptor pd);
+
+ Type createType(java.lang.reflect.Type type);
Type createType(Field f);
Modified: cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/TypeUtil.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/TypeUtil.java?rev=806602&r1=806601&r2=806602&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/TypeUtil.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/TypeUtil.java Fri Aug 21 15:34:27 2009
@@ -157,6 +157,26 @@
return type;
}
+ /**
+ * Allow writing of collections when the type of the collection object is known via
+ * an {@link java.lang.reflect.Type} object.
+ * @param globalContext the context
+ * @param value the object to write.
+ * @param reflectType the type to use in writing the object.
+ * @return
+ */
+ public static Type getWriteTypeStandalone(AegisContext globalContext,
+ Object value,
+ java.lang.reflect.Type reflectType) {
+ if (reflectType == null) {
+ return getWriteTypeStandalone(globalContext, value, (Type)null);
+ } else {
+ return globalContext.getTypeMapping().getTypeCreator().createType(reflectType);
+ }
+
+
+ }
+
public static void setAttributeAttributes(QName name, Type type, XmlSchema root) {
String ns = type.getSchemaType().getNamespaceURI();
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractAegisProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractAegisProvider.java?rev=806602&r1=806601&r2=806602&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractAegisProvider.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractAegisProvider.java Fri Aug 21 15:34:27 2009
@@ -114,6 +114,13 @@
}
context.setRootClasses(rootClasses);
context.initialize();
+ /* It's not enough, in the presence of generic types, to just add it as a root.
+ a mapping is also needed */
+ if (genericType != null) {
+ org.apache.cxf.aegis.type.Type aegisType;
+ aegisType = context.getTypeMapping().getTypeCreator().createType(genericType);
+ context.getTypeMapping().register(aegisType);
+ }
classContexts.put(type, context);
}
return context;
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AegisElementProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AegisElementProvider.java?rev=806602&r1=806601&r2=806602&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AegisElementProvider.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AegisElementProvider.java Fri Aug 21 15:34:27 2009
@@ -70,7 +70,9 @@
type = obj.getClass();
}
AegisContext context = getAegisContext(type, genericType);
- org.apache.cxf.aegis.type.Type aegisType = TypeUtil.getWriteTypeStandalone(context, obj, null);
+ // we need special cases for collection types.
+
+ org.apache.cxf.aegis.type.Type aegisType = TypeUtil.getWriteTypeStandalone(context, obj, genericType);
AegisWriter<XMLStreamWriter> aegisWriter = context.createXMLStreamWriter();
try {
XMLStreamWriter xmlStreamWriter = createStreamWriter(type, os);
Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/AegisProviderTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/AegisProviderTest.java?rev=806602&r1=806601&r2=806602&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/AegisProviderTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/AegisProviderTest.java Fri Aug 21 15:34:27 2009
@@ -43,7 +43,7 @@
+ "xmlns:ns2=\"http://www.w3.org/2001/XMLSchema-instance\" ns2:type=\"ns1:AegisTestBean\">"
+ "<ns1:boolValue>true</ns1:boolValue><ns1:strValue>hovercraft</ns1:strValue>"
+ "</ns1:AegisTestBean>";
-
+
@After
public void clearCache() {
AbstractAegisProvider.clearContexts();
@@ -91,29 +91,32 @@
Map<AegisTestBean, String> mapFunction();
}
+
+
@SuppressWarnings("unchecked")
@Test
- @org.junit.Ignore
public void testReadWriteComplexMap() throws Exception {
- Map<AegisTestBean, String> map = new HashMap<AegisTestBean, String>();
+ Map<AegisTestBean, String> testMap = new HashMap<AegisTestBean, String>();
+
+ Class<InterfaceWithMap> iwithMapClass = InterfaceWithMap.class;
+ Method method = iwithMapClass.getMethod("mapFunction");
+ Type mapType = method.getGenericReturnType();
+
AegisTestBean bean = new AegisTestBean();
bean.setBoolValue(Boolean.TRUE);
bean.setStrValue("hovercraft");
- map.put(bean, "hovercraft");
+ testMap.put(bean, "hovercraft");
MessageBodyWriter<Object> writer = new AegisElementProvider();
ByteArrayOutputStream os = new ByteArrayOutputStream();
- writer.writeTo(bean, null, null, null, null, null, os);
+ writer.writeTo(testMap, testMap.getClass(), mapType, null, null, null, os);
byte[] bytes = os.toByteArray();
String xml = new String(bytes, "utf-8");
MessageBodyReader<Object> reader = new AegisElementProvider();
byte[] simpleBytes = xml.getBytes("utf-8");
- Class<InterfaceWithMap> iwithMapClass = InterfaceWithMap.class;
- Method method = iwithMapClass.getMethod("mapFunction");
- Type mapType = method.getGenericReturnType();
Object beanObject = reader.readFrom((Class)Map.class, mapType, null,
null, null, new ByteArrayInputStream(simpleBytes));