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 2007/12/11 20:01:36 UTC
svn commit: r603333 [1/2] - in /incubator/cxf/trunk/rt/databinding/aegis/src:
main/java/org/apache/cxf/aegis/type/basic/
main/java/org/apache/cxf/aegis/type/encoded/
test/java/org/apache/cxf/aegis/type/encoded/
Author: bimargulies
Date: Tue Dec 11 11:01:33 2007
New Revision: 603333
URL: http://svn.apache.org/viewvc?rev=603333&view=rev
Log:
Dain's first round of 'encoded' implementation.
Added:
incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/
incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/MarshalRegistry.java (with props)
incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapEncodingUtil.java (with props)
incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRef.java (with props)
incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRefRegistry.java (with props)
incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRefType.java (with props)
incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/StructType.java (with props)
incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/TrailingBlocks.java (with props)
incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/
incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/Address.java (with props)
incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/PurchaseOrder.java (with props)
incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/StructTypeTest.java (with props)
incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref1.xml (with props)
incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref2.xml (with props)
incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref3.xml (with props)
incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct1.xml (with props)
incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct2.xml (with props)
incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct3.xml (with props)
incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct4.xml (with props)
Modified:
incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java
incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ObjectType.java
Modified: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java?rev=603333&r1=603332&r2=603333&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java (original)
+++ incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java Tue Dec 11 11:01:33 2007
@@ -20,6 +20,7 @@
import java.beans.PropertyDescriptor;
import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
@@ -27,7 +28,6 @@
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
-
import javax.xml.namespace.QName;
import org.apache.cxf.aegis.Context;
@@ -46,7 +46,7 @@
/**
* Serializes JavaBeans.
- *
+ *
* @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
* @author <a href="mailto:jack.xu.hong@gmail.com">Jack Hong</a>
*/
@@ -83,22 +83,23 @@
try {
Class clazz = getTypeClass();
- Object object = null;
- InterfaceInvocationHandler delegate = null;
- boolean isProxy = false;
+ Object object;
+ // the target for properties; either the object or the proxy handler
+ Object target;
if (isInterface) {
String impl = (String)context.get(clazz.getName() + ".implementation");
if (impl == null) {
- delegate = new InterfaceInvocationHandler();
+ InvocationHandler handler = new InterfaceInvocationHandler();
object = Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[] {clazz},
- delegate);
- isProxy = true;
+ handler);
+ target = handler;
} else {
try {
clazz = ClassLoaderUtils.loadClass(impl, getClass());
object = clazz.newInstance();
+ target = object;
} catch (ClassNotFoundException e) {
throw new DatabindingException("Could not find implementation class " + impl
+ " for class " + clazz.getName());
@@ -106,8 +107,10 @@
}
} else if (isException) {
object = createFromFault(context);
+ target = object;
} else {
object = clazz.newInstance();
+ target = object;
}
// Read attributes
@@ -119,11 +122,7 @@
if (type != null) {
Object writeObj = type.readObject(childReader, context);
- if (isProxy) {
- delegate.writeProperty(name.getLocalPart(), writeObj);
- } else {
- writeProperty(name, object, writeObj, clazz, inf);
- }
+ writeProperty(name, target, writeObj, clazz, inf);
}
}
@@ -132,39 +131,20 @@
MessageReader childReader = reader.getNextElementReader();
QName name = childReader.getName();
- BeanType parent = getBeanTypeWithProperty(name);
- Type defaultType = null;
- if (parent != null) {
- info = parent.getTypeInfo();
- defaultType = info.getType(name);
- }
+ // Find the BeanTypeInfo that contains a property for the element name
+ BeanTypeInfo propertyTypeInfo = getBeanTypeInfoWithProperty(name);
- Type type = TypeUtil.getReadType(childReader.getXMLStreamReader(), context, defaultType);
-
- // If the xsi:type lookup didn't work or there was none, use the
- // normal Type.
- if (type == null) {
- parent = getBeanTypeWithProperty(name);
- if (parent != null) {
- inf = parent.getTypeInfo();
- type = inf.getType(name);
- } else {
- type = null;
- }
- }
+ // Get the Type for the property
+ Type type = getElementType(name, propertyTypeInfo, childReader, context);
if (type != null) {
if (!childReader.isXsiNil()) {
Object writeObj = type.readObject(childReader, context);
- if (isProxy) {
- delegate.writeProperty(name.getLocalPart(), writeObj);
- } else {
- writeProperty(name, object, writeObj, clazz, inf);
- }
+ writeProperty(name, target, writeObj, clazz, propertyTypeInfo);
} else {
- if (!inf.isNillable(name)) {
- throw new DatabindingException(name.getLocalPart()
+ if (!propertyTypeInfo.isNillable(name)) {
+ throw new DatabindingException(name.getLocalPart()
+ " is nil, but not nillable.");
}
@@ -188,6 +168,19 @@
throw new DatabindingException("Could not create class: " + e.getMessage(), e);
}
}
+
+ protected Type getElementType(QName name,
+ BeanTypeInfo beanTypeInfo,
+ MessageReader reader,
+ Context context) {
+
+ Type type = beanTypeInfo.getType(name);
+
+ // Type can be overriden with a xsi:type attribute
+ type = TypeUtil.getReadType(reader.getXMLStreamReader(), context, type);
+ return type;
+ }
+
/**
* If the class is an exception, this will try and instantiate it with
* information from the XFireFault (if it exists).
@@ -198,7 +191,7 @@
Class clazz = getTypeClass();
Constructor ctr;
Object o;
-
+
Fault fault = context.getFault();
try {
@@ -220,12 +213,19 @@
return o;
}
-
+
/**
* Write the specified property to a field.
*/
protected void writeProperty(QName name, Object object, Object property, Class impl, BeanTypeInfo inf)
throws DatabindingException {
+
+ if (object instanceof InterfaceInvocationHandler) {
+ InterfaceInvocationHandler delegate = (InterfaceInvocationHandler) object;
+ delegate.writeProperty(name.getLocalPart(), property);
+ return;
+ }
+
try {
PropertyDescriptor desc = inf.getPropertyDescriptorFromMappedName(name);
@@ -273,7 +273,7 @@
* org.apache.cxf.aegis.Context)
*/
@Override
- public void writeObject(Object object, MessageWriter writer, Context context)
+ public void writeObject(Object object, MessageWriter writer, Context context)
throws DatabindingException {
if (object == null) {
return;
@@ -281,7 +281,7 @@
BeanTypeInfo inf = getTypeInfo();
- if (object.getClass() == getTypeClass()
+ if (object.getClass() == getTypeClass()
&& context.isWriteXsiTypes()) {
writer.writeXsiType(getSchemaType());
}
@@ -323,22 +323,17 @@
Type defaultType = getType(inf, name);
Type type = TypeUtil.getWriteType(context, value, defaultType);
- MessageWriter cwriter;
// Write the value if it is not null.
if (value != null) {
- cwriter = getWriter(writer, name, type);
-
if (type == null) {
throw new DatabindingException("Couldn't find type for " + value.getClass()
+ " for property " + name);
}
- type.writeObject(value, cwriter, context);
-
- cwriter.close();
+ writeElement(name, value, type, writer, context);
} else if (inf.isNillable(name)) {
- cwriter = getWriter(writer, name, type);
+ MessageWriter cwriter = getWriter(writer, name, type);
// Write the xsi:nil if it is null.
cwriter.writeXsiNil();
@@ -354,6 +349,14 @@
}
}
+ protected void writeElement(QName name, Object value, Type type, MessageWriter writer, Context context) {
+ MessageWriter cwriter = getWriter(writer, name, type);
+
+ type.writeObject(value, cwriter, context);
+
+ cwriter.close();
+ }
+
private MessageWriter getWriter(MessageWriter writer, QName name, Type type) {
MessageWriter cwriter;
if (type.isAbstract()) {
@@ -403,8 +406,8 @@
}
if (inf.isExtension() && sooperType != null) {
- Element complexContent = new Element("complexContent",
- SOAPConstants.XSD_PREFIX,
+ Element complexContent = new Element("complexContent",
+ SOAPConstants.XSD_PREFIX,
SOAPConstants.XSD);
complex.addContent(complexContent);
complex = complexContent;
@@ -561,7 +564,7 @@
/**
* We need to write a complex type schema for Beans, so return true.
- *
+ *
* @see org.apache.cxf.aegis.type.Type#isComplex()
*/
@Override
@@ -603,22 +606,29 @@
return deps;
}
- private BeanType getBeanTypeWithProperty(QName name) {
- BeanType sooper = this;
+ protected BeanTypeInfo getBeanTypeInfoWithProperty(QName name) {
+ // search the BeanType superType tree for the first BeanType with a property named 'name'
+ BeanType beanType = this;
Type type = null;
-
- while (type == null && sooper != null) {
- type = sooper.getTypeInfo().getType(name);
+ while (type == null && beanType != null) {
+ type = beanType.getTypeInfo().getType(name);
if (type == null) {
- sooper = sooper.getSuperType();
+ beanType = beanType.getSuperType();
}
}
- return sooper;
+ BeanTypeInfo elementTypeInfo;
+ if (beanType != null) {
+ elementTypeInfo = beanType.getTypeInfo();
+ } else {
+ // didn't find a bean type so just use this bean't type info
+ elementTypeInfo = getTypeInfo();
+ }
+ return elementTypeInfo;
}
- private BeanType getSuperType() {
+ public BeanType getSuperType() {
BeanTypeInfo inf = getTypeInfo();
Class c = inf.getTypeClass().getSuperclass();
/*
@@ -647,7 +657,7 @@
}
info.initialize();
-
+
return info;
}
@@ -662,7 +672,7 @@
/**
* Create an element to represent any future elements that might get added
* to the schema <xsd:any minOccurs="0" maxOccurs="unbounded"/>
- *
+ *
* @return
*/
private Element createAnyElement() {
Modified: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ObjectType.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ObjectType.java?rev=603333&r1=603332&r2=603333&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ObjectType.java (original)
+++ incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ObjectType.java Tue Dec 11 11:01:33 2007
@@ -198,7 +198,7 @@
}
}
- private Type determineType(Context context, Class clazz) {
+ public Type determineType(Context context, Class clazz) {
TypeMapping tm = context.getTypeMapping();
if (tm == null) {
tm = getTypeMapping();
Added: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/MarshalRegistry.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/MarshalRegistry.java?rev=603333&view=auto
==============================================================================
--- incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/MarshalRegistry.java (added)
+++ incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/MarshalRegistry.java Tue Dec 11 11:01:33 2007
@@ -0,0 +1,110 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.aegis.type.encoded;
+
+import java.util.IdentityHashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.apache.cxf.aegis.Context;
+
+/**
+ * MarshalRegistry maintains tracks which object instnces have been marshalled and which objects still need to
+ * be marshalled.
+ * <p/>
+ * Note: only the StructType register objects with this class.
+ */
+public class MarshalRegistry implements Iterable<Object> {
+ /**
+ * All objects instances with ids. It is CRITICAL that is be an IdentityHashMap to assure we don't
+ * exclude instances that are equivilant but different instances.
+ */
+ private final Map<Object, String> instances = new IdentityHashMap<Object, String>();
+
+ /**
+ * The objects not yet marshalled. The is maintained as a map for debugging purpuses. It is IMPORTANT
+ * that this be a LinkedHashMap so we write the objects in the order they were discovered in the object
+ * graphs (and writes them in numeric order).
+ */
+ private final Map<String, Object> notMarshalled = new LinkedHashMap<String, Object>();
+
+ /**
+ * The next id.
+ */
+ private int nextId;
+
+ /**
+ * Get the MarshalRegistry stored in the context, and if necessary create a new one.
+ *
+ * @param context the unmarshal context
+ * @return the SoapRefRegistry; never null
+ */
+ public static MarshalRegistry get(Context context) {
+ MarshalRegistry marshalRegistry = (MarshalRegistry) context.get(MarshalRegistry.class.getName());
+ if (marshalRegistry == null) {
+ marshalRegistry = new MarshalRegistry();
+ context.put(MarshalRegistry.class.getName(), marshalRegistry);
+ }
+ return marshalRegistry;
+ }
+
+
+ public String getInstanceId(Object instance) {
+ String id = instances.get(instance);
+ if (id == null) {
+ id = "" + nextId++;
+ instances.put(instance, id);
+ notMarshalled.put(id, instance);
+ }
+ return id;
+ }
+
+ /**
+ * Returns an iterator over the object instances that have not been marshalled yet. As each instance in
+ * this iterator is written, it may contain references to additional objects that have not been written.
+ * Those references objects will be added to the end of this iterator, so the "list" that is being
+ * iterated over grows as the iteration preceeds.
+ * <p/>
+ * When an instance is returned from this iterator it is marked as marshalled.
+ *
+ * @return an iterator over the objects to be marshalled.
+ */
+ public Iterator<Object> iterator() {
+ return new Iterator<Object>() {
+ public boolean hasNext() {
+ return !notMarshalled.isEmpty();
+ }
+
+ public Object next() {
+ // remove the first entry in the notMarshalled map
+ Iterator<Object> iterator = notMarshalled.values().iterator();
+ Object instance = iterator.next();
+ iterator.remove();
+
+ // return the instance
+ return instance;
+ }
+
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ };
+ }
+}
\ No newline at end of file
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/MarshalRegistry.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/MarshalRegistry.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapEncodingUtil.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapEncodingUtil.java?rev=603333&view=auto
==============================================================================
--- incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapEncodingUtil.java (added)
+++ incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapEncodingUtil.java Tue Dec 11 11:01:33 2007
@@ -0,0 +1,122 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.aegis.type.encoded;
+
+import javax.xml.namespace.QName;
+
+import org.apache.cxf.aegis.xml.MessageReader;
+import org.apache.cxf.aegis.xml.MessageWriter;
+import org.apache.cxf.binding.soap.Soap12;
+
+/**
+ * Utilitiy methods for SOAP reading and writing encoded mesages.
+ */
+public final class SoapEncodingUtil {
+ private static final String SOAP_ENCODING_NS = Soap12.getInstance().getSoapEncodingStyle();
+ private static final QName SOAP_ENCODING_ID_1_2 = new QName(SOAP_ENCODING_NS, "id");
+ private static final QName SOAP_ENCODING_ID_1_1 = new QName("id");
+ private static final QName SOAP_ENCODING_REF_1_2 = new QName(SOAP_ENCODING_NS, "ref");
+ private static final QName SOAP_ENCODING_REF_1_1 = new QName("href");
+
+ private SoapEncodingUtil() {
+ }
+
+ /**
+ * Reads the SOAP 1.2 or SOAP 1.1 id attribute.
+ *
+ * @param reader the stream to read; must not be null
+ * @return the id or null of neither attribute was present
+ */
+ public static String readId(MessageReader reader) {
+ if (reader == null) {
+ throw new NullPointerException("reader is null");
+ }
+ String id = readAttributeValue(reader, SOAP_ENCODING_ID_1_2);
+ if (id == null) {
+ id = readAttributeValue(reader, SOAP_ENCODING_ID_1_1);
+ }
+ return id;
+ }
+
+ /**
+ * Writes a SOAP 1.1 id attribute.
+ *
+ * @param writer the stream to which the id should be written; must not be null
+ * @param id the id to write; must not be null
+ */
+ public static void writeId(MessageWriter writer, String id) {
+ if (writer == null) {
+ throw new NullPointerException("writer is null");
+ }
+ if (id == null) {
+ throw new NullPointerException("id is null");
+ }
+ writeAttribute(writer, SOAP_ENCODING_ID_1_1, id);
+ }
+
+ /**
+ * Reads the SOAP 1.2 or SOAP 1.1 refernce attribute.
+ *
+ * @param reader the stream to read; must not be null
+ * @return the reference id or null of neither attribute was present
+ */
+ public static String readRef(MessageReader reader) {
+ if (reader == null) {
+ throw new NullPointerException("reader is null");
+ }
+ String ref = readAttributeValue(reader, SOAP_ENCODING_REF_1_2);
+ if (ref == null) {
+ ref = readAttributeValue(reader, SOAP_ENCODING_REF_1_1);
+ }
+ return ref;
+ }
+
+ /**
+ * Writes a SOAP 1.1 ref attribute.
+ *
+ * @param writer the stream to which the id should be written; must not be null
+ * @param refId the reference id to write; must not be null
+ */
+ public static void writeRef(MessageWriter writer, String refId) {
+ if (writer == null) {
+ throw new NullPointerException("writer is null");
+ }
+ if (refId == null) {
+ throw new NullPointerException("refId is null");
+ }
+ writeAttribute(writer, SOAP_ENCODING_REF_1_1, refId);
+ }
+
+ private static String readAttributeValue(MessageReader reader, QName name) {
+ MessageReader attributeReader = reader.getAttributeReader(name);
+ if (attributeReader != null) {
+ String id = attributeReader.getValue();
+ if (id != null) {
+ return id;
+ }
+ }
+ return null;
+ }
+
+ private static void writeAttribute(MessageWriter writer, QName name, String refId) {
+ MessageWriter attributeWriter = writer.getAttributeWriter(name);
+ attributeWriter.writeValue(refId);
+ attributeWriter.close();
+ }
+}
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapEncodingUtil.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapEncodingUtil.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRef.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRef.java?rev=603333&view=auto
==============================================================================
--- incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRef.java (added)
+++ incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRef.java Tue Dec 11 11:01:33 2007
@@ -0,0 +1,76 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.aegis.type.encoded;
+
+/**
+ * SoapRef represents an encoded SOAP 1.1 href or SOAP 1.2 ref object. This data class is updated when the ref
+ * is resolved which can be immedately when the ref is resolved, or later when an instance with the referenced
+ * id is unmarshalled.
+ * <p/>
+ * When the reference is resolved, an optional Action will be invoked which is commonly used to update a
+ * property on the source object of the reference.
+ */
+public class SoapRef {
+ private Object instance;
+ private Action action;
+
+ /**
+ * Gets the referenced object instance or null if the reference has not been resolved yet;
+ *
+ * @return the referenced object instance or null
+ */
+ public Object get() {
+ return instance;
+ }
+
+ /**
+ * Sets the referenced object instance. If an action is registered the onSet method is invoked.
+ *
+ * @param object the reference instance; not null
+ */
+ public void set(Object object) {
+ if (object == null) {
+ throw new NullPointerException("object is null");
+ }
+ this.instance = object;
+ if (action != null) {
+ action.onSet(this);
+ }
+ }
+
+ /**
+ * Registers an action to invoke when the instance is set. If the instance, has already been set, the
+ * onSet method will immedately be invoked.
+ *
+ * @return the action to invoke when this refernce is resolved; not null
+ */
+ public void setAction(Action action) {
+ if (action == null) {
+ throw new NullPointerException("action is null");
+ }
+ this.action = action;
+ if (instance != null) {
+ action.onSet(this);
+ }
+ }
+
+ public static interface Action {
+ void onSet(SoapRef ref);
+ }
+}
\ No newline at end of file
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRef.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRef.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRefRegistry.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRefRegistry.java?rev=603333&view=auto
==============================================================================
--- incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRefRegistry.java (added)
+++ incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRefRegistry.java Tue Dec 11 11:01:33 2007
@@ -0,0 +1,126 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.aegis.type.encoded;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import org.apache.cxf.aegis.Context;
+import org.apache.cxf.aegis.DatabindingException;
+
+/**
+ * SoapRefRegistry handles resolving all SOAP encoded references. After each object is unmarshalled if the
+ * xml contained a SOAP id attribute it is registered with that attribute. As each object is unmarshalled if
+ * any nested elements have a SOAP ref attribute it, the references is registered. If there is a object
+ * instance already registered with the referenced id, the SOAP reference is immedately set. Otherwise, the
+ * reference is set when an object instance is registered with the id. This allows for the objects to occur
+ * in any order in the XML document.
+ * <p/>
+ * Note: only the StructType and TraillingBlocks register objects with this class.
+ */
+public class SoapRefRegistry {
+ /**
+ * The unmarshalled object instances by id.
+ */
+ private final SortedMap<String, Object> instances = new TreeMap<String, Object>();
+
+ /**
+ * The unresolved SOAP references by referenced id.
+ */
+ private final SortedMap<String, List<SoapRef>> unresolvedRefs = new TreeMap<String, List<SoapRef>>();
+
+ /**
+ * Get the SoapRefRegistry stored in the context, and if necessary create a new one.
+ *
+ * @param context the unmarshal context
+ * @return the SoapRefRegistry; never null
+ */
+ public static SoapRefRegistry get(Context context) {
+ SoapRefRegistry soapRefRegistry = (SoapRefRegistry) context.get(SoapRefRegistry.class.getName());
+ if (soapRefRegistry == null) {
+ soapRefRegistry = new SoapRefRegistry();
+ context.put(SoapRefRegistry.class.getName(), soapRefRegistry);
+ }
+ return soapRefRegistry;
+ }
+
+ /**
+ * Add an object instance to the registry.
+ *
+ * @param id the unique identifier of the instance
+ * @param instance the instance
+ * @throws DatabindingException if another object instance is already registered with the id
+ */
+ public void addInstance(String id, Object instance) {
+ Object oldInstance = instances.put(id, instance);
+ if (oldInstance != null) {
+ throw new DatabindingException("Id " + id + " is already registered to instance " + instance);
+ }
+ List<SoapRef> list = unresolvedRefs.remove(id);
+ if (list != null) {
+ for (SoapRef soapRef : list) {
+ soapRef.set(instance);
+ }
+ }
+ }
+
+ /**
+ * Adds a reference to the specified id. If an object is already registered with the specified id, the
+ * SOAP reference will immedately be set. Otherwise, the reference will be set when an object is
+ * registered with the specified id.
+ *
+ * @param id the id of the referenced object instance
+ * @param soapRef the reference to set
+ */
+ public void addRef(String id, SoapRef soapRef) {
+ Object value = instances.get(id);
+ if (value != null) {
+ soapRef.set(value);
+ } else {
+ List<SoapRef> list = unresolvedRefs.get(id);
+ if (list == null) {
+ list = new ArrayList<SoapRef>();
+ unresolvedRefs.put(id, list);
+ }
+ list.add(soapRef);
+ }
+ }
+
+ /**
+ * Gets the ids of the registered object instances.
+ *
+ * @return the ids of the registered object instances
+ */
+ public Set<String> getIds() {
+ return Collections.unmodifiableSet(instances.keySet());
+ }
+
+ /**
+ * Gets the unresolved SOAP references by referenced id.
+ *
+ * @return the unresolved SOAP references by referenced id
+ */
+ public SortedMap<String, List<SoapRef>> getUnresolvedRefs() {
+ return unresolvedRefs;
+ }
+}
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRefRegistry.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRefRegistry.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRefType.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRefType.java?rev=603333&view=auto
==============================================================================
--- incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRefType.java (added)
+++ incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRefType.java Tue Dec 11 11:01:33 2007
@@ -0,0 +1,139 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.aegis.type.encoded;
+
+import java.util.Set;
+import javax.xml.namespace.QName;
+
+import org.apache.cxf.aegis.Context;
+import org.apache.cxf.aegis.DatabindingException;
+import org.apache.cxf.aegis.type.Type;
+import org.apache.cxf.aegis.type.TypeMapping;
+import org.apache.cxf.aegis.xml.MessageReader;
+import org.apache.cxf.aegis.xml.MessageWriter;
+import org.jdom.Element;
+
+/**
+ * SoapRefType reads and writes SoapRef objects.
+ * <p/>
+ * When reading, this class checks for a SOAP ref attribute, and if present creates SoapRef and registers it
+ * with the SoapRefRegistry. If the SOAP ref attribute is not present, this class delegates to the baseType
+ * specified in the constructor. Regardless of the element containing SOAP ref or not, a SoapRef object is
+ * returned. In the case of an inline object the SoapRef will contain a null value.
+ * <p/>
+ * When writing, the class always writes an element containing a SOAP ref attribute. The actual object
+ * instance is registered with the MarshalRegistry, and is written at the end of the message body by the
+ * TrailingBlocks class.
+ */
+public class SoapRefType extends Type {
+ private final Type baseType;
+
+ public SoapRefType(Type baseType) {
+ if (baseType == null) {
+ throw new NullPointerException("baseType is null");
+ }
+ this.baseType = baseType;
+ }
+
+ @Override
+ public Object readObject(MessageReader reader, Context context) throws DatabindingException {
+ SoapRef soapRef = new SoapRef();
+
+ // if we have a ref, register our soap ref with context
+ String ref = SoapEncodingUtil.readRef(reader);
+ if (ref != null) {
+ SoapRefRegistry.get(context).addRef(ref, soapRef);
+ reader.readToEnd();
+ return soapRef;
+ }
+
+ Object object = baseType.readObject(reader, context);
+ soapRef.set(object);
+ return soapRef;
+ }
+
+ public void writeObject(Object object,
+ MessageWriter writer,
+ Context context) throws DatabindingException {
+
+ // write the ref id
+ String refId = MarshalRegistry.get(context).getInstanceId(object);
+ SoapEncodingUtil.writeRef(writer, refId);
+ }
+
+ public void writeSchema(Element root) {
+ baseType.writeSchema(root);
+ }
+
+ public TypeMapping getTypeMapping() {
+ return baseType.getTypeMapping();
+ }
+
+ public void setTypeMapping(TypeMapping typeMapping) {
+ baseType.setTypeMapping(typeMapping);
+ }
+
+ public Class getTypeClass() {
+ return baseType.getTypeClass();
+ }
+
+ public void setTypeClass(Class typeClass) {
+ baseType.setTypeClass(typeClass);
+ }
+
+ public boolean isComplex() {
+ return baseType.isComplex();
+ }
+
+ public boolean isAbstract() {
+ return baseType.isAbstract();
+ }
+
+ public void setAbstract(boolean ab) {
+ baseType.setAbstract(ab);
+ }
+
+ public boolean isNillable() {
+ return baseType.isNillable();
+ }
+
+ public void setNillable(boolean nillable) {
+ baseType.setNillable(nillable);
+ }
+
+ public Set<Type> getDependencies() {
+ return baseType.getDependencies();
+ }
+
+ public QName getSchemaType() {
+ return baseType.getSchemaType();
+ }
+
+ public void setSchemaType(QName name) {
+ baseType.setSchemaType(name);
+ }
+
+ public boolean isWriteOuter() {
+ return baseType.isWriteOuter();
+ }
+
+ public void setWriteOuter(boolean writeOuter) {
+ baseType.setWriteOuter(writeOuter);
+ }
+}
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRefType.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRefType.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/StructType.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/StructType.java?rev=603333&view=auto
==============================================================================
--- incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/StructType.java (added)
+++ incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/StructType.java Tue Dec 11 11:01:33 2007
@@ -0,0 +1,178 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.aegis.type.encoded;
+
+import javax.xml.namespace.QName;
+
+import org.apache.cxf.aegis.Context;
+import org.apache.cxf.aegis.DatabindingException;
+import org.apache.cxf.aegis.type.Type;
+import org.apache.cxf.aegis.type.basic.BeanType;
+import org.apache.cxf.aegis.type.basic.BeanTypeInfo;
+import org.apache.cxf.aegis.xml.MessageReader;
+import org.apache.cxf.aegis.xml.MessageWriter;
+
+/**
+ * StructType is a small extension of the BeanType which can properly read and write SOAP encoded structs. The
+ * modifications are:
+ * <ul>
+ * <li>Nested elements MUST be unqualified</li>
+ * <li>Nested elements MAY contain a SOAP ref attribute instead of an inline value</li>
+ * <li>Struct MAY contain a SOAP id attribute</li>
+ * </ul>
+ * </p>
+ * When writting, the class will always write the struct in the following connonical format:
+ * <ul>
+ * <li>Struct will contain a SOAP id</li>
+ * <li>Nested structs will be written as SOAP references (with SoapRefType)</li>
+ * </ul>
+ */
+public class StructType extends BeanType {
+ public StructType() {
+ }
+
+ public StructType(BeanTypeInfo info) {
+ super(info);
+ }
+
+ /**
+ * Gets the BeanTypeInfo using an unqualified name.
+ * @param name the unqualified name of the element
+ * @return the BeanTypeInfo containing a property with the specified unqualified name
+ */
+ @Override
+ protected BeanTypeInfo getBeanTypeInfoWithProperty(QName name) {
+ // nested elements use unqualified names
+ name = qualifyName(name);
+
+ return super.getBeanTypeInfoWithProperty(name);
+ }
+
+ /**
+ * Returns a SoapRefType wrapping the actual type.
+ */
+ @Override
+ protected Type getElementType(QName name,
+ BeanTypeInfo beanTypeInfo,
+ MessageReader reader,
+ Context context) {
+
+ // nested elements use unqualified names
+ name = qualifyName(name);
+
+ Type type = super.getElementType(name, beanTypeInfo, reader, context);
+ if (type != null) {
+ type = new SoapRefType(type);
+ }
+ return type;
+ }
+
+ /**
+ * Adds special handeling for SoapRefs
+ */
+ @Override
+ protected void writeProperty(QName name,
+ Object object,
+ Object property,
+ Class impl,
+ BeanTypeInfo inf) throws DatabindingException {
+
+ // nested elements use unqualified names
+ name = qualifyName(name);
+
+ if (property instanceof SoapRef) {
+ SoapRef soapRef = (SoapRef) property;
+
+ // register an action with the ref that will set the bean property
+ // if the reference has already been resolved the action will be
+ // invoked immedately
+ soapRef.setAction(new WritePropertyAction(name, object, impl, inf));
+ } else {
+ // normal property
+ super.writeProperty(name, object, property, impl, inf);
+ }
+ }
+
+ /**
+ * Writes a nested element with an unqualified name.
+ */
+ @Override
+ protected void writeElement(QName name, Object value, Type type, MessageWriter writer, Context context) {
+ // Nested elements are unqualified
+ name = new QName("", name.getLocalPart());
+
+ MessageWriter cwriter = writer.getElementWriter(name);
+
+ // todo check if the property value is a simple Java type instead of looking or a BeanType
+ if (type instanceof BeanType) {
+ String refId = MarshalRegistry.get(context).getInstanceId(value);
+ SoapEncodingUtil.writeRef(cwriter, refId);
+ } else {
+ type.writeObject(value, cwriter, context);
+ }
+
+ cwriter.close();
+ }
+
+ /**
+ * Gets the qualified name of a nested element. Soap encoded structs contain unqualified elements so
+ * the method searches for a property matching the local part of the unqualified name.
+ */
+ private QName qualifyName(QName name) {
+ // is the name already qualified, we're done
+ if (!"".equals(name.getNamespaceURI())) {
+ return name;
+ }
+
+ // find the matching property and get it's name
+ for (BeanType sooper = this; sooper != null; sooper = sooper.getSuperType()) {
+ QName qualifiedName = new QName(sooper.getTypeInfo().getDefaultNamespace(), name.getLocalPart());
+
+ if (sooper.getTypeInfo().getType(qualifiedName) != null) {
+ return qualifiedName;
+ }
+ }
+
+ return name;
+ }
+
+ /**
+ * When the SoapRef is resolved write the matching property on the target object.
+ */
+ private final class WritePropertyAction implements SoapRef.Action {
+ private final QName name;
+ private final Object targetObject;
+ private final Class targetClass;
+ private final BeanTypeInfo beanTypeInfo;
+
+ private WritePropertyAction(QName name,
+ Object targetObject,
+ Class targetClass,
+ BeanTypeInfo beanTypeInfo) {
+ this.name = name;
+ this.targetObject = targetObject;
+ this.targetClass = targetClass;
+ this.beanTypeInfo = beanTypeInfo;
+ }
+
+ public void onSet(SoapRef ref) {
+ writeProperty(name, targetObject, ref.get(), targetClass, beanTypeInfo);
+ }
+ }
+}
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/StructType.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/StructType.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/TrailingBlocks.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/TrailingBlocks.java?rev=603333&view=auto
==============================================================================
--- incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/TrailingBlocks.java (added)
+++ incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/TrailingBlocks.java Tue Dec 11 11:01:33 2007
@@ -0,0 +1,157 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.aegis.type.encoded;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.cxf.aegis.Context;
+import org.apache.cxf.aegis.DatabindingException;
+import org.apache.cxf.aegis.type.Type;
+import org.apache.cxf.aegis.type.TypeMapping;
+import org.apache.cxf.aegis.type.basic.ObjectType;
+import org.apache.cxf.aegis.xml.MessageReader;
+import org.apache.cxf.aegis.xml.MessageWriter;
+
+/**
+ * TrailingBlocks reads and writes the extra objects referenced but not written in the main message parts.
+ * These objects are commonly refered to as serialization (SOAP spec) roots and trailing blocks (JaxRpc spec).
+ * This class uses ObjectType to perform the actual reading and writting, so each block will (and must)
+ * contain an xsi type element.
+ * <p/>
+ * Typically, all message parts are read or written using the SoapRefType and before closing the SOAP body
+ * element the trailing blocks are read or written using this class.
+ */
+public class TrailingBlocks {
+ /**
+ * The ObjectType used to read and write the trailing block instances.
+ */
+ private ObjectType objectType;
+
+ public TrailingBlocks() {
+ // we only work with mapped types
+ objectType = new ObjectType();
+ objectType.setReadToDocument(false);
+ objectType.setSerializedWhenUnknown(false);
+ }
+
+ public TrailingBlocks(TypeMapping typeMapping) {
+ this();
+ objectType.setTypeMapping(typeMapping);
+ }
+
+ public TrailingBlocks(ObjectType objectType) {
+ this.objectType = objectType;
+ }
+
+ /**
+ * Gets the ObjectType used to read and write the trailing block instances.
+ *
+ * @return the ObjectType used to read and write the trailing block instances.
+ */
+ public ObjectType getObjectType() {
+ return objectType;
+ }
+
+ /**
+ * Sets the ObjectType used to read and write the trailing block instances.
+ *
+ * @param objectType the ObjectType used to read and write the trailing block instances.
+ */
+ public void setObjectType(ObjectType objectType) {
+ this.objectType = objectType;
+ }
+
+ /**
+ * Reads all remailing elements in the reader and registers them with the SoapRefRegistry in the context.
+ *
+ * @param reader the stream to read
+ * @param context the unmarshal context
+ * @return a list containing the object instances read
+ * @throws DatabindingException if a trailing block element does not contain a soap id attribute
+ */
+ public List<Object> readBlocks(MessageReader reader, Context context) throws DatabindingException {
+ List<Object> blocks = new ArrayList<Object>();
+
+ // read extra serialization roots
+ while (reader.hasMoreElementReaders()) {
+ MessageReader creader = reader.getNextElementReader();
+
+ // read the instance id
+ String id = SoapEncodingUtil.readId(creader);
+ if (id == null) {
+ throw new DatabindingException(
+ "Trailing block does not contain a SOAP id attribute " + creader.getName());
+ }
+
+ // read the instance
+ Object instance = objectType.readObject(creader, context);
+ blocks.add(instance);
+
+ // register the instance
+ SoapRefRegistry.get(context).addInstance(id, instance);
+
+ // close the element reader
+ creader.readToEnd();
+ }
+ return blocks;
+ }
+
+ /**
+ * Writes all of the unmarshalled objects in the MarshalRegistry.
+ *
+ * @param writer the stream to write the objects
+ * @param context the marshal context
+ * @return a list containing the object instances written
+ */
+ public List<Object> writeBlocks(MessageWriter writer, Context context) {
+ List<Object> blocks = new ArrayList<Object>();
+
+ for (Object instance : MarshalRegistry.get(context)) {
+ // determine instance type
+ Type type = objectType.determineType(context, instance.getClass());
+ if (type == null) {
+ TypeMapping tm = context.getTypeMapping();
+ if (tm == null) {
+ tm = objectType.getTypeMapping();
+ }
+
+ type = tm.getTypeCreator().createType(instance.getClass());
+ tm.register(type);
+ }
+
+ // create an new element for the instance
+ MessageWriter cwriter = writer.getElementWriter(type.getSchemaType());
+
+ // write the id attribute
+ String id = MarshalRegistry.get(context).getInstanceId(instance);
+ SoapEncodingUtil.writeId(cwriter, id);
+
+ // write the instance
+ objectType.writeObject(instance, cwriter, context);
+ blocks.add(instance);
+
+ // close the element
+ cwriter.close();
+ }
+
+ return blocks;
+ }
+
+}
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/TrailingBlocks.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/TrailingBlocks.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/Address.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/Address.java?rev=603333&view=auto
==============================================================================
--- incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/Address.java (added)
+++ incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/Address.java Tue Dec 11 11:01:33 2007
@@ -0,0 +1,58 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.aegis.type.encoded;
+
+public class Address {
+ private String street;
+ private String city;
+ private String state;
+ private String zip;
+
+ public String getStreet() {
+ return street;
+ }
+
+ public void setStreet(String street) {
+ this.street = street;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public String getState() {
+ return state;
+ }
+
+ public void setState(String state) {
+ this.state = state;
+ }
+
+ public String getZip() {
+ return zip;
+ }
+
+ public void setZip(String zip) {
+ this.zip = zip;
+ }
+}
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/Address.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/Address.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/PurchaseOrder.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/PurchaseOrder.java?rev=603333&view=auto
==============================================================================
--- incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/PurchaseOrder.java (added)
+++ incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/PurchaseOrder.java Tue Dec 11 11:01:33 2007
@@ -0,0 +1,40 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.aegis.type.encoded;
+
+public class PurchaseOrder {
+ private Address shipping;
+ private Address billing;
+
+ public Address getShipping() {
+ return shipping;
+ }
+
+ public void setShipping(Address shipping) {
+ this.shipping = shipping;
+ }
+
+ public Address getBilling() {
+ return billing;
+ }
+
+ public void setBilling(Address billing) {
+ this.billing = billing;
+ }
+}
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/PurchaseOrder.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/PurchaseOrder.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/StructTypeTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/StructTypeTest.java?rev=603333&view=auto
==============================================================================
--- incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/StructTypeTest.java (added)
+++ incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/StructTypeTest.java Tue Dec 11 11:01:33 2007
@@ -0,0 +1,296 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.aegis.type.encoded;
+
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+
+import org.apache.cxf.aegis.AbstractAegisTest;
+import org.apache.cxf.aegis.Context;
+import org.apache.cxf.aegis.type.DefaultTypeMappingRegistry;
+import org.apache.cxf.aegis.type.Type;
+import org.apache.cxf.aegis.type.TypeMapping;
+import org.apache.cxf.aegis.type.basic.BeanTypeInfo;
+import org.apache.cxf.aegis.xml.MessageReader;
+import org.apache.cxf.aegis.xml.MessageWriter;
+import org.apache.cxf.aegis.xml.jdom.JDOMWriter;
+import org.apache.cxf.aegis.xml.stax.ElementReader;
+import org.apache.cxf.common.util.SOAPConstants;
+import org.apache.cxf.helpers.CastUtils;
+import org.jdom.Attribute;
+import org.jdom.Content;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.output.XMLOutputter;
+import org.junit.Test;
+
+public class StructTypeTest extends AbstractAegisTest {
+ private TypeMapping mapping;
+ private StructType addressType;
+ private StructType purchaseOrderType;
+ private TrailingBlocks trailingBlocks;
+
+ public void setUp() throws Exception {
+ super.setUp();
+
+ addNamespace("b", "urn:Bean");
+ addNamespace("a", "urn:anotherns");
+ addNamespace("xsi", SOAPConstants.XSI_NS);
+
+ DefaultTypeMappingRegistry reg = new DefaultTypeMappingRegistry(true);
+ mapping = reg.createTypeMapping(true);
+
+ // address type
+ BeanTypeInfo addressInfo = new BeanTypeInfo(Address.class, "urn:Bean");
+ addressInfo.setTypeMapping(mapping);
+
+ addressType = new StructType(addressInfo);
+ addressType.setTypeClass(Address.class);
+ addressType.setSchemaType(new QName("urn:Bean", "address"));
+ mapping.register(addressType);
+
+ // purchase order type
+ BeanTypeInfo poInfo = new BeanTypeInfo(PurchaseOrder.class, "urn:Bean");
+ poInfo.setTypeMapping(mapping);
+
+ purchaseOrderType = new StructType(poInfo);
+ purchaseOrderType.setTypeClass(PurchaseOrder.class);
+ purchaseOrderType.setTypeMapping(mapping);
+ purchaseOrderType.setSchemaType(new QName("urn:Bean", "po"));
+ mapping.register(purchaseOrderType);
+
+ // serialization root type
+ trailingBlocks = new TrailingBlocks();
+// trailingBlocks.setTypeMapping(mapping);
+
+ }
+
+ @Test
+ public void testSimpleStruct() throws Exception {
+ // Test reading
+ ElementReader reader = new ElementReader(getClass().getResourceAsStream("struct1.xml"));
+ Address address = (Address) addressType.readObject(reader, new Context());
+ validateAddress(address);
+ reader.getXMLStreamReader().close();
+
+ // Test reading - no namespace on nested elements
+ reader = new ElementReader(getClass().getResourceAsStream("struct2.xml"));
+ address = (Address) addressType.readObject(reader, new Context());
+ validateAddress(address);
+ reader.getXMLStreamReader().close();
+
+ // Test writing
+ Element element = new Element("root", "b", "urn:Bean");
+ new Document(element);
+ addressType.writeObject(address, new JDOMWriter(element), new Context());
+ validateShippingAddress(element);
+ }
+
+ @Test
+ public void testComplexStruct() throws Exception {
+ // Test reading
+ ElementReader reader = new ElementReader(getClass().getResourceAsStream("struct3.xml"));
+ PurchaseOrder po = (PurchaseOrder) purchaseOrderType.readObject(reader, new Context());
+ validatePurchaseOrder(po);
+ reader.getXMLStreamReader().close();
+
+ // Test reading - no namespace on nested elements
+ reader = new ElementReader(getClass().getResourceAsStream("struct4.xml"));
+ po = (PurchaseOrder) purchaseOrderType.readObject(reader, new Context());
+ validatePurchaseOrder(po);
+ reader.getXMLStreamReader().close();
+
+ // Test writing
+ Element element = writeRef(po);
+ validatePurchaseOrder(element);
+ }
+
+ @Test
+ public void testStructRef() throws Exception {
+ PurchaseOrder purchaseOrder;
+
+ // Simple nested ref
+ purchaseOrder = (PurchaseOrder) readRef("ref1.xml");
+ validatePurchaseOrder(purchaseOrder);
+
+ // Strings referenced
+ purchaseOrder = (PurchaseOrder) readRef("ref2.xml");
+ validatePurchaseOrder(purchaseOrder);
+
+ // completely unrolled
+ purchaseOrder = (PurchaseOrder) readRef("ref3.xml");
+ validatePurchaseOrder(purchaseOrder);
+
+ // Test writing
+ Element element = writeRef(purchaseOrder);
+
+ validatePurchaseOrder(element);
+ }
+
+ private Object readRef(String file) throws XMLStreamException {
+ Context context = new Context();
+ context.setTypeMapping(mapping);
+ ElementReader root = new ElementReader(getClass().getResourceAsStream(file));
+
+ // get Type based on the element qname
+ MessageReader reader = root.getNextElementReader();
+ Type type = this.mapping.getType(reader.getName());
+ assertNotNull("type is null", type);
+
+ // read ref
+ SoapRefType soapRefType = new SoapRefType(type);
+ SoapRef ref = (SoapRef) soapRefType.readObject(reader, context);
+ reader.readToEnd();
+
+ // read the trailing blocks (referenced objects)
+ List<Object> roots = trailingBlocks.readBlocks(root, context);
+ assertNotNull(roots);
+
+ // close the input stream
+ root.getXMLStreamReader().close();
+
+ // return the ref
+ return ref.get();
+ }
+
+ private Element writeRef(Object instance) {
+ // create the document
+ Element element = new Element("root", "b", "urn:Bean");
+ new Document(element);
+ JDOMWriter rootWriter = new JDOMWriter(element);
+ Context context = new Context();
+ context.setTypeMapping(mapping);
+
+ // get Type based on the object instance
+ Type type = this.mapping.getType(instance.getClass());
+ assertNotNull("type is null", type);
+
+ // write the ref
+ SoapRefType soapRefType = new SoapRefType(type);
+ MessageWriter cwriter = rootWriter.getElementWriter(soapRefType.getSchemaType());
+ soapRefType.writeObject(instance, cwriter, context);
+ cwriter.close();
+
+ // write the trailing blocks (referenced objects)
+ trailingBlocks.writeBlocks(rootWriter, context);
+ return element;
+ }
+
+ private void validateAddress(Address address) {
+ assertNotNull(address);
+ assertEquals("1234 Riverside Drive", address.getStreet());
+ assertEquals("Gainesville", address.getCity());
+ assertEquals("FL", address.getState());
+ assertEquals("30506", address.getZip());
+ }
+
+ private void validateShippingAddress(Element shipping) {
+ assertNotNull("shipping is null", shipping);
+ assertChildEquals("1234 Riverside Drive", shipping, "street");
+ assertChildEquals("Gainesville", shipping, "city");
+ assertChildEquals("FL", shipping, "state");
+ assertChildEquals("30506", shipping, "zip");
+ }
+
+ private void validateBillingAddress(Element billing) {
+ assertNotNull("billing is null", billing);
+ assertChildEquals("1234 Fake Street", billing, "street");
+ assertChildEquals("Las Vegas", billing, "city");
+ assertChildEquals("NV", billing, "state");
+ assertChildEquals("89102", billing, "zip");
+ }
+
+ private void validatePurchaseOrder(PurchaseOrder purchaseOrder) {
+ assertNotNull(purchaseOrder);
+ assertNotNull(purchaseOrder.getShipping());
+ assertEquals("1234 Riverside Drive", purchaseOrder.getShipping().getStreet());
+ assertEquals("Gainesville", purchaseOrder.getShipping().getCity());
+ assertEquals("FL", purchaseOrder.getShipping().getState());
+ assertEquals("30506", purchaseOrder.getShipping().getZip());
+ assertNotNull(purchaseOrder.getBilling());
+ assertEquals("1234 Fake Street", purchaseOrder.getBilling().getStreet());
+ assertEquals("Las Vegas", purchaseOrder.getBilling().getCity());
+ assertEquals("NV", purchaseOrder.getBilling().getState());
+ assertEquals("89102", purchaseOrder.getBilling().getZip());
+ }
+
+ private void validatePurchaseOrder(Element element) throws Exception {
+ Element poRefElement = null;
+ Map<String, Element> blocks = new TreeMap<String, Element>();
+ for (Content content : CastUtils.<Content>cast(element.getContent())) {
+ if (content instanceof Element) {
+ Element child = (Element) content;
+ if (poRefElement == null) {
+ poRefElement = child;
+ } else {
+ String id = getId("Trailing block ", child);
+ blocks.put(id, child);
+ }
+ }
+ }
+
+ Element po = getReferencedElement("poRef", poRefElement, blocks);
+
+ Element shippingRef = po.getChild("shipping");
+ Element shipping = getReferencedElement("shipping", shippingRef, blocks);
+ validateShippingAddress(shipping);
+
+ Element billingRef = po.getChild("billing");
+ Element billing = getReferencedElement("billing", billingRef, blocks);
+ validateBillingAddress(billing);
+ }
+
+ private Element getReferencedElement(String childName,
+ Element element,
+ Map<String, Element> blocks) {
+ assertNotNull(childName + " is null", element);
+ assertNotNull("element is null", element);
+ String refId = getRef(childName, element);
+ Element refElement = blocks.get(refId);
+ assertNotNull(childName + " referenced non-existant element " + refId, refElement);
+ return refElement;
+ }
+
+ private void assertChildEquals(String expected, Element element, String childName) {
+ assertEquals(expected, element.getChild(childName).getText());
+ }
+
+ private String getId(String childName, Element child) {
+ assertNotNull(childName + " is null", child);
+ Attribute idAttribute = child.getAttribute("id");
+ XMLOutputter xmlOutputter = new XMLOutputter();
+ assertNotNull(childName + " id is null \n" + xmlOutputter.outputString(child), idAttribute);
+ String id = idAttribute.getValue();
+ assertNotNull(childName + " id is null \n" + xmlOutputter.outputString(child), id);
+ return id;
+ }
+
+ private String getRef(String childName, Element child) {
+ assertNotNull(childName + " is null", child);
+ Attribute hrefAttribute = child.getAttribute("href");
+ XMLOutputter xmlOutputter = new XMLOutputter();
+ assertNotNull(childName + " href is null \n" + xmlOutputter.outputString(child), hrefAttribute);
+ String href = hrefAttribute.getValue();
+ assertNotNull(childName + " href is null \n" + xmlOutputter.outputString(child), href);
+ return href;
+ }
+}
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/StructTypeTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/StructTypeTest.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref1.xml
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref1.xml?rev=603333&view=auto
==============================================================================
--- incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref1.xml (added)
+++ incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref1.xml Tue Dec 11 11:01:33 2007
@@ -0,0 +1,37 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<root xmlns:b="urn:Bean" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <b:po>
+ <shipping href="#real"/>
+ <billing href="#fake"/>
+ </b:po>
+
+ <real id="#real" xsi:type="b:address">
+ <street>1234 Riverside Drive</street>
+ <city>Gainesville</city>
+ <state>FL</state>
+ <zip>30506</zip>
+ </real>
+ <fake id="#fake" xsi:type="b:address">
+ <street>1234 Fake Street</street>
+ <city>Las Vegas</city>
+ <state>NV</state>
+ <zip>89102</zip>
+ </fake>
+</root>
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref1.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref1.xml
------------------------------------------------------------------------------
svn:keywords = Rev Date
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref1.xml
------------------------------------------------------------------------------
svn:mime-type = text/xml
Added: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref2.xml
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref2.xml?rev=603333&view=auto
==============================================================================
--- incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref2.xml (added)
+++ incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref2.xml Tue Dec 11 11:01:33 2007
@@ -0,0 +1,51 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<root xmlns:b="urn:Bean"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
+
+ <b:po>
+ <shipping href="#real"/>
+ <billing href="#fake"/>
+ </b:po>
+
+ <real id="#real" xsi:type="b:address">
+ <street href="#real-street"/>
+ <city href="#real-city"/>
+ <state href="#real-state"/>
+ <zip href="#real-zip"/>
+ </real>
+ <fake id="#fake" xsi:type="b:address">
+ <street href="#fake-street"/>
+ <city href="#fake-city"/>
+ <state href="#fake-state"/>
+ <zip href="#fake-zip"/>
+ </fake>
+
+ <soapenc:string xsi:type="xsd:string" id="#real-street">1234 Riverside Drive</soapenc:string>
+ <soapenc:string xsi:type="xsd:string" id="#real-city">Gainesville</soapenc:string>
+ <soapenc:string xsi:type="xsd:string" id="#real-state">FL</soapenc:string>
+ <soapenc:string xsi:type="xsd:string" id="#real-zip">30506</soapenc:string>
+
+ <soapenc:string xsi:type="xsd:string" id="#fake-street">1234 Fake Street</soapenc:string>
+ <soapenc:string xsi:type="xsd:string" id="#fake-city">Las Vegas</soapenc:string>
+ <soapenc:string xsi:type="xsd:string" id="#fake-state">NV</soapenc:string>
+ <soapenc:string xsi:type="xsd:string" id="#fake-zip">89102</soapenc:string>
+</root>
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref2.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref2.xml
------------------------------------------------------------------------------
svn:keywords = Rev Date
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref2.xml
------------------------------------------------------------------------------
svn:mime-type = text/xml
Added: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref3.xml
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref3.xml?rev=603333&view=auto
==============================================================================
--- incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref3.xml (added)
+++ incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref3.xml Tue Dec 11 11:01:33 2007
@@ -0,0 +1,53 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<root xmlns:b="urn:Bean"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
+
+ <b:po href="#po"/>
+
+ <object id="#po" xsi:type="b:po">
+ <shipping href="#real"/>
+ <billing href="#fake"/>
+ </object>
+
+ <real id="#real" xsi:type="b:address">
+ <street href="#real-street"/>
+ <city href="#real-city"/>
+ <state href="#real-state"/>
+ <zip href="#real-zip"/>
+ </real>
+ <fake id="#fake" xsi:type="b:address">
+ <street href="#fake-street"/>
+ <city href="#fake-city"/>
+ <state href="#fake-state"/>
+ <zip href="#fake-zip"/>
+ </fake>
+
+ <soapenc:string xsi:type="xsd:string" id="#real-street">1234 Riverside Drive</soapenc:string>
+ <soapenc:string xsi:type="xsd:string" id="#real-city">Gainesville</soapenc:string>
+ <soapenc:string xsi:type="xsd:string" id="#real-state">FL</soapenc:string>
+ <soapenc:string xsi:type="xsd:string" id="#real-zip">30506</soapenc:string>
+
+ <soapenc:string xsi:type="xsd:string" id="#fake-street">1234 Fake Street</soapenc:string>
+ <soapenc:string xsi:type="xsd:string" id="#fake-city">Las Vegas</soapenc:string>
+ <soapenc:string xsi:type="xsd:string" id="#fake-state">NV</soapenc:string>
+ <soapenc:string xsi:type="xsd:string" id="#fake-zip">89102</soapenc:string>
+</root>
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref3.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref3.xml
------------------------------------------------------------------------------
svn:keywords = Rev Date
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ref3.xml
------------------------------------------------------------------------------
svn:mime-type = text/xml
Added: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct1.xml
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct1.xml?rev=603333&view=auto
==============================================================================
--- incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct1.xml (added)
+++ incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct1.xml Tue Dec 11 11:01:33 2007
@@ -0,0 +1,24 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<b:shipping xmlns:b="urn:Bean">
+ <b:street>1234 Riverside Drive</b:street>
+ <b:city>Gainesville</b:city>
+ <b:state>FL</b:state>
+ <b:zip>30506</b:zip>
+</b:shipping>
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct1.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct1.xml
------------------------------------------------------------------------------
svn:keywords = Rev Date
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct1.xml
------------------------------------------------------------------------------
svn:mime-type = text/xml
Added: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct2.xml
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct2.xml?rev=603333&view=auto
==============================================================================
--- incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct2.xml (added)
+++ incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct2.xml Tue Dec 11 11:01:33 2007
@@ -0,0 +1,24 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<b:shipping xmlns:b="urn:Bean">
+ <street>1234 Riverside Drive</street>
+ <city>Gainesville</city>
+ <state>FL</state>
+ <zip>30506</zip>
+</b:shipping>
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct2.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct2.xml
------------------------------------------------------------------------------
svn:keywords = Rev Date
Propchange: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct2.xml
------------------------------------------------------------------------------
svn:mime-type = text/xml
Added: incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct3.xml
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct3.xml?rev=603333&view=auto
==============================================================================
--- incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct3.xml (added)
+++ incubator/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/struct3.xml Tue Dec 11 11:01:33 2007
@@ -0,0 +1,32 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<b:po xmlns:b="urn:Bean">
+ <b:shipping>
+ <b:street>1234 Riverside Drive</b:street>
+ <b:city>Gainesville</b:city>
+ <b:state>FL</b:state>
+ <b:zip>30506</b:zip>
+ </b:shipping>
+ <b:billing>
+ <b:street>1234 Fake Street</b:street>
+ <b:city>Las Vegas</b:city>
+ <b:state>NV</b:state>
+ <b:zip>89102</b:zip>
+ </b:billing>
+</b:po>
\ No newline at end of file