/*******************************************************************************
 * 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.models.conversion;

import java.util.*;
import org.eclipse.persistence.internal.helper.Helper;
import org.eclipse.persistence.tools.schemaframework.*;

public class ConversionDataObject {
    public int id;

    // ====================================
    // Direct Mapping Variables
    // ====================================
    // Primitive types
    public char aPChar;
    public char[] aPCharArray;
    public int aPInt;
    public float aPFloat;
    public boolean aPBoolean;
    public long aPLong;
    public double aPDouble;
    public byte aPByte;
    public byte[] aPByteArray;
    public short aPShort;

    // Primitive wrapper types
    public Character aCharacter;
    public Integer anInteger;
    public Float aFloat;
    public Boolean aBoolean;
    public Long aLong;
    public Double aDouble;
    public Byte aByte;
    public Short aShort;

    // Misc. number types
    public Number aNumber;
    public java.math.BigDecimal aBigDecimal;
    public java.math.BigInteger aBigInteger;

    // Date/Time types
    public java.sql.Date anSQLDate;
    public java.util.Date aJavaDate;
    public java.sql.Time aTime;
    public java.sql.Timestamp aTimestamp;
    public java.util.Calendar aCalendar;

    // Other
    public String aString;

    // ====================================
    // Type Conversion Mapping Variables
    // ====================================
    //	public int intToChar;
    public long timestamp2Long;
    public Date dateToTimestamp;// Only mapped with DB2.  Used for nano-second test
    public int intToFloat;
    public int intToLong;
    public int intToDouble;
    public int intToShort;
    public int intToString;
    public int intToByte;

    //	public float floatToChar;
    public float floatToInt;
    public float floatToLong;
    public float floatToDouble;
    public float floatToShort;
    public float floatToString;
    public float floatToByte;
    public String stringToInt;

    public static ConversionDataObject example1() {
        ConversionDataObject example = new ConversionDataObject();

        example.aPChar = 'a';
        example.setAPCharArray(new char[] { 'a', 'b', 'c' });
        example.aPInt = 1;
        example.aPFloat = 1.0F;
        example.aPBoolean = true;
        example.aPLong = 1L;
        example.aPDouble = 1.0;
        example.aPByte = 1;
        example.setAPByteArray(new byte[] { 1, 2, 3 });
        example.aPShort = 1;
        example.aCharacter = new Character('a');
        example.anInteger = new Integer(1);
        example.aFloat = new Float(1.0);
        example.aBoolean = new Boolean(false);
        example.aLong = new Long(1L);
        example.aDouble = new Double(1.0);
        example.aByte = new Byte((byte)1);
        example.aShort = new Short((short)1);
        example.aBigDecimal = new java.math.BigDecimal(1.0);
        example.aBigInteger = new java.math.BigInteger("1");
        example.aNumber = example.aBigDecimal;
        example.anSQLDate = Helper.dateFromYearMonthDate(1903, 3, 3);
        Calendar c = Calendar.getInstance();
        c.set(1903, 3, 3);
        c.set(Calendar.MILLISECOND, 0);
        example.aJavaDate = c.getTime();
        example.aCalendar = Calendar.getInstance();
        example.aCalendar.set(1999, 06, 06, 0, 0, 0);
        example.aCalendar.set(Calendar.MILLISECOND, 0);
        example.aTime = Helper.timeFromHourMinuteSecond(3, 3, 3);
        example.aTimestamp = Helper.timestampFromYearMonthDateHourMinuteSecondNanos(1903, 3, 3, 3, 3, 3, 0);
        example.aString = new String("Conversion Managaer Test Example 1");

        //	example.intToChar = 111;
        example.timestamp2Long = Helper.timestampFromYearMonthDateHourMinuteSecondNanos(1990, 1, 1, 0, 0, 0, 0).getTime();
        example.dateToTimestamp = new java.util.Date(System.currentTimeMillis());
        example.intToFloat = 111;
        example.intToLong = 111;
        example.intToDouble = 111;
        example.intToShort = 111;
        example.intToString = 111;
        example.intToByte = 11;

        //	example.floatToChar = 111;
        example.floatToInt = 111;
        example.floatToLong = 111;
        example.floatToDouble = 111;
        example.floatToShort = 111;
        example.floatToString = 111;
        example.floatToByte = 11;

        example.stringToInt = new String("111");

        return example;
    }

    public static ConversionDataObject example2() {
        ConversionDataObject example = new ConversionDataObject();

        example.aPChar = 'b';
        example.setAPCharArray(new char[] { 'd', 'e', 'f' });
        example.aPInt = 2;
        example.aPFloat = 2.0F;
        example.aPBoolean = false;
        example.aPLong = 2L;
        example.aPDouble = 2.0;
        example.aPByte = 2;
        example.setAPByteArray(new byte[] { 4, 5, 6 });
        example.aPShort = 2;
        example.aCharacter = new Character('b');
        example.anInteger = new Integer(2);
        example.aFloat = new Float(2.0);
        example.aBoolean = new Boolean(true);
        example.aLong = new Long(2L);
        example.aDouble = new Double(2.0);
        example.aByte = new Byte((byte)2);
        example.aShort = new Short((short)2);
        example.aBigDecimal = new java.math.BigDecimal(2.0);
        example.aBigInteger = new java.math.BigInteger("2");
        example.aNumber = example.aBigDecimal;
        example.anSQLDate = Helper.dateFromYearMonthDate(1906, 6, 6);
        Calendar c = Calendar.getInstance();
        c.set(1906, 6, 6);
        c.set(Calendar.MILLISECOND, 0);
        example.aJavaDate = c.getTime();
        example.aCalendar = Calendar.getInstance();
        example.aCalendar.set(1991, 11, 10, 0, 0, 0);
        example.aCalendar.set(java.util.Calendar.MILLISECOND, 0);
        example.aTime = Helper.timeFromHourMinuteSecond(6, 6, 6);
        example.aTimestamp = Helper.timestampFromYearMonthDateHourMinuteSecondNanos(1906, 6, 6, 6, 6, 6, 0);
        example.aString = new String("Conversion Managaer Test Example 2");

        //	example.intToChar = 222;
        example.timestamp2Long = Helper.timestampFromYearMonthDateHourMinuteSecondNanos(1999, 9, 9, 0, 0, 0, 0).getTime();
        example.intToFloat = 222;
        example.intToLong = 222;
        example.intToDouble = 222;
        example.intToShort = 222;
        example.intToString = 222;
        example.intToByte = 22;

        //	example.floatToChar = 222;
        example.floatToInt = 222;
        example.floatToLong = 222;
        example.floatToDouble = 222;
        example.floatToShort = 222;
        example.floatToString = 222;
        example.floatToByte = 22;

        example.stringToInt = new String("222");

        return example;
    }

    public static ConversionDataObject example3() {
        ConversionDataObject example = new ConversionDataObject();

        example.aPChar = 'c';
        example.setAPCharArray(new char[] { 'g', 'h', 'i' });
        example.aPInt = 3;
        example.aPFloat = 2.0F;
        example.aPBoolean = false;
        example.aPLong = 3L;
        example.aPDouble = 3.0;
        example.aPByte = 3;
        example.setAPByteArray(new byte[] { 7, 8, 9 });
        example.aPShort = 3;
        example.aCharacter = new Character('c');
        example.anInteger = new Integer(3);
        example.aFloat = new Float(3.0);
        example.aBoolean = new Boolean(true);
        example.aLong = new Long(3L);
        example.aDouble = new Double(3.0);
        example.aByte = new Byte((byte)3);
        example.aShort = new Short((short)3);
        example.aBigDecimal = new java.math.BigDecimal(3.0);
        example.aBigInteger = new java.math.BigInteger("3");
        example.aNumber = example.aBigDecimal;
        example.anSQLDate = Helper.dateFromYearMonthDate(1909, 9, 9);
        Calendar c = Calendar.getInstance();
        c.set(1909, 9, 9);
        c.set(Calendar.MILLISECOND, 0);
        example.aJavaDate = c.getTime();
        example.aCalendar = Calendar.getInstance();
        example.aCalendar.set(2001, 03, 8, 0, 0, 0);
        example.aCalendar.set(Calendar.MILLISECOND, 0);
        example.aTime = Helper.timeFromHourMinuteSecond(9, 9, 9);
        example.aTimestamp = Helper.timestampFromYearMonthDateHourMinuteSecondNanos(1909, 9, 9, 9, 9, 9, 0);
        example.aString = new String("Conversion Managaer Test Example 3");

        //	example.intToChar = 333;
        example.timestamp2Long = Helper.timestampFromYearMonthDateHourMinuteSecondNanos(1990, 1, 1, 0, 0, 0, 0).getTime();
        example.intToFloat = 333;
        example.intToLong = 333;
        example.intToDouble = 333;
        example.intToShort = 333;
        example.intToString = 333;
        example.intToByte = 33;

        //	example.floatToChar = 333;
        example.floatToInt = 333;
        example.floatToLong = 333;
        example.floatToDouble = 333;
        example.floatToShort = 333;
        example.floatToString = 333;
        example.floatToByte = 33;

        example.stringToInt = new String("333");

        return example;
    }

    public byte[] getAPByteArray() {
        return aPByteArray;
    }

    public char[] getAPCharArray() {
        return aPCharArray;
    }

    public void setAPByteArray(byte[] aPByteArray) {
        this.aPByteArray = aPByteArray;
    }

    public void setAPCharArray(char[] aPCharArray) {
        this.aPCharArray = aPCharArray;
    }

    /**
     * Return a platform independant definition of the database table.
     */
    public static TableDefinition tableDefinition() {
        TableDefinition definition = new TableDefinition();

        definition.setName("CM_OBJ");

        definition.addIdentityField("ID", Integer.class);

        definition.addField("A_PCHAR_A", Character[].class);

        definition.addField("A_PCHAR", Character.class);
        definition.addField("A_PINT", Integer.class);
        definition.addField("A_PFLOAT", Float.class);

        FieldDefinition field = new FieldDefinition("A_PBOOLEAN", Boolean.class);
        field.setShouldAllowNull(false);
        definition.addField(field);

        definition.addField("A_PLONG", Long.class);
        definition.addField("A_PDOUBLE", Double.class);
        definition.addField("A_PBYTE", Byte.class);

        // The A_PBYTE_A field will be added after a plaftorm check in 
        // ConversionManagerSystem.createTables()
        definition.addField("A_PSHORT", Short.class);

        definition.addField("A_CHAR", Character.class);
        definition.addField("AN_INTEGER", Integer.class);
        definition.addField("A_FLOAT", Float.class);

        FieldDefinition field2 = new FieldDefinition("A_BOOLEAN", Boolean.class);
        field2.setShouldAllowNull(false);
        definition.addField(field2);

        definition.addField("A_LONG", Long.class);
        definition.addField("A_DOUBLE", Double.class);
        definition.addField("A_BYTE", Byte.class);
        definition.addField("A_SHORT", Short.class);

        definition.addField("A_NUMBER", java.math.BigDecimal.class);
        definition.addField("A_BIGDEC", java.math.BigDecimal.class);
        definition.addField("A_BIGINT", java.math.BigInteger.class);

        definition.addField("AN_SQLDATE", java.sql.Date.class);
        definition.addField("A_JAVADATE", java.sql.Timestamp.class);
        definition.addField("A_TIME", java.sql.Time.class);
        definition.addField("A_TIMESTMP", java.sql.Timestamp.class);
        definition.addField("A_CALNDR", java.sql.Timestamp.class);

        definition.addField("A_STRING", String.class, 50);

        //	definition.addField("INT2CHR", Character.class);
        definition.addField("TIMESP2LNG", java.sql.Timestamp.class);
        definition.addField("DATE2TIMESTAMP", java.sql.Timestamp.class);
        definition.addField("INT2FLT", Float.class);
        definition.addField("INT2LNG", Long.class);
        definition.addField("INT2DBL", Double.class);
        definition.addField("INT2SHORT", Short.class);
        definition.addField("INT2STR", String.class);
        definition.addField("INT2BYTE", Byte.class);

        //	definition.addField("FLT2CHR", Character.class);
        definition.addField("FLT2INT", Integer.class);
        definition.addField("FLT2LNG", Long.class);
        definition.addField("FLT2DBL", Double.class);
        definition.addField("FLT2SHORT", Short.class);
        definition.addField("FLT2STR", String.class);
        definition.addField("FLT2BYTE", Byte.class);

        definition.addField("STR2INT", Integer.class);

        return definition;
    }

    public String toString() {
        return "ConversionDataObject(" + aPChar + ")";
    }
}
