/*******************************************************************************
 * 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
 *     
 *     14/05/2009 ailitchev - Bug 267929: Oracle 11.1.0.7: TIMESTAMP test '100 Years from now -> 2109-03-10 13:22:28.5 EST5EDT EDT' began to fail after Daylight Saving Time started
 *     Changed the test "100 Years from now" to "Last DST year", see comment in TIMESTAMPTester.
 ******************************************************************************/  
package org.eclipse.persistence.testing.tests.types;

import java.util.*;
import oracle.sql.*;

import org.eclipse.persistence.descriptors.RelationalDescriptor;
import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.mappings.*;
import org.eclipse.persistence.mappings.converters.TypeConversionConverter;
import org.eclipse.persistence.tools.schemaframework.*;

/**
 * This class tests TypeConversion mapping to TIMESTAMP, TIMESTAMPTZ and TIMESTAMPLTZ
 */
public class TIMESTAMPTypeConversionTester extends TIMESTAMPTester {

	public TIMESTAMPTypeConversionTester() {
		super();
	}

	public TIMESTAMPTypeConversionTester (String nameOfTest, int year, int month, int date, int hrs, int min, int sec, int nano, String zoneId) 
	{
		super(nameOfTest, year, month, date, hrs, min, sec, nano, zoneId);
	}

	public TIMESTAMPTypeConversionTester (String nameOfTest, Calendar c) 
	{
		super(nameOfTest, c);
	}

	public TIMESTAMPTypeConversionTester (String nameOfTest, long time) 
	{
		super(nameOfTest, time);
	}

	/**
	 *Return a platform independant definition of the database table.
	 */
	public static TableDefinition tableDefinition(Session session)
	{
		TableDefinition definition= TIMESTAMPTester.tableDefinition();

		definition.setName("TIMESTAMPTCTEST");
		definition.addField("TSTOTS", TIMESTAMP.class);
		definition.addField("TSTOTSTZ", TIMESTAMPTZ.class);
		definition.addField("TSTOTSLTZ", TIMESTAMPLTZ.class);
		definition.addField("CALTOTSTZ", TIMESTAMPTZ.class);
		definition.addField("CALTOTSLTZ", TIMESTAMPLTZ.class);
		definition.addField("UTILDATETOTS", TIMESTAMP.class);
		definition.addField("UTILDATETOTSTZ", TIMESTAMPTZ.class);
		definition.addField("UTILDATETOTSLTZ", TIMESTAMPLTZ.class);
		definition.addField("DATETOTS", TIMESTAMP.class);
		definition.addField("DATETOTSTZ", TIMESTAMPTZ.class);
		definition.addField("DATETOTSLTZ", TIMESTAMPLTZ.class);
		definition.addField("TIMETOTS", TIMESTAMP.class);
		definition.addField("TIMETOTSTZ", TIMESTAMPTZ.class);
		definition.addField("TIMETOTSLTZ", TIMESTAMPLTZ.class);
		definition.addField("TSTODATE", java.sql.Date.class);
		
		return definition;
	}		
	
