You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by ke...@apache.org on 2007/02/19 11:32:14 UTC

svn commit: r509148 [1/2] - in /incubator/tuscany/java/sdo/impl/src: main/java/org/apache/tuscany/sdo/util/ main/java/org/apache/tuscany/sdo/util/resource/ test/java/org/apache/tuscany/sdo/test/ test/resources/

Author: kelvingoodson
Date: Mon Feb 19 02:32:13 2007
New Revision: 509148

URL: http://svn.apache.org/viewvc?view=rev&rev=509148
Log:
TUSCANY-1101 -- applied patch

Added:
    incubator/tuscany/java/sdo/impl/src/test/resources/SequenceChangeSummary.xsd   (with props)
    incubator/tuscany/java/sdo/impl/src/test/resources/mixedChangeSummary.xml   (with props)
    incubator/tuscany/java/sdo/impl/src/test/resources/mixedChangeSummaryUndone.xml   (with props)
    incubator/tuscany/java/sdo/impl/src/test/resources/openChangeSummary.xml   (with props)
    incubator/tuscany/java/sdo/impl/src/test/resources/openChangeSummaryUndone.xml   (with props)
Modified:
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/StreamDeserializer.java
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/ChangeSummaryStreamDeserializer.java
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/ChangeSummaryStreamSerializer.java
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/RecordedEventXMLStreamReader.java
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/SDODeserializer.java
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/SDOXMLResourceImpl.java
    incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/AllTests.java
    incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/ChangeSummaryPropertyTestCase.java
    incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/XMLHelperTestCase.java

Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/StreamDeserializer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/StreamDeserializer.java?view=diff&rev=509148&r1=509147&r2=509148
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/StreamDeserializer.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/StreamDeserializer.java Mon Feb 19 02:32:13 2007
@@ -19,13 +19,17 @@
  */
 package org.apache.tuscany.sdo.util;
 
+import java.util.Comparator;
+
 import javax.xml.XMLConstants;
 import javax.xml.namespace.NamespaceContext;
-import javax.xml.stream.*;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamReader;
 
 import org.apache.tuscany.sdo.util.resource.RecordedEventXMLStreamReader;
-import org.eclipse.emf.ecore.*;
-import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.ExtendedMetaData;
 import org.eclipse.emf.ecore.xmi.XMLResource;
 import org.eclipse.emf.ecore.xml.type.internal.QName;
 
@@ -71,4 +75,18 @@
     static public final class QualifiedAttribute extends Attribute {
         public String nameSpace;
     }
-}
\ No newline at end of file
+
+    static protected final Comparator EQUAL_NULL = new Comparator() {
+        public int compare(Object v, Object NULL) {
+            return v == null || v.equals(null) ? 0 : 1;
+        }
+    }, EQUAL = new Comparator() {
+        public int compare(Object v, Object value) {
+            return value.equals(v) ? 0 : -1;
+        }
+    }, SAME = new Comparator() {
+        public int compare(Object v, Object value) {
+            return value == v ? 0 : -1;
+        }
+    };
+}

Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/ChangeSummaryStreamDeserializer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/ChangeSummaryStreamDeserializer.java?view=diff&rev=509148&r1=509147&r2=509148
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/ChangeSummaryStreamDeserializer.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/ChangeSummaryStreamDeserializer.java Mon Feb 19 02:32:13 2007
@@ -19,39 +19,66 @@
  */
 package org.apache.tuscany.sdo.util.resource;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 
 import javax.xml.namespace.NamespaceContext;
-import javax.xml.stream.*;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
 
-import commonj.sdo.*;
-import commonj.sdo.helper.HelperContext;
-
-import org.eclipse.emf.ecore.*;
-import org.eclipse.emf.ecore.change.*;
 import org.apache.tuscany.sdo.SDOFactory;
 import org.apache.tuscany.sdo.helper.SDOAnnotations;
