in impl/src/main/java/org/apache/tuscany/sdo/util/resource/ChangeSummaryStreamDeserializer.java [236:423]
public final void begin(DataObject rootObject, HelperContext scope, XMLStreamReader reader) throws XMLStreamException {
/*
* 3-1. Instantiate ChangeSummary input: reader (xsi:type), factory, rootObject output: changeSummary, changeDescription
*/
initialize(reader, scope, rootObject);
if (typedXSI()) {
changeSummary = (ChangeSummaryImpl) scope.getDataFactory().create(nameSpace, name);
if (changeSummary == null)
getChangeSummary(rootObject);
else {
Property csp = ((ClassImpl) rootObject.getType()).getChangeSummaryProperty();
rootObject.set(csp, changeSummary);
changeSummary.setDataObject(rootObject);
}
} else
getChangeSummary(rootObject);
ChangeDescription changeDescription = (ChangeDescription) changeSummary;
/*
* 3-2. "logging" attribute input: reader output: logging
*/
logging = Boolean.valueOf(reader.getAttributeValue(null, "logging")).booleanValue();
/*
* 3-3. Modified DataObjects input: changeDescription
*/
if (forwardReferences != null)
forwardReferences.clear();
if (objectChangesCollection != null)
objectChangesCollection.clear();
if (START_ELEMENT == reader.nextTag()) {
objectMapChanges = changeDescription.getObjectChanges();
deletedDataObjects = changeDescription.getObjectsToAttach();
Object factory = changeDescription.eClass().getEPackage().getEFactoryInstance();
changeFactory = factory instanceof ChangeFactory ? (ChangeFactory) factory : ChangeFactory.eINSTANCE;
changeSettingFactory = factory instanceof SDOFactory ? (SDOFactory) factory : null;
do {
/*
* Modified DataObject
*/
String ref = ref(), unset = reader.getAttributeValue(SDOAnnotations.COMMONJ_SDO_NS, ChangeSummaryStreamSerializer.UNSET);
int attributes = reader.getAttributeCount();
NamespaceContext nameSpaces = reader.getNamespaceContext();
EObject referent = referent(ref, nameSpaces);
if (referent == null) {
/*
* Forward-referenced(unresolved) modified DataObject
*/
ForwardReference forwardReference = new ForwardReference(ref, nameSpaces, unset);
if (forwardReferences == null)
forwardReferences = new ArrayList();
forwardReferences.add(forwardReference);
do // what about xmlns="NS1" a1="qName" xmlns="NS2" a2="qName" ?
{
/*
* Record property old value as attribute for end()
*/
String nameSpace = reader.getAttributeNamespace(--attributes), name = reader.getAttributeLocalName(attributes), value = reader
.getAttributeValue(attributes);
if (nameSpace == null) {
/*
* Local attribute
*/
Attribute attribute = new Attribute();
attribute.name = name;
attribute.value = value;
if (forwardReference.attributes == null)
forwardReference.attributes = new ArrayList();
forwardReference.attributes.add(attribute);
} else if (!SDOAnnotations.COMMONJ_SDO_NS.equals(nameSpace) || !ChangeSummaryStreamSerializer.REF_ATTRIBUTE.equals(name)
&& !ChangeSummaryStreamSerializer.UNSET.equals(name)) {
/*
* Qualified(global) attribute
*/
QualifiedAttribute attribute = new QualifiedAttribute();
attribute.name = name;
attribute.value = value;
attribute.nameSpace = nameSpace;
if (forwardReference.qualifiedAttributes == null)
forwardReference.qualifiedAttributes = new ArrayList();
forwardReference.qualifiedAttributes.add(attribute);
}
} while (attributes != 0);
while (START_ELEMENT == reader.nextTag()) {
/*
* Record property old value as element for end()
*/
Tag tag = new Tag(reader);
if (forwardReference.tags == null)
forwardReference.tags = new ArrayList();
forwardReference.tags.add(tag);
tag.ref = ref();
if (tag.ref != null)
continue;
Type xsi = typeXSI();
if (xsi == 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
tag.value = value(xsi);
}
} else {
/*
* Resolved(back-referenced) modified DataObject
*/
Type type = ((DataObject) referent).getType();
Collection featureChanges = unsetProperties(referent, unset, type);
do // what about xmlns="NS1" a1="qName" xmlns="NS2" a2="qName" ?
{
/*
* Log property old value as attribute
*/
String nameSpace = reader.getAttributeNamespace(--attributes), name = reader.getAttributeLocalName(attributes), value = reader
.getAttributeValue(attributes);
if (nameSpace == null)
logAttributeChange(featureChanges, name, type, value, nameSpaces);
else if (!SDOAnnotations.COMMONJ_SDO_NS.equals(nameSpace) || !ChangeSummaryStreamSerializer.REF_ATTRIBUTE.equals(name)
&& !ChangeSummaryStreamSerializer.UNSET.equals(name))
logAttributeChange(featureChanges, nameSpace, name, type, value, nameSpaces);
} while (attributes != 0);
if (START_ELEMENT == reader.nextTag()) {
ObjectChanges objectChanges = null;
do {
/*
* Log property old value as element
*/
String nameSpace = reader.getNamespaceURI(), name = reader.getLocalName();
Property property = getProperty(nameSpace, name, type);
boolean many = property.isMany();
Object value;
ref = ref();
if (ref == null) {
/*
* Contained property old value
*/
Type xsi = typeXSI();
if (xsi != null)
value = value(xsi);
else if (nameSpace == null)
value = value(reader);
else {
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, nameSpaces);
if (value == null) {
/*
* Forward-referenced(unresolved) child DataObject
*/
if (!many) {
ElementChange elementChange = new ElementChange(ref, nameSpaces, property, propertyInSequence);
if (objectChanges == null) {
objectChanges = newObjectChanges(featureChanges);
objectChanges.newElementChanges();
} else if (objectChanges.elementChanges == null)
objectChanges.newElementChanges();
objectChanges.elementChanges.add(elementChange);
continue;
}
value = new Ref(ref, nameSpaces);
}
}
if (many) {
Collection list;
if (objectChanges == null) {
objectChanges = newObjectChanges(featureChanges);
list = objectChanges.newList(property);
} else if (objectChanges.lists == null)
list = objectChanges.newList(property);
else
list = objectChanges.get(property);
addPropertyChange(list, value, property);
} else
logPropertyChange(featureChanges, property, value);
} while (START_ELEMENT == reader.nextTag());
}
}
} while (START_ELEMENT == reader.nextTag());
}
}