	public static RelationalDescriptor descriptor()
	{
		RelationalDescriptor descriptor = new RelationalDescriptor();

		/* First define the class, table and descriptor properties. */
		descriptor.setJavaClass(TIMESTAMPTypeConversionTester.class);
		descriptor.setTableName("TIMESTAMPTCTEST");
		descriptor.setPrimaryKeyFieldName("NAME");

		/* Next define the attribute mappings. */
		descriptor.addDirectMapping("testName", "getTestName", "setTestName", "NAME");
	
		DirectToFieldMapping tsToDateMapping = new DirectToFieldMapping();
		tsToDateMapping.setAttributeName("tsToDate");
		tsToDateMapping.setFieldName("TSTODATE");
		TypeConversionConverter converter = new TypeConversionConverter();
		converter.setObjectClass(java.sql.Timestamp.class);
		converter.setDataClass(java.sql.Timestamp.class);
                tsToDateMapping.setConverter(converter);
		descriptor.addMapping(tsToDateMapping);

		DirectToFieldMapping timestampMapping = new DirectToFieldMapping();
		timestampMapping.setAttributeName("tsToTS");
		timestampMapping.setFieldName("TSTOTS");
		converter = new TypeConversionConverter();
		converter.setObjectClass(java.sql.Timestamp.class);
		converter.setDataClass(oracle.sql.TIMESTAMP.class);
                timestampMapping.setConverter(converter);
		descriptor.addMapping(timestampMapping);

		DirectToFieldMapping timestampMapping2 = new DirectToFieldMapping();
		timestampMapping2.setAttributeName("tsToTSTZ");
		timestampMapping2.setFieldName("TSTOTSTZ");
		converter = new TypeConversionConverter();
		converter.setObjectClass(java.sql.Timestamp.class);
		converter.setDataClass(oracle.sql.TIMESTAMPTZ.class);
                timestampMapping2.setConverter(converter);
		descriptor.addMapping(timestampMapping2);

		DirectToFieldMapping timestampMapping3 = new DirectToFieldMapping();
		timestampMapping3.setAttributeName("tsToTSLTZ");
		timestampMapping3.setFieldName("TSTOTSLTZ");
		converter = new TypeConversionConverter();
		converter.setObjectClass(java.sql.Timestamp.class);
		converter.setDataClass(oracle.sql.TIMESTAMPLTZ.class);
                timestampMapping3.setConverter(converter);
		descriptor.addMapping(timestampMapping3);

		DirectToFieldMapping calendarMapping = new DirectToFieldMapping();
		calendarMapping.setAttributeName("calToTSTZ");
		calendarMapping.setFieldName("CALTOTSTZ");
		converter = new TypeConversionConverter();
		converter.setObjectClass(java.util.Calendar.class);
		converter.setDataClass(oracle.sql.TIMESTAMPTZ.class);
                calendarMapping.setConverter(converter);
		descriptor.addMapping(calendarMapping);
	
		DirectToFieldMapping calendarMapping2 = new DirectToFieldMapping();
		calendarMapping2.setAttributeName("calToTSLTZ");
		calendarMapping2.setFieldName("CALTOTSLTZ");
		converter = new TypeConversionConverter();
		converter.setObjectClass(java.util.Calendar.class);
		converter.setDataClass(oracle.sql.TIMESTAMPLTZ.class);
                calendarMapping2.setConverter(converter);
		descriptor.addMapping(calendarMapping2);

		DirectToFieldMapping utilDateToTSMapping = new DirectToFieldMapping();
		utilDateToTSMapping.setAttributeName("utilDateToTS");
		utilDateToTSMapping.setFieldName("UTILDATETOTS");
		converter = new TypeConversionConverter();
		converter.setObjectClass(java.util.Date.class);
		converter.setDataClass(oracle.sql.TIMESTAMP.class);
                utilDateToTSMapping.setConverter(converter);
		descriptor.addMapping(utilDateToTSMapping);

		DirectToFieldMapping utilDateToTSTZMapping = new DirectToFieldMapping();
		utilDateToTSTZMapping.setAttributeName("utilDateToTSTZ");
		utilDateToTSTZMapping.setFieldName("UTILDATETOTSTZ");
		converter = new TypeConversionConverter();
		converter.setObjectClass(java.util.Date.class);
		converter.setDataClass(oracle.sql.TIMESTAMPTZ.class);
                utilDateToTSTZMapping.setConverter(converter);
		descriptor.addMapping(utilDateToTSTZMapping);

		DirectToFieldMapping utilDateToTSLTZMapping = new DirectToFieldMapping();
		utilDateToTSLTZMapping.setAttributeName("utilDateToTSLTZ");
		utilDateToTSLTZMapping.setFieldName("UTILDATETOTSLTZ");
		converter = new TypeConversionConverter();
		converter.setObjectClass(java.util.Date.class);
		converter.setDataClass(oracle.sql.TIMESTAMPLTZ.class);
                utilDateToTSLTZMapping.setConverter(converter);
		descriptor.addMapping(utilDateToTSLTZMapping);

		DirectToFieldMapping dateToTSMapping = new DirectToFieldMapping();
		dateToTSMapping.setAttributeName("dateToTS");
		dateToTSMapping.setFieldName("DATETOTS");
		converter = new TypeConversionConverter();
		converter.setObjectClass(java.sql.Date.class);
		converter.setDataClass(oracle.sql.TIMESTAMP.class);
                dateToTSMapping.setConverter(converter);
		descriptor.addMapping(dateToTSMapping);

		DirectToFieldMapping dateToTSTZMapping = new DirectToFieldMapping();
		dateToTSTZMapping.setAttributeName("dateToTSTZ");
		dateToTSTZMapping.setFieldName("DATETOTSTZ");
		converter = new TypeConversionConverter();
		converter.setObjectClass(java.sql.Date.class);
		converter.setDataClass(oracle.sql.TIMESTAMPTZ.class);
                dateToTSTZMapping.setConverter(converter);
		descriptor.addMapping(dateToTSTZMapping);

		DirectToFieldMapping dateToTSLTZMapping = new DirectToFieldMapping();
		dateToTSLTZMapping.setAttributeName("dateToTSLTZ");
		dateToTSLTZMapping.setFieldName("DATETOTSLTZ");
		converter = new TypeConversionConverter();
		converter.setObjectClass(java.sql.Date.class);
		converter.setDataClass(oracle.sql.TIMESTAMPLTZ.class);
                dateToTSLTZMapping.setConverter(converter);
		descriptor.addMapping(dateToTSLTZMapping);

		DirectToFieldMapping timeToTSMapping = new DirectToFieldMapping();
		timeToTSMapping.setAttributeName("timeToTS");
		timeToTSMapping.setFieldName("TIMETOTS");
		converter = new TypeConversionConverter();
		converter.setObjectClass(java.sql.Time.class);
		converter.setDataClass(oracle.sql.TIMESTAMP.class);
                timeToTSMapping.setConverter(converter);
		descriptor.addMapping(timeToTSMapping);

		DirectToFieldMapping timeToTSTZMapping = new DirectToFieldMapping();
		timeToTSTZMapping.setAttributeName("timeToTSTZ");
		timeToTSTZMapping.setFieldName("TIMETOTSTZ");
		converter = new TypeConversionConverter();
		converter.setObjectClass(java.sql.Time.class);
		converter.setDataClass(oracle.sql.TIMESTAMPTZ.class);
                timeToTSTZMapping.setConverter(converter);
		descriptor.addMapping(timeToTSTZMapping);

		DirectToFieldMapping timeToTSLTZMapping = new DirectToFieldMapping();
		timeToTSLTZMapping.setAttributeName("timeToTSLTZ");
		timeToTSLTZMapping.setFieldName("TIMETOTSLTZ");
		converter = new TypeConversionConverter();
		converter.setObjectClass(java.sql.Time.class);
		converter.setDataClass(oracle.sql.TIMESTAMPLTZ.class);
                timeToTSLTZMapping.setConverter(converter);
		descriptor.addMapping(timeToTSLTZMapping);
		
		return descriptor;
	}