-import org.apache.tuscany.sdo.impl.*;
+import org.apache.tuscany.sdo.impl.ChangeSummaryImpl;
+import org.apache.tuscany.sdo.impl.ClassImpl;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.ETypedElement;
+import org.eclipse.emf.ecore.change.ChangeDescription;
+import org.eclipse.emf.ecore.change.ChangeFactory;
+import org.eclipse.emf.ecore.change.ChangeKind;
+import org.eclipse.emf.ecore.change.FeatureChange;
+import org.eclipse.emf.ecore.change.FeatureMapEntry;
+import org.eclipse.emf.ecore.change.ListChange;
+import org.eclipse.emf.ecore.util.FeatureMap;
+import org.eclipse.emf.ecore.util.FeatureMapUtil;
+
+import commonj.sdo.ChangeSummary;
+import commonj.sdo.DataObject;
+import commonj.sdo.Property;
+import commonj.sdo.Type;
+import commonj.sdo.helper.HelperContext;
 
 /**
  * ChangeSummary StAX Deserializer whose input conforms to the SDO Java/C++/PHP specifications. The instance isn't thread-safe, however it's safe to
  * use the instance any times on the same thread.
  */
 public class ChangeSummaryStreamDeserializer extends SDODeserializer {
-    static final class ForwardReference {
-        String ref, unset;
+    static final class ForwardReference extends Ref {
+        final String unset;
 
-        Collection attributes/* = null */, qualifiedAttributes/* = null */, tags/* = null */; // may be null, never empty
+        ForwardReference(String ref, NamespaceContext nameSpaces, String u) {
+            super(ref, nameSpaces);
+            unset = u;
+        }
 
-        NamespaceContext nameSpaces;
+        Collection attributes/* = null */, qualifiedAttributes/* = null */, tags/* = null */; // may be null, never empty
     }
 
     protected Collection forwardReferences/* = null */;
 
-    static private final class ElementChange {
-        private Object property;
-
-        private String ref;
+    static private final class ElementChange extends Ref {
+        private final Object containing, containment;
+        private ElementChange(String ref, NamespaceContext nameSpaces, Object property, Object propertyInSequence) {
+            super(ref, nameSpaces);
+            containing = property;
+            containment = propertyInSequence;
+        }
     }
 
     static private class PropertyMapChanges {
@@ -98,8 +125,7 @@
 
     private SDOFactory changeSettingFactory;
 
-    private void logPropertyChange(Collection featureChanges, Object property, Object value, boolean set) {
-        EStructuralFeature feature = (EStructuralFeature) property;
+    private void logPropertyChange(Collection featureChanges, EStructuralFeature feature, Object value, boolean set) {
         if (changeSettingFactory == null)
             featureChanges.add(changeFactory.createFeatureChange(feature, value, set));
         else
@@ -107,7 +133,7 @@
     }
 
     void unsetProperty(Collection featureChanges, String unset, int begin, int index, Type type) {
-        logPropertyChange(featureChanges, type.getProperty(unset.substring(begin, index)), null, false);
+        logPropertyChange(featureChanges, (EStructuralFeature) type.getProperty(unset.substring(begin, index)), null, false);
     }
 
     static boolean isWhitespace(String unset, int index) {
@@ -142,23 +168,30 @@
         return featureChanges;
     }
 
+    private Object value(EStructuralFeature containing, Object containment, Object value) {
+        return FeatureMapUtil.isFeatureMap(containing) ? changeFactory.createFeatureMapEntry((EStructuralFeature) containment, value) : value;
+    }
+
+    private void logPropertyChange(Collection featureChanges, Object containing, Object containment, Object value) {
+        EStructuralFeature feature = (EStructuralFeature) containing;
+        logPropertyChange(featureChanges, feature, value(feature, containment, value), true);
+    }
+
     private void logPropertyChange(Collection featureChanges, Object property, Object value) {
-        logPropertyChange(featureChanges, property, value, true);
+        logPropertyChange(featureChanges, property, propertyInSequence, value);
     }
 
     void logAttributeChange(Collection featureChanges, Property property, String literal, NamespaceContext nameSpaces) {
-        if (property != null)
-            logPropertyChange(featureChanges, property, value(property.getType(), literal, nameSpaces));
-        // else report error?
+        logPropertyChange(featureChanges, property, value(property.getType(), literal, nameSpaces));
     }
 
     protected final void logAttributeChange(Collection featureChanges, String property, Type type, String value, NamespaceContext nameSpaces) {
-        logAttributeChange(featureChanges, type.getProperty(property), value, nameSpaces);
+        logAttributeChange(featureChanges, getProperty(type, property), value, nameSpaces);
     }
 
     protected final void logAttributeChange(Collection featureChanges, String nameSpace, String name, Type type, String value,
             NamespaceContext nameSpaces) {
-        logAttributeChange(featureChanges, getProperty(type, nameSpace, name), value, nameSpaces);
+        logAttributeChange(featureChanges, getProperty(type, nameSpace, name, false), value, nameSpaces);
     }
 
     protected final String ref() {
@@ -187,6 +220,10 @@
         }
     }
 
+    protected final void addPropertyChange(Collection list, Object value, Object containing) {
+        list.add(value((EStructuralFeature) containing, propertyInSequence, value));
+    }
+
     protected boolean logging;
 
     /**
@@ -239,18 +276,15 @@
                 String ref = ref(), unset = reader.getAttributeValue(SDOAnnotations.COMMONJ_SDO_NS, ChangeSummaryStreamSerializer.UNSET);
                 int attributes = reader.getAttributeCount();
                 NamespaceContext nameSpaces = reader.getNamespaceContext();
-                EObject referent = referent(ref);
+                EObject referent = referent(ref, nameSpaces);
                 if (referent == null) {
                     /*
                      * Forward-referenced(unresolved) modified DataObject
                      */
-                    ForwardReference forwardReference = new ForwardReference();
+                    ForwardReference forwardReference = new ForwardReference(ref, nameSpaces, unset);
                     if (forwardReferences == null)
                         forwardReferences = new ArrayList();
                     forwardReferences.add(forwardReference);
-                    forwardReference.ref = ref;
-                    forwardReference.unset = unset;
-                    forwardReference.nameSpaces = nameSpaces;
                     do // what about xmlns="NS1" a1="qName" xmlns="NS2" a2="qName" ?
                     {
                         /*
@@ -295,9 +329,8 @@
                             continue;
                         Type xsi = typeXSI();
                         if (xsi == null) {
-                            nameSpace = tag.nameSpace;
-                            if (nameSpace != null)
-                                tag.value = value(globalElementType(tag.name.getLocalPart())); // TODO substitutionGroup type if null
+                            if (tag.nameSpace != null)
+                                tag.value = value(globalElementType(tag.nameSpace, tag.name.getLocalPart())); // TODO substitutionGroup type if null
                             else if (tag.record(reader))
                                 break;
                         } else
@@ -328,8 +361,7 @@
                             /*
                              * Log property old value as element
                              */
-                            nameSpace = reader.getNamespaceURI();
-                            name = reader.getLocalName();
+                            String nameSpace = reader.getNamespaceURI(), name = reader.getLocalName();
                             Property property = getProperty(nameSpace, name, type);
                             boolean many = property.isMany();
                             Object value;
@@ -342,25 +374,24 @@
                                 if (xsi != null)
                                     value = value(xsi);
                                 else if (nameSpace == null)
-                                    value = value(property, reader);
+                                    value = value(reader);
                                 else {
-                                    xsi = globalElementType(name);
-                                    value = value(xsi == null ? property.getType() : xsi);
+                                    xsi = globalElementType(nameSpace, name);
+                                    value = value(xsi == null ? propertyInSequence.getType() : xsi);
                                 }
                             } else {
                                 /*
                                  * Referenced child DataObject
                                  */
+                                nameSpaces = reader.getNamespaceContext();
                                 reader.nextTag()/* END_ELEMENT */;
-                                value = referent(ref);
+                                value = referent(ref, nameSpaces);
                                 if (value == null) {
                                     /*
                                      * Forward-referenced(unresolved) child DataObject
                                      */
                                     if (!many) {
-                                        ElementChange elementChange = new ElementChange();
-                                        elementChange.property = property;
-                                        elementChange.ref = ref;
+                                        ElementChange elementChange = new ElementChange(ref, nameSpaces, property, propertyInSequence);
                                         if (objectChanges == null) {
                                             objectChanges = newObjectChanges(featureChanges);
                                             objectChanges.newElementChanges();
@@ -369,7 +400,7 @@
                                         objectChanges.elementChanges.add(elementChange);
                                         continue;
                                     }
-                                    value = ref;
+                                    value = new Ref(ref, nameSpaces);
                                 }
                             }
                             if (many) {
@@ -381,7 +412,7 @@
                                     list = objectChanges.newList(property);
                                 else
                                     list = objectChanges.get(property);
-                                list.add(value);
+                                addPropertyChange(list, value, property);
                             } else
                                 logPropertyChange(featureChanges, property, value);
                         } while (START_ELEMENT == reader.nextTag());
@@ -391,23 +422,38 @@
         }
     }
 
-    private Collection changeList(ChangeKind changeKind, int index, Collection listChanges) {
+    static private boolean sequence(Object listChanges) {
+        return FeatureMapUtil.isFeatureMap(((FeatureChange) ((EStructuralFeature.Setting) listChanges).getEObject()).getFeature());
+    }
+
+    private ListChange createListChange(ChangeKind changeKind, int index, Collection listChanges) {
         ListChange listChange = changeFactory.createListChange();
         listChange.setKind(changeKind);
         listChange.setIndex(index);
         listChanges.add(listChange);
-        return listChange.getValues();
+        return listChange;
     }
 
     Collection add(Collection adds, int change, Collection listChanges, Object value) {
-        if (adds == null)
-            adds = changeList(ChangeKind.ADD_LITERAL, change, listChanges);
+        if (adds == null) {
+            ListChange listChange = createListChange(ChangeKind.ADD_LITERAL, change, listChanges);
+            adds = sequence(listChanges) ? listChange.getFeatureMapEntryValues() : listChange.getValues();
+        }
         adds.add(value);
         return adds;
     }
 
     private int remove(int change, Collection listChanges, List list, int begin, int end) {
-        Collection removes = changeList(ChangeKind.REMOVE_LITERAL, change, listChanges);
+        ListChange listChange = createListChange(ChangeKind.REMOVE_LITERAL, change, listChanges);
+        if (sequence(listChanges)) {
+            Collection removes = listChange.getFeatureMapEntryValues();
+            do {
+                FeatureMap.Entry fme = (FeatureMap.Entry) list.get(begin);
+                removes.add(changeFactory.createFeatureMapEntry(fme.getEStructuralFeature(), fme.getValue()));
+            } while (++begin != end);
+            return begin;
+        }
+        Collection removes = listChange.getValues();
         do
             removes.add(list.get(begin));
         while (++begin != end);
@@ -418,53 +464,31 @@
         return begin == end ? begin : remove(change, listChanges, list, begin, end);
     }
 
-    protected final void logManyChanges(PropertyMapChanges propertyMapChanges, Object referent, Collection featureChanges) {
+    protected final void logManyChanges(PropertyMapChanges propertyMapChanges, EObject referent, Collection featureChanges) {
         for (Iterator lists = propertyMapChanges.lists.entrySet().iterator(); lists.hasNext();) {
             /*
              * Compute ListChanges out of comparision of old and new list
              */
             Map.Entry entry = (Map.Entry) lists.next();
-            Property property = (Property) entry.getKey();
+            EStructuralFeature property = (EStructuralFeature) entry.getKey();
             Iterator values = ((Collection) entry.getValue()).iterator(); // old list
-            List list = ((DataObject) referent).getList(property); // new
+            Object value = referent.eGet(property);
+            List list = value instanceof FeatureMap.Internal.Wrapper ? ((FeatureMap.Internal.Wrapper) value).featureMap() : (List) value; // new
             int change = 0;
             FeatureChange featureChange = changeSettingFactory == null ? changeFactory.createFeatureChange() : (FeatureChange) changeSettingFactory
                     .createChangeSummarySetting();
-            featureChange.setFeature((EStructuralFeature) property);
+            featureChange.setFeature(property);
             Collection listChanges = featureChange.getListChanges(), adds = null;
             featureChanges.add(featureChange);
-            Type type = property.getType();
-            if (type.isDataType()) {
-                /*
-                 * Log simple value changes
-                 */
-                while (values.hasNext()) {
-                    Object value = values.next();
-                    // values.remove();
-                    int index = list.indexOf(value);
-                    switch (index) {
-                    case -1:
-                        adds = add(adds, change, listChanges, value);
-                        break;
-                    default:
-                        remove(change, listChanges, list, 0, index);
-                    case 0:
-                        list = list.subList(++index, list.size());
-                        adds = null;
-                    }
-                    ++change;
-                }
-                remove(0, list.size(), change, listChanges, list);
-            } else {
+            if (property.getEType() instanceof EClass) {
                 /*
                  * Log child DataObject changes
                  */
                 int begin = 0, end = list.size();
                 while (values.hasNext()) {
-                    Object value = values.next();
-                    if (value.getClass() == String.class) // final
-                    {
-                        value = referent((String) value);
+                    value = values.next();
+                    if (value.getClass() == Ref.class) {
+                        value = referent((Ref) value);
                         if (value == null)
                             continue;// report error?
                     }
@@ -483,6 +507,66 @@
                     ++change;
                 }
                 remove(begin, end, change, listChanges, list);
+            } else if (FeatureMapUtil.isFeatureMap(property)) {
+                /*
+                 * Log Sequence changes
+                 */
+                int begin = 0, end = list.size();
+                while (values.hasNext()) {
+                    FeatureMapEntry featureMapEntry = (FeatureMapEntry) values.next();
+                    value = featureMapEntry.getValue();
+                    if (value.getClass() == Ref.class) {
+                        value = referent((Ref) value);
+                        if (value == null)
+                            continue;// report error?
+                    }
+                    // values.remove();
+                    Comparator equality;
+                    ETypedElement feature = featureMapEntry.getFeature();
+                    if (((Type) feature.getEType()).isDataType())
+                        if (value == null)
+                            equality = EQUAL_NULL;
+                        else
+                            equality = EQUAL;
+                    else
+                        equality = SAME;
+                    for (int index = begin;/* true */; ++index)
+                        if (index == end) {
+                            adds = add(adds, change, listChanges, featureMapEntry);
+                            break;
+                        } else {
+                            FeatureMap.Entry fme = (FeatureMap.Entry) list.get(index);
+                            if (feature == fme.getEStructuralFeature() && equality.compare(fme.getValue(), value) == 0) {
+                                begin = remove(begin, index, change, listChanges, list);
+                                ++begin;
+                                adds = null;
+                                break;
+                            }
+                        }
+                    ++change;
+                }
+                remove(begin, end, change, listChanges, list);
+            } else {
+                /*
+                 * Log simple value changes
+                 */
+                while (values.hasNext()) {
+                    value = values.next();
+                    // values.remove();
+                    int index = list.indexOf(value);
+                    switch (index) {
+                    case -1:
+                        adds = add(adds, change, listChanges, value);
+                        break;
+                    default:
+                        remove(change, listChanges, list, 0, index);
+                    case 0:
+                        list = list.subList(++index, list.size());
+                        adds = null;
+                    }
+                    ++change;
+                }
+                remove(0, list.size(), change, listChanges, list);
             }
         }
     }
@@ -502,7 +586,7 @@
                  * Forward-referenced(unresolved) modified DataObject from begin(...)
                  */
                 ForwardReference forwardReference = (ForwardReference) iterator.next();
-                EObject referent = referent(forwardReference.ref);
+                EObject referent = referent(forwardReference);
                 if (referent == null)
                     continue; // report error?
                 // iterator.remove();
@@ -534,10 +618,10 @@
                         Tag tag = (Tag) tags.next();
                         Property property = getProperty(tag.nameSpace, tag.name.getLocalPart(), type);
                         if (tag.ref != null)
-                            tag.value = referent(tag.ref);
+                            tag.value = referent(tag.ref, tag.nameSpaceContext);
                         // if (tag.value == null) report error?
                         else if (tag.events != null)
-                            tag.value = value(property, play(tag));
+                            tag.value = value(play(tag));
                         if (property.isMany()) {
                             Collection list;
                             if (propertyMapChanges == null) {
@@ -545,7 +629,7 @@
                                 list = propertyMapChanges.newList(property);
                             } else
                                 list = propertyMapChanges.get(property);
-                            list.add(tag.value);
+                            addPropertyChange( list, tag.value, property);
                         } else
                             logPropertyChange(featureChanges, property, tag.value);
                     }
@@ -562,18 +646,18 @@
                 if (objectChanges.elementChanges != null)
                     for (Iterator elementChanges = objectChanges.elementChanges.iterator(); elementChanges.hasNext();) {
                         ElementChange elementChange = (ElementChange) elementChanges.next();
-                        Object value = referent(elementChange.ref);
+                        Object value = referent(elementChange);
                         if (value == null)
                             continue; // report error?
                         // iterator.remove();
-                        logPropertyChange(objectChanges.featureChanges, elementChange.property, value);
+                        logPropertyChange(objectChanges.featureChanges, elementChange.containing, elementChange.containment, value);
                     }
                 if (objectChanges.lists != null)
-                    logManyChanges(objectChanges, ((Map.Entry) ((EStructuralFeature.Setting) objectChanges.featureChanges).getEObject()).getKey(),
-                            objectChanges.featureChanges);
+                    logManyChanges(objectChanges, (EObject) ((Map.Entry) ((EStructuralFeature.Setting) objectChanges.featureChanges).getEObject())
+                            .getKey(), objectChanges.featureChanges);
             }
         if (logging)
             changeSummary.resumeLogging();
         return changeSummary;
     }
-}
\ No newline at end of file
+}

Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/ChangeSummaryStreamSerializer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/ChangeSummaryStreamSerializer.java?view=diff&rev=509148&r1=509147&r2=509148
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/ChangeSummaryStreamSerializer.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/ChangeSummaryStreamSerializer.java Mon Feb 19 02:32:13 2007
@@ -19,22 +19,45 @@
  */
 package org.apache.tuscany.sdo.util.resource;
 
-import java.util.*;
-import javax.xml.namespace.*;
-import javax.xml.stream.*;
-
-import commonj.sdo.*;
-import commonj.sdo.helper.XSDHelper;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
 
 import org.apache.tuscany.sdo.SDOPackage;
-import org.apache.tuscany.sdo.helper.*;
+import org.apache.tuscany.sdo.helper.SDOAnnotations;
+import org.apache.tuscany.sdo.helper.XSDHelperImpl;
 import org.apache.tuscany.sdo.impl.ChangeSummaryImpl;
+import org.apache.tuscany.sdo.model.ModelFactory;
+import org.apache.tuscany.sdo.model.impl.ModelFactoryImpl;
 import org.apache.tuscany.sdo.util.SDOUtil;
-import org.eclipse.emf.ecore.*;
-import org.eclipse.emf.ecore.change.*;
-import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.EMap;
+import org.eclipse.emf.ecore.EClassifier;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.change.ChangeDescription;
+import org.eclipse.emf.ecore.change.ChangeKind;
+import org.eclipse.emf.ecore.change.FeatureChange;
+import org.eclipse.emf.ecore.change.ListChange;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.ExtendedMetaData;
+import org.eclipse.emf.ecore.util.FeatureMap;
+import org.eclipse.emf.ecore.util.FeatureMapUtil;
 import org.eclipse.emf.ecore.xmi.XMLResource;
 
+import commonj.sdo.ChangeSummary;
+import commonj.sdo.DataObject;
+import commonj.sdo.Property;
+import commonj.sdo.helper.XSDHelper;
+
 /**
  * ChangeSummary StAX Serializer whose output conforms to the SDO Java/C++/PHP specifications. The instance isn't thread-safe, however it's safe to
  * use the instance any times on the same thread.
@@ -170,7 +193,7 @@
     private StringBuffer step(Object container) throws XMLStreamException {
         Property containmentProperty = dataObject.getContainmentProperty();
         StringBuffer step = step(containmentProperty);
-        if (containmentProperty.isMany())
+        if (containmentProperty.isMany() || ((EObject) dataObject).eContainingFeature() != containmentProperty)
             step.append('[').append(((DataObject) container).getList(containmentProperty).indexOf(dataObject) + 1).append(']');
         return step;
     }
@@ -324,7 +347,10 @@
         containmentProperty = changeSummary.getOldContainmentProperty(deletedDataObject);
         // assert containmentProperty != null;
         step(containmentProperty, pathDeleted);
-        if (containmentProperty.isMany())
+        Object f;
+        if (containmentProperty.isMany()
+                || (f = extendedMetaData.getAffiliation(((EObject) dataObject).eClass(), (EStructuralFeature) containmentProperty)) != null
+                && f != containmentProperty)
             pathDeleted.append('[').append(
                     ((List) changeSummary.getOldValue(dataObject, containmentProperty).getValue()).indexOf(deletedDataObject) + 1).append(']');
         if (id != null)
@@ -349,6 +375,8 @@
       new XMLStreamSerializer().serialize(new XMLDocumentStreamReader(reader), writer);
     }
 
+    static public final Object ChangeSummary_TYPE = ((ModelFactoryImpl) ModelFactory.INSTANCE).getChangeSummaryType();
+
     Collection deletedDataObjects;
 
     protected final void writeElement(Object value, Property property) throws XMLStreamException {
@@ -370,12 +398,20 @@
                 writeEndElement(null);
             }
         } else {
+            Object type = property.getType();
+            if (type == ChangeSummary_TYPE)
+                return;
             writeStartElement(property);
-            writer.writeCharacters(convertToString(property, value));
+            writer.writeCharacters(EcoreUtil.convertToString((EDataType) type, value));
             writeEndElement(null);
         }
     }
     
+    protected final void writeElement(Object value) throws XMLStreamException {
+        FeatureMap.Entry entry = (FeatureMap.Entry) value;
+        writeElement(entry.getValue(), (Property)entry.getEStructuralFeature());
+    }
+
     static protected List optimize(List values, Object featureChange, int size) {
         int fromIndex = size, toIndex = 0;
         for (Iterator changes = ((FeatureChange) featureChange).getListChanges().iterator(); changes.hasNext();) {
@@ -452,7 +488,8 @@
         ChangeDescription changeDescription = (ChangeDescription) changeSummary;
         Iterator createdDataObjects = changeDescription.getObjectsToDetach().iterator();
         deletedDataObjects = changeDescription.getObjectsToAttach();
-        modifiedDataObjects = changeDescription.getObjectChanges().keySet(); // may contain DO(s) from createdDataObjects and/or deletedDataObjects
+        EMap objectChanges = changeDescription.getObjectChanges();
+        modifiedDataObjects = objectChanges.keySet(); // may contain DO(s) from createdDataObjects and/or deletedDataObjects
 
         /*
          * 6-2. Prepare to compute (X)Path
@@ -581,7 +618,7 @@
                 writeRef();
 
                 String lineBreak = null;
-                Collection oldValues = changeSummary.getOldValues(dataObject);
+                Collection oldValues = (Collection) objectChanges.get(dataObject); // changeSummary.getOldValues repeats Sequence changes
                 Iterator settings = oldValues.iterator();
                 if (settings.hasNext()) {
                     do {
@@ -609,18 +646,34 @@
                         Property property = oldValue.getProperty();
                         if (!xsdHelper.isAttribute(property))
                             if (property.isMany()) {
-                                List list = (List) oldValue.getValue();
-                                if (optimizeList)
-                                    list = optimize(list, oldValue, dataObject.getList(property).size());
-                                Iterator values = list.iterator();
-                                if (values.hasNext()) {
+                                Object value = oldValue.getValue();
+                                List list = (List) value;
+                                if (FeatureMapUtil.isFeatureMap((EStructuralFeature) property)) {
+                                    if (optimizeList)
+                                        list = optimize(list, oldValue, dataObject.getSequence(property).size());
+                                    Iterator values = list.iterator();
+                                    if (!values.hasNext())
+                                        continue;
+                                    do
+                                        writeElement(values.next());
+                                    while (values.hasNext());
+                                } else {
+                                    if (optimizeList)
+                                        list = optimize(list, oldValue, dataObject.getList(property).size());
+                                    Iterator values = list.iterator();
+                                    if (!values.hasNext())
+                                        continue;
                                     do
                                         writeElement(values.next(), property);
                                     while (values.hasNext());
-                                    lineBreak = this.lineBreak;
                                 }
+                                lineBreak = this.lineBreak;
                             } else if (oldValue.isSet()) {
-                                writeElement(oldValue.getValue(), property);
+                                Object value = oldValue.getValue();
+                                if (value instanceof FeatureMap.Entry)
+                                    writeElement(value);
+                                else
+                                    writeElement(value, property);
                                 lineBreak = this.lineBreak;
                             }
                     }

Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/RecordedEventXMLStreamReader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/RecordedEventXMLStreamReader.java?view=diff&rev=509148&r1=509147&r2=509148
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/RecordedEventXMLStreamReader.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/RecordedEventXMLStreamReader.java Mon Feb 19 02:32:13 2007
@@ -19,14 +19,22 @@
  */
 package org.apache.tuscany.sdo.util.resource;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
 
 import javax.xml.XMLConstants;
-import javax.xml.namespace.*;
-import javax.xml.stream.*;
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.namespace.QName;
+import javax.xml.stream.Location;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
 
 import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.xml.sax.*;
+import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
 
 /**
  * This special purpose XMLStreamReader is used to produce a StAX event stream corresponding to a list of events 
@@ -47,7 +55,7 @@
     static private class Event {
         int type;
 
-        NamespaceContext nameSpaceContext;
+        public NamespaceContext nameSpaceContext;
 
         Location location;
 
@@ -406,19 +414,25 @@
             ++nest;
         }
 
+        protected final void  add (Event event)
+        {
+            int index = events.size();
+            event.nameSpaceContext = index == 0 ? nameSpaceContext : ((Event) events.get(--index)).nameSpaceContext;
+            events.add(event);
+        }
+
         public final void text(int type, String value, Locator locator) {
             Event event = new ValueEvent(value);
             event.type = type;
             event.location(locator);
             int index = events.size();
-            event.nameSpaceContext = index == 0 ? nameSpaceContext : ((Event) events.get(--index)).nameSpaceContext;
-            events.add(event);
+            add(event);
         }
 
         public final boolean end(String nameSpace, String local, String qName, Locator locator) {
             Event end = new EndElement(nameSpace, local, prefix(qName, nameSpace), locator);
             end.type = END_ELEMENT;
-            events.add(end);
+            add(end);
             if (nest == 0)
                 return true;
             --nest;
@@ -851,4 +865,4 @@
                         && name.equals(((EndElement) event).name.getLocalPart())))
             throwXMLStreamException("name not matched");
     }
-}
\ No newline at end of file
+}

Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/SDODeserializer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/SDODeserializer.java?view=diff&rev=509148&r1=509147&r2=509148
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/SDODeserializer.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/SDODeserializer.java Mon Feb 19 02:32:13 2007
@@ -19,19 +19,37 @@
  */
 package org.apache.tuscany.sdo.util.resource;
 
-import java.util.*;
-
-import javax.xml.stream.*;
-
-import commonj.sdo.*;
-import commonj.sdo.helper.*;
-
-import org.apache.tuscany.sdo.helper.*;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.tuscany.sdo.helper.TypeHelperImpl;
+import org.apache.tuscany.sdo.helper.XMLStreamHelper;
+import org.apache.tuscany.sdo.helper.XMLStreamHelperImpl;
 import org.apache.tuscany.sdo.util.StreamDeserializer;
-import org.eclipse.emf.ecore.*;
-import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.TreeIterator;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.ExtendedMetaData;
 import org.eclipse.emf.ecore.xmi.XMLResource;
 
+import commonj.sdo.Property;
+import commonj.sdo.Type;
+import commonj.sdo.helper.HelperContext;
+import commonj.sdo.helper.TypeHelper;
+import commonj.sdo.helper.XSDHelper;
+
 /**
  * SDO StAX Deserializer. The instance isn't thread-safe, however it's safe to use the instance any times on the same thread.
  */
@@ -40,24 +58,51 @@
         reader = stream;
         xsdHelper = scope.getXSDHelper();
         typeHelper = scope.getTypeHelper();
+        extendedMetaData = ((TypeHelperImpl) typeHelper).getExtendedMetaData();
         deserializer = null;
         root = (EObject) rootObject;
     }
 
     XSDHelper xsdHelper;
 
