/*
 * 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
/*
   DESCRIPTION
    Perform copy/equality junit test operations on DataObjects.
    References:
      SDO59-DeepCopy.doc
      SDO_Ref_BiDir_Relationships_DesignSpec.doc
      http://files.oraclecorp.com/content/MySharedFolders/ST%20Functional%20Specs/AS11gR1/TopLink/SDO/SDO_Ref_BiDir_Relationships_DesignSpec.doc

 */
package org.eclipse.persistence.testing.sdo.helper;

import commonj.sdo.DataObject;
import commonj.sdo.Property;
import java.util.ArrayList;
import java.util.List;
import javax.xml.namespace.QName;
import org.eclipse.persistence.sdo.SDOConstants;
import org.eclipse.persistence.sdo.SDODataObject;
import org.eclipse.persistence.sdo.SDOProperty;
import org.eclipse.persistence.sdo.SDOType;
import org.eclipse.persistence.sdo.helper.SDOTypeHelper;
import org.eclipse.persistence.testing.sdo.SDOTestCase;

public class SDOCopyEqualityHelperTestCases extends SDOTestCase {
    protected String rootTypeName = "rootTypeName";
    protected String rootTypeUri = "rootTypeTypeUri";
    protected String containedTypeName = "containedTypeName";
    protected String containedTypeUri = "containedTypeTypeUri";
    protected String containedType1Name = "containedType1Name";
    protected String containedType1Uri = "containedType1TypeUri";
    protected String containedByContainedTypeName = "containedByContainedTypeName";
    protected String containedBycontainedType1Uri = "containedBycontainedTypeTypeUri";
    protected SDODataObject root;
    protected SDODataObject root1;
    protected SDODataObject containedDataObject;
    protected SDODataObject containedDataObject_1;
    protected SDODataObject containedDataObject1;
    protected SDODataObject containedByContainedDataObject;
    protected SDOType rootType;
    protected SDOType containedType;
    protected SDOType containedType_1;
    protected SDOType containedType1;
    protected SDOType containedByContainedType;
    protected SDOProperty rootProperty1;
    protected SDOProperty rootProperty2;
    protected SDOProperty rootProperty3;
    protected SDOProperty rootProperty4;
    protected SDOProperty containedProperty1;
    protected SDOProperty containedProperty2;
    protected SDOProperty containedProperty_ChangeSummary;
    protected SDOProperty contained1Property1;
    protected SDOProperty containedByContainedProperty1;
    protected SDOProperty containedByContainedProperty2;

    // Data structures for UC02xx (bidirectional property between internal nodes)
    protected String containedType3Name = "containedType3Name";
    protected String containedType3Uri = "containedType3TypeUri";
    protected SDOType containedByContainedType3;
    protected SDODataObject containedByContainedDataObject3;
    protected String containedByContainedTypeName3 = "containedByContainedTypeName3";
    protected String containedBycontainedType3Uri = "containedBycontainedTypeType3Uri";
    protected SDOProperty containedByContainedProperty3;
    protected SDOProperty contained1Property3;
    protected SDOType containedType3;
    protected SDOProperty containedProperty3;

    // UC4
    protected SDODataObject rootUC4;
    protected SDODataObject rootUC4m;
    protected SDOType rootUC4Type;
    protected SDOType rootUC4Typem;
    protected SDOType homeType;
    protected SDOType homeTypem;
    protected SDOType workType;
    protected SDOType workTypem;
    protected SDOType addressType;
    protected SDOType addressTypem;
    protected SDODataObject workObject;
    protected SDODataObject workObjectm;
    protected SDODataObject homeObject;
    protected SDODataObject homeObjectm;
    protected SDODataObject addressObject;
    protected SDODataObject addressObjectm;
    protected SDOProperty homeAddress;
    protected SDOProperty homeAddressm;
    protected SDOProperty rootHome;
    protected SDOProperty rootHomem;
    protected SDOProperty rootWork;
    protected SDOProperty rootWorkm;
    protected SDOProperty workAddress;
    protected SDOProperty workAddressm;
    protected SDOProperty addressWork;
    protected SDOProperty addressWorkm;
    protected String workObjectName = "workObjectName";
    protected String homeObjectName = "homeObjectName";
    protected String addressObjectName = "addressObjectName";
    protected String workObjectUri = "workObjectUri";
    protected String homeObjectUri = "homeObjectUri";
    protected String addressObjectUri = "addressObjectUri";
    protected String workObjectUrim = "workObjectUrim";
    protected String homeObjectUrim = "homeObjectUrim";
    protected String addressObjectUrim = "addressObjectUrim";