	static public Vector testInstances () 
	{
		Vector tests = new Vector();	 
		tests.addElement(new TIMESTAMPTypeConversionTester("NOW", Calendar.getInstance()));	
		tests.addElement(new TIMESTAMPTypeConversionTester("ZERO", 1900,0,1,0,0,0,0,"GMT"));							
		tests.addElement(new TIMESTAMPTypeConversionTester("GMT New Years Eve", 1997, 11, 31, 23, 59, 59, 900000000, "GMT"));	
		tests.addElement(new TIMESTAMPTypeConversionTester("PST New Years Eve", 1997, 11, 31, 23, 59, 59, 900000000, "America/Los_Angeles"));	
		tests.addElement(new TIMESTAMPTypeConversionTester("EST New Years Day 2000", 2000, 1, 1, 0, 0, 1, 0, "America/Montreal"));	
		tests.addElement(new TIMESTAMPTypeConversionTester("London summer", 1998, 7, 1, 14, 37, 53, 365789894, "Europe/London"));	
		tests.addElement(new TIMESTAMPTypeConversionTester("LA summer", 1999, 5, 31, 12, 59, 59, 565764356, "America/Los_Angeles"));	
		Calendar yearsBack100 = Calendar.getInstance();
		yearsBack100.set(Calendar.YEAR, (yearsBack100.get(Calendar.YEAR) - 100));
		tests.addElement(new TIMESTAMPTypeConversionTester("100 Years ago", yearsBack100));
		Calendar lastDSTYearCal = Calendar.getInstance();
		lastDSTYearCal.set(Calendar.YEAR, lastDSTYear);
		tests.addElement(new TIMESTAMPDirectToFieldTester("Last DST year", lastDSTYearCal));
		tests.addElement(new TIMESTAMPTypeConversionTester("GMT Before 1970", 1902, 2, 13, 16, 34, 25, 900000000, "GMT"));
		//Nanos starting with one zero
		tests.addElement(new TIMESTAMPTypeConversionTester("Nano with one zero", 465346464057L));
		//Nanos starting with two zeros
		tests.addElement(new TIMESTAMPTypeConversionTester("Nano with two zeros", 465346464007L));
		return tests;
	}

