/*******************************************************************************
 * Copyright (c) 1998, 2013 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 v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     Oracle - initial API and implementation from Oracle TopLink
 ******************************************************************************/  
package org.eclipse.persistence.testing.sdo.helper.xmlhelper.loadandsave;

import commonj.sdo.DataObject;
import commonj.sdo.Property;
import commonj.sdo.Type;
import commonj.sdo.helper.XMLDocument;
import java.util.ArrayList;
import java.util.List;
import junit.textui.TestRunner;
import org.eclipse.persistence.sdo.SDOConstants;
import org.eclipse.persistence.sdo.SDOProperty;
import org.eclipse.persistence.sdo.SDOType;

/**
 * Created for bug 60307617
 */
public class LoadAndSaveWithDefaultsTestCases extends LoadAndSavePurchaseOrderComplexTestCases {
    public LoadAndSaveWithDefaultsTestCases(String name) {
        super(name);
    }

    public static void main(String[] args) {
        String[] arguments = { "-c", "org.eclipse.persistence.testing.sdo.helper.xmlhelper.loadandsave.LoadAndSaveWithDefaultsTestCases" };
        TestRunner.main(arguments);
    }

    protected String getNoSchemaControlFileName() {
        return "./org/eclipse/persistence/testing/sdo/helper/xmlhelper/defaultvalue/purchaseOrderComplexDefaultValueNSNoSchema.xml";
    }

    protected String getControlDataObjectFileName() {
        return "./org/eclipse/persistence/testing/sdo/helper/xmlhelper/defaultvalue/purchaseOrderComplexDefaultValueNSDataObject.xml";
    }

    protected String getControlFileName() {
        return "./org/eclipse/persistence/testing/sdo/helper/xmlhelper/defaultvalue/purchaseOrderComplexDefaultValueNS.xml";
    }

    protected String getSchemaName() {
        return "org/eclipse/persistence/testing/sdo/schemas/PurchaseOrderComplexDefaultValue.xsd";
    }

    protected void verifyAfterLoad(XMLDocument doc) {
    	// TODO: the noSchema test will continue to fail until attributes are working with IsSetOptionalNodeNullPolicy
        super.verifyAfterLoad(doc);
        DataObject rootObject = doc.getRootObject();
        DataObject address = rootObject.getDataObject("shipTo");
        assertNotNull(address);

        //city is not set to nillable and is not present in the doc this means we will call set(null)                
        //IsSetOptionalNodeNull Policy will return the default
        assertEquals("Ottawa", address.get("city"));
        assertFalse(address.isSet("city"));

        Property prop = address.getInstanceProperty("street");

        boolean isAttribute = xsdHelper.isAttribute(prop);

        //street is set to nillable and is not present in the doc
        //street isSet false get "Main Street"
        if (isAttribute) {
            assertEquals(null, address.get("street"));
            assertTrue(address.isSet("street"));
        } else {
            assertFalse(address.isSet("street"));
            assertEquals("Main Street", address.get("street"));
        }
        
        
        //name is set to nillable and has xsi:nil=true in the doc                
        assertTrue(address.isSet("name"));
        assertEquals(null, address.get("name"));

        //country is not set to nillable is not present in the doc
        assertFalse(address.isSet("country"));
        assertEquals("US", address.get("country"));

        List items = rootObject.getDataObject("items").getList("item");
        DataObject item1 = (DataObject)items.get(0);
        DataObject item2 = (DataObject)items.get(0);
        assertNotNull(item1);
        assertNotNull(item2);

        //USPrice is not set to nillable and is not present in the doc this means we will call set(null)
        assertFalse(item1.isSet("USPrice"));
        assertEquals(10, ((Float)item1.get("USPrice")).intValue());

        isAttribute = xsdHelper.isAttribute(item2.getInstanceProperty("CDNPrice"));
        //CDNPrice is set to nillable and is not present in the doc
        if (isAttribute) {
            assertTrue(item2.isSet("CDNPrice"));
            assertEquals(null, item2.get("CDNPrice"));
        } else {
            assertFalse(item2.isSet("CDNPrice"));
            assertEquals(15.0f, item2.get("CDNPrice"));
        }
        address.unset("country");              
    }