    // property strings
    protected String rootUC4TypeName = "rootUC4TypeName";
    protected String rootUC4TypeUri = "rootUC4TypeTypeUri";
    protected String rootUC4TypeUrim = "rootUC4TypeTypeUrim";
    protected String rootHomeName = "rootHome";
    protected String rootWorkName = "rootWork";
    protected String homeAddressName = "homeAddress";
    protected String workAddressName = "workAddress";
    protected String addressWorkName = "addressWork";
    protected String rootHomeUri = "rootHomeUri";
    protected String rootHomeUrim = "rootHomeUrim";
    protected String rootWorkUri = "rootWorkUri";
    protected String rootWorkUrim = "rootWorkUrim";
    protected String homeAddressUri = "homeAddressUri";
    protected String workAddressUri = "workAddressUri";
    protected String addressWorkUri = "addressWorkUri";
    protected String homeAddressUrim = "homeAddressUrim";
    protected String workAddressUrim = "workAddressUrim";
    protected String addressWorkUrim = "addressWorkUrim";

    // UCUniOutside
    protected SDODataObject rootUCUniOutside;
    protected SDOType rootUCUniOutsideType;
    protected SDOType homeTypeUCUniOutside;
    protected SDOType workTypeUCUniOutside;
    protected SDOType addressTypeUCUniOutside;
    protected SDODataObject workObjectUCUniOutside;
    protected SDODataObject homeObjectUCUniOutside;
    protected SDODataObject addressObjectUCUniOutside;
    protected SDOProperty homeAddressUCUniOutside;
    protected SDOProperty rootHomeUCUniOutside;
    protected SDOProperty rootWorkUCUniOutside;
    protected SDOProperty workAddressUCUniOutside;
    protected SDOProperty addressWorkUCUniOutside;
    protected String workObjectNameUCUniOutside = "workObjectNameUCUniOutside";
    protected String homeObjectNameUCUniOutside = "homeObjectNameUCUniOutside";
    protected String addressObjectNameUCUniOutside = "addressObjectNameUCUniOutside";
    protected String workObjectUriUCUniOutside = "workObjectUriUCUniOutside";
    protected String homeObjectUriUCUniOutside = "homeObjectUriUCUniOutside";
    protected String addressObjectUriUCUniOutside = "addressObjectUriUCUniOutside";

    // property strings
    protected String rootUCUniOutsideTypeName = "rootUCUniOutsideTypeName";
    protected String rootUCUniOutsideTypeUri = "rootUCUniOutsideTypeTypeUri";
    protected String rootHomeNameUCUniOutside = "rootHome";
    protected String rootWorkNameUCUniOutside = "rootWork";
    protected String homeAddressNameUCUniOutside = "homeAddress";
    protected String workAddressNameUCUniOutside = "workAddress";
    protected String addressWorkNameUCUniOutside = "addressWork";
    protected String rootHomeUriUCUniOutside = "rootHomeUri";
    protected String rootWorkUriUCUniOutside = "rootWorkUri";
    protected String homeAddressUriUCUniOutside = "homeAddressUri";
    protected String workAddressUriUCUniOutside = "workAddressUri";
    protected String addressWorkUriUCUniOutside = "addressWorkUri";
    protected List objects = new ArrayList();
    protected List objects1 = new ArrayList();

    public SDOCopyEqualityHelperTestCases(String name) {
        super(name);
    }

