/*
* TestCalendarFields.java
*
* Created on October 9, 2006, 6:12 PM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openjpa.persistence.kernel;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import org.apache.openjpa.persistence.kernel.common.apps.CalendarFields;
import org.apache.openjpa.kernel.OpenJPAStateManager;
import org.apache.openjpa.lib.util.JavaVersions;
import org.apache.openjpa.persistence.OpenJPAEntityManager;
public class TestCalendarFields extends BaseKernelTest {
/**
* Creates a new instance of TestCalendarFields
*/
public TestCalendarFields(String name) {
super(name);
}
public void setUp() throws Exception {
super.setUp(CalendarFields.class);
}
public void testFieldDefaultTimeZone() {
CalendarFields cal = new CalendarFields();
OpenJPAEntityManager pm;
pm = getPM();
startTx(pm);
cal.setSingapore(Calendar.
getInstance(TimeZone.getTimeZone("America/New_York")));
pm.persist(cal);
int id = cal.getId();
endTx(pm);
endEm(pm);
pm = getPM();
cal = pm.find(CalendarFields.class, id);
assertEquals(TimeZone.getTimeZone("Asia/Singapore"),
cal.getSingapore().getTimeZone());
endEm(pm);
}
public void testTimeZoneEquals() {
CalendarFields c1 = new CalendarFields();
CalendarFields c2 = new CalendarFields();
assertTimeZonesEquals(c1, c2);
OpenJPAEntityManager pm;
pm = getPM();
startTx(pm);
pm.persist(c2);
int id2 = c2.getId();
assertTimeZonesEquals(c1, c2);
endTx(pm);
assertTimeZonesEquals(c1, c2);
endEm(pm);
pm = getPM();
c2 = pm.find(CalendarFields.class, id2);
assertTimeZonesEquals(c1, c2);
assertTimeZonesEquals(c1, pm.detachCopy(c2));
endEm(pm);
}
public void testCalendarQuery() {
long time = 1136660560572L;
CalendarFields cal = new CalendarFields();
OpenJPAEntityManager pm;
pm = getPM();
startTx(pm);
cal.getSingapore().setTime(new Date(time));
pm.persist(cal);
int id = cal.getId();
endTx(pm);
endEm(pm);
pm = getPM();
//FIXME jthomas
Date date = new Date(time + 100000);
Calendar cals = Calendar.getInstance();
cals.setTime(date);
String query =
"SELECT o FROM CalendarFields o WHERE o.singapore < :cal";
int size = pm.createQuery(query).setParameter("cal", cals).
getResultList().size();
assertEquals(1, size);
// assertSize(0, pm.newQuery(CalendarFields.class,
// "singapore < :date").execute(new Date(time - 100000)));
//
// assertSize(0, pm.newQuery(CalendarFields.class,
// "singapore > :date").execute(new Date(time + 100000)));
// assertSize(1, pm.newQuery(CalendarFields.class,
// "singapore > :date").execute(new Date(time - 100000)));
//
// assertSize(1, pm.newQuery(CalendarFields.class,
// "singapore < :date").execute(newCalendar(new Date(time + 100000),
// null)));
// assertSize(0, pm.newQuery(CalendarFields.class,
// "singapore < :date").execute(newCalendar(new Date(time - 100000),
// null)));
//
// assertSize(0, pm.newQuery(CalendarFields.class,
// "singapore > :date").execute(newCalendar(new Date(time + 100000),
// null)));
// assertSize(1, pm.newQuery(CalendarFields.class,
// "singapore > :date").execute(newCalendar(new Date(time - 100000),
// null)));
endEm(pm);
}
private static Calendar newCalendar(Date date, String tz) {
Calendar cal = Calendar.getInstance(
tz == null ? TimeZone.getDefault() : TimeZone.getTimeZone(tz));
cal.setTime(date);
return cal;
}
public void testMutateCalendarDirties() {
CalendarFields c1 = new CalendarFields();
OpenJPAEntityManager pm;
pm = getPM();
startTx(pm);
pm.persist(c1);
int id = c1.getId();
endTx(pm);
endEm(pm);
pm = getPM();
c1 = pm.find(CalendarFields.class, id);
startTx(pm);
OpenJPAStateManager sm = getStateManager(c1, pm);
assertFalse(sm.getDirty().get(sm.getMetaData().
getField("gmt").getIndex()));
// test setting to same value doesn't dirty the field
/*
setTimeInMillis(c1.getGmtc1.getGmt().getTime().getTime());
c1.getGmt().setTime(c1.getGmt().getTime());
assertFalse(sm.getDirty().get(sm.getMetaData().
getField("gmt").getIndex()));
*/
// test changing time
setTimeInMillis(c1.getGmt(), 12345);
assertTrue(sm.getDirty().get(sm.getMetaData().
getField("gmt").getIndex()));
assertFalse(sm.getDirty().get(sm.getMetaData().
getField("newYork").getIndex()));
// test mutate via "add()" method
c1.getNewYork().add(Calendar.SECOND, -1);
assertTrue(sm.getDirty().get(sm.getMetaData().
getField("newYork").getIndex()));
assertFalse(sm.getDirty().get(sm.getMetaData().
getField("berlin").getIndex()));
// test mutate via "setTimeZone()" method
c1.getBerlin().setTimeZone(TimeZone.getTimeZone("GMT"));
assertTrue(sm.getDirty().get(sm.getMetaData().
getField("berlin").getIndex()));
// Calendar.set can only be subclassed in JDK 1.4+ (it is final in
// 1.3), so we only run this test in JDK 1.4+
if (JavaVersions.VERSION >= 4) {
assertFalse(sm.getDirty().get(sm.getMetaData().
getField("singapore").getIndex()));
// test mutate via "set()" method
c1.getSingapore().set(Calendar.YEAR, 1998);
assertTrue(sm.getDirty().get(sm.getMetaData().
getField("singapore").getIndex()));
}
assertFalse(sm.getDirty().get(sm.getMetaData().
getField("pacific").getIndex()));
// test mutate via "roll()" method
c1.getPacific().roll(Calendar.YEAR, 5);
assertTrue(sm.getDirty().get(sm.getMetaData().
getField("pacific").getIndex()));
endTx(pm);
endEm(pm);
}
private static void setTimeInMillis(Calendar cal, long millis) {
// "setTimeInMillis" is protected in JDK 1.3, put public in 1.4 & 1.5
try {
// Equivalent to: cal.setTimeInMillis (millis);
cal.getClass().getMethod("setTimeInMillis",
new Class[]{ long.class }).invoke(cal,
new Object[]{ new Long(millis) });
} catch (Exception e) {
cal.setTime(new Date(millis));
}
}
private void assertTimeZonesEquals(CalendarFields c1, CalendarFields c2) {
for (int i = 0; i < c1.getCalendars().size(); i++) {
Calendar cal1 = (Calendar) c1.getCalendars().get(i);
Calendar cal2 = (Calendar) c2.getCalendars().get(i);
if (cal1 != null && cal2 != null)
assertEquals(cal1.getTimeZone().getID(),
cal2.getTimeZone().getID());
}
}
}