    protected Type registerAddressType() {
        Type stringType = typeHelper.getType("commonj.sdo", "String");
        DataObject addressType = dataFactory.create("commonj.sdo", "Type");
        SDOProperty prop = (SDOProperty)addressType.getType().getProperty("uri");
        addressType.set(prop, getControlRootURI());
        prop = (SDOProperty)addressType.getType().getProperty("name");
        addressType.set(prop, "AddressType");
        DataObject nameProp = addProperty(addressType, "name", stringType, false, false, true);
        nameProp.set("nullable", true);  
        nameProp.set("default", "MyAddress");  
        
        DataObject streetProp = addProperty(addressType, "street", stringType, false, false, true);
        //streetProp.set("nullable", true);  //dont set since this is an attribute
        streetProp.set("default", "Main Street");
        DataObject cityProp = addProperty(addressType, "city", stringType, false, false, true);
        cityProp.set("default", "Ottawa");
        DataObject newProperty = addProperty(addressType, "country", stringType, false, false, true);
        prop = (SDOProperty)newProperty.getType().getProperty("default");
        newProperty.set(prop, "US");
        return typeHelper.define(addressType);
    }

    protected Type registerItemType() {
        Type stringType = typeHelper.getType("commonj.sdo", "String");
        //Type intType = typeHelper.getType("commonj.sdo", "Int");
        Type floatType = typeHelper.getType("commonj.sdo", "Float");
        Type dateType = typeHelper.getType("commonj.sdo", "YearMonthDay");
        Type SKUType = registerSKUType();
        Type quantityType = registerQuantityType();
        DataObject itemType = dataFactory.create("commonj.sdo", "Type");
        SDOProperty prop = (SDOProperty)itemType.getType().getProperty("uri");
        itemType.set(prop, getControlRootURI());
        prop = (SDOProperty)itemType.getType().getProperty("name");
        itemType.set(prop, "LineItemType");
        addProperty(itemType, "partNum", SKUType, false, false, false);
        addProperty(itemType, "productName", stringType, false, false, true);
        addProperty(itemType, "quantity", quantityType, false, false, false);
        // attributes are not supported by IsSetOptionalNodeNullPolicy yet
        DataObject usPriceProp = addProperty(itemType, "USPrice", floatType, false, false, true);
        usPriceProp.set("default", 10f);
        DataObject cdnPriceProp = addProperty(itemType, "CDNPrice", floatType, false, false, true);
        //cdnPriceProp.set("nullable", true); //dont set since this is an attribute
        cdnPriceProp.set("default", 15f);
        addProperty(itemType, "exchangeRate", floatType, false, false, true);
        addProperty(itemType, "comment", stringType, false, false, true);
        addProperty(itemType, "shipDate", dateType, false, false, true);
        return typeHelper.define(itemType);
    }
    
    protected Type registerCustomerType() {
        Type stringType = typeHelper.getType("commonj.sdo", "String");
        DataObject customerType = dataFactory.create("commonj.sdo", "Type");
        SDOProperty prop = (SDOProperty)customerType.getType().getProperty("uri");
        customerType.set(prop, getControlRootURI());
        prop = (SDOProperty)customerType.getType().getProperty("name");
        customerType.set(prop, "CustomerType");
        addProperty(customerType, "name", stringType, false, false, true);
        addProperty(customerType, "gender", registerGenderType(),false, false, true);
        addProperty(customerType, "phoneNumber", registerPhoneNumberType(),false, false, true);
        addProperty(customerType, "namePrefix", registerNamePrefixType(),false, false, false);
        return typeHelper.define(customerType);
    }
    
     protected Type registerCdnAddressType() {
        Type stringType = typeHelper.getType("commonj.sdo", "String");
        DataObject addressType = dataFactory.create("commonj.sdo", "Type");
        SDOProperty prop = (SDOProperty)addressType.getType().getProperty("uri");
        addressType.set(prop, getControlRootURI());
        prop = (SDOProperty)addressType.getType().getProperty("name");
        addressType.set(prop, "cdnAddressType");
        prop = (SDOProperty)addressType.getType().getProperty("baseType");
        List baseTypes = new ArrayList();
        baseTypes.add(typeHelper.getType(getControlRootURI(), "AddressType"));
        addressType.set(prop, baseTypes);
        addProperty(addressType, "province", stringType, false, false, true);
        addProperty(addressType, "territory", stringType, false, false, true);
        addProperty(addressType, "postalcode", stringType, false, false, true);
        return typeHelper.define(addressType);
    }
    
