| /* |
| * 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.changesummary; |
| |
| import java.io.ByteArrayOutputStream; |
| import java.io.FileInputStream; |
| import java.io.InputStream; |
| import java.util.ArrayList; |
| import java.util.List; |
| import junit.textui.TestRunner; |
| import org.eclipse.persistence.sdo.SDOChangeSummary; |
| import org.eclipse.persistence.sdo.SDOSetting; |
| import org.eclipse.persistence.sdo.helper.SDOTypeHelper; |
| import org.eclipse.persistence.sdo.helper.delegates.SDOTypeHelperDelegate; |
| import org.eclipse.persistence.testing.sdo.helper.xmlhelper.loadandsave.changesummary.ChangeSummaryRootLoadAndSaveTestCases; |
| import commonj.sdo.ChangeSummary; |
| import commonj.sdo.DataObject; |
| import commonj.sdo.Property; |
| import commonj.sdo.helper.XMLDocument; |
| |
| public abstract class ChangeSummaryOnChildTestCases extends ChangeSummaryRootLoadAndSaveTestCases { // we override everything on root - don't need child version of parent |
| protected DataObject rootObject; |
| protected DataObject rootObject2; |
| protected DataObject rootObjectOriginalCopy; |
| protected ChangeSummary salesPO1CS; |
| protected ChangeSummary salesPO2CS; |
| protected ChangeSummary developmentPO1CS; // n/a on startup |
| protected ChangeSummary developmentPO2CS; // n/a on startup |
| protected ChangeSummary stock1CS; |
| protected ChangeSummary stock2CS; |
| protected ChangeSummary stock3CS; |
| protected ChangeSummary salesPO1CS2; |
| protected ChangeSummary salesPO2CS2; |
| protected ChangeSummary developmentPO1CS2; // n/a on startup |
| protected ChangeSummary developmentPO2CS2; // n/a on startup |
| protected ChangeSummary stock1CS2; |
| protected ChangeSummary stock2CS2; |
| protected ChangeSummary stock3CS2; |
| public static final String URINAME = "http://www.example.org"; |
| public static final String TYPENAME = "corporation"; |
| @Override |
| protected String getControlRootURI() { |
| return URINAME; |
| } |
| |
| @Override |
| protected String getControlRootName() { |
| return TYPENAME; |
| } |
| |
| @Override |
| protected String getRootInterfaceName() { |
| return "CorporationType"; |
| } |
| |
| @Override |
| protected String getControlFileName() { |
| // implemented by subclass |
| return getControlFileName2(); |
| } |
| |
| protected abstract String getControlFileName2(); |
| |
| //protected String getNoSchemaControlFileName() { |
| // return ("./org/eclipse/persistence/testing/sdo/helper/xmlhelper/PurchaseOrderDeepWithCS.xml"); |
| //} |
| |
| @Override |
| public void testNoSchemaLoadFromInputStreamSaveDataObjectToString() throws Exception { |
| //do nothing |
| //TODO: need to make this test run |
| } |
| |
| protected String getModelFileName() { |
| return ("./org/eclipse/persistence/testing/sdo/helper/xmlhelper/PurchaseOrderDeepWithCSonChild.xml"); |
| } |
| |
| public ChangeSummaryOnChildTestCases(String name) { |
| super(name); |
| } |
| |
| @Override |
| public String getSchemaName() { |
| return ("./org/eclipse/persistence/testing/sdo/helper/xmlhelper/PurchaseOrderDeepWithCSonChild.xsd"); |
| } |
| |
| public static void main(String[] args) { |
| String[] arguments = { "-c", "org.eclipse.persistence.testing.sdo.model.changesummary.ChangeSummaryOnChildTestCases" }; |
| TestRunner.main(arguments); |
| } |
| |
| @Override |
| protected List defineTypes() { |
| |
| List types = xsdHelper.define(getSchema(getSchemaName())); |
| try{ |
| XMLDocument document = xmlHelper.load(new FileInputStream(getModelFileName())); |
| rootObject = document.getRootObject(); |
| salesPO1CS = rootObject.getDataObject("sales/purchaseOrder[1]").getChangeSummary(); |
| salesPO2CS = rootObject.getDataObject("sales/purchaseOrder[2]").getChangeSummary(); |
| developmentPO1CS = rootObject.getDataObject("development/purchaseOrder[1]").getChangeSummary(); |
| developmentPO2CS = null;//rootObject.getDataObject("development/purchaseOrder[2]").getChangeSummary(); |
| stock1CS = rootObject.getDataObject("stock[1]").getChangeSummary(); |
| stock2CS = rootObject.getDataObject("stock[2]").getChangeSummary(); |
| stock3CS = rootObject.getDataObject("stock[3]").getChangeSummary(); |
| |
| //rootObjectOriginalCopy = copyHelper.copy(rootObject); |
| // see bug #5878605: SDO: COPYHELPER.COPY() LOGS CS CHANGES - SHOULD SUSPEND LOGGING DURING COPY |
| // turn off logging before deep copy as a workaround |
| salesPO1CS.endLogging(); |
| salesPO2CS.endLogging(); |
| developmentPO1CS.endLogging(); |
| //developmentPO2CS.endLogging(); |
| stock1CS.endLogging(); |
| stock2CS.endLogging(); |
| stock3CS.endLogging(); |
| |
| rootObject2 = copyHelper.copy(rootObject); |
| |
| salesPO1CS2 = rootObject2.getDataObject("sales/purchaseOrder[1]").getChangeSummary(); |
| salesPO2CS2 = rootObject2.getDataObject("sales/purchaseOrder[2]").getChangeSummary(); |
| developmentPO1CS2 = rootObject.getDataObject("development/purchaseOrder[1]").getChangeSummary(); |
| developmentPO2CS2 = null;//rootObject.getDataObject("development/purchaseOrder[2]").getChangeSummary(); |
| stock1CS2 = rootObject2.getDataObject("stock[1]").getChangeSummary(); |
| stock2CS2 = rootObject2.getDataObject("stock[2]").getChangeSummary(); |
| stock3CS2 = rootObject2.getDataObject("stock[3]").getChangeSummary(); |
| |
| // make sure all logs are off |
| salesPO1CS.endLogging(); |
| salesPO2CS.endLogging(); |
| developmentPO1CS.endLogging(); |
| //developmentPO2CS.endLogging(); |
| stock1CS.endLogging(); |
| stock2CS.endLogging(); |
| stock3CS.endLogging(); |
| |
| salesPO1CS2.endLogging(); |
| salesPO2CS2.endLogging(); |
| developmentPO1CS2.endLogging(); |
| //developmentPO2CS2.endLogging(); |
| stock1CS2.endLogging(); |
| stock2CS2.endLogging(); |
| stock3CS2.endLogging(); |
| }catch(Exception e) |
| { |
| e.printStackTrace(); |
| } |
| return types; |
| } |
| |
| @Override |
| protected String getControlString(String fileName) { |
| try { |
| FileInputStream inputStream = new FileInputStream(fileName); |
| byte[] bytes = new byte[inputStream.available()]; |
| inputStream.read(bytes); |
| return new String(bytes); |
| } catch (Exception e) { |
| fail("An error occurred loading the control document"); |
| e.printStackTrace(); |
| return null; |
| } |
| } |
| |
| @Override |
| protected void verifyAfterLoad(XMLDocument document) { |
| assertNull(document.getRootObject().getContainer()); |
| } |
| /* |
| protected List defineTypes() { |
| // do not define types twice - so we do not set dirty=true |
| //return xsdHelper.define(getSchema(getSchemaName())); |
| return (List)new ArrayList(((SDOTypeHelper)typeHelper).getTypesHashMap().values()); |
| } |
| */ |
| //protected String getSchemaLocation() { |
| // return ""; |
| //} |
| public DataObject loadObjectFromInputStream() throws Exception { |
| List types = defineTypes(); |
| FileInputStream inputStream = new FileInputStream(getControlFileName()); |
| XMLDocument document = xmlHelper.load(inputStream); |
| |
| // reset global variables for this xml based test |
| rootObject = document.getRootObject(); |
| salesPO1CS = rootObject.getDataObject("sales/purchaseOrder[1]").getChangeSummary(); |
| salesPO2CS = rootObject.getDataObject("sales/purchaseOrder[2]").getChangeSummary(); |
| developmentPO1CS = rootObject.getDataObject("development/purchaseOrder[1]").getChangeSummary(); |
| developmentPO2CS = null;//rootObject.getDataObject("development/purchaseOrder[2]").getChangeSummary(); |
| stock1CS = rootObject.getDataObject("stock[1]").getChangeSummary(); |
| stock2CS = rootObject.getDataObject("stock[2]").getChangeSummary(); |
| stock3CS = rootObject.getDataObject("stock[3]").getChangeSummary(); |
| |
| verifyAfterLoad(document); |
| return document.getRootObject(); |
| |
| //compareXML(getControlString(getLoadControlFileName()), outputStream.toString()); |
| //ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); |
| //xmlHelper.save(document, outputStream, null); |
| //compareXML(getControlString(getControlFileName()), outputStream.toString()); |
| } |
| |
| public void saveObjectToOutputStream() throws Exception { |
| //List types = defineTypes(); |
| //FileInputStream inputStream = new FileInputStream(getControlFileName()); |
| //XMLDocument document = xmlHelper.load(inputStream); |
| //verifyAfterLoad(document); |
| ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); |
| try { |
| xmlHelper.save(rootObject, URINAME,// |
| TYPENAME,// |
| //System.out);//outputStream); |
| outputStream); |
| } catch (Exception e) { |
| System.out.println("Exception: " + e.getMessage()); |
| e.printStackTrace(); |
| } |
| compareXML(getControlString(getControlFileName()), outputStream.toString()); |
| } |
| |
| public void assertDeleteDetachUnsetComplexSingleBelowRoot(boolean testLoadSave, // |
| boolean isDeleted, // |
| DataObject itemsDO,// |
| DataObject item1DO,// |
| DataObject item1ProductDO,// |
| DataObject item1ProductPrice1DO,// |
| DataObject item1ProductPrice2DO// |
| ) { |
| assertEquals(5, salesPO1CS.getChangedDataObjects().size()); |
| assertEquals(1, salesPO1CS.getOldValues(itemsDO).size()); |
| if (!testLoadSave) { |
| assertModified(itemsDO, salesPO1CS); |
| if (isDeleted) { |
| assertDeleted(item1DO, salesPO1CS); |
| assertFalse(item1DO == salesPO1CS.getOldValue(itemsDO, itemsDO.getInstanceProperty("item"))); // verify that oldValue of original deleted is deep copy |
| assertDeleted(item1ProductDO, salesPO1CS); |
| assertFalse(item1ProductDO == salesPO1CS.getOldValue(item1DO, item1DO.getInstanceProperty("product"))); // verify that oldValue of original deleted is deep copy |
| assertDeleted(item1ProductPrice1DO, salesPO1CS); |
| Object oldValue = salesPO1CS.getOldValue(item1ProductDO, item1ProductDO.getInstanceProperty("price")).getValue(); |
| // Bug# 5895047 - verify we are not getting an oldSetting that is an empty ArrayList |
| assertTrue(oldValue instanceof ArrayList); |
| assertEquals(2, ((ArrayList)oldValue).size()); |
| List aPriceList = ((ArrayList)oldValue); |
| DataObject oldItem1ProductPrice1DO = (DataObject) aPriceList.get(0); |
| assertNotNull(oldItem1ProductPrice1DO); |
| assertFalse(item1ProductPrice1DO == oldItem1ProductPrice1DO); // verify that oldValue of original deleted is deep copy |
| assertDeleted(item1ProductPrice2DO, salesPO1CS); |
| DataObject oldItem2ProductPrice1DO = (DataObject) aPriceList.get(1); |
| assertNotNull(oldItem2ProductPrice1DO); |
| assertFalse(item1ProductPrice2DO == oldItem2ProductPrice1DO); // verify that oldValue of original deleted is deep copy |
| } else { |
| assertDetached(item1DO, salesPO1CS); |
| assertDetached(item1ProductDO, salesPO1CS, false); |
| assertDetached(item1ProductPrice1DO, salesPO1CS, false); |
| assertDetached(item1ProductPrice2DO, salesPO1CS, false); |
| } |
| } |
| |
| assertEquals(5, salesPO1CS.getChangedDataObjects().size()); |
| |
| if (!testLoadSave) { |
| assertEquals(1, salesPO1CS.getOldValues(itemsDO).size()); |
| ChangeSummary.Setting containmentSetting = (ChangeSummary.Setting)salesPO1CS.getOldValues(itemsDO).get(0); |
| assertEquals("item", containmentSetting.getProperty().getName()); |
| assertTrue(containmentSetting.getValue() instanceof List); |
| assertEquals(2, ((List)containmentSetting.getValue()).size()); |
| assertEquals(true, containmentSetting.isSet()); |
| } |
| |
| assertEquals(16, ((SDOChangeSummary)salesPO1CS).getOldContainer().size()); |
| assertEquals(16, ((SDOChangeSummary)salesPO1CS).getOldContainmentProperty().size()); |
| } |
| |
| public void assertDeleteDetachUnsetComplexSingleAtRoot(boolean testLoadSave, // |
| boolean isDeleted, // |
| DataObject po1DO,// |
| DataObject itemsDO,// |
| DataObject item1DO,// |
| DataObject item2DO,// |
| DataObject item1ProductDO,// |
| DataObject item1ProductPrice1DO,// |
| DataObject item1ProductPrice2DO// |
| ) { |
| assertEquals(10, salesPO1CS.getChangedDataObjects().size()); |
| assertEquals(1, salesPO1CS.getOldValues(po1DO).size()); |
| if (!testLoadSave) { |
| assertModified(po1DO, salesPO1CS); |
| if (isDeleted) { |
| assertDeleted(itemsDO, salesPO1CS); |
| assertFalse(itemsDO == salesPO1CS.getOldValue(po1DO, po1DO.getInstanceProperty("items"))); // verify that oldValue of original deleted is deep copy |
| Object oldValueItem = salesPO1CS.getOldValue(itemsDO, itemsDO.getInstanceProperty("item")).getValue(); |
| |
| // Bug# 5895047 - verify we are not getting an oldSetting that is an empty ArrayList |
| assertTrue(oldValueItem instanceof ArrayList); |
| assertEquals(2, ((ArrayList)oldValueItem).size()); |
| List anItemList = ((ArrayList)oldValueItem); |
| DataObject oldItem1DO = (DataObject) anItemList.get(0); |
| assertNotNull(oldItem1DO); |
| assertFalse(item1ProductPrice1DO == oldItem1DO); // verify that oldValue of original deleted is deep copy |
| assertDeleted(item1DO, salesPO1CS); |
| DataObject oldItem2DO = (DataObject) anItemList.get(1); |
| assertNotNull(oldItem2DO); |
| assertFalse(item1ProductPrice2DO == oldItem2DO); // verify that oldValue of original deleted is deep copy |
| assertDeleted(item2DO, salesPO1CS); |
| |
| assertDeleted(item1ProductDO, salesPO1CS); |
| assertFalse(item1ProductDO == salesPO1CS.getOldValue(item1DO, item1DO.getInstanceProperty("product"))); // verify that oldValue of original deleted is deep copy |
| assertDeleted(item1ProductPrice1DO, salesPO1CS); |
| Object oldValuePrice = salesPO1CS.getOldValue(item1ProductDO, item1ProductDO.getInstanceProperty("price")).getValue(); |
| // Bug# 5895047 - verify we are not getting an oldSetting that is an empty ArrayList |
| assertTrue(oldValuePrice instanceof ArrayList); |
| assertEquals(2, ((ArrayList)oldValuePrice).size()); |
| List aPriceList = ((ArrayList)oldValuePrice); |
| DataObject oldItem1ProductPrice1DO = (DataObject) aPriceList.get(0); |
| assertNotNull(oldItem1ProductPrice1DO); |
| assertFalse(item1ProductPrice1DO == oldItem1ProductPrice1DO); // verify that oldValue of original deleted is deep copy |
| assertDeleted(item1ProductPrice2DO, salesPO1CS); |
| DataObject oldItem2ProductPrice1DO = (DataObject) aPriceList.get(1); |
| assertNotNull(oldItem2ProductPrice1DO); |
| assertFalse(item1ProductPrice2DO == oldItem2ProductPrice1DO); // verify that oldValue of original deleted is deep copy |
| } else { |
| assertDetached(item1DO, salesPO1CS); |
| assertDetached(item1ProductDO, salesPO1CS, false); |
| assertDetached(item1ProductPrice1DO, salesPO1CS, false); |
| assertDetached(item1ProductPrice2DO, salesPO1CS, false); |
| } |
| } |
| |
| assertEquals(10, salesPO1CS.getChangedDataObjects().size()); |
| |
| if (!testLoadSave) { |
| assertEquals(1, salesPO1CS.getOldValues(itemsDO).size()); |
| ChangeSummary.Setting containmentSetting = (ChangeSummary.Setting)salesPO1CS.getOldValues(itemsDO).get(0); |
| assertEquals("item", containmentSetting.getProperty().getName()); |
| assertTrue(containmentSetting.getValue() instanceof List); |
| assertEquals(2, ((List)containmentSetting.getValue()).size()); |
| assertEquals(true, containmentSetting.isSet()); |
| } |
| |
| assertEquals(16, ((SDOChangeSummary)salesPO1CS).getOldContainer().size()); |
| assertEquals(16, ((SDOChangeSummary)salesPO1CS).getOldContainmentProperty().size()); |
| } |
| } |