    /**
    * Structure:
    *
    * root
    *    rootproperty1 --> is DataType; SDOString  <---> value: "test"
    *    rootproperty2 --> not DataType            <---> value: containedDataObject
    * root's child:
    *  containedDataObject1
    *      contained1Property1 --> not DataType; bidirectional   <---> value: containedByContainedDataObject
    *  containedDataObject
    *      containedProperty1  --> is DataType; SDOString  <---> value: "test1"
    *      containedProperty2  --> not DataType            <---> value: containedByContainedDataObject
    *      containedProperty3  --> not DataType            <---> value: containedByContainedDataObject3 (bidirectional inside sub-tree copy tree)
    *      containedProperty_ChangeSummary  --> not DataType  <---> value: chSum(ChangeSummary)
    *  containedDataObject's child:
    *    containedByContainedDataObject
    *        containedByContainedProperty1  --> not DataType; bidirectional   <---> value: containedDataObejct1
    *
    * Covered test cases:
    * Test case 1: copied root's DataType property rootproperty1 has same value
    * Test Case 2: copied root's not DataType property rootproperty2 has a copied DataObject from containedDataObject
    * Test case 3: there exists dataobject's bidirectional not containment property has another DataObject as value
    * Test Case 4: there exists dataobject's unidirectional not containment property has another DataObject as value
    * Test Case 5: there exists dataobject's non containment property has another DataObject that is not in containment tree as value
    * Test Case 6: copied containedProperty's ChangeSummary Type property containedProperty_ChangeSummary has a copied ChangeSummary from source's ChangeSummary chSum
    */
    @Override
    public void setUp() {
        super.setUp();
        SDOType changeSummaryType = (SDOType) aHelperContext.getTypeHelper().getType(SDOConstants.SDO_URL, SDOConstants.CHANGESUMMARY);

        // first we set up root data object
        DataObject rootTypeDO = defineType(rootTypeUri, rootTypeName);
        rootType = (SDOType)typeHelper.define(rootTypeDO);

        rootProperty1 = new SDOProperty(aHelperContext);// root's property1
        rootProperty1.setName("rootproperty1-datatype");
        SDOType rootProperty1_type = SDOConstants.SDO_STRING;// string type
        rootProperty1.setType(rootProperty1_type);
        rootType.addDeclaredProperty(rootProperty1);// add this property to root type's declared list

        rootProperty2 = new SDOProperty(aHelperContext);//root's property2
        rootProperty2.setName("rootproperty2-notdatatype");
        rootProperty2.setContainment(true);// containment property
        SDOType rootProperty2_type = new SDOType("notDataTypeUri", "notDataType");
        QName qname = new QName("notDataTypeUri", "notDataType");
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, rootProperty2_type);

        rootProperty2.setType(rootProperty2_type);
        rootType.addDeclaredProperty((Property)rootProperty2);

        rootProperty3 = new SDOProperty(aHelperContext);// root's property3
        rootProperty3.setName("rootproperty3-notdatatype");
        rootProperty3.setContainment(true);// containment property
        DataObject rootProperty3_typeDO = defineType("notDataTypeUri1", "notDataType1");
        SDOType rootProperty3_type = (SDOType)typeHelper.define(rootProperty3_typeDO);

        rootProperty3.setType(rootProperty3_type);
        rootType.addDeclaredProperty(rootProperty3);

        rootProperty4 = new SDOProperty(aHelperContext);
        rootProperty4.setName("rootproperty4-list");
        rootProperty4.setContainment(true);
        rootProperty4.setMany(true);

        DataObject rootProperty4_typeDO = defineType("listPropertyUri", "listProperty");
        SDOType rootProperty4_type = (SDOType)typeHelper.define(rootProperty4_typeDO);

        rootProperty4.setType(rootProperty4_type);
        rootType.addDeclaredProperty(rootProperty4);

        SDOProperty rootProperty_NotContainment = new SDOProperty(aHelperContext);
        rootProperty_NotContainment.setContainment(false);

        DataObject rootProperty_NotContainment_typeDO = defineType("rootProperty_NotContainmenturi", "rootProperty_NotContainment");
        SDOType rootProperty_NotContainment_type = (SDOType)typeHelper.define(rootProperty_NotContainment_typeDO);
        rootProperty_NotContainment.setType(rootProperty_NotContainment_type);
        rootProperty_NotContainment.setName("rootProperty_NotContainment");
        rootType.addDeclaredProperty(rootProperty_NotContainment);

        // 20060913: opposite property 3 (to test bidirectional property inside subtree copy tree)
        contained1Property3 = new SDOProperty(aHelperContext);// containedDataObject3's property3
        contained1Property3.setName("contained1Property3-notdataType");
        contained1Property3.setContainment(false);// non-containment property

        DataObject contained1Property3_typeDO = defineType("contained1Property3Uri", "contained1Property3_notdataType");
        SDOType contained1Property3_type = (SDOType)typeHelper.define(contained1Property3_typeDO);
        contained1Property3.setType(contained1Property3_type);

        objects = new ArrayList();

