/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.util;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Date;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import junit.framework.TestCase;
import org.geotools.factory.Hints;
public class TemporalConverterFactoryTest extends TestCase {
TemporalConverterFactory factory;
protected void setUp() throws Exception {
factory = new TemporalConverterFactory();
}
/**
* When converting from Calendar to Date from ArcSDE we run into a problem
* where the Dates are out by a very small number. Basically we need to
* look at the Calendar and see if it represents an *entire* day.
*
* @throws Exception
*/
public void testStitchInTime() throws Exception {
Converter converter = factory.createConverter( Calendar.class, Date.class, null );
Calendar calendar = Calendar.getInstance();
// Year, month, date, hour, minute, second.
calendar.set(2004, 06, 1);
for( int i=1; i<=12;i++){
calendar.set(Calendar.DAY_OF_MONTH, 1);
Date date = converter.convert( calendar, Date.class );
pause();
assertNotNull( date );
assertEquals( calendar.getTime(), date );
}
calendar.set(2004, 06, 1, 12, 30 );
Date date = converter.convert( calendar, Date.class );
pause();
assertNotNull( date );
assertEquals( calendar.getTime(), date );
}
/** Pause for one tick of the clock ... */
public static void pause(){
long pause = System.currentTimeMillis() + 15; // 15 is about the resolution of a system clock
while( System.currentTimeMillis() < pause ){
Thread.yield();
}
}
public void testCalendarToDate() throws Exception {
Calendar calendar = Calendar.getInstance();
assertNotNull( factory.createConverter( Calendar.class, Date.class, null ) );
Date date = (Date) factory.createConverter( Calendar.class, Date.class, null )
.convert( calendar, Date.class );
assertNotNull( date );
assertEquals( calendar.getTime(), date );
}
/*
* Make sure that additional Milliseconds (cause an offset) do not appear
* after conversion
*/
public void testCalendarToDateWithMilliseconds() throws Exception {
Calendar calendar = Calendar.getInstance();
long offset = 123;
calendar.set(Calendar.MILLISECOND, (int) offset);
assertNotNull(factory.createConverter(Calendar.class, Date.class, null));
Date date = (Date) factory.createConverter(Calendar.class, Date.class,
null).convert(calendar, Date.class);
assertNotNull(date);
assertEquals(calendar.getTime(), date);
}
public void testCalendarToTime() throws Exception {
Calendar calendar = Calendar.getInstance();
assertNotNull( factory.createConverter( Calendar.class, Time.class, null ) );
Time time = (Time) factory.createConverter( Calendar.class, Time.class, null )
.convert( calendar, Time.class );
assertNotNull( time );
// need to remove the date part
Calendar cal = (Calendar) calendar.clone();
cal.set(Calendar.YEAR, 0);
cal.set(Calendar.MONTH, 0);
cal.set(Calendar.DAY_OF_MONTH, 0);
assertEquals(cal.getTimeInMillis(), time.getTime());
}
public void testCalendarToTimestamp() throws Exception {
Calendar calendar = Calendar.getInstance();
assertNotNull( factory.createConverter( Calendar.class, Timestamp.class, null ) );
Timestamp timeStamp = (Timestamp) factory.createConverter( Calendar.class, Timestamp.class, null )
.convert( calendar, Timestamp.class );
assertNotNull( timeStamp );
assertEquals( new Timestamp( calendar.getTime().getTime() ), timeStamp );
}
/**
* Make sure that milliseconds do not get lost after conversion
*
* @throws Exception
*/
public void testCalendarToTimestampWithMilliseconds() throws Exception {
Calendar calendar = Calendar.getInstance();
long offset = 123;
calendar.set(Calendar.MILLISECOND, (int) offset);
assertNotNull(factory.createConverter(Calendar.class, Timestamp.class,
null));
Calendar calWithMs = (Calendar) calendar.clone();
Timestamp timeStamp = (Timestamp) factory.createConverter(
Calendar.class, Timestamp.class, null).convert(calendar,
Timestamp.class);
assertNotNull(timeStamp);
assertEquals(new Timestamp(calWithMs.getTime().getTime()), timeStamp);
assertEquals(new Timestamp(calendar.getTime().getTime()), timeStamp);
}
public void testDateToCalendar() throws Exception {
Date date = new Date();
assertNotNull( factory.createConverter( Date.class, Calendar.class, null ) );
Calendar calendar = (Calendar) factory.createConverter( Date.class, Calendar.class, null )
.convert( date, Calendar.class );
assertNotNull( calendar );
assertEquals( date, calendar.getTime() );
}
public void testDateToTime() throws Exception {
Date date = new Date();
assertNotNull( factory.createConverter( Date.class, Time.class, null ) );
Time time = (Time) factory.createConverter( Date.class, Time.class, null )
.convert( date, Time.class );
assertNotNull( time );
// need to remove the date part
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.setTime(date);
cal.set(Calendar.YEAR, 0);
cal.set(Calendar.MONTH, 0);
cal.set(Calendar.DAY_OF_MONTH, 0);
assertEquals(cal.getTimeInMillis(), time.getTime());
}
public void testDateToTimestamp() throws Exception {
Date date = new Date();
assertNotNull( factory.createConverter( Date.class, Timestamp.class, null ) );
Timestamp timeStamp = (Timestamp) factory.createConverter( Date.class, Timestamp.class, null )
.convert( date, Timestamp.class );
assertNotNull( timeStamp );
assertEquals( new Timestamp( date.getTime() ), timeStamp );
//check safe conversion
Hints h = new Hints();
h.put(ConverterFactory.SAFE_CONVERSION, new Boolean(true));
assertNull( factory.createConverter( Timestamp.class, Calendar.class, h ) );
h.put(ConverterFactory.SAFE_CONVERSION, new Boolean(false));
assertNotNull( factory.createConverter( Timestamp.class, Calendar.class, h ) );
}
public void testTimeToCalendar() throws Exception {
Time time = new Time(new Date().getTime());
assertNotNull( factory.createConverter( Time.class, Calendar.class, null ) );
Calendar calendar = (Calendar) factory.createConverter( Time.class, Calendar.class, null )
.convert( time, Calendar.class );
assertNotNull( calendar );
assertEquals( time, new Time( calendar.getTime().getTime() ) );
}
public void testTimestampToCalendar() throws Exception {
Timestamp timeStamp = new Timestamp( new Date().getTime() );
assertNotNull( factory.createConverter( Timestamp.class, Calendar.class, null ) );
Calendar calendar = (Calendar) factory.createConverter( Timestamp.class, Calendar.class, null )
.convert( timeStamp, Calendar.class );
assertNotNull( calendar );
assertEquals( timeStamp, new Timestamp( calendar.getTime().getTime() ) );
}
public void testXMLGregorianCalendarToCalendar() throws Exception {
XMLGregorianCalendar gc = DatatypeFactory.newInstance().newXMLGregorianCalendar("1981-06-20T12:00:00");
assertNotNull( factory.createConverter( XMLGregorianCalendar.class, Calendar.class, null));
Calendar calendar = (Calendar) factory.createConverter( XMLGregorianCalendar.class, Calendar.class, null)
.convert( gc, Calendar.class );
assertNotNull(calendar);
assertEquals( 1981, calendar.get( Calendar.YEAR ) );
assertEquals( 5, calendar.get( Calendar.MONTH ) );
assertEquals( 20, calendar.get( Calendar.DATE ) );
assertEquals( 12, calendar.get( Calendar.HOUR_OF_DAY ) );
assertEquals( 0, calendar.get( Calendar.MINUTE ) );
assertEquals( 0, calendar.get( Calendar.SECOND ) );
}
public void testCalendarToXMLGregorianCalendar() throws Exception {
Calendar calendar = Calendar.getInstance();
assertNotNull( factory.createConverter( Calendar.class, XMLGregorianCalendar.class, null));
XMLGregorianCalendar gc = factory.createConverter(Calendar.class, XMLGregorianCalendar.class, null)
.convert( calendar, XMLGregorianCalendar.class );
assertNotNull(gc);
Calendar actual = gc.toGregorianCalendar();
assertEquals( calendar.get( Calendar.YEAR ), actual.get( Calendar.YEAR) );
assertEquals( calendar.get( Calendar.MONTH ), actual.get( Calendar.MONTH) );
assertEquals( calendar.get( Calendar.DATE ), actual.get( Calendar.DATE) );
assertEquals( calendar.get( Calendar.HOUR_OF_DAY ), actual.get( Calendar.HOUR_OF_DAY) );
assertEquals( calendar.get( Calendar.MINUTE ), actual.get( Calendar.MINUTE) );
assertEquals( calendar.get( Calendar.SECOND ), actual.get( Calendar.SECOND) );
assertEquals( calendar.get( Calendar.MILLISECOND ), actual.get( Calendar.MILLISECOND) );
}
public void testXMLGregorianCalendarToDate() throws Exception {
XMLGregorianCalendar gc = DatatypeFactory.newInstance().newXMLGregorianCalendar("1981-06-20T12:00:00");
assertNotNull( factory.createConverter( XMLGregorianCalendar.class, Date.class, null));
Date date = factory.createConverter( XMLGregorianCalendar.class, Date.class, null)
.convert( gc, Date.class );
assertNotNull(date);
Calendar calendar = Calendar.getInstance();
calendar.setTime( date );
assertEquals( 1981, calendar.get( Calendar.YEAR ) );
assertEquals( 5, calendar.get( Calendar.MONTH ) );
assertEquals( 20, calendar.get( Calendar.DATE ) );
assertEquals( 12, calendar.get( Calendar.HOUR_OF_DAY ) );
assertEquals( 0, calendar.get( Calendar.MINUTE ) );
assertEquals( 0, calendar.get( Calendar.SECOND ) );
}
public void testDateToXMLGregorianCalendar() throws Exception {
Date date = new Date();
assertNotNull( factory.createConverter( Date.class, XMLGregorianCalendar.class, null ) );
XMLGregorianCalendar gc = factory.createConverter( Date.class, XMLGregorianCalendar.class, null )
.convert( date, XMLGregorianCalendar.class );
assertNotNull( gc );
assertEquals( date, gc.toGregorianCalendar().getTime() );
}
}