Search in sources :

Example 96 with SDOChangeSummary

use of org.eclipse.persistence.sdo.SDOChangeSummary in project eclipselink by eclipse-ee4j.

the class SDODataObjectGetPathTest method testGetPathFromAncestorDeletedFromChildToAncestorListWrapperLoggingOn.

// verify that we do not get an infinite loop if we pass in the target's changeSummary
public void testGetPathFromAncestorDeletedFromChildToAncestorListWrapperLoggingOn() {
    SDODataObject anItem = (SDODataObject) aRoot5.get("items/item[2]");
    // start logging
    SDOChangeSummary aCS = aRoot5.getChangeSummary();
    aCS.beginLogging();
    assertTrue(aCS.isLogging());
    // delete source object
    SDODataObject deletedObject = ((SDODataObject) aRoot5.get("items"));
    deletedObject.delete();
    String aPath = ((SDOMarshalListener) ((SDOXMLHelper) xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(anItem, aRoot5, aRoot5.getChangeSummary());
    assertNotNull(aPath);
    // TODO: no storage of deleted indexed postition - defaults to size() = start of list for now
    // see SDODataObject: index = ((SDODataObject)parent).getList(aChild).size();
    assertEquals("ns0:items/ns0:item[2]", aPath);
// assertEquals(anItem, anItemFromPath);
}
Also used : SDOChangeSummary(org.eclipse.persistence.sdo.SDOChangeSummary) SDOMarshalListener(org.eclipse.persistence.sdo.helper.SDOMarshalListener) SDOXMLHelper(org.eclipse.persistence.sdo.helper.SDOXMLHelper) SDODataObject(org.eclipse.persistence.sdo.SDODataObject)

Example 97 with SDOChangeSummary

use of org.eclipse.persistence.sdo.SDOChangeSummary in project eclipselink by eclipse-ee4j.

the class SDODataObjectGetPathTest method testGetPathFromAncestorModifiedFromChildToRootLoggingOnWithoutPassingChangeSummary.

public void testGetPathFromAncestorModifiedFromChildToRootLoggingOnWithoutPassingChangeSummary() {
    SDODataObject anItem = (SDODataObject) aRoot5.get("billTo");
    // start logging
    SDOChangeSummary aCS = aRoot5.getChangeSummary();
    aCS.beginLogging();
    assertTrue(aCS.isLogging());
    // modifydelete source object
    ((SDODataObject) aRoot5.get("billTo")).set("name", "new name");
    String aPath = ((SDOMarshalListener) ((SDOXMLHelper) xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(anItem, aRoot5, anItem.getChangeSummary());
    assertNotNull(aPath);
    assertEquals("ns0:billTo", aPath);
}
Also used : SDOChangeSummary(org.eclipse.persistence.sdo.SDOChangeSummary) SDOMarshalListener(org.eclipse.persistence.sdo.helper.SDOMarshalListener) SDOXMLHelper(org.eclipse.persistence.sdo.helper.SDOXMLHelper) SDODataObject(org.eclipse.persistence.sdo.SDODataObject)

Example 98 with SDOChangeSummary

use of org.eclipse.persistence.sdo.SDOChangeSummary in project eclipselink by eclipse-ee4j.

the class SDOUnmarshalListener method afterUnmarshal.

/**
 * @param target assumed to be non-null
 * @param parent may be null, indicating target is root object
 */
@Override
public void afterUnmarshal(Object target, Object parent) {
    SDODataObject targetDataObject;
    // assume target is DataObject or ChangeSummary
    try {
        targetDataObject = (SDODataObject) target;
    } catch (ClassCastException ccex) {
        // each time we hit a ChangeSummary store it to process later and set its root
        // object - this is because we can't fully process the cs's because they have
        // references that can't be resolved until the full tree is built
        SDOChangeSummary sdoChangeSummary = (SDOChangeSummary) target;
        sdoChangeSummary.setRootDataObject((DataObject) parent);
        getChangeSummaries().add(sdoChangeSummary);
        return;
    }
    // if getType is sequenced, then update values to settings map
    if (targetDataObject.getType().isSequenced()) {
        targetDataObject.getSequence().afterUnmarshal();
    }
    // the last object that will hit the afterUnmarshal method
    if (parent == null && null != changeSummaries) {
        XMLUnmarshaller unmarshaller = null;
        for (int i = 0, changeSummariesSize = changeSummaries.size(); i < changeSummariesSize; i++) {
            SDOChangeSummary nextCS = changeSummaries.get(i);
            // Set logging to true until finished building modified list.
            boolean loggingValue = nextCS.isLoggingMapping();
            nextCS.setLogging(true);
            // CREATES
            // For each xpath in the create attribute convert it to an sdo path and execute it against the root
            // dataobject to get the dataobject being pointed to and set that dataobject to be created
            List xpaths = nextCS.getCreatedXPaths();
            for (int j = 0, xpathsSize = xpaths.size(); j < xpathsSize; j++) {
                String nextXPath = (String) xpaths.get(j);
                String sdoPath = convertXPathToSDOPath(nextXPath);
                SDODataObject nextCreatedDO = targetDataObject.getDataObject(sdoPath);
                if (nextCreatedDO == null) {
                    int nextSlash = sdoPath.indexOf('/');
                    if (nextSlash != -1) {
                        sdoPath = sdoPath.substring(nextSlash + 1);
                    } else {
                        sdoPath = "/";
                    }
                    nextCreatedDO = targetDataObject.getDataObject(sdoPath);
                }
                if (nextCreatedDO != null) {
                    nextCreatedDO._setCreated(true);
                    nextCS.getOldContainers().remove(nextCreatedDO);
                } else {
                    throw SDOException.errorProcessingXPath(nextXPath);
                }
            }
            // clear the createxpaths list that was read in from XML
            nextCS.setCreatedXPaths(null);
            // MODIFIED
            List modifiedDoms = nextCS.getModifiedDoms();
            for (int j = 0, modifiedDomsSize = modifiedDoms.size(); j < modifiedDomsSize; j++) {
                Element nextNode = (Element) modifiedDoms.get(j);
                String refValue = nextNode.getAttributeNS(SDOConstants.SDO_URL, SDOConstants.CHANGESUMMARY_REF);
                if ((refValue == null) || (refValue.length() == 0)) {
                    throw SDOException.missingRefAttribute();
                }
                // nextModifiedDO is the real modified current data object
                String sdoPath = convertXPathToSDOPath(refValue);
                SDODataObject nextModifiedDO = targetDataObject.getDataObject(sdoPath);
                // if it failed, try peeling off the first fragment (may be the root
                if (nextModifiedDO == null) {
                    int nextSlash = sdoPath.indexOf('/');
                    if (nextSlash != -1) {
                        sdoPath = sdoPath.substring(nextSlash + 1);
                    } else {
                        sdoPath = "/";
                    }
                    nextModifiedDO = targetDataObject.getDataObject(sdoPath);
                }
                String unsetValue = nextNode.getAttributeNS(SDOConstants.SDO_URL, SDOConstants.CHANGESUMMARY_UNSET);
                List unsetValueList = new ArrayList();
                if ((unsetValue != null) && (unsetValue.length() > 0)) {
                    XMLConversionManager xmlConversionManager = ((SDOXMLHelper) aHelperContext.getXMLHelper()).getXmlConversionManager();
                    unsetValueList = xmlConversionManager.convertObject(unsetValue, List.class);
                }
                if (nextModifiedDO != null) {
                    nextModifiedDO._setModified(true);
                    SDOCSUnmarshalListener listener = new SDOCSUnmarshalListener(nextModifiedDO.getType().getHelperContext(), true);
                    if (null == unmarshaller) {
                        unmarshaller = ((SDOXMLHelper) aHelperContext.getXMLHelper()).getXmlContext().createUnmarshaller();
                    }
                    unmarshaller.setUnmarshalListener(listener);
                    unmarshaller.getProperties().put("sdoHelperContext", aHelperContext);
                    unmarshaller.setUnmappedContentHandlerClass(SDOUnmappedContentHandler.class);
                    Object unmarshalledNode = unmarshaller.unmarshal(nextNode, nextModifiedDO.getType().getXmlDescriptor().getJavaClass());
                    // unmarshalledDO is the modified dataobject from the changesummary xml
                    SDODataObject unmarshalledDO = null;
                    // Assumption: unmarshalledNode should always be either an instance of XMLRoot or DataObject
                    if (unmarshalledNode instanceof XMLRoot) {
                        unmarshalledDO = (SDODataObject) ((XMLRoot) unmarshalledNode).getObject();
                    } else if (unmarshalledNode instanceof DataObject) {
                        unmarshalledDO = (SDODataObject) unmarshalledNode;
                    }
                    List modifiedProps = new ArrayList();
                    Node n = nextNode.getFirstChild();
                    TypeHelper typeHelper = aHelperContext.getTypeHelper();
                    while (n != null) {
                        if (n.getNodeType() == Node.ELEMENT_NODE) {
                            String propName = n.getLocalName();
                            Property nextProp = unmarshalledDO.getInstanceProperty(propName);
                            if (nextProp == null) {
                                nextProp = typeHelper.getOpenContentProperty(n.getNamespaceURI(), propName);
                            }
                            if (!modifiedProps.contains(nextProp)) {
                                modifiedProps.add(nextProp);
                            }
                        }
                        n = n.getNextSibling();
                    }
                    // instead of iterating over all props can we just check elements in cs and get appropriate properties from DO
                    for (int k = 0, modifiedPropsSize = modifiedProps.size(); k < modifiedPropsSize; k++) {
                        SDOProperty nextProp = (SDOProperty) modifiedProps.get(k);
                        if (!nextProp.getType().isDataType()) {
                            if (nextProp.isMany()) {
                                // original value is the list from the changesummary xml
                                List originalValue = unmarshalledDO.getList(nextProp);
                                List newList = new ArrayList();
                                List toDelete = new ArrayList();
                                List indexsToDelete = new ArrayList();
                                for (int l = 0, originalValueSize = originalValue.size(); l < originalValueSize; l++) {
                                    SDODataObject nextInList = (SDODataObject) originalValue.get(l);
                                    String sdoRef = nextInList._getSdoRef();
                                    if (sdoRef != null) {
                                        // if sdoRef is not null then object is modified
                                        String sdoRefPath = convertXPathToSDOPath(sdoRef);
                                        int nextSlash = sdoRefPath.indexOf('/');
                                        if (nextSlash != -1) {
                                            sdoRefPath = sdoRefPath.substring(nextSlash + 1);
                                        } else {
                                            sdoRefPath = "/";
                                        }
                                        newList.add(targetDataObject.getDataObject(sdoRefPath));
                                    } else {
                                        // if sdo ref is null there is a deleted object
                                        toDelete.add(nextInList);
                                        indexsToDelete.add(l);
                                        newList.add(nextInList);
                                    }
                                }
                                // lw is the list from the real current data object
                                ListWrapper lw = ((ListWrapper) nextModifiedDO.getList(nextProp));
                                int indexsToDeleteSize = indexsToDelete.size();
                                if (indexsToDeleteSize > 0) {
                                    // after this loop, lw will have the entire list when logging was turned on
                                    nextCS.pauseLogging();
                                    for (int m = 0; m < indexsToDeleteSize; m++) {
                                        int toDeleteIndex = (Integer) indexsToDelete.get(m);
                                        SDODataObject nextToDelete = (SDODataObject) toDelete.get(m);
                                        lw.add(toDeleteIndex, nextToDelete);
                                    }
                                    nextCS.setPropertyInternal(nextModifiedDO, nextProp, lw);
                                    SDOSequence nextSeq = ((SDOSequence) nextCS.getOriginalSequences().get(nextModifiedDO));
                                    nextCS.resumeLogging();
                                    nextModifiedDO._setModified(true);
                                    for (int m = indexsToDeleteSize - 1; m >= 0; m--) {
                                        int toDeleteIndex = (Integer) indexsToDelete.get(m);
                                        SDODataObject nextToDelete = (SDODataObject) toDelete.get(m);
                                        if (nextSeq != null) {
                                            nextSeq.addSettingWithoutModifyingDataObject(-1, nextProp, nextToDelete);
                                        }
                                        nextToDelete.resetChanges();
                                        lw.remove(toDeleteIndex);
                                    }
                                }
                                nextCS.getOriginalElements().put(lw, newList);
                            } else {
                                SDODataObject value = unmarshalledDO.getDataObject(nextProp);
                                if (value != null) {
                                    String sdoRef = value._getSdoRef();
                                    if (sdoRef != null) {
                                        // modified
                                        nextModifiedDO._setModified(true);
                                    } else {
                                        // deleted
                                        value._setChangeSummary(nextCS);
                                        nextModifiedDO._setModified(true);
                                        nextCS.pauseLogging();
                                        boolean wasSet = nextModifiedDO.isSet(nextProp);
                                        Object existingValue = nextModifiedDO.get(nextProp);
                                        // grab index of nextProp's Setting for use during setting below
                                        Sequence nextModifiedDOSequence = nextModifiedDO.getSequence();
                                        int settingIdx = -1;
                                        if (nextModifiedDOSequence != null) {
                                            settingIdx = ((SDOSequence) nextModifiedDOSequence).getIndexForProperty(nextProp);
                                        }
                                        value._setContainmentPropertyName(null);
                                        value._setContainer(null);
                                        nextModifiedDO.set(nextProp, value);
                                        nextCS.setPropertyInternal(nextModifiedDO, nextProp, value);
                                        SDOSequence nextSeq = ((SDOSequence) nextCS.getOriginalSequences().get(nextModifiedDO));
                                        if (nextSeq != null) {
                                            nextSeq.addSettingWithoutModifyingDataObject(-1, nextProp, value);
                                        }
                                        nextCS.resumeLogging();
                                        nextModifiedDO._setModified(true);
                                        value.resetChanges();
                                        value.delete();
                                        if (wasSet) {
                                            // need to add at the right pos in the list, not at the end
                                            nextModifiedDO.set(nextProp, existingValue, false);
                                            if (settingIdx != -1) {
                                                nextModifiedDO.getSequence().addSettingWithoutModifyingDataObject(settingIdx, nextProp, existingValue);
                                            }
                                        } else {
                                            nextModifiedDO.unset(nextProp);
                                        }
                                    }
                                } else {
                                    nextModifiedDO._setModified(true);
                                    nextCS.setPropertyInternal(nextModifiedDO, nextProp, null);
                                }
                            }
                        } else {
                            nextModifiedDO._setModified(true);
                            Object value = unmarshalledDO.get(nextProp);
                            if (nextProp.isMany()) {
                                Property theProp = nextModifiedDO.getInstanceProperty(nextProp.getName());
                                if (theProp == null) {
                                    Property newProp = nextModifiedDO.defineOpenContentProperty(nextProp.getName(), new ArrayList(), nextProp.getType());
                                    nextModifiedDO.set(newProp, new ArrayList());
                                    theProp = newProp;
                                }
                                List lw = nextModifiedDO.getList(theProp.getName());
                                nextCS.setPropertyInternal(nextModifiedDO, theProp, lw);
                                nextCS.getOriginalElements().put(lw, ((ListWrapper) value).getCurrentElements());
                            } else {
                                nextCS.setPropertyInternal(nextModifiedDO, nextProp, value);
                            }
                        }
                    }
                    for (int k = 0, unsetValueListSize = unsetValueList.size(); k < unsetValueListSize; k++) {
                        SDOProperty nextProp = unmarshalledDO.getInstanceProperty((String) unsetValueList.get(k));
                        if (nextProp != null) {
                            Object oldValue = null;
                            if (nextProp.getType().isDataType() || nextProp.isMany()) {
                                // to get default
                                oldValue = unmarshalledDO.get(nextProp);
                            }
                            nextModifiedDO._setModified(true);
                            nextCS.setPropertyInternal(nextModifiedDO, nextProp, oldValue);
                            nextCS.unsetPropertyInternal(nextModifiedDO, nextProp);
                        } else {
                            nextProp = nextModifiedDO.getInstanceProperty((String) unsetValueList.get(k));
                            nextModifiedDO._setModified(true);
                            nextCS.setPropertyInternal(nextModifiedDO, nextProp, null);
                            nextCS.unsetPropertyInternal(nextModifiedDO, nextProp);
                        }
                    }
                } else {
                    throw SDOException.errorProcessingXPath(refValue);
                }
            }
            // clear modified doms list
            nextCS.setModifiedDoms(null);
            // clear deleted xpaths list
            nextCS.setDeletedXPaths(null);
            List created = nextCS.getCreated();
            for (int j = 0, createdSize = created.size(); j < createdSize; j++) {
                SDODataObject next = (SDODataObject) created.get(j);
                Property containmentProperty = next.getContainmentProperty();
                if (containmentProperty != null && containmentProperty.isMany()) {
                    SDODataObject container = next.getContainer();
                    ListWrapper list = (ListWrapper) container.get(containmentProperty);
                    if (!(nextCS.getOriginalElements().containsKey(list))) {
                        // if there was an object created as part of a list, and that list is not
                        // already in the original elements map. Add an empty list to the map.
                        nextCS.getOriginalElements().put(list, new ArrayList());
                    }
                }
            }
            nextCS.setLogging(loggingValue);
        }
        // reset changeSummary list - we are done with it
        changeSummaries = null;
    }
}
Also used : TypeHelper(commonj.sdo.helper.TypeHelper) XMLRoot(org.eclipse.persistence.oxm.XMLRoot) Element(org.w3c.dom.Element) Node(org.w3c.dom.Node) ArrayList(java.util.ArrayList) Sequence(commonj.sdo.Sequence) SDOSequence(org.eclipse.persistence.sdo.SDOSequence) SDOSequence(org.eclipse.persistence.sdo.SDOSequence) SDODataObject(org.eclipse.persistence.sdo.SDODataObject) DataObject(commonj.sdo.DataObject) SDOChangeSummary(org.eclipse.persistence.sdo.SDOChangeSummary) ArrayList(java.util.ArrayList) List(java.util.List) SDODataObject(org.eclipse.persistence.sdo.SDODataObject) DataObject(commonj.sdo.DataObject) XMLUnmarshaller(org.eclipse.persistence.oxm.XMLUnmarshaller) SDOProperty(org.eclipse.persistence.sdo.SDOProperty) Property(commonj.sdo.Property) SDOProperty(org.eclipse.persistence.sdo.SDOProperty) SDODataObject(org.eclipse.persistence.sdo.SDODataObject) XMLConversionManager(org.eclipse.persistence.internal.oxm.XMLConversionManager)

Example 99 with SDOChangeSummary

use of org.eclipse.persistence.sdo.SDOChangeSummary in project eclipselink by eclipse-ee4j.

the class SDOCopyHelperDeepCopyTest method testSourceHasPropertyWithChangeSummaryValue.

// purpose: test case 6 about changesummary
public void testSourceHasPropertyWithChangeSummaryValue() {
    SDODataObject copy = (SDODataObject) ((SDOCopyHelper) copyHelper).copy(root, getChangeSummary());
    SDODataObject copyContainedDataObject = (SDODataObject) copy.get(rootProperty2.getName());
    assertEqualityHelperEqual(root, copy);
    assertNotNull(copyContainedDataObject);
    SDOChangeSummary copyChSum = (SDOChangeSummary) copyContainedDataObject.get(containedProperty_ChangeSummary.getName());
    assertNotNull(copyChSum);
    ChangeSummary originalChSum = root.getDataObject("rootproperty2-notdatatype").getChangeSummary();
    assertFalse(copyChSum.equals(originalChSum));
    // logging status is same
    assertEquals(originalChSum.isLogging(), copyChSum.isLogging());
    // their root dataObject have the same setting
    testCopySourceMap(containedDataObject, copyChSum.getRootObject());
}
Also used : SDOChangeSummary(org.eclipse.persistence.sdo.SDOChangeSummary) ChangeSummary(commonj.sdo.ChangeSummary) SDOChangeSummary(org.eclipse.persistence.sdo.SDOChangeSummary) SDODataObject(org.eclipse.persistence.sdo.SDODataObject)

Example 100 with SDOChangeSummary

use of org.eclipse.persistence.sdo.SDOChangeSummary in project eclipselink by eclipse-ee4j.

the class SDOCopyHelperDeepCopyTest method testShallowCopySourceMapsHaveSameDataTypeObj.

// TODO: this tests only tests the MapValueStore impl, separate generic test required
public void testShallowCopySourceMapsHaveSameDataTypeObj() {
    SDODataObject copy = (SDODataObject) copyHelper.copyShallow(root);
    int copySize = getPropertiesSize(copy);
    assertFalse(copySize == getPropertiesSize(root));
    Set copyKeys = getPropertiesKeySet(copy);
    Set keys = getPropertiesKeySet(root);
    Iterator iterKeys = copyKeys.iterator();
    while (iterKeys.hasNext()) {
        String propertyName = (String) iterKeys.next();
        assertTrue(keys.contains(propertyName));
        Object s = root.get(propertyName);
        Object c = copy.get(propertyName);
        if (!(c instanceof SDODataObject) && !(c instanceof SDOChangeSummary)) {
            assertEquals(c, s);
        }
    }
}
Also used : Set(java.util.Set) HashSet(java.util.HashSet) SDOChangeSummary(org.eclipse.persistence.sdo.SDOChangeSummary) Iterator(java.util.Iterator) SDODataObject(org.eclipse.persistence.sdo.SDODataObject) DataObject(commonj.sdo.DataObject) SDODataObject(org.eclipse.persistence.sdo.SDODataObject)

Aggregations

SDOChangeSummary (org.eclipse.persistence.sdo.SDOChangeSummary)123 SDODataObject (org.eclipse.persistence.sdo.SDODataObject)109 DataObject (commonj.sdo.DataObject)91 ChangeSummary (commonj.sdo.ChangeSummary)66 List (java.util.List)63 ArrayList (java.util.ArrayList)56 SDOSetting (org.eclipse.persistence.sdo.SDOSetting)37 Property (commonj.sdo.Property)25 SDOProperty (org.eclipse.persistence.sdo.SDOProperty)25 ValueStore (org.eclipse.persistence.sdo.ValueStore)17 SDOMarshalListener (org.eclipse.persistence.sdo.helper.SDOMarshalListener)16 SDOXMLHelper (org.eclipse.persistence.sdo.helper.SDOXMLHelper)16 SDOSequence (org.eclipse.persistence.sdo.SDOSequence)9 ListWrapper (org.eclipse.persistence.sdo.helper.ListWrapper)9 SDOType (org.eclipse.persistence.sdo.SDOType)7 Sequence (commonj.sdo.Sequence)6 Iterator (java.util.Iterator)6 Map (java.util.Map)6 HashSet (java.util.HashSet)2 Set (java.util.Set)2