	static public Vector testInstances1 () 
	{
		Vector tests = new Vector();	 
		tests.addElement(new TIMESTAMPTypeConversionTester("NOW 1", Calendar.getInstance()));	
		tests.addElement(new TIMESTAMPTypeConversionTester("ZERO 1", 1900,0,1,0,0,0,0,"GMT"));							
		tests.addElement(new TIMESTAMPTypeConversionTester("GMT New Years Eve 1", 1997, 11, 31, 23, 59, 59, 900000000, "GMT"));	
		tests.addElement(new TIMESTAMPTypeConversionTester("PST New Years Eve 1", 1997, 11, 31, 23, 59, 59, 900000000, "America/Los_Angeles"));	
		tests.addElement(new TIMESTAMPTypeConversionTester("EST New Years Day 2000 1", 2000, 1, 1, 0, 0, 1, 0, "America/Montreal"));	
		tests.addElement(new TIMESTAMPTypeConversionTester("London summer 1", 1998, 7, 1, 14, 37, 53, 365789894, "Europe/London"));	
		tests.addElement(new TIMESTAMPTypeConversionTester("LA summer 1", 1999, 5, 31, 12, 59, 59, 565764356, "America/Los_Angeles"));	
		Calendar yearsBack100 = Calendar.getInstance();
		yearsBack100.set(Calendar.YEAR, (yearsBack100.get(Calendar.YEAR) - 100));
		tests.addElement(new TIMESTAMPTypeConversionTester("100 Years ago 1", yearsBack100));
		Calendar lastDSTYearCal = Calendar.getInstance();
		lastDSTYearCal.set(Calendar.YEAR, lastDSTYear);
		tests.addElement(new TIMESTAMPDirectToFieldTester("Last DST year 1", lastDSTYearCal));
		tests.addElement(new TIMESTAMPTypeConversionTester("GMT Before 1970 1", 1902, 2, 13, 16, 34, 25, 900000000, "GMT"));
		tests.addElement(new TIMESTAMPTypeConversionTester("Nano with one zero 1", 465346464057L));
		tests.addElement(new TIMESTAMPTypeConversionTester("Nano with two zeros 1", 465346464007L));
		return tests;
	}

	static public Vector testInstances2 () 
	{
		Vector tests = new Vector();	 
		tests.addElement(new TIMESTAMPTypeConversionTester("NOW 2", Calendar.getInstance()));	
		tests.addElement(new TIMESTAMPTypeConversionTester("ZERO 2", 1900,0,1,0,0,0,0,"GMT"));							
		tests.addElement(new TIMESTAMPTypeConversionTester("GMT New Years Eve 2", 1997, 11, 31, 23, 59, 59, 900000000, "GMT"));	
		tests.addElement(new TIMESTAMPTypeConversionTester("PST New Years Eve 2", 1997, 11, 31, 23, 59, 59, 900000000, "America/Los_Angeles"));	
		tests.addElement(new TIMESTAMPTypeConversionTester("EST New Years Day 2000 2", 2000, 1, 1, 0, 0, 1, 0, "America/Montreal"));	
		tests.addElement(new TIMESTAMPTypeConversionTester("London summer 2", 1998, 7, 1, 14, 37, 53, 365789894, "Europe/London"));	
		tests.addElement(new TIMESTAMPTypeConversionTester("LA summer 2", 1999, 5, 31, 12, 59, 59, 565764356, "America/Los_Angeles"));	
		Calendar yearsBack100 = Calendar.getInstance();
		yearsBack100.set(Calendar.YEAR, (yearsBack100.get(Calendar.YEAR) - 100));
		tests.addElement(new TIMESTAMPTypeConversionTester("100 Years ago 2", yearsBack100));
		Calendar lastDSTYearCal = Calendar.getInstance();
		lastDSTYearCal.set(Calendar.YEAR, lastDSTYear);
		tests.addElement(new TIMESTAMPDirectToFieldTester("Last DST year 2", lastDSTYearCal));
		tests.addElement(new TIMESTAMPTypeConversionTester("GMT Before 1970 2", 1902, 2, 13, 16, 34, 25, 900000000, "GMT"));
		tests.addElement(new TIMESTAMPTypeConversionTester("Nano with one zero 2", 465346464057L));
		tests.addElement(new TIMESTAMPTypeConversionTester("Nano with two zeros 2", 465346464007L));
		return tests;
	}
			
    // As opposed to TIMESTAMPTester
    // tsToTSTZ, utilDateToTSTZ and timeToTSTZ work no matter what session time zone is.
	// Converter makes a difference - Timestamp (Date, Time) object is converted to Calendar first,
	// which finally converted to TIMESTAMPTZ.
    boolean doesTimestampTZWork() {
        return true; 
    }
}
