/*
 * 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.xpathquery;

import commonj.sdo.DataObject;
import java.util.ArrayList;
import java.util.List;
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.testing.sdo.SDOTestCase;

public class SDODataObjectGetByXPathQueryTestCases extends SDOTestCase {
    public SDODataObjectGetByXPathQueryTestCases(String name) {
        super(name);
    }

    protected static final String URINAME = "uri";
    protected static final String TYPENAME_A = "TypeName-a";
    protected static final String TYPENAME_B = "TypeName-b";
    protected static final String TYPENAME_C = "TypeName-c";
    protected static final String TYPENAME_D = "TypeName-d";
    protected static final String PROPERTY_NAME_A = "PName-a";
    protected static final String PROPERTY_NAME_A0 = "PName-a0";
    protected static final String PROPERTY_NAME_B = "PName-b";
    protected static final String PROPERTY_NAME_B0 = "PName-b0";
    protected static final String PROPERTY_NAME_B_NUMBER = "number";
    protected static final String PROPERTY_NAME_C = "PName-c";
    protected static final String PROPERTY_NAME_C0 = "PName-c0";
    protected static final String PROPERTY_NAME_C_NUMBER = "number";
    protected static final String PROPERTY_NAME_D_NUMBER = "number";
    protected static final String property = "PName-a/PName-b.0/PName-c[number='123']";
    protected static final String propertyD = "PName-a/PName-b.0/PName-c[number1='5.55']";
    protected static final String property1 = "PName-a0/PName-b0[number='123']/PName-c0.0";
    protected static final String propertyTest = "PName-a0/PName-b0[number='123']/";
    protected static final String propertyTest1 = "PName-a0/PName-b0[number='1']/";
    protected static final int PROPERTY_INDEX = 0;
    protected static final String PROPERTY_NAME_A_LENGTH_1 = "PName-a-length-1";
    protected SDODataObject dataObject_a;
    protected SDODataObject dataObject_b;
    protected SDODataObject dataObject_b0;
    protected SDODataObject dataObject_b1;
    protected SDODataObject dataObject_c;
    protected SDODataObject dataObject_c0;
    protected SDODataObject dataObject_c1;
    protected SDODataObject dataObject_d0;
    protected SDODataObject dataObject_d1;
    protected SDOType type_a;
    protected SDOType type_b;
    protected SDOType type_b0;
    protected SDOType type_b1;
    protected SDOType type_c;
    protected SDOType type_c0;
    protected SDOType type_d;
    protected SDOProperty property_a;
    protected SDOProperty property_a0;
    protected SDOProperty property_b;
    protected SDOProperty property_b0;
    protected SDOProperty property_b_number;
    protected SDOProperty property_c;
    protected SDOProperty property_c0;
    protected SDOProperty property_c_number;
    protected SDOProperty property_d_number;
    protected SDOProperty property_d_number1;
    protected SDOType baseType;
    protected SDOProperty baseProperty1;
    protected SDOProperty baseProperty2;
    protected SDOType baseType1;
    protected SDOProperty baseProperty3;

    @Override
    public void setUp() {// set up as a/b/c
        super.setUp();
        SDOType dataObjectType = (SDOType) typeHelper.getType(SDOConstants.SDO_URL, SDOConstants.DATAOBJECT);

        type_a = new SDOType(URINAME, TYPENAME_A);

        type_b = new SDOType(URINAME, TYPENAME_B);
        type_b.setOpen(true);

        type_c = new SDOType(URINAME, TYPENAME_C);
        type_c.setOpen(true);
        type_b0 = new SDOType(URINAME, TYPENAME_B + "0");
        type_c0 = new SDOType(URINAME, TYPENAME_C + "0");

        property_a = new SDOProperty(aHelperContext);
        property_a.setContainment(true);
        property_a.setType(type_b);
        property_a.setName(PROPERTY_NAME_A);
        type_a.addDeclaredProperty(property_a);

        property_a0 = new SDOProperty(aHelperContext);
        property_a0.setContainment(true);
        //property_a0.setMany(true);
        property_a0.setType(type_b0);
        property_a0.setName(PROPERTY_NAME_A0);
        type_a.addDeclaredProperty(property_a0);

        dataObject_a = (SDODataObject)dataFactory.create(type_a);
        //b
        property_b = new SDOProperty(aHelperContext);
        property_b.setContainment(true);
        property_b.setMany(true);
        property_b.setName(PROPERTY_NAME_B);
        property_b.setType(type_c);
        List aliasNames = new ArrayList();
        aliasNames.add("alias1");
        aliasNames.add("alias2");
        property_b.setAliasNames(aliasNames);
        type_b.addDeclaredProperty(property_b);

        dataObject_b = (SDODataObject)dataFactory.create(type_b);
        //b0
        property_b0 = new SDOProperty(aHelperContext);
        property_b0.setContainment(true);
        property_b0.setMany(true);
        property_b0.setType(type_c0);
        property_b0.setName(PROPERTY_NAME_B0);
        List alias = new ArrayList();
        alias.add("alias1");
        alias.add("alias2");
        property_b0.setAliasNames(alias);

        type_b0.addDeclaredProperty(property_b0);

        dataObject_b0 = (SDODataObject)dataFactory.create(type_b0);
        //property_b_number = new SDOProperty(aHelperContext);
        //property_b_number.setContainment(false);
        //property_b_number.setMany(false);
        //property_b_number.setName(PROPERTY_NAME_B_NUMBER);
        //type_b0.addDeclaredProperty(property_b_number);
        //b1
        //dataObject_b1 = new SDODataObject();
        //dataObject_b1.setType(type_b0);
        //c
        property_c = new SDOProperty(aHelperContext);
        property_c.setName(PROPERTY_NAME_C);
        property_c.setType(SDOConstants.SDO_STRING);
        property_c.setMany(true);
        type_c.addDeclaredProperty(property_c);

        dataObject_c = (SDODataObject)dataFactory.create(type_c);
        //c0
        property_c0 = new SDOProperty(aHelperContext);
        property_c0.setName(PROPERTY_NAME_C0);
        property_c0.setContainment(true);
        property_c0.setMany(true);
        property_c0.setType(dataObjectType);
        type_c0.addDeclaredProperty(property_c0);

        property_c_number = new SDOProperty(aHelperContext);
        property_c_number.setContainment(false);
        property_c_number.setMany(false);
        property_c_number.setName(PROPERTY_NAME_C_NUMBER);
        property_c_number.setType(SDOConstants.SDO_STRING);
        type_c0.addDeclaredProperty(property_c_number);

        SDOProperty testProp = new SDOProperty(aHelperContext);
        testProp.setName("test");
        testProp.setType(SDOConstants.SDO_BOOLEAN);
        type_c0.addDeclaredProperty(testProp);

        SDOProperty property_c1_object = new SDOProperty(aHelperContext);
        property_c1_object.setName("PName-c1");
        property_c1_object.setContainment(true);
        property_c1_object.setMany(true);
        property_c1_object.setType(SDOConstants.SDO_DOUBLE);

        type_c0.addDeclaredProperty(property_c1_object);

        dataObject_c0 = (SDODataObject)dataFactory.create(type_c0);
        //c1
        dataObject_c1 = (SDODataObject)dataFactory.create(type_c0);
        // d
        type_d = new SDOType(URINAME, TYPENAME_D);
        //type_d.setOpen(true);
        property_d_number = new SDOProperty(aHelperContext);
        property_d_number.setName(PROPERTY_NAME_D_NUMBER);
        property_d_number.setType(SDOConstants.SDO_STRING);
        property_d_number.setMany(false);
        List aliasNames_ = new ArrayList();
        aliasNames_.add("alias1");
        aliasNames_.add("alias2");
        property_d_number.setAliasNames(aliasNames_);
        type_d.addDeclaredProperty(property_d_number);

        property_d_number1 = new SDOProperty(aHelperContext);
        property_d_number1.setName(PROPERTY_NAME_D_NUMBER + "1");
        property_d_number1.setType(SDOConstants.SDO_DOUBLE);
        property_d_number1.setMany(true);
        type_d.addDeclaredProperty(property_d_number1);

        dataObject_d0 = (SDODataObject)dataFactory.create(type_d);

        dataObject_d1 = (SDODataObject)dataFactory.create(type_d);

        // start building tree:
        dataObject_a.set(property_a, dataObject_b);// set a/

        List objects_b = new ArrayList();
        objects_b.add(dataObject_c);//

        dataObject_b.set(property_b, objects_b);// set a/b.0

        List objects_c = new ArrayList();
        objects_c.add(dataObject_d0);
        objects_c.add(dataObject_d1);

        dataObject_c.set(property_c, objects_c);// set a/b.0/c

        dataObject_d0.set(property_d_number, "123");// set a/b.0/c[numbet=123]
        dataObject_d1.set(property_d_number, "1");

        List d_list0 = new ArrayList();
        List d_list1 = new ArrayList();
        d_list0.add(Double.valueOf("1.11"));
        d_list0.add(Double.valueOf("2.22"));
        d_list1.add(Double.valueOf("3.33"));
        d_list1.add(Double.valueOf("5.55"));

        dataObject_d0.set(property_d_number1, d_list0);// set a/b.0/c[numbet=123]
        dataObject_d1.set(property_d_number1, d_list1);

        dataObject_a.set(property_a0, dataObject_b0);// set a/

        List objects_b0 = new ArrayList();
        objects_b0.add(dataObject_c0);
        objects_b0.add(dataObject_c1);

        dataObject_b0.set(property_b0, objects_b0);// set a/b0

        dataObject_c0.set(property_c_number, "123");// set b0[number=123]
        dataObject_c1.set(property_c_number, "1");

        List str = new ArrayList();
        DataObject dataObject1 = dataFactory.create(type_d);
        dataObject1.set(PROPERTY_NAME_D_NUMBER,"one");
        DataObject dataObject2 = dataFactory.create(type_d);
        dataObject2.set(PROPERTY_NAME_D_NUMBER,"two");
        str.add(dataObject1);
        str.add(dataObject2);

        dataObject_c0.set(property_c0, str);// set c0.0

        baseType = new SDOType("baseUri", "base");
        baseProperty1 = new SDOProperty(aHelperContext);
        baseProperty1.setName("baseProperty1");
        baseProperty1.setType(SDOConstants.SDO_STRING);
        baseProperty1.setMany(false);
        List aliasNames_baseP1 = new ArrayList();
        aliasNames_baseP1.add("alias3");
        aliasNames_baseP1.add("alias4");
        baseProperty1.setAliasNames(aliasNames_baseP1);

        baseType.addDeclaredProperty(baseProperty1);

        baseProperty2 = new SDOProperty(aHelperContext);
        baseProperty2.setName("baseProperty2");
        baseProperty2.setType(dataObjectType);
        baseProperty2.setMany(false);
        baseProperty2.setContainment(true);
        List aliasNames_baseP2 = new ArrayList();
        aliasNames_baseP2.add("alias5");
        aliasNames_baseP2.add("alias6");
        baseProperty2.setAliasNames(aliasNames_baseP2);

        baseType.addDeclaredProperty(baseProperty2);

        baseType1 = new SDOType("base1Uri", "base1");
        baseProperty3 = new SDOProperty(aHelperContext);
        baseProperty3.setName("baseProperty3");
        baseProperty3.setType(SDOConstants.SDO_STRING);
        baseProperty3.setMany(false);
        List aliasNames_baseP3 = new ArrayList();
        aliasNames_baseP3.add("alias7");
        aliasNames_baseP3.add("alias8");
        baseProperty3.setAliasNames(aliasNames_baseP3);

        baseType1.addDeclaredProperty(baseProperty3);

    }
}