-    protected final Property getProperty(Type type, String nameSpace, String name) {
+    protected Property propertyInSequence;
+
+    Property getProperty(Object type) {
+        EClass c = (EClass) type;
+        EStructuralFeature containment = (EStructuralFeature) propertyInSequence;
+        Object containing = extendedMetaData.getAffiliation(c, containment);
+        // if (containing == null) report error?
+        if (containment == containing && containment.isDerived()) {
+            containing = extendedMetaData.getMixedFeature(c);
+            if (containing == null) {
+                containing = extendedMetaData.getGroup(containment);
+                if (containing == null)
+                    return propertyInSequence;
+            }
+        }
+        return (Property) containing;
+    }
+
+    protected final Property getProperty(Type type, String nameSpace, String name, boolean element) {
         for (Iterator iterator = type.getProperties().iterator(); iterator.hasNext();) {
-            Property property = (Property) iterator.next();
-            if (nameSpace.equals(xsdHelper.getNamespaceURI(property)) && name.equals(xsdHelper.getLocalName(property)))
-                return property;
+            propertyInSequence = (Property) iterator.next();
+            if (name.equals(xsdHelper.getLocalName(propertyInSequence))
+                    && nameSpace.equals(xsdHelper.getNamespaceURI(propertyInSequence)))
+                return getProperty(type);
         }
-        return null; // TODO substitutionGroup & any
+        propertyInSequence = xsdHelper.getGlobalProperty(nameSpace, name, element);
+        // if (propertyInSequence == null) report error?
+        return getProperty(type);
+    }
+
+    protected final Property getProperty(Type type, String name) {
+        propertyInSequence = type.getProperty(name);
+        // if (propertyInSequence == null) report error?
+        return getProperty(type);
     }
 
     protected final Property getProperty(String nameSpace, String name, Type type) {
-        return nameSpace == null ? type.getProperty(name) : getProperty(type, nameSpace, name);
-        // if (property == null) report error?
+        return null == nameSpace ? getProperty(type, name) : getProperty(type, nameSpace, name, true);
     }
 
     XMLStreamHelperImpl deserializer;
@@ -81,8 +126,8 @@
 
     Map options/* = null */;
 
-    protected final Object value(Property property, XMLStreamReader reader) throws XMLStreamException {
-        Type propertyType = property.getType();
+    protected final Object value(XMLStreamReader reader) throws XMLStreamException {
+        Type propertyType = propertyInSequence.getType();
         if (propertyType.isDataType())
             return value(propertyType, reader);
         if (options == null)
@@ -91,20 +136,38 @@
         return load(reader, options);
     }
 
-    EObject root;
+    private boolean match(String name, String space, EStructuralFeature feature) {
+        return name.equals(extendedMetaData.getName(feature)) && space.equals(extendedMetaData.getNamespace(feature));
+    }
 
-    static EObject step(String ref, int step, int index, EObject container, ExtendedMetaData extendedMetaData) {
+    EObject step(String ref, int step, int index, EObject container, String prefix, NamespaceContext nameSpaces) {
         String name = ref.substring(step, index);
-        for (Iterator iterator = container.eContents().iterator(); iterator.hasNext();) {
-            container = (EObject) iterator.next();
-            // if( container == null )continue;
-            if (name.equals(extendedMetaData.getName(container.eContainmentFeature())))
-                return container;
-        }
+        Iterator iterator = container.eContents().iterator();
+        if (iterator.hasNext())
+            if (prefix == null)
+                do {
+                    container = (EObject) iterator.next();
+                    // if( container == null )continue;
+                    if (name.equals(extendedMetaData.getName(container.eContainmentFeature())))
+                        return container;
+                } while (iterator.hasNext());
+            else {
+                prefix = nameSpaces.getNamespaceURI(prefix);
+                do {
+                    container = (EObject) iterator.next();
+                    // if( container == null )continue;
+                    if (match(name, prefix, container.eContainmentFeature()))
+                        return container;
+                } while (iterator.hasNext());
+            }
         return null;
     }
 
-    protected EObject referent(String ref) {
+    EObject root;
+    
+    ExtendedMetaData extendedMetaData;
+
+    protected final EObject referent(String ref, NamespaceContext nameSpaces) {
         int length = ref.length();
         switch (length) {
         case 0:
@@ -136,31 +199,46 @@
             container = root;
             step = 1;
         }
-        ExtendedMetaData extendedMetaData = ((TypeHelperImpl) typeHelper).getExtendedMetaData();
+        String prefix = null;
         for (int index = step; ++index != length;) {
             switch (ref.charAt(index)) {
             case '/':
-                container = step(ref, step, index, container, extendedMetaData);
+                container = step(ref, step, index, container, prefix, nameSpaces);
                 if (container == null)
                     return null;
                 break;
+            case ':':
+                prefix = ref.substring(step, index);
+                if (++index == length)
+                    return container; // report error?
+                step = index;
             default:
                 continue;
             case '[':
                 name = ref.substring(step, index);
                 step = ref.indexOf(']', index + 2);
                 if (step == -1)
-                    return null;
+                    return container; // report error?
                 index = Integer.parseInt(ref.substring(++index, step));
                 EStructuralFeature feature;
-                for (Iterator iterator = container.eContents().iterator();/* true */;) {
-                    if (!iterator.hasNext())
-                        return null;
-                    EObject content = (EObject) iterator.next();
-                    // if( content == null )continue;
-                    feature = content.eContainmentFeature();
-                    if (name.equals(extendedMetaData.getName(feature)))
-                        break;
+                Iterator iterator = container.eContents().iterator();
+                if (prefix == null)
+                    do {
+                        if (!iterator.hasNext())
+                            return null;
+                        EObject content = (EObject) iterator.next();
+                        // if( content == null )continue;
+                        feature = content.eContainmentFeature();
+                    } while (!name.equals(extendedMetaData.getName(feature)));
+                else {
+                    prefix = nameSpaces.getNamespaceURI(prefix);
+                    do {
+                        if (!iterator.hasNext())
+                            return null;
+                        EObject content = (EObject) iterator.next();
+                        // if( content == null )continue;
+                        feature = content.eContainmentFeature();
+                    } while (!match(name, prefix, feature));
                 }
                 Object value = container.eGet(feature);
                 if (value instanceof List) {
@@ -179,15 +257,83 @@
             if (++index == length)
                 return container;
             step = index;
+            prefix = null;
         }
-        return step(ref, step, length, container, extendedMetaData);
+        return step(ref, step, length, container, prefix, nameSpaces);
+    }
+
+    static protected class Ref implements EObject // FeatureMapEntry value
+    {
+        protected Ref(String path, NamespaceContext context) {
+            ref = path;
+            nameSpaces = context;
+        }
+
+        final String ref;
+
+        final NamespaceContext nameSpaces;
+
+        public TreeIterator eAllContents() {
+            return null;
+        }
+        public EClass eClass() {
+            return null;
+        }
+        public EObject eContainer() {
+            return null;
+        }
+        public EStructuralFeature eContainingFeature() {
+            return null;
+        }
+        public EReference eContainmentFeature() {
+            return null;
+        }
+        public EList eContents() {
+            return null;
+        }
+        public EList eCrossReferences() {
+            return null;
+        }
+        public Object eGet(EStructuralFeature feature) {
+            return null;
+        }
+        public Object eGet(EStructuralFeature feature, boolean resolve) {
+            return null;
+        }
+        public boolean eIsProxy() {
+            return false;
+        }
+        public boolean eIsSet(EStructuralFeature feature) {
+            return false;
+        }
+        public Resource eResource() {
+            return null;
+        }
+        public void eSet(EStructuralFeature feature, Object newValue) {
+        }
+        public void eUnset(EStructuralFeature feature) {
+        }
+        public EList eAdapters() {
+            return null;
+        }
+        public boolean eDeliver() {
+            return false;
+        }
+        public void eNotify(Notification notification) {
+        }
+        public void eSetDeliver(boolean deliver) {
+        }
+    }
+
+    protected final EObject referent(Ref path) {
+        return referent(path.ref, path.nameSpaces);
     }
 
     protected final Type typeXSI() {
         return typedXSI() ? typeHelper.getType(nameSpace, name) : null;
     }
 
-    protected final Type globalElementType(String name) {
+    protected final Type globalElementType(String nameSpace, String name) {
         return xsdHelper.getGlobalProperty(nameSpace, name, true).getType();
     }
-}
\ No newline at end of file
+}

Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/SDOXMLResourceImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/SDOXMLResourceImpl.java?view=diff&rev=509148&r1=509147&r2=509148
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/SDOXMLResourceImpl.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/SDOXMLResourceImpl.java Mon Feb 19 02:32:13 2007
@@ -25,35 +25,63 @@
 import java.security.AccessController;
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 
 import javax.xml.XMLConstants;
 import javax.xml.namespace.NamespaceContext;
 import javax.xml.namespace.QName;
-import javax.xml.stream.*;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
 
 import org.apache.tuscany.sdo.helper.HelperContextImpl;
 import org.apache.tuscany.sdo.helper.XMLStreamHelper;
 import org.apache.tuscany.sdo.helper.XSDHelperImpl;
-import org.apache.tuscany.sdo.model.ModelFactory;
-import org.apache.tuscany.sdo.model.impl.ModelFactoryImpl;
-import org.apache.tuscany.sdo.util.*;
+import org.apache.tuscany.sdo.util.SDOUtil;
+import org.apache.tuscany.sdo.util.StAX2SAXAdapter;
 import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.*;
+import org.eclipse.emf.ecore.EClassifier;
+import org.eclipse.emf.ecore.EFactory;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.util.ExtendedMetaData;
+import org.eclipse.emf.ecore.util.FeatureMap;
 import org.eclipse.emf.ecore.xmi.XMIException;
 import org.eclipse.emf.ecore.xmi.XMLHelper;
 import org.eclipse.emf.ecore.xmi.XMLLoad;
 import org.eclipse.emf.ecore.xmi.XMLOptions;
 import org.eclipse.emf.ecore.xmi.XMLResource;
 import org.eclipse.emf.ecore.xmi.XMLSave;
-import org.eclipse.emf.ecore.xmi.impl.*;
+import org.eclipse.emf.ecore.xmi.impl.SAXXMLHandler;
+import org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl;
+import org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl;
+import org.eclipse.emf.ecore.xmi.impl.XMLOptionsImpl;
+import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
+import org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl;
+import org.eclipse.emf.ecore.xmi.impl.XMLString;
 import org.eclipse.emf.ecore.xmi.util.DefaultEcoreBuilder;
-import org.xml.sax.*;
+import org.eclipse.emf.ecore.xml.type.XMLTypePackage;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
 
-import commonj.sdo.*;
+import commonj.sdo.ChangeSummary;
+import commonj.sdo.DataObject;
 import commonj.sdo.helper.XSDHelper;
 
 public class SDOXMLResourceImpl extends XMLResourceImpl {
@@ -140,8 +168,6 @@
         }
     }
 
-    static final Object ChangeSummary_TYPE = ((ModelFactoryImpl) ModelFactory.INSTANCE).getChangeSummaryType();
-
     public EObject root;
 
     /**
@@ -249,7 +275,7 @@
                 if (peekObject != null) {
                     String prefix = helper.getPrefix(uri.length() == 0 ? null : uri);
                     EStructuralFeature feature = getFeature(peekObject, prefix == null ? XMLConstants.DEFAULT_NS_PREFIX : prefix, localName, true);
-                    if (feature != null && feature.getEType() == ChangeSummary_TYPE) {
+                    if (feature != null && feature.getEType() == ChangeSummaryStreamSerializer.ChangeSummary_TYPE) {
                         tag = new RecordedEventXMLStreamReader.Tag(uri, localName, prefix, attributes, locator, ((SDOXMLHelperImpl) helper).nameSpaceContext(),
                                 nameSpaces);
                         nameSpaces = null;
@@ -455,6 +481,10 @@
         protected String getAttributeIndent() {
             return getElementIndent();
         }
+        
+        public final boolean mixed() {
+            return isMixed;
+        }
 
         public void reset(String publicId, String systemId, int lineWidth, String temporaryFileName) {
             super.reset(publicId, systemId, lineWidth, temporaryFileName);
@@ -546,113 +576,265 @@
 
         XMLStreamWriter xmlStreamWriter/* = null*/;
 
-        protected void saveDataTypeElementSingle(EObject o, EStructuralFeature f) {
-            if (f.getEType() == ChangeSummary_TYPE) {
-                Object changeSummary = helper.getValue(o, f);
+        void saveChangeSummary(EObject o, EStructuralFeature f, Object changeSummary) {
+            boolean notMixed;
+            if (doc instanceof XmlString)
+                notMixed = !((XmlString) doc).mixed();
+            else if (extendedMetaData == null)
+                notMixed = true;
+            else
+                switch (extendedMetaData.getContentKind(o.eClass())) {
+                case ExtendedMetaData.MIXED_CONTENT:
+                case ExtendedMetaData.SIMPLE_CONTENT:
+                    notMixed = false;
+                    break;
+                default:
+                    notMixed = true;
+                }
+            if (notMixed) {
                 StringBuffer margin = new StringBuffer(this.margin);
                 for (EObject container = o.eContainer(), grandContainer; (grandContainer = container.eContainer()) != null; container = grandContainer)
                     margin.append(indent);
                 changeSummaryOptions.put(SDOUtil.XML_SAVE_MARGIN, margin.toString());
-                try {
-                    if (xmlStreamWriter == null) {
-                        xmlStreamWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(new Writer() {
-                            public void close() {
-                            }
-
-                            public void flush() {
-                            }
-
-                            protected final void add(char[] cbuf, int index, int off) {
-                                doc.add(new String(cbuf, index, off - index));
-                            }
-
-                            public void write(char[] cbuf, int off, int len) {
-                                if (len != 0)
-                                    for (;;) {
-                                        while (cbuf[off] == MARK) {
-                                            doc.addLine();
-                                            if (--len == 0)
-                                                return;
-                                            ++off;
-                                        }
-                                        for (int index = off;/* true */;) {
-                                            ++off;
-                                            if (--len == 0)
-                                                add(cbuf, index, off);
-                                            else {
-                                                if (cbuf[off] != MARK)
-                                                    continue;
-                                                add(cbuf, index, off);
-                                                doc.addLine();
-                                                if (--len != 0)
-                                                    break;
-                                            }
+            }
+            try {
+                if (xmlStreamWriter == null) {
+                    xmlStreamWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(new Writer() {
+                        public void close() {
+                        }
+
+                        public void flush() {
+                        }
+
+                        protected final void add(char[] cbuf, int index, int off) {
+                            doc.addText(new String(cbuf, index, off - index));
+                        }
+
+                        public void write(char[] cbuf, int off, int len) {
+                            if (len != 0)
+                                for (;;) {
+                                    while (cbuf[off] == MARK) {
+                                        doc.addLine();
+                                        if (--len == 0)
                                             return;
-                                        }
                                         ++off;
                                     }
-                            }
-                        });
-                        xmlStreamWriter.setNamespaceContext(((SDOXMLHelperImpl) helper).new NameSpaceContext() {
-                            public String getNamespaceURI(String prefix) {
-                                return declareXSI && ExtendedMetaData.XSI_PREFIX.equals(prefix) ? ExtendedMetaData.XSI_URI : super
-                                        .getNamespaceURI(prefix);
-                            }
-
-                            public String getPrefix(String namespaceURI) {
-                                return declareXSI && ExtendedMetaData.XSI_URI.equals(namespaceURI) ? ExtendedMetaData.XSI_PREFIX : super
-                                        .getPrefix(namespaceURI);
-                            }
-
-                            public Iterator getPrefixes(String namespaceURI) {
-                                final Iterator iterator = super.getPrefixes(namespaceURI);
-                                return ExtendedMetaData.XSI_URI.equals(namespaceURI) ? new Iterator() {
-                                    boolean first = true;
-
-                                    public boolean hasNext() {
-                                        if (first)
-                                            if (declareXSI) // never from true to false
-                                                return true;
-                                            else
-                                                first = false;
-                                        return iterator.hasNext();
-                                    }
-
-                                    public Object next() {
-                                        if (first) {
-                                            first = false;
-                                            if (declareXSI)
-                                                return ExtendedMetaData.XSI_PREFIX;
+                                    for (int index = off;/* true */;) {
+                                        ++off;
+                                        if (--len == 0)
+                                            add(cbuf, index, off);
+                                        else {
+                                            if (cbuf[off] != MARK)
+                                                continue;
+                                            add(cbuf, index, off);
+                                            doc.addLine();
+                                            if (--len != 0)
+                                                break;
                                         }
-                                        return iterator.next();
+                                        return;
                                     }
+                                    ++off;
+                                }
+                        }
+                    });
+                    xmlStreamWriter.setNamespaceContext(((SDOXMLHelperImpl) helper).new NameSpaceContext() {
+                        public String getNamespaceURI(String prefix) {
+                            return declareXSI && ExtendedMetaData.XSI_PREFIX.equals(prefix) ? ExtendedMetaData.XSI_URI : super
+                                    .getNamespaceURI(prefix);
+                        }
 
-                                    public void remove() {
-                                        if (first)
-                                            declareXSI = false;
+                        public String getPrefix(String namespaceURI) {
+                            return declareXSI && ExtendedMetaData.XSI_URI.equals(namespaceURI) ? ExtendedMetaData.XSI_PREFIX : super
+                                    .getPrefix(namespaceURI);
+                        }
+
+                        public Iterator getPrefixes(String namespaceURI) {
+                            final Iterator iterator = super.getPrefixes(namespaceURI);
+                            return ExtendedMetaData.XSI_URI.equals(namespaceURI) ? new Iterator() {
+                                boolean first = true;
+
+                                public boolean hasNext() {
+                                    if (first)
+                                        if (declareXSI) // never from true to false
+                                            return true;
                                         else
-                                            iterator.remove();
+                                            first = false;
+                                    return iterator.hasNext();
+                                }
+
+                                public Object next() {
+                                    if (first) {
+                                        first = false;
+                                        if (declareXSI)
+                                            return ExtendedMetaData.XSI_PREFIX;
                                     }
-                                } : iterator;
-                            }
-                        });
-                        for (Iterator iterator = helper.getPrefixToNamespaceMap().iterator(); iterator.hasNext();) {
-                            Map.Entry entry = (Map.Entry) iterator.next();
-                            xmlStreamWriter.setPrefix((String) entry.getKey(), (String) entry.getValue());
+                                    return iterator.next();
+                                }
+
+                                public void remove() {
+                                    if (first)
+                                        declareXSI = false;
+                                    else
+                                        iterator.remove();
+                                }
+                            } : iterator;
                         }
-                        if (declareXSI)
-                            xmlStreamWriter.setPrefix(ExtendedMetaData.XSI_PREFIX, ExtendedMetaData.XSI_URI);
-                        if (changeSummarySerializer == null)
-                            changeSummarySerializer = new ChangeSummaryStreamSerializer();
+                    });
+                    for (Iterator iterator = helper.getPrefixToNamespaceMap().iterator(); iterator.hasNext();) {
+                        Map.Entry entry = (Map.Entry) iterator.next();
+                        xmlStreamWriter.setPrefix((String) entry.getKey(), (String) entry.getValue());
                     }
-                    changeSummarySerializer.saveChangeSummary((ChangeSummary) changeSummary, qName(f), xmlStreamWriter,
-                            changeSummaryOptions);
-                    doc.addLine();
-                } catch (XMLStreamException e) {
-                    xmlResource.getErrors().add(new XMIException(e));
+                    if (declareXSI)
+                        xmlStreamWriter.setPrefix(ExtendedMetaData.XSI_PREFIX, ExtendedMetaData.XSI_URI);
+                    if (changeSummarySerializer == null)
+                        changeSummarySerializer = new ChangeSummaryStreamSerializer();
                 }
-            } else
+                changeSummarySerializer.saveChangeSummary((ChangeSummary) changeSummary, qName(f), xmlStreamWriter, changeSummaryOptions);
+                if (notMixed)
+                    doc.addLine();
+            } catch (XMLStreamException e) {
+                xmlResource.getErrors().add(new XMIException(e));
+            }
+        }
+
+        protected void saveDataTypeElementSingle(EObject o, EStructuralFeature f) {
+            if (f.getEType() == ChangeSummaryStreamSerializer.ChangeSummary_TYPE)
+                saveChangeSummary(o, f, helper.getValue(o, f));
+            else
                 super.saveDataTypeElementSingle(o, f);
+        }
+        
+        /*
+         * TEMPORARILY COPIED FROM BASE CLASS - DO NOT EDIT - WILL BE REMOVED WHEN WE MOVE TO EMF 2.3
+         */
+        protected boolean saveElementFeatureMap(EObject o, EStructuralFeature f)
+        {
+          List values = (List)helper.getValue(o, f);
+          int size = values.size();
+          for (int i = 0; i < size; i++)
+          {
+            FeatureMap.Entry entry = (FeatureMap.Entry)values.get(i);
+            EStructuralFeature entryFeature = entry.getEStructuralFeature();
+            Object value = entry.getValue();
+            if (entryFeature instanceof EReference)
+            {
+              if (value == null)
+              {
+                saveNil(o, entryFeature);
+              }
+              else 
+              {
+                EReference referenceEntryFeature = (EReference)entryFeature;
+                if (referenceEntryFeature.isContainment())
+                {
+                  saveElement((InternalEObject)value, entryFeature);
+                }
+                else if (referenceEntryFeature.isResolveProxies())
+                {
+                  saveFeatureMapElementReference((EObject)value, referenceEntryFeature);
+                }
+                else
+                {
+                  saveElementIDRef(o, (EObject)value, entryFeature);
+                }
+              }
+            }
+            else
+            {
+              if (entryFeature == XMLTypePackage.eINSTANCE.getXMLTypeDocumentRoot_Text())
+              {
+                String svalue = value.toString();
+                if (escape != null)
+                {
+                  svalue =  escape.convertText(svalue);
+                }        
+                if (!toDOM)
+                {    
+                  doc.addText(svalue);
+                }
+                else
+                {
+                  Node text = document.createTextNode(svalue);
+                  currentNode.appendChild(text);
+                  handler.recordValues(text, o, f, entry);
+                }
+              }
+              else if (entryFeature == XMLTypePackage.eINSTANCE.getXMLTypeDocumentRoot_CDATA())
+              {
+                String stringValue = value.toString();
+                if (escape != null)
+                {
+                  stringValue = escape.convertLines(stringValue);
+                }
+                if (!toDOM)
+                {
+                  doc.addCDATA(stringValue);
+                }
+                else
+                {
+                  Node cdata = document.createCDATASection(stringValue);
+                  currentNode.appendChild(cdata);
+                  handler.recordValues(cdata, o, f, entry);            
+                }
+              }
+              else if (entryFeature == XMLTypePackage.eINSTANCE.getXMLTypeDocumentRoot_Comment())
+              {
+                String stringValue = value.toString();
+                if (escape != null)
+                {
+                  stringValue = escape.convertLines(stringValue);
+                }
+                if (!toDOM)
+                {
+                  doc.addComment(stringValue);
+                }
+                else
+                {
+                  // TODO comments are not sent to recordValues
+                  currentNode.appendChild(document.createComment(stringValue));
+                }
+              }
+              else
+              {
+                saveElement(o, value, entryFeature);
+              }
+            }
+          }
+          return size > 0;
+        }
+
+        protected final void saveElement(EObject o, Object value, EStructuralFeature f)
+        {
+          if (f.getEType() == ChangeSummaryStreamSerializer.ChangeSummary_TYPE)
+          {
+            saveChangeSummary(o, f, value);
+            return;
+          }
+          /* super.saveElement(o, value, f);
+           * TEMPORARILY COPIED FROM BASE CLASS - DO NOT EDIT - WILL BE REMOVED WHEN WE MOVE TO EMF 2.3
+           */
+          if (value == null)
+          {
+            saveNil(o, f);
+          }
+          else
+          {
+            String svalue =  getDatatypeValue(value, f, false);
+            if (!toDOM)
+            {
+              doc.saveDataValueElement(helper.getQName(f), svalue);
+            }
+            else
+            {
+              helper.populateNameInfo(nameInfo, f);
+              Element elem = document.createElementNS(nameInfo.getNamespaceURI(), nameInfo.getQualifiedName());
+              Node text = document.createTextNode(svalue);
+              elem.appendChild(text);
+              currentNode.appendChild(elem);
+              handler.recordValues(elem, o, f, value);
+              handler.recordValues(text, o, f, value);
+            }
+          }
         }
     }
 

Modified: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/AllTests.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/AllTests.java?view=diff&rev=509148&r1=509147&r2=509148
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/AllTests.java (original)
+++ incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/AllTests.java Mon Feb 19 02:32:13 2007
@@ -11,6 +11,7 @@
       
         // suite.addTestSuite(ChangeSummaryOnDataObjectTestCase.class);
         suite.addTestSuite(ChangeSummaryTestCase.class);
+        suite.addTestSuite(ChangeSummaryPropertyTestCase.class);
         suite.addTestSuite(CrossScopeCopyTestCase.class);
         suite.addTestSuite(DataTypeBaseTypeTestCase.class);
         suite.addTestSuite(DateConversionTestCase.class);
@@ -26,6 +27,7 @@
         suite.addTestSuite(TypeConversionTestCase.class);
         suite.addTestSuite(TypeRoundTripTestCase.class);
         suite.addTestSuite(XMLDocumentTestCase.class);
+        suite.addTestSuite(XMLHelperTestCase.class);
         suite.addTestSuite(XMLStreamHelperTestCase.class);
         suite.addTestSuite(XPathTestCase.class);
         suite.addTestSuite(XSDHelperTestCase.class);

Modified: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/ChangeSummaryPropertyTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/ChangeSummaryPropertyTestCase.java?view=diff&rev=509148&r1=509147&r2=509148
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/ChangeSummaryPropertyTestCase.java (original)
+++ incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/ChangeSummaryPropertyTestCase.java Mon Feb 19 02:32:13 2007
@@ -21,7 +21,7 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.net.URL;
 
@@ -31,8 +31,13 @@
 
 import commonj.sdo.ChangeSummary;
 import commonj.sdo.DataObject;
+import commonj.sdo.Property;
+import commonj.sdo.Sequence;
 import commonj.sdo.Type;
+import commonj.sdo.helper.DataFactory;
 import commonj.sdo.helper.HelperContext;
+import commonj.sdo.helper.XMLHelper;
+import commonj.sdo.helper.XSDHelper;
 
 public class ChangeSummaryPropertyTestCase extends TestCase {
     private final String TEST_MODEL = "/simpleWithChangeSummary.xsd";
@@ -42,13 +47,45 @@
     private final String TEST_DATA_AFTER_UNDO = "/simpleWithChangeSummaryUndone.xml";
     
     HelperContext hc;
+    DataFactory dataFactory;
+    XMLHelper xmlHelper;
+    
+    void verify(ChangeSummary cs, DataObject quote, String nameSpace, String element, String beforeUndo, String afterUndo) throws IOException {
+        // Stop logging changes and serialize the resulting data graph
+        //
+        cs.endLogging();
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        xmlHelper.save(quote, nameSpace, element, baos);
+        //xmlHelper.save(quote, nameSpace, element, System.out);
+
+        byte[] bytes = baos.toByteArray();
+        URL url = getClass().getResource(beforeUndo);
+        assertTrue(TestUtil.equalXmlFiles(new ByteArrayInputStream(bytes), url));
+        
+        DataObject loaded = xmlHelper.load(new ByteArrayInputStream(bytes)).getRootObject();
+        baos.reset();
+        xmlHelper.save(loaded, nameSpace, element, baos);
+        //xmlHelper.save(loaded, nameSpace, element, System.out);
+        assertTrue(TestUtil.equalXmlFiles(new ByteArrayInputStream(baos.toByteArray()), url));
+        
+        // Undo all changes and then serialize the resulting data graph again
+        //
+        cs.undoChanges();
+        
+        baos.reset();
+        xmlHelper.save(quote, nameSpace, element, baos);
+        //xmlHelper.save(quote, nameSpace, element, System.out);
+        
+        assertTrue(TestUtil.equalXmlFiles(new ByteArrayInputStream(baos.toByteArray()), getClass().getResource(afterUndo)));
+    }
     
     /**
-     * Simple ChangeSummary property test.
+     * ChangeSummary property test.
      */
-    public void testChangeSummary() throws Exception {
-        Type quoteType = hc.getTypeHelper().getType(TEST_NAMESPACE, "RootQuote");
-        DataObject quote = hc.getDataFactory().create(quoteType);
+    protected final void change(String nameSpace, String beforeUndo, String afterUndo) throws Exception {
+        Type quoteType = hc.getTypeHelper().getType(nameSpace, "RootQuote");
+        DataObject quote = dataFactory.create(quoteType);
         
         ChangeSummary cs = quote.getChangeSummary();
         ChangeSummary csp = (ChangeSummary)quote.get("changes");
@@ -84,42 +121,88 @@
 
         quote.getDataObject("quotes[2]").delete();
 
-        // Stop logging changes and serialize the resulting data graph
-        //
-        cs.endLogging();
+        verify(cs, quote, nameSpace, "stockQuote", beforeUndo, afterUndo);
+    }
+    
+    /**
+     * Simple ChangeSummary property test.
+     */
+    public void testChangeSummary() throws Exception {
+        change(TEST_NAMESPACE, TEST_DATA_BEFORE_UNDO, TEST_DATA_AFTER_UNDO);
+    }
+    
+    static final String SequenceTest_NameSpace = "http://www.example.com/sequenceCS";
 
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        hc.getXMLHelper().save(quote, TEST_NAMESPACE, "stockQuote", baos);
-        //hc.getXMLHelper().save(quote, TEST_NAMESPACE, "stockQuote", System.out);
+    /**
+     * Mixed ChangeSummary property test.
+     */
+    public void testMixedChangeSummary() throws Exception {
+        change(SequenceTest_NameSpace, "/mixedChangeSummary.xml", "/mixedChangeSummaryUndone.xml");
+    }
+    
+    protected final DataObject createDataObject(Type quoteType, Object value, Sequence sequence, Property property) {
+        DataObject child = dataFactory.create(quoteType);
+        child.set("symbol", value);
+        sequence.add(property, child);
+        return child;
+    }
+    
+    static final String SequenceTest_ELEMENT = "openQuote";
 
-        assertTrue(TestUtil.equalXmlFiles(new ByteArrayInputStream(baos.toByteArray()), getClass().getResource(TEST_DATA_BEFORE_UNDO)));
+    private XSDHelper xsdHelper;
+
+    /**
+     * Open/any ChangeSummary property test.
+     */
+    public void testOpenChangeSummary() throws Exception {
+        DataObject quote = dataFactory.create(xsdHelper.getGlobalProperty(SequenceTest_NameSpace, SequenceTest_ELEMENT, true).getType());
         
-        DataObject loaded = hc.getXMLHelper().load(new ByteArrayInputStream(baos.toByteArray())).getRootObject();
-        baos.reset();
-        hc.getXMLHelper().save(loaded, TEST_NAMESPACE, "stockQuote", baos);
-        //hc.getXMLHelper().save(loaded, TEST_NAMESPACE, "stockQuote", System.out);
+        ChangeSummary cs = quote.getChangeSummary();
+        ChangeSummary csp = (ChangeSummary)quote.get("changes");
 
-        assertTrue(TestUtil.equalXmlFiles(new ByteArrayInputStream(baos.toByteArray()), getClass().getResource(TEST_DATA_BEFORE_UNDO)));
+        assertSame(cs, csp);
 
-        // Undo all changes and then serialize the resulting data graph again
+        quote.set("symbol", "fbnt");
+        Sequence sequence = quote.getSequence("any");
+        Property property = xsdHelper.getGlobalProperty("http://www.example.com/open", "openStockQuote", true);
+        Type quoteType = property.getType();
+        createDataObject(quoteType, "1500.0", sequence, property);
+        DataObject child = createDataObject(quoteType, "2000.0", sequence, property);
+        createDataObject(quoteType, "2000.99", child.getSequence("any"), property);
+        createDataObject(quoteType, "2500.0", sequence, property);
+
+        // Begin logging changes
         //
-        cs.undoChanges();
-        
-        baos.reset();
-        hc.getXMLHelper().save(quote, TEST_NAMESPACE, "stockQuote", baos);
-        //hc.getXMLHelper().save(quote, TEST_NAMESPACE, "stockQuote", System.out);
-        
-        assertTrue(TestUtil.equalXmlFiles(new ByteArrayInputStream(baos.toByteArray()), getClass().getResource(TEST_DATA_AFTER_UNDO)));
+        cs.beginLogging();
+
+        // Modify the data graph in various ways
+        //
+        quote.set("symbol", "FBNT");
+
+        createDataObject(quoteType, "3000.0", sequence, property);
+        createDataObject(quoteType, "4000.0", sequence, property);
+
+        sequence.remove(1); // child.delete();
+
+        verify(cs, quote, SequenceTest_NameSpace, SequenceTest_ELEMENT, "/openChangeSummary.xml", "/openChangeSummaryUndone.xml");
     }
 
+    void define(String model) throws Exception {
+        // Populate the meta data for the test model
+        URL url = getClass().getResource(model);
+        xsdHelper.define(url.openStream(), url.toString());
+    }
+    
     protected void setUp() throws Exception {
         super.setUp();
         hc = SDOUtil.createHelperContext();
+        xsdHelper = hc.getXSDHelper();
+        dataFactory = hc.getDataFactory();
+        xmlHelper = hc.getXMLHelper();
 
         // Populate the meta data for the test (Stock Quote) model
-        URL url = getClass().getResource(TEST_MODEL);
-        InputStream inputStream = url.openStream();
-        hc.getXSDHelper().define(inputStream, url.toString());
-        inputStream.close();
+        define(TEST_MODEL);
+
+        define("/SequenceChangeSummary.xsd");
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org