blob: b44f0404d58caaf5eb022c3df91e48ab26c63d99 [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.sdo.model.dataobject;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.persistence.sdo.SDOChangeSummary;
import org.eclipse.persistence.sdo.SDOConstants;
import org.eclipse.persistence.sdo.SDODataObject;
import org.eclipse.persistence.sdo.helper.ListWrapper;
import org.eclipse.persistence.sdo.helper.SDOMarshalListener;
import org.eclipse.persistence.sdo.helper.SDOXMLHelper;
import org.eclipse.persistence.testing.sdo.SDOTestCase;
import commonj.sdo.helper.XMLDocument;
public class SDODataObjectGetPathTest extends SDOTestCase {
protected static final String URINAME = "dataObject";
protected static final String TYPENAME = "commonj.sdo";
protected static final String ROOT_PROPERTY_NAME = "root";
protected static final String CHILD1_PROPERTY_NAME = "items";
protected static final String CHILD2_PROPERTY_NAME = "item";
protected static final String CHILD1ITEM_PROPERTY_NAME = "item";
protected SDODataObject aRoot;
protected SDODataObject aRoot5;
protected SDODataObject anEmptyListRoot;
// default to XPath format ie: ns0:item not just item
protected boolean useXPathFormat = true;
public SDODataObjectGetPathTest(String name) {
super(name);
}
@Override
public void setUp() {
super.setUp();
try {
String xsdString = getXSDString("org/eclipse/persistence/testing/sdo/schemas/PurchaseOrderNSDeepCSPath.xsd");
// Generate a list of sdo types based on the purchaseOrder.xsd and print
// out info about them
xsdHelper.define(xsdString);
// create a Purchase Order dataObject and write it to XML called
FileInputStream inStream = new FileInputStream("org/eclipse/persistence/testing/sdo/helper/xmlhelper/PurchaseOrderNSDeepCSPath.xml");
XMLDocument document = xmlHelper.load(inStream);
aRoot = (SDODataObject)document.getRootObject();
// reset changes if changeSummary=true
SDOChangeSummary aCS = aRoot.getChangeSummary();
if (aCS != null) {
//aCS.resetChanges();
aCS.endLogging();
}
inStream.close();
//aRoot.getChangeSummary().beginLogging();
// create a List of new items
List<SDODataObject> aNewList = new ArrayList<SDODataObject>();
// create item from existing
SDODataObject anItem = (SDODataObject)aHelperContext.getCopyHelper().copy(((SDODataObject)aRoot.get("items/item[2]")));
// modify object
anItem.set(anItem.getInstanceProperty("partNum"), "926-ZA");
SDODataObject anItem2 = (SDODataObject)aHelperContext.getCopyHelper().copy(((SDODataObject)aRoot.get("items/item[2]")));
// modify object
anItem2.set(anItem.getInstanceProperty("partNum"), "926-ZB");
SDODataObject anItem3 = (SDODataObject)aHelperContext.getCopyHelper().copy(((SDODataObject)aRoot.get("items/item[2]")));
// modify object
anItem3.set(anItem.getInstanceProperty("partNum"), "926-ZC");
// add items to list (to be added to the ListWrapper)
aNewList.add(anItem);
aNewList.add(anItem2);
aNewList.add(anItem3);
// copy root
aRoot5 = (SDODataObject)aHelperContext.getCopyHelper().copy(aRoot);
// get containment node
ListWrapper aList = (ListWrapper)aRoot5.getList("items/item");
// TODO: changeSummary is not copied
//aRoot5.setChangeSummary(aRoot.getChangeSummary());
setChangeSummary(aRoot5);
aList.addAll(1, aNewList);
// create empty ListWrapper
anEmptyListRoot = (SDODataObject)aHelperContext.getCopyHelper().copy(aRoot);
// get containment node
aList = (ListWrapper)anEmptyListRoot.getList("items/item");
aList.clear();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
private SDOChangeSummary setChangeSummary(SDODataObject aCSRoot) {
// get and set change summary (temp workaround does not propagate to children)
SDOChangeSummary aCS = new SDOChangeSummary(aCSRoot, aHelperContext);
aCSRoot._setChangeSummary(aCS);
aCS.endLogging();
aCS.beginLogging();
aCS.endLogging();
return aCS;
}
// NS tests required
public void testGetPathForRootObject() {
String aPath = aRoot5._getPath();
assertNotNull(aPath);
assertEquals(SDOConstants.SDO_XPATH_TO_ROOT, aPath);
}
public void testGetPathForInternalNonIsManyObject() {
SDODataObject anItem = (SDODataObject)aRoot5.get("shipTo");
String aPath = anItem._getPath();
assertNotNull(aPath);
assertEquals("shipTo", aPath);
}
public void testGetPathForInternalIsManyObject() {
SDODataObject anItem = (SDODataObject)aRoot5.get("items/item[2]");
String aPath = anItem._getPath();
assertNotNull(aPath);
assertEquals("items/item[2]", aPath);
}
public void testGetPathFromAncestorFromContainedToParent() {
SDODataObject target = (SDODataObject)aRoot5.get("items");
SDODataObject aSibling = (SDODataObject)aRoot5.get("items/item[2]");
String aPath = ((SDOMarshalListener)((SDOXMLHelper)xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(aSibling, target, aSibling.getChangeSummary());
assertNotNull(aPath);
assertEquals("ns0:item[2]", aPath);
}
public void testGetPathFromAncestorFromChildToRoot() {
SDODataObject anItem = (SDODataObject)aRoot5.get("items/item[2]");
String aPath = ((SDOMarshalListener)((SDOXMLHelper)xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(anItem,aRoot5, anItem.getChangeSummary());
assertNotNull(aPath);
assertEquals("ns0:items/ns0:item[2]", aPath);
}
public void testGetPathFromAncestorFromChildToCurrentObject() {
SDODataObject anItem = (SDODataObject)aRoot5.get("items/item[2]");
String aPath = ((SDOMarshalListener)((SDOXMLHelper)xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(anItem,anItem, anItem.getChangeSummary());
assertNotNull(aPath);
assertEquals(SDOConstants.EMPTY_STRING, aPath);
}
public void testGetPathFromAncestorFromRootToCurrentObject() {
String aPath = ((SDOMarshalListener)((SDOXMLHelper)xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(aRoot5,aRoot5, aRoot5.getChangeSummary());
assertNotNull(aPath);
assertEquals(SDOConstants.EMPTY_STRING, aPath);
}
public void testGetPathFromAncestorFromRootToSibling() {
SDODataObject anItem = (SDODataObject)aRoot5.get("items/item[2]");
String aPath = ((SDOMarshalListener)((SDOXMLHelper)xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(aRoot5,anItem, aRoot5.getChangeSummary());
assertEquals(SDOConstants.SDO_XPATH_INVALID_PATH, aPath);
}
// path would need to go up to common ancestor and back down to sibling - null for now
public void testGetPathFromAncestorFromChildToSibling() {
SDODataObject anItem = (SDODataObject)aRoot5.get("items/item[2]");
SDODataObject aSibling = (SDODataObject)aRoot5.get("shipTo");
String aPath = ((SDOMarshalListener)((SDOXMLHelper)xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(anItem,aSibling, anItem.getChangeSummary());
assertEquals(SDOConstants.SDO_XPATH_INVALID_PATH, aPath);
}
public void testGetPathFromAncestorDeletedFromContainedToParentLoggingOff() {
SDODataObject target = (SDODataObject)aRoot5.get("items");
SDODataObject aSibling = (SDODataObject)aRoot5.get("items/item[2]");
// get changeSummary
SDOChangeSummary aCS = aRoot5.getChangeSummary();
assertFalse(aCS.isLogging());
// delete source object
aSibling.delete();
String aPath = ((SDOMarshalListener)((SDOXMLHelper)xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(aSibling,target, target.getChangeSummary());
assertEquals(SDOConstants.SDO_XPATH_INVALID_PATH, aPath);
}
// if logging is off we get null path because we need a changeSummary to compute containers
public void testGetPathFromAncestorDeletedFromChildToRootLoggingOff() {
SDODataObject anItem = (SDODataObject)aRoot5.get("items/item[2]");
// get changeSummary
SDOChangeSummary aCS = aRoot5.getChangeSummary();
assertFalse(aCS.isLogging());
// delete source object, useXPathFormat
anItem.delete();
String aPath = ((SDOMarshalListener)((SDOXMLHelper)xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(anItem,aRoot5, aRoot5.getChangeSummary());
assertNull(aPath);
// get path to root
//String aPathAcrossCS = anItem.getPathFromAncestor(aCS, aRoot5, false);
//assertNotNull(aPathAcrossCS);
//assertEquals(aPathAcrossCS, "items/item[2]");
}
public void testGetPathFromAncestorDeletedFromChildToCurrentObjectLoggingOff() {
SDODataObject anItem = (SDODataObject)aRoot5.get("items/item[2]");
// get changeSummary
SDOChangeSummary aCS = aRoot5.getChangeSummary();
assertFalse(aCS.isLogging());
// delete source object
anItem.delete();
String aPath = ((SDOMarshalListener)((SDOXMLHelper)xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(anItem,anItem, anItem.getChangeSummary());
assertNotNull(aPath);
assertEquals(SDOConstants.EMPTY_STRING, aPath);
}
public void testGetPathFromAncestorDeletedFromRootToCurrentObjectLoggingOff() {
String aPath = ((SDOMarshalListener)((SDOXMLHelper)xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(aRoot5,aRoot5, aRoot5.getChangeSummary());
// get changeSummary
SDOChangeSummary aCS = aRoot5.getChangeSummary();
assertFalse(aCS.isLogging());
// delete source object
aRoot5.delete();
assertNotNull(aPath);
assertEquals(SDOConstants.EMPTY_STRING, aPath);
}
public void testGetPathFromAncestorDeletedFromRootToSiblingLoggingOff() {
SDODataObject anItem = (SDODataObject)aRoot5.get("items/item[2]");
String aPath = ((SDOMarshalListener)((SDOXMLHelper)xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(aRoot5,anItem, aRoot5.getChangeSummary());
// get changeSummary
SDOChangeSummary aCS = aRoot5.getChangeSummary();
assertFalse(aCS.isLogging());
// delete source object
aRoot5.delete();
assertEquals(SDOConstants.SDO_XPATH_INVALID_PATH, aPath);
}
// these deleted tests are not supported yet for XPath
// TODO: we must store the index (2) position when deleting inside a ListWrapper
public void testGetPathFromAncestorDeletedFromContainedToParentLoggingOn() {
SDODataObject target = (SDODataObject)aRoot5.get("items");
SDODataObject aSibling = (SDODataObject)aRoot5.get("items/item[2]");
// start logging
SDOChangeSummary aCS = aRoot5.getChangeSummary();
aCS.beginLogging();
// delete source object
aSibling.delete();
String aPath = ((SDOMarshalListener)((SDOXMLHelper)xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(aSibling,target, target.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:item[2]", aPath);
}
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);
}
public void testGetPathFromAncestorDeletedFromChildToRootLoggingOn() {
SDODataObject anItem = (SDODataObject)aRoot5.get("billTo");
// start logging
SDOChangeSummary aCS = aRoot5.getChangeSummary();
aCS.beginLogging();
assertTrue(aCS.isLogging());
// delete source object
((SDODataObject)aRoot5.get("billTo")).detach();
String aPath = ((SDOMarshalListener)((SDOXMLHelper)xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(anItem,aRoot5, aRoot5.getChangeSummary());
assertNotNull(aPath);
assertEquals("ns0:billTo", aPath);
}
// 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);
}
public void testGetXPathFromAncestorDeletedFromChildToRootInsideListWrapperLoggingOn() {
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"));
anItem.delete();//detach();
String aPath = ((SDOMarshalListener)((SDOXMLHelper)xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(anItem,aRoot5, aRoot5.getChangeSummary());
//SDODataObject anItemFromPath = (SDODataObject)aRoot5.get(aPath);
//System.out.println("testGetPathFromAncestorDeletedFromChildToRootLoggingOn: " + aPath);
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);
}
public void testGetXPathFromAncestorDeletedFromChildToAncestorInsideListWrapperLoggingOn() {
SDODataObject anItem = (SDODataObject)aRoot5.get("billTo/phone[1]");
// start logging
SDOChangeSummary aCS = aRoot5.getChangeSummary();
aCS.beginLogging();
assertTrue(aCS.isLogging());
// delete source object
SDODataObject deletedObjectParent = ((SDODataObject)aRoot5.get("billTo"));
deletedObjectParent.delete();//detach();
String aPath = ((SDOMarshalListener)((SDOXMLHelper)xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(anItem,aRoot5, aRoot5.getChangeSummary());
//SDODataObject anItemFromPath = (SDODataObject)aRoot5.get(aPath);
//System.out.println("testGetPathFromAncestorDeletedFromChildToRootLoggingOn: " + aPath);
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:billTo/ns0:phone[1]", aPath);
}
// test index=0 from item inside deleted listWrapper
public void testGetPathFromAncestorDeletedFromChildToAncestorInsideListWrapperLoggingOn() {
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"));
anItem.delete();//detach();
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("items/item[2]", aPath);
assertEquals("ns0:items/ns0:item[2]", aPath);
}
// TODO: This case fails to find a path because the oldSettings map is not populated during detach()
public void testGetPathFromAncestorDetachedFromChildToAncestorInsideListWrapperLoggingOn() {
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"));
anItem.detach();
//String aPath = anItem.getPathFromAncestor(aCS, aRoot5, useXPathFormat);
String aPath = ((SDOMarshalListener)((SDOXMLHelper)xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(anItem,aRoot5, aRoot5.getChangeSummary());
//SDODataObject anItemFromPath = (SDODataObject)aRoot5.get(aPath);
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);
}
public void testGetPathFromAncestorDeletedFromChildToCurrentObjectLoggingOn() {
SDODataObject anItem = (SDODataObject)aRoot5.get("items/item[2]");
// start logging
SDOChangeSummary aCS = aRoot5.getChangeSummary();
aCS.beginLogging();
assertTrue(aCS.isLogging());
// delete source object
anItem.delete();
String aPath = ((SDOMarshalListener)((SDOXMLHelper)xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(anItem,anItem, anItem.getChangeSummary());
assertNotNull(aPath);
assertEquals(SDOConstants.EMPTY_STRING, aPath);
}
public void testGetXPathFromAncestorDeletedFromRootToCurrentObjectLoggingOn() {
String aPath = ((SDOMarshalListener)((SDOXMLHelper)xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(aRoot5,aRoot5, aRoot5.getChangeSummary());
// start logging
SDOChangeSummary aCS = aRoot5.getChangeSummary();
aCS.beginLogging();
assertTrue(aCS.isLogging());
// delete source object
aRoot5.delete();
assertNotNull(aPath);
assertEquals(SDOConstants.EMPTY_STRING, aPath);
}
public void testGetPathFromAncestorDeletedFromRootToSiblingLoggingOn() {
SDODataObject anItem = (SDODataObject)aRoot5.get("items/item[2]");
String aPath = ((SDOMarshalListener)((SDOXMLHelper)xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(aRoot5,anItem, aRoot5.getChangeSummary());
// start logging
SDOChangeSummary aCS = aRoot5.getChangeSummary();
aCS.beginLogging();
assertTrue(aCS.isLogging());
// delete source object
aRoot5.delete();
assertEquals(SDOConstants.SDO_XPATH_INVALID_PATH, aPath);
}
public void testGetXPathFromAncestorFromContainedToParent() {
SDODataObject target = (SDODataObject)aRoot5.get("items");
SDODataObject aSibling = (SDODataObject)aRoot5.get("items/item[2]");
String aPath = ((SDOMarshalListener)((SDOXMLHelper)xmlHelper).getXmlMarshaller().getMarshalListener()).getPathFromAncestor(aSibling,target, aSibling.getChangeSummary());
assertNotNull(aPath);
assertEquals("ns0:item[2]", aPath);
}
private String getXSDString(String filename) {
try {
FileInputStream inStream = new FileInputStream(filename);
byte[] bytes = new byte[inStream.available()];
inStream.read(bytes);
return new String(bytes);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
public static Test suite() {
TestSuite suite = new TestSuite("All SDODataObject.SDODataObjectGetPathTest Tests");
suite.addTest(new TestSuite(SDODataObjectGetPathTest.class));
return suite;
}
}