     protected Type registerUSAddressType() {
        Type stringType = typeHelper.getType("commonj.sdo", "String");
        Type intType = typeHelper.getType("commonj.sdo", "Int");
        DataObject addressType = dataFactory.create("commonj.sdo", "Type");
        SDOProperty prop = (SDOProperty)addressType.getType().getProperty("uri");
        addressType.set(prop, getControlRootURI());
        prop = (SDOProperty)addressType.getType().getProperty("name");
        addressType.set(prop, "usAddressType");
        prop = (SDOProperty)addressType.getType().getProperty("baseType");
        List baseTypes = new ArrayList();
        baseTypes.add(typeHelper.getType(getControlRootURI(), "AddressType"));
        addressType.set(prop, baseTypes);
        addProperty(addressType, "state", stringType, false, false, true);
        addProperty(addressType, "zip", intType, false, false, false);
        return typeHelper.define(addressType);
    }
    
     protected Type registerCdnMailingAddressType() {
        Type stringType = typeHelper.getType("commonj.sdo", "String");
        DataObject addressType = dataFactory.create("commonj.sdo", "Type");
        SDOProperty prop = (SDOProperty)addressType.getType().getProperty("uri");
        addressType.set(prop, getControlRootURI());
        prop = (SDOProperty)addressType.getType().getProperty("name");
        addressType.set(prop, "cdnAddressMailingType");
        prop = (SDOProperty)addressType.getType().getProperty("baseType");
        List baseTypes = new ArrayList();
        baseTypes.add(typeHelper.getType(getControlRootURI(), "cdnAddressType"));
        addressType.set(prop, baseTypes);
        addProperty(addressType, "deliveryInfo", stringType, false, false, true);
        return typeHelper.define(addressType);
    }
    
     protected void registerTypes() {
        Type intType = typeHelper.getType("commonj.sdo", "Int");
        Type stringType = typeHelper.getType("commonj.sdo", "String");
        Type dateType = typeHelper.getType("commonj.sdo", "YearMonthDay");
        Type addressType = registerAddressType();
        Type itemsType = registerItemsType();
        registerUSAddressType();
        registerCdnAddressType();
        registerCdnMailingAddressType();
        Type customerType = registerCustomerType();
        SDOType propertyType = (SDOType) typeHelper.getType(SDOConstants.SDO_URL, SDOConstants.PROPERTY);

        DataObject purchaseOrderTypeType = dataFactory.create("commonj.sdo", "Type");
        SDOProperty prop = (SDOProperty)purchaseOrderTypeType.getType().getProperty("uri");
        purchaseOrderTypeType.set(prop, getControlRootURI());
        prop = (SDOProperty)purchaseOrderTypeType.getType().getProperty("name");
        purchaseOrderTypeType.set(prop, "purchaseOrder");
        addProperty(purchaseOrderTypeType, "orderDate", dateType);
        DataObject shipToProp = addProperty(purchaseOrderTypeType, "shipTo", addressType, true, false, true);
        DataObject billToProp = addProperty(purchaseOrderTypeType, "billTo", addressType, true, false, true);
        addProperty(purchaseOrderTypeType, "comment", stringType, false, false, true);
        DataObject itemsProp = addProperty(purchaseOrderTypeType, "items", itemsType, true, false, true);
        DataObject customerProp = addProperty(purchaseOrderTypeType, "customer", customerType, true, false, true);

        addProperty(purchaseOrderTypeType, "poId", stringType);
        Type POType = typeHelper.define(purchaseOrderTypeType);

        DataObject propDO = dataFactory.create(propertyType);
        propDO.set("name", getControlRootName());
        propDO.set("type", POType);
        typeHelper.defineOpenContentProperty(getControlRootURI(), propDO);
    }

}
