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