        SDOType obj1Type = new SDOType("listelm1", "listelm1");
        qname = new QName("listelm1", "listelm1");
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, obj1Type);
        SDOProperty obj1Property = new SDOProperty(aHelperContext);
        obj1Property.setName("obj1Property");
        SDOType obj1PropertyType = SDOConstants.SDO_STRING;
        obj1Property.setType(obj1PropertyType);
        obj1Property.setContainment(false);
        obj1Type.addDeclaredProperty(obj1Property);
        SDODataObject obj1 = (SDODataObject)dataFactory.create(obj1Type);
        objects.add(obj1);

        obj1.set(obj1Property, "test");

        // second, we create another dataobject contained by root
        DataObject containedTypeDO = defineType(containedTypeUri, containedTypeName);
        containedType = (SDOType)typeHelper.define(containedTypeDO);

        containedProperty1 = new SDOProperty(aHelperContext);// containedDataObject's property1
        containedProperty1.setName("containedProperty1-dataType");
        SDOType containedProperty1_type = SDOConstants.SDO_STRING;// String Type
        containedProperty1.setType(containedProperty1_type);
        containedType.addDeclaredProperty(containedProperty1);

        containedProperty2 = new SDOProperty(aHelperContext);// containedDataObject's property2
        containedProperty2.setName("containedProperty2-notdataType");
        containedProperty2.setContainment(true);// containment property
        SDOType containedProperty2_type = new SDOType(//
        "containedProperty2Uri", "containedProperty2_notdataType");
        qname = new QName("containedProperty2Uri", "containedProperty2_notdataType");
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, containedProperty2_type);
        containedProperty2_type.setDataType(false);// not datatype
        containedProperty2.setType(containedProperty2_type);
        containedType.addDeclaredProperty(containedProperty2);

        // 20060914 new bidirectional hosting node
        containedProperty3 = new SDOProperty(aHelperContext);// containedDataObject's property2
        containedProperty3.setName("containedProperty3-notdataType");
        containedProperty3.setContainment(true);// containment property
        SDOType containedProperty3_type = new SDOType(//
        "containedProperty3Uri", "containedProperty3_notdataType");
        qname = new QName("containedProperty3Uri", "containedProperty3_notdataType");
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, containedProperty3_type);
        containedProperty3_type.setDataType(false);// not datatype
        containedProperty3.setType(containedProperty3_type);
        containedType.addDeclaredProperty(containedProperty3);

        containedProperty_ChangeSummary = new SDOProperty(aHelperContext);
        containedProperty_ChangeSummary.setContainment(false);
        containedProperty_ChangeSummary.setType(changeSummaryType);
        containedProperty_ChangeSummary.setName("containedProperty_ChangeSummary");
        containedType.addDeclaredProperty(containedProperty_ChangeSummary);

        containedDataObject = (SDODataObject)dataFactory.create(containedType);

        // then, we create one dataobject as root's non containment property' value
        containedType1 = new SDOType(containedType1Uri, containedType1Name);
        qname = new QName(containedType1Uri, containedType1Name);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, containedType1);

        contained1Property1 = new SDOProperty(aHelperContext);// containedDataObject1's property1
        contained1Property1.setName("contained1Property1-notdataType");
        contained1Property1.setContainment(false);// non containment property
        SDOType contained1Property1_type = new SDOType(//
        "contained1Property1Uri", "contained1Property1_notdataType");
        qname = new QName("contained1Property1Uri", "contained1Property1_notdataType");
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, contained1Property1_type);
        contained1Property1_type.setDataType(false);// not datatype
        contained1Property1.setType(contained1Property1_type);
        // TODO: 20060906 bidirectional
        // bidirectional to containedByContainedDataObject
        // Note: the property parameter is null so this set will have no effect until the 2nd set later
        contained1Property1.setOpposite(containedByContainedProperty1);

        containedType1.addDeclaredProperty(contained1Property1);

        containedDataObject1 = (SDODataObject)dataFactory.create(containedType1);
        // finally, we create a dataobject contained by containedDataObject
        containedByContainedType = new SDOType(containedBycontainedType1Uri, containedByContainedTypeName);

        qname = new QName(containedBycontainedType1Uri, containedByContainedTypeName);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, containedByContainedType);
        containedByContainedProperty1 = new SDOProperty(aHelperContext);// containedByContainedDataObject's property1
        containedByContainedProperty1.setName("containedByContainedProperty1-notdataType");
        containedByContainedProperty1.setContainment(false);// non containment property
        SDOType containedByContainedProperty1_type = new SDOType(//
        "containedByContainedProperty1Uri", "containedByContainedProperty1_notdataType");
        qname = new QName("containedByContainedProperty1Uri", "containedByContainedProperty1_notdataType");
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, containedByContainedProperty1_type);
        containedByContainedProperty1_type.setDataType(false);// not datatype
        containedByContainedProperty1.setType(containedByContainedProperty1_type);
        // TODO: 20060906 bidirectional
        // bidirectional to containedDataObject1
        containedByContainedProperty1.setOpposite(contained1Property1);
        containedByContainedType.addDeclaredProperty(containedByContainedProperty1);
        // reset opposite set above when property paramenter used to be null
        contained1Property1.setOpposite(containedByContainedProperty1);

        containedByContainedProperty2 = new SDOProperty(aHelperContext);// containedByContainedDataObject's property1
        containedByContainedProperty2.setName("containedByContainedProperty2-dataType");
        containedByContainedProperty2.setContainment(false);// non containment property
        SDOType containedByContainedProperty2_type = new SDOType(//
        "containedByContainedProperty2Uri", "containedByContainedProperty2_notdataType");
        qname = new QName("containedByContainedProperty2Uri", "containedByContainedProperty2_notdataType");
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, containedByContainedProperty2_type);
        containedByContainedProperty2_type.setDataType(false);// not datatype
        containedByContainedProperty2.setType(containedByContainedProperty2_type);
        containedByContainedType.addDeclaredProperty(containedByContainedProperty2);

        // opposite property 3
        containedByContainedProperty3 = new SDOProperty(aHelperContext);// containedByContainedDataObject2's property3
        containedByContainedProperty3.setName("containedByContainedProperty3-notdataType");
        containedByContainedProperty3.setContainment(false);// non-containment property
        SDOType containedByContainedProperty3_type = new SDOType(//
        "containedByContainedProperty3Uri", "containedByContainedProperty3_notdataType");
        qname = new QName("containedByContainedProperty3Uri", "containedByContainedProperty3_notdataType");
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, containedByContainedProperty3_type);
        containedByContainedProperty3_type.setDataType(false);// non-datatype
        containedByContainedProperty3.setType(containedByContainedProperty3_type);
        containedByContainedType.addDeclaredProperty(containedByContainedProperty3);

        containedByContainedDataObject = (SDODataObject)dataFactory.create(//
            containedByContainedType);

        // set up relationship
        root = (SDODataObject)dataFactory.create(rootType);
        root.set(rootProperty1, "test");
        root.set(rootProperty2, containedDataObject);// child: containedDataObject
        root.set(rootProperty3, containedDataObject1);// child: containedDataObject1
        root.set(rootProperty4, objects);
        containedDataObject.set(containedProperty1, "test1");
        // child: containedByContainedDataObject
        containedDataObject.set(containedProperty2, containedByContainedDataObject);
        // set opposite property
        containedDataObject1.set(contained1Property1, containedByContainedDataObject);
        // set opposite property
        containedByContainedDataObject.set(containedByContainedProperty1, containedDataObject1);

        /*
              // UC02xx: setup some bidirectional properties that have the same copy root
              // but are 1 level down from the source root so that copy root != source root
              // new CBCDO2 off off CDO
              containedByContainedType3 = new SDOType(containedBycontainedType3Uri, containedByContainedTypeName3);


              // add property to do
              //containedByContainedType3.addDeclaredProperty(containedByContainedProperty3);
              // 20060913
              //containedType3 = new SDOType(containedType3Uri, containedType3Name);
              // add property to do
              containedByContainedType3.addDeclaredProperty(contained1Property3);

              // new DO
              containedByContainedDataObject3 = (SDODataObject)dataFactory.create(//
                      containedByContainedType3);


              // 2 new opposite properties CBCP2 and C1P2 between CBCDO and CBCDO2
              // set opposite property
        //        containedByContainedDataObject3.set(contained1Property3, containedByContainedDataObject);
              // set opposite property
              containedByContainedDataObject.set(containedByContainedProperty3, containedByContainedDataObject3);


              // child: containedByContainedDataObject
        //        containedDataObject.set(containedProperty3, containedByContainedDataObject3);

              // attach opposite properties between CBCDO and CBCDO2
              // bidirectional to containedDataObject1
              containedByContainedProperty3.setOpposite(contained1Property3);
              // reset opposite set above when property paramenter used to be null
              contained1Property3.setOpposite(containedByContainedProperty3);
        */
        // UC 4: mixed containment=true/containment=false bidirectional opposite set
        // (work at home relationship)
        // root -> home -> address
        // root -> work -> address
        // home/address -> noncontainment to -> work
        // work -> containment to -> home/address
        rootUC4Type = new SDOType(rootUC4TypeUri, rootUC4TypeName);// root's type
        qname = new QName(rootUC4TypeUri, rootUC4TypeName);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, rootUC4Type);

        homeType = new SDOType(homeObjectUri, homeObjectName);
        qname = new QName(homeObjectUri, homeObjectName);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, homeType);

        addressType = new SDOType(addressObjectUri, addressObjectName);
        qname = new QName(addressObjectUri, addressObjectName);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, addressType);

        workType = new SDOType(workObjectUri, workObjectName);
        qname = new QName(workObjectUri, workObjectName);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, workType);

        rootHome = new SDOProperty(aHelperContext);
        rootHome.setName(rootHomeName);
        rootHome.setContainment(true);// containment property
        SDOType rootHome_type = new SDOType(rootHomeUri, rootHomeName);
        qname = new QName(rootHomeUri, rootHomeName);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, rootHome_type);

        rootHome_type.setDataType(false);// not datatype
        rootHome.setType(rootHome_type);
        rootUC4Type.addDeclaredProperty((Property)rootHome);

        rootWork = new SDOProperty(aHelperContext);
        rootWork.setName(rootWorkName);
        // non containment so that a containment opposite can be set to this node
        rootWork.setContainment(false);//true);// containment property
        //rootWork.setContainment(true);// containment property
        SDOType rootWork_type = new SDOType(rootWorkUri, rootWorkName);
        qname = new QName(rootWorkUri, rootWorkName);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, rootWork_type);
        rootWork_type.setDataType(false);// not datatype
        rootWork.setType(rootWork_type);
        rootUC4Type.addDeclaredProperty((Property)rootWork);

        homeAddress = new SDOProperty(aHelperContext);
        homeAddress.setName(homeAddressName);
        homeAddress.setContainment(true);// containment property
        SDOType homeAddress_type = new SDOType(homeAddressUri, homeAddressName);
        qname = new QName(homeAddressUri, homeAddressName);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, homeAddress_type);
        homeAddress_type.setDataType(false);// not datatype
        homeAddress.setType(homeAddress_type);
        homeType.addDeclaredProperty((Property)homeAddress);

        workAddress = new SDOProperty(aHelperContext);
        workAddress.setName(workAddressName);
        // one opposite property can be true
        workAddress.setContainment(false);//true);// containment property
        //workAddress.setContainment(true);// containment property
        SDOType workAddress_type = new SDOType(workAddressUri, workAddressName);
        qname = new QName(workAddressUri, workAddressName);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, workAddress_type);
        workAddress_type.setDataType(false);// not datatype
        workAddress.setType(workAddress_type);
        workType.addDeclaredProperty((Property)workAddress);

        addressWork = new SDOProperty(aHelperContext);
        addressWork.setName(addressWorkName);
        // other opposite property must be false
        addressWork.setContainment(true);// containment property
        SDOType addressWork_type = new SDOType(addressWorkUri, addressWorkName);
        qname = new QName(addressWorkUri, addressWorkName);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, addressWork_type);
        addressWork_type.setDataType(false);// not datatype
        addressWork.setType(addressWork_type);
        addressType.addDeclaredProperty((Property)addressWork);

        rootUC4 = (SDODataObject)dataFactory.create(rootUC4Type);
        addressObject = (SDODataObject)dataFactory.create(addressType);
        homeObject = (SDODataObject)dataFactory.create(homeType);
        workObject = (SDODataObject)dataFactory.create(workType);
        addressWork.setOpposite(workAddress);
        workAddress.setOpposite(addressWork);

        rootUC4.set(rootHome, homeObject);
        rootUC4.set(rootWork, workObject);
        // child:
        homeObject.set(homeAddress, addressObject);
        // set opposite property
        addressObject.set(addressWork, workObject);
        // set opposite property
        workObject.set(workAddress, addressObject);

        // many case
        // UC 4: mixed containment=true/containment=false bidirectional opposite set
        // (work at home relationship)
        // root -> home -> address
        // root -> work -> address
        // home/address -> noncontainment to -> work
        // work -> containment to -> home/address
        rootUC4Typem = new SDOType(rootUC4TypeUrim, rootUC4TypeName);// root's type
        qname = new QName(rootUC4TypeUrim, rootUC4TypeName);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, rootUC4Typem);

        homeTypem = new SDOType(homeObjectUrim, homeObjectName);
        qname = new QName(homeObjectUrim, homeObjectName);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, homeTypem);

        addressTypem = new SDOType(addressObjectUrim, addressObjectName);
        qname = new QName(addressObjectUrim, addressObjectName);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, addressTypem);

        workTypem = new SDOType(workObjectUrim, workObjectName);
        qname = new QName(workObjectUrim, workObjectName);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, workTypem);

        rootHomem = new SDOProperty(aHelperContext);
        rootHomem.setName(rootHomeName);
        rootHomem.setContainment(true);// containment property
        SDOType rootHome_typem = new SDOType(rootHomeUrim, rootHomeName);
        qname = new QName(rootHomeUrim, rootHomeName);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, rootHome_typem);
        rootHome_typem.setDataType(false);// not datatype
        rootHomem.setType(rootHome_typem);
        rootUC4Typem.addDeclaredProperty((Property)rootHomem);

        rootWorkm = new SDOProperty(aHelperContext);
        rootWorkm.setName(rootWorkName);
        // non containment so that a containment opposite can be set to this node
        rootWorkm.setContainment(false);//true);// containment property
        rootWorkm.setMany(true);
        SDOType rootWork_typem = new SDOType(rootWorkUrim, rootWorkName);
        qname = new QName(rootWorkUrim, rootWorkName);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, rootWork_typem);
        rootWork_typem.setDataType(false);// not datatype
        rootWorkm.setType(rootWork_typem);
        rootUC4Typem.addDeclaredProperty((Property)rootWorkm);

        homeAddressm = new SDOProperty(aHelperContext);
        homeAddressm.setName(homeAddressName);
        homeAddressm.setContainment(true);// containment property
        SDOType homeAddress_typem = new SDOType(homeAddressUrim, homeAddressName);
        qname = new QName(homeAddressUrim, homeAddressName);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, homeAddress_typem);
        homeAddress_typem.setDataType(false);// not datatype
        homeAddressm.setType(homeAddress_typem);
        homeTypem.addDeclaredProperty((Property)homeAddressm);

        workAddressm = new SDOProperty(aHelperContext);
        workAddressm.setName(workAddressName);
        // one opposite property can be true
        workAddressm.setContainment(false);//true);// containment property
        //workAddress.setContainment(true);// containment property
        SDOType workAddress_typem = new SDOType(workAddressUri, workAddressName);
        qname = new QName(workAddressUri, workAddressName);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, workAddress_typem);
        workAddress_typem.setDataType(false);// not datatype
        workAddressm.setType(workAddress_typem);
        workTypem.addDeclaredProperty((Property)workAddressm);

        addressWorkm = new SDOProperty(aHelperContext);
        addressWorkm.setName(addressWorkName);
        // other opposite property must be false
        addressWorkm.setContainment(false);// containment property
        addressWorkm.setMany(true);
        SDOType addressWork_typem = new SDOType(addressWorkUri, addressWorkName);
        qname = new QName(addressWorkUri, addressWorkName);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, addressWork_typem);
        addressWork_typem.setDataType(false);// not datatype
        addressWorkm.setType(addressWork_typem);
        addressTypem.addDeclaredProperty((Property)addressWorkm);

        rootUC4m = (SDODataObject)dataFactory.create(rootUC4Typem);
        addressObjectm = (SDODataObject)dataFactory.create(addressTypem);
        homeObjectm = (SDODataObject)dataFactory.create(homeTypem);
        workObjectm = (SDODataObject)dataFactory.create(workTypem);
        addressWorkm.setOpposite(workAddressm);
        workAddressm.setOpposite(addressWorkm);

        rootUC4m.set(rootHomem, homeObjectm);
        ArrayList workList = new ArrayList();
        workList.add(workObjectm);
        rootUC4m.set(rootWorkm, workList);
        //rootUC4m.set(rootWorkm, workObjectm);
        // child:
        homeObjectm.set(homeAddressm, addressObjectm);
        // set opposite property
        addressObjectm.set(addressWorkm, workList);//workObjectm);
        // set opposite property
        workObjectm.set(workAddressm, addressObjectm);

        // UC 1b: unidirectional outside the copytree
        // (work at home relationship)
        // root -> home -> address
        // root -> work -> address
        // home/address -> noncontainment to -> work
        //
        rootUCUniOutsideType = new SDOType(rootUCUniOutsideTypeUri, rootUCUniOutsideTypeName);// root's type
        qname = new QName(rootUCUniOutsideTypeUri, rootUCUniOutsideTypeName);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, rootUCUniOutsideType);

        homeTypeUCUniOutside = new SDOType(homeObjectUriUCUniOutside, homeObjectNameUCUniOutside);
        qname = new QName(homeObjectUriUCUniOutside, homeObjectNameUCUniOutside);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, homeTypeUCUniOutside);

        addressTypeUCUniOutside = new SDOType(addressObjectUriUCUniOutside, addressObjectNameUCUniOutside);
        qname = new QName(addressObjectUriUCUniOutside, addressObjectNameUCUniOutside);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, addressTypeUCUniOutside);

        workTypeUCUniOutside = new SDOType(workObjectUriUCUniOutside, workObjectNameUCUniOutside);
        qname = new QName(workObjectUriUCUniOutside, workObjectNameUCUniOutside);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, workTypeUCUniOutside);

        rootHomeUCUniOutside = new SDOProperty(aHelperContext);
        rootHomeUCUniOutside.setName(rootHomeNameUCUniOutside);
        rootHomeUCUniOutside.setContainment(true);// containment property
        SDOType rootHome_typeUCUniOutside = new SDOType(rootHomeUriUCUniOutside, rootHomeNameUCUniOutside);
        qname = new QName(rootHomeUriUCUniOutside, rootHomeNameUCUniOutside);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, rootHome_typeUCUniOutside);
        rootHome_typeUCUniOutside.setDataType(false);// not datatype
        rootHomeUCUniOutside.setType(rootHome_typeUCUniOutside);
        rootUCUniOutsideType.addDeclaredProperty((Property)rootHomeUCUniOutside);

        rootWorkUCUniOutside = new SDOProperty(aHelperContext);
        rootWorkUCUniOutside.setName(rootWorkNameUCUniOutside);
        // non containment so that a containment opposite can be set to this node
        rootWorkUCUniOutside.setContainment(false);//true);// containment property
        SDOType rootWork_typeUCUniOutside = new SDOType(rootWorkUriUCUniOutside, rootWorkNameUCUniOutside);
        qname = new QName(rootWorkUriUCUniOutside, rootWorkNameUCUniOutside);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, rootWork_typeUCUniOutside);

        rootWork_typeUCUniOutside.setDataType(false);// not datatype
        rootWorkUCUniOutside.setType(rootWork_typeUCUniOutside);
        rootUCUniOutsideType.addDeclaredProperty((Property)rootWorkUCUniOutside);

        homeAddressUCUniOutside = new SDOProperty(aHelperContext);
        homeAddressUCUniOutside.setName(homeAddressNameUCUniOutside);
        homeAddressUCUniOutside.setContainment(true);// containment property
        SDOType homeAddress_typeUCUniOutside = new SDOType(homeAddressUriUCUniOutside, homeAddressNameUCUniOutside);
        qname = new QName(homeAddressUriUCUniOutside, homeAddressNameUCUniOutside);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, homeAddress_typeUCUniOutside);
        homeAddress_typeUCUniOutside.setDataType(false);// not datatype
        homeAddressUCUniOutside.setType(homeAddress_typeUCUniOutside);
        homeTypeUCUniOutside.addDeclaredProperty((Property)homeAddressUCUniOutside);

        /*
                workAddressUCUniOutside = new SDOProperty(aHelperContext);
                workAddressUCUniOutside.setName(workAddressNameUCUniOutside);
                // one opposite property can be true
                workAddressUCUniOutside.setContainment(false);//true);// containment property
                SDOType workAddress_typeUCUniOutside = new SDOType(workAddressUriUCUniOutside, workAddressNameUCUniOutside);
                workAddress_typeUCUniOutside.setDataType(false);// not datatype
                workAddressUCUniOutside.setType(workAddress_typeUCUniOutside);
                workTypeUCUniOutside.addDeclaredProperty((Property)workAddressUCUniOutside);
        */
        addressWorkUCUniOutside = new SDOProperty(aHelperContext);
        addressWorkUCUniOutside.setName(addressWorkNameUCUniOutside);
        // other opposite property must be false
        addressWorkUCUniOutside.setContainment(true);//false);// containment property
        SDOType addressWork_typeUCUniOutside = new SDOType(addressWorkUriUCUniOutside, addressWorkNameUCUniOutside);
        qname = new QName(addressWorkUriUCUniOutside, addressWorkNameUCUniOutside);
        ((SDOTypeHelper)typeHelper).getTypesHashMap().put(qname, addressWork_typeUCUniOutside);

        addressWork_typeUCUniOutside.setDataType(false);// not datatype
        addressWorkUCUniOutside.setType(addressWork_typeUCUniOutside);
        addressTypeUCUniOutside.addDeclaredProperty((Property)addressWorkUCUniOutside);

        rootUCUniOutside = (SDODataObject)dataFactory.create(rootUCUniOutsideType);
        addressObjectUCUniOutside = (SDODataObject)dataFactory.create(addressTypeUCUniOutside);
        homeObjectUCUniOutside = (SDODataObject)dataFactory.create(homeTypeUCUniOutside);
        workObjectUCUniOutside = (SDODataObject)dataFactory.create(workTypeUCUniOutside);
        //addressWorkUCUniOutside.setOpposite(workAddressUCUniOutside);
        //workAddressUCUniOutside.setOpposite(addressWorkUCUniOutside);
        rootUCUniOutside.set(rootHomeUCUniOutside, homeObjectUCUniOutside);
        rootUCUniOutside.set(rootWorkUCUniOutside, workObjectUCUniOutside);
        // child:
        homeObjectUCUniOutside.set(homeAddressUCUniOutside, addressObjectUCUniOutside);
        // set opposite property
        addressObjectUCUniOutside.set(addressWorkUCUniOutside, workObjectUCUniOutside);

        // set opposite property
        //workObjectUCUniOutside.set(workAddressUCUniOutside, addressObjectUCUniOutside);
        containedDataObject.getChangeSummary().beginLogging();
    }
}
