public final void begin()

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());
        }
    }