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 2008/01/14 17:58:09 UTC
svn commit: r611852 - in /incubator/cxf/branches/2.0.x-fixes: ./
rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/
Author: dkulp
Date: Mon Jan 14 08:57:59 2008
New Revision: 611852
URL: http://svn.apache.org/viewvc?rev=611852&view=rev
Log:
Merged revisions 611657 via svnmerge from
https://svn.apache.org/repos/asf/incubator/cxf/trunk
........
r611657 | bimargulies | 2008-01-13 16:50:28 -0500 (Sun, 13 Jan 2008) | 2 lines
Fix CXF-1391 and other related problems with xsi:type.
........
Modified:
incubator/cxf/branches/2.0.x-fixes/ (props changed)
incubator/cxf/branches/2.0.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ArrayType.java
incubator/cxf/branches/2.0.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java
incubator/cxf/branches/2.0.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ObjectType.java
Propchange: incubator/cxf/branches/2.0.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.
Modified: incubator/cxf/branches/2.0.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ArrayType.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/2.0.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ArrayType.java?rev=611852&r1=611851&r2=611852&view=diff
==============================================================================
--- incubator/cxf/branches/2.0.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ArrayType.java (original)
+++ incubator/cxf/branches/2.0.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ArrayType.java Mon Jan 14 08:57:59 2008
@@ -38,6 +38,7 @@
import org.apache.cxf.aegis.util.XmlConstants;
import org.apache.cxf.aegis.xml.MessageReader;
import org.apache.cxf.aegis.xml.MessageWriter;
+import org.apache.cxf.common.xmlschema.XmlSchemaConstants;
import org.jdom.Attribute;
import org.jdom.Element;
import org.jdom.Namespace;
@@ -49,7 +50,7 @@
*/
public class ArrayType extends Type {
private static final Log LOG = LogFactory.getLog(ArrayType.class);
-
+
private QName componentName;
private long minOccurs;
private long maxOccurs = Long.MAX_VALUE;
@@ -159,20 +160,22 @@
Array.set(array, i, objects[i]);
}
}
- return array == null
- ? values.toArray((Object[])Array.newInstance(getComponentType().getTypeClass(), values.size()))
- : array;
+ return array == null ? values.toArray((Object[])Array.newInstance(getComponentType().getTypeClass(),
+ values.size())) : array;
}
@Override
- public void writeObject(Object values,
- MessageWriter writer,
- Context context) throws DatabindingException {
+ public void writeObject(Object values, MessageWriter writer, Context context)
+ throws DatabindingException {
+ boolean forceXsiWrite = false;
if (values == null) {
return;
}
Type type = getComponentType();
+ if (XmlSchemaConstants.ANY_TYPE_QNAME.equals(type.getSchemaType())) {
+ forceXsiWrite = true;
+ }
String ns = null;
if (type.isAbstract()) {
@@ -189,53 +192,62 @@
Class arrayType = type.getTypeClass();
- int i;
- int n;
- if (Object.class.isAssignableFrom(arrayType)) {
- Object[] objects = (Object[])values;
- for (i = 0, n = objects.length; i < n; i++) {
- writeValue(objects[i], writer, context, type, name, ns);
- }
- } else if (Integer.TYPE.equals(arrayType)) {
- int[] objects = (int[])values;
- for (i = 0, n = objects.length; i < n; i++) {
- writeValue(new Integer(objects[i]), writer, context, type, name, ns);
- }
- } else if (Long.TYPE.equals(arrayType)) {
- long[] objects = (long[])values;
- for (i = 0, n = objects.length; i < n; i++) {
- writeValue(new Long(objects[i]), writer, context, type, name, ns);
- }
- } else if (Short.TYPE.equals(arrayType)) {
- short[] objects = (short[])values;
- for (i = 0, n = objects.length; i < n; i++) {
- writeValue(new Short(objects[i]), writer, context, type, name, ns);
- }
- } else if (Double.TYPE.equals(arrayType)) {
- double[] objects = (double[])values;
- for (i = 0, n = objects.length; i < n; i++) {
- writeValue(new Double(objects[i]), writer, context, type, name, ns);
- }
- } else if (Float.TYPE.equals(arrayType)) {
- float[] objects = (float[])values;
- for (i = 0, n = objects.length; i < n; i++) {
- writeValue(new Float(objects[i]), writer, context, type, name, ns);
- }
- } else if (Byte.TYPE.equals(arrayType)) {
- byte[] objects = (byte[])values;
- for (i = 0, n = objects.length; i < n; i++) {
- writeValue(new Byte(objects[i]), writer, context, type, name, ns);
- }
- } else if (Boolean.TYPE.equals(arrayType)) {
- boolean[] objects = (boolean[])values;
- for (i = 0, n = objects.length; i < n; i++) {
- writeValue(Boolean.valueOf(objects[i]), writer, context, type, name, ns);
+ boolean oldXsiWrite = context.getGlobalContext().isWriteXsiTypes();
+ try {
+ if (forceXsiWrite) {
+ context.getGlobalContext().setWriteXsiTypes(true);
}
- } else if (Character.TYPE.equals(arrayType)) {
- char[] objects = (char[])values;
- for (i = 0, n = objects.length; i < n; i++) {
- writeValue(new Character(objects[i]), writer, context, type, name, ns);
+
+ int i;
+ int n;
+ if (Object.class.isAssignableFrom(arrayType)) {
+ Object[] objects = (Object[])values;
+ for (i = 0, n = objects.length; i < n; i++) {
+ writeValue(objects[i], writer, context, type, name, ns);
+ }
+ } else if (Integer.TYPE.equals(arrayType)) {
+ int[] objects = (int[])values;
+ for (i = 0, n = objects.length; i < n; i++) {
+ writeValue(new Integer(objects[i]), writer, context, type, name, ns);
+ }
+ } else if (Long.TYPE.equals(arrayType)) {
+ long[] objects = (long[])values;
+ for (i = 0, n = objects.length; i < n; i++) {
+ writeValue(new Long(objects[i]), writer, context, type, name, ns);
+ }
+ } else if (Short.TYPE.equals(arrayType)) {
+ short[] objects = (short[])values;
+ for (i = 0, n = objects.length; i < n; i++) {
+ writeValue(new Short(objects[i]), writer, context, type, name, ns);
+ }
+ } else if (Double.TYPE.equals(arrayType)) {
+ double[] objects = (double[])values;
+ for (i = 0, n = objects.length; i < n; i++) {
+ writeValue(new Double(objects[i]), writer, context, type, name, ns);
+ }
+ } else if (Float.TYPE.equals(arrayType)) {
+ float[] objects = (float[])values;
+ for (i = 0, n = objects.length; i < n; i++) {
+ writeValue(new Float(objects[i]), writer, context, type, name, ns);
+ }
+ } else if (Byte.TYPE.equals(arrayType)) {
+ byte[] objects = (byte[])values;
+ for (i = 0, n = objects.length; i < n; i++) {
+ writeValue(new Byte(objects[i]), writer, context, type, name, ns);
+ }
+ } else if (Boolean.TYPE.equals(arrayType)) {
+ boolean[] objects = (boolean[])values;
+ for (i = 0, n = objects.length; i < n; i++) {
+ writeValue(Boolean.valueOf(objects[i]), writer, context, type, name, ns);
+ }
+ } else if (Character.TYPE.equals(arrayType)) {
+ char[] objects = (char[])values;
+ for (i = 0, n = objects.length; i < n; i++) {
+ writeValue(new Character(objects[i]), writer, context, type, name, ns);
+ }
}
+ } finally {
+ context.getGlobalContext().setWriteXsiTypes(oldXsiWrite);
}
}
@@ -248,7 +260,7 @@
} else {
cwriter = writer;
}
-
+
if (value == null && type.isNillable()) {
cwriter.writeXsiNil();
} else {
@@ -264,7 +276,7 @@
if (hasDefinedArray(root)) {
return;
}
-
+
Element complex = new Element("complexType", XmlConstants.XSD_PREFIX, XmlConstants.XSD);
complex.setAttribute(new Attribute("name", getSchemaType().getLocalPart()));
root.addContent(complex);
@@ -276,8 +288,8 @@
seq.addContent(element);
Type componentType = getComponentType();
- String prefix = NamespaceHelper.getUniquePrefix(root, componentType
- .getSchemaType().getNamespaceURI());
+ String prefix = NamespaceHelper.getUniquePrefix(root, componentType.getSchemaType()
+ .getNamespaceURI());
String typeName = prefix + ":" + componentType.getSchemaType().getLocalPart();
@@ -302,17 +314,17 @@
}
/**
- * Since both an Array and a List can have the same type definition, double check
- * that there isn't already a defined type already.
+ * Since both an Array and a List can have the same type definition, double
+ * check that there isn't already a defined type already.
+ *
* @param root
* @return
*/
private boolean hasDefinedArray(Element root) {
List children = root.getChildren("complexType", Namespace.getNamespace(XmlConstants.XSD));
for (Iterator itr = children.iterator(); itr.hasNext();) {
- Element e = (Element) itr.next();
-
-
+ Element e = (Element)itr.next();
+
if (e.getAttributeValue("name").equals(getSchemaType().getLocalPart())) {
return true;
}
@@ -368,8 +380,7 @@
// We couldn't find the type the user specified. One is created
// below instead.
if (type == null) {
- LOG.debug("Couldn't find array component type " + componentName
- + ". Creating one instead.");
+ LOG.debug("Couldn't find array component type " + componentName + ". Creating one instead.");
}
}
Modified: incubator/cxf/branches/2.0.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/2.0.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java?rev=611852&r1=611851&r2=611852&view=diff
==============================================================================
--- incubator/cxf/branches/2.0.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java (original)
+++ incubator/cxf/branches/2.0.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java Mon Jan 14 08:57:59 2008
@@ -266,15 +266,31 @@
return impl.getMethod(name, new Class[] {pd.getPropertyType()});
}
-
+
+ /**
+ * To avoid double-writing xsi:type attributes, ObjectType uses this special entrypoint.
+ * @param object
+ * @param writer
+ * @param context
+ * @param wroteXsiType
+ */
+ void writeObjectFromObjectType(Object object, MessageWriter writer,
+ Context context, boolean wroteXsiType) {
+ writeObjectInternal(object, writer, context, wroteXsiType);
+ }
+
/**
- * @see org.apache.cxf.aegis.type.Type#writeObject(Object,
- * org.apache.cxf.aegis.xml.MessageWriter,
- * org.apache.cxf.aegis.Context)
+ * {@inheritDoc}
*/
@Override
public void writeObject(Object object, MessageWriter writer, Context context)
throws DatabindingException {
+ writeObjectInternal(object, writer, context, false);
+ }
+
+ private void writeObjectInternal(Object object, MessageWriter writer, Context context,
+ boolean wroteXsiType)
+ throws DatabindingException {
if (object == null) {
return;
}
@@ -282,6 +298,8 @@
BeanTypeInfo inf = getTypeInfo();
if (object.getClass() == getTypeClass()
+ if (!wroteXsiType
+ && object.getClass() == getTypeClass()
&& context.isWriteXsiTypes()) {
writer.writeXsiType(getSchemaType());
}
Modified: incubator/cxf/branches/2.0.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ObjectType.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/2.0.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ObjectType.java?rev=611852&r1=611851&r2=611852&view=diff
==============================================================================
--- incubator/cxf/branches/2.0.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ObjectType.java (original)
+++ incubator/cxf/branches/2.0.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ObjectType.java Mon Jan 14 08:57:59 2008
@@ -184,17 +184,14 @@
type = tm.getTypeCreator().createType(object.getClass());
tm.register(type);
}
-
- String prefix = writer.getPrefixForNamespace(type.getSchemaType().getNamespaceURI(),
- type.getSchemaType().getPrefix());
-
- if (null == prefix || prefix.length() == 0) {
- addXsiType(writer, type.getSchemaType().getLocalPart());
+
+ writer.writeXsiType(type.getSchemaType());
+ boolean nextIsBeanType = type instanceof BeanType;
+ if (nextIsBeanType) {
+ ((BeanType)type).writeObjectFromObjectType(object, writer, context, true);
} else {
- addXsiType(writer, prefix + ":" + type.getSchemaType().getLocalPart());
+ type.writeObject(object, writer, context);
}
-
- type.writeObject(object, writer, context);
}
}
@@ -230,14 +227,6 @@
return determineType(context, superclass);
}
- private void addXsiType(MessageWriter writer, String prefixedType) {
- MessageWriter typeWriter = writer.getAttributeWriter(XSI_TYPE);
-
- typeWriter.writeValue(prefixedType);
-
- typeWriter.close();
- }
-
public boolean isReadToDocument() {
return readToDocument;
}
@@ -270,25 +259,21 @@
@Override
public boolean isAbstract() {
- // TODO Auto-generated method stub
return super.isAbstract();
}
@Override
public boolean isNillable() {
- // TODO Auto-generated method stub
return super.isNillable();
}
@Override
public boolean isWriteOuter() {
- // TODO Auto-generated method stub
return super.isWriteOuter();
}
@Override
public void setNillable(boolean nillable) {
- // TODO Auto-generated method stub
super.setNillable(nillable);
}