From: <fg...@us...> - 2011-08-08 09:32:15
|
Revision: 3584 http://openutils.svn.sourceforge.net/openutils/?rev=3584&view=rev Author: fgiust Date: 2011-08-08 09:32:08 +0000 (Mon, 08 Aug 2011) Log Message: ----------- CRIT-42 revised timezone handling Modified Paths: -------------- trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/BaseCriterion.java trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/BetweenExpression.java trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/Restrictions.java trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/SimpleExpression.java trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/xpath/utils/XPathTextUtils.java trunk/openutils-mgnlcriteria/src/test/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/CriteriaTest.java Modified: trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/BaseCriterion.java =================================================================== --- trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/BaseCriterion.java 2011-08-05 10:02:25 UTC (rev 3583) +++ trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/BaseCriterion.java 2011-08-08 09:32:08 UTC (rev 3584) @@ -19,9 +19,6 @@ package net.sourceforge.openutils.mgnlcriteria.jcr.query.criterion; -import java.text.SimpleDateFormat; -import java.util.Locale; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,13 +32,6 @@ { /** - * Date format used for date formatting. - */ - protected static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat( - "yyyy-MM-dd'T'HH:mm:ss.SSS", - Locale.ENGLISH); - - /** * Stable serialVersionUID */ private static final long serialVersionUID = 42L; Modified: trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/BetweenExpression.java =================================================================== --- trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/BetweenExpression.java 2011-08-05 10:02:25 UTC (rev 3583) +++ trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/BetweenExpression.java 2011-08-08 09:32:08 UTC (rev 3584) @@ -23,6 +23,7 @@ import net.sourceforge.openutils.mgnlcriteria.jcr.query.Criteria; import net.sourceforge.openutils.mgnlcriteria.jcr.query.JCRQueryException; +import net.sourceforge.openutils.mgnlcriteria.jcr.query.xpath.utils.XPathTextUtils; /** @@ -73,28 +74,16 @@ { Calendar cal = (Calendar) lo; Calendar cal2 = (Calendar) hi; - String fmt; - String fmt2; - synchronized (DATE_FORMAT) - { - DATE_FORMAT.setCalendar(cal); - fmt = DATE_FORMAT.format(cal.getTime()); - DATE_FORMAT.setCalendar(cal2); - fmt2 = DATE_FORMAT.format(cal2.getTime()); - } - fragment.append(XS_DATETIME_FUNCTION + "('" - + fmt - + "+00:00" + + XPathTextUtils.toXsdDate(cal) + "') and " + propertyName + " <= " + XS_DATETIME_FUNCTION + "('" - + fmt2 - + "+00:00" + + XPathTextUtils.toXsdDate(cal2) + "') "); } else Modified: trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/Restrictions.java =================================================================== --- trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/Restrictions.java 2011-08-05 10:02:25 UTC (rev 3583) +++ trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/Restrictions.java 2011-08-08 09:32:08 UTC (rev 3584) @@ -21,7 +21,6 @@ import java.util.Calendar; import java.util.Collection; -import java.util.TimeZone; import net.sourceforge.openutils.mgnlcriteria.jcr.query.xpath.utils.XPathTextUtils; @@ -37,17 +36,6 @@ public final class Restrictions { - private static final Calendar MIDNIGHT_GMT; - - static - { - MIDNIGHT_GMT = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - MIDNIGHT_GMT.set(Calendar.HOUR_OF_DAY, 0); - MIDNIGHT_GMT.set(Calendar.MINUTE, 0); - MIDNIGHT_GMT.set(Calendar.SECOND, 0); - MIDNIGHT_GMT.set(Calendar.MILLISECOND, 0); - } - private Restrictions() { // cannot be instantiated @@ -378,7 +366,8 @@ private static Calendar getDayStart(Calendar cal) { - Calendar cal2 = (Calendar) MIDNIGHT_GMT.clone(); + Calendar cal2 = Calendar.getInstance(); + cal2.clear(); cal2.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)); return cal2; } @@ -386,7 +375,7 @@ private static Calendar getDayEnd(Calendar cal) { Calendar cal2 = getDayStart(cal); - cal2.add(Calendar.DAY_OF_YEAR, 1); + cal2.add(Calendar.DATE, 1); cal2.add(Calendar.MILLISECOND, -1); return cal2; } Modified: trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/SimpleExpression.java =================================================================== --- trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/SimpleExpression.java 2011-08-05 10:02:25 UTC (rev 3583) +++ trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/SimpleExpression.java 2011-08-08 09:32:08 UTC (rev 3584) @@ -23,6 +23,7 @@ import net.sourceforge.openutils.mgnlcriteria.jcr.query.Criteria; import net.sourceforge.openutils.mgnlcriteria.jcr.query.JCRQueryException; +import net.sourceforge.openutils.mgnlcriteria.jcr.query.xpath.utils.XPathTextUtils; import org.apache.commons.lang.StringUtils; @@ -104,14 +105,8 @@ { fragment.append(propertyName).append(getOp()); Calendar cal = (Calendar) value; - String fmt; - synchronized (DATE_FORMAT) - { - DATE_FORMAT.setCalendar(cal); - fmt = DATE_FORMAT.format(cal.getTime()); - } - fragment.append(XS_DATETIME_FUNCTION + "('" + fmt + "+00:00" + "')) "); + fragment.append(XS_DATETIME_FUNCTION + "('" + XPathTextUtils.toXsdDate(cal) + "')) "); } else if (value != null) { Modified: trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/xpath/utils/XPathTextUtils.java =================================================================== --- trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/xpath/utils/XPathTextUtils.java 2011-08-05 10:02:25 UTC (rev 3583) +++ trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/xpath/utils/XPathTextUtils.java 2011-08-08 09:32:08 UTC (rev 3584) @@ -19,7 +19,12 @@ package net.sourceforge.openutils.mgnlcriteria.jcr.query.xpath.utils; +import java.util.Calendar; +import java.util.Locale; +import java.util.TimeZone; + import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.time.FastDateFormat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,6 +40,14 @@ private static Logger log = LoggerFactory.getLogger(XPathTextUtils.class); + /** + * Date format used for date formatting. + */ + private static final FastDateFormat DATE_FORMAT = FastDateFormat.getInstance( + "yyyy-MM-dd'T'HH:mm:ss.SSSZ", + TimeZone.getDefault(), + Locale.ENGLISH); + private XPathTextUtils() { } @@ -144,4 +157,23 @@ log.debug("returning encoded path {}", encodedPath); return encodedPath.toString(); } + + /** + * Get a date in the XSD format "yyyy-MM-ddThh:mm:ss.SSS:+01:00" + * @param date input calendar + * @return XSD formatted date + */ + public static String toXsdDate(Calendar date) + { + if (date == null) + { + return null; + } + + String xsdDate = DATE_FORMAT.format(date); + int length = xsdDate.length(); + + return StringUtils.substring(xsdDate, 0, length - 2) + ":" + StringUtils.substring(xsdDate, length - 2, length); + } + } \ No newline at end of file Modified: trunk/openutils-mgnlcriteria/src/test/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/CriteriaTest.java =================================================================== --- trunk/openutils-mgnlcriteria/src/test/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/CriteriaTest.java 2011-08-05 10:02:25 UTC (rev 3583) +++ trunk/openutils-mgnlcriteria/src/test/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/CriteriaTest.java 2011-08-08 09:32:08 UTC (rev 3584) @@ -32,316 +32,374 @@ import net.sourceforge.openutils.mgnlcriteria.jcr.query.criterion.Order; import net.sourceforge.openutils.mgnlcriteria.jcr.query.criterion.Restrictions; +import net.sourceforge.openutils.mgnlcriteria.jcr.query.xpath.utils.XPathTextUtils; import org.apache.commons.lang.StringUtils; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; + /** * @author dschivo * @version $Id$ */ @RepositoryTestConfiguration(jackrabbitRepositoryConfig = "/crit-repository/jackrabbit-test-configuration.xml", repositoryConfig = "/crit-repository/test-repositories.xml", bootstrapFiles = "/crit-bootstrap/website.pets.xml") -public class CriteriaTest extends TestNgRepositoryTestcase { +public class CriteriaTest extends TestNgRepositoryTestcase +{ - /** - * {@inheritDoc} - */ - @Override - @BeforeClass - public void setUp() throws Exception { - super.setUp(); + /** + * {@inheritDoc} + */ + @Override + @BeforeClass + public void setUp() throws Exception + { + super.setUp(); - // Nodes in this workspace: - // - pets (title=Pets) - // --- cats (title=Cats) - // ----- 1 (title=Leo, petType=cat, birthDate=2000-09-07) - // ----- 7 (title=Samantha, petType=cat, birthDate=1995-09-04) - // ----- 8 (title=Max, petType=cat, birthDate=1995-09-04) - // ----- 13 (title=Sly, petType=cat, birthDate=2002-06-08) - // --- dogs (title=Dogs) - // ----- 3 (title=Rosy, petType=dog, birthDate=2001-04-17) - // ----- 4 (title=Jewel, petType=dog, birthDate=2000-03-07) - // ----- 10 (title=Mulligan, petType=dog, birthDate=1997-02-24) - // ----- 12 (title=Lucky, petType=dog, birthDate=2000-06-24) - // --- lizards (title=Lizards) - // ----- 5 (title=Iggy, petType=lizard, birthDate=2000-11-30) - // --- snakes (title=Snakes) - // ----- 6 (title=George, petType=snake, birthDate=2000-01-20) - // --- birds (title=Birds) - // ----- 9 (title=Lucky, petType=bird, birthDate=1999-08-06) - // ----- 11 (title=Freddy, petType=bird, birthDate=2000-03-09) - // --- hamsters (title=Hamsters) - // ----- 2 (title=Basil, petType=hamster, birthDate=2002-08-06) - MgnlContext.getHierarchyManager(ContentRepository.WEBSITE).save(); - } + // Nodes in this workspace: + // - pets (title=Pets) + // --- cats (title=Cats) + // ----- 1 (title=Leo, petType=cat, birthDate=2000-09-07) + // ----- 7 (title=Samantha, petType=cat, birthDate=1995-09-04) + // ----- 8 (title=Max, petType=cat, birthDate=1995-09-04) + // ----- 13 (title=Sly, petType=cat, birthDate=2002-06-08) + // --- dogs (title=Dogs) + // ----- 3 (title=Rosy, petType=dog, birthDate=2001-04-17) + // ----- 4 (title=Jewel, petType=dog, birthDate=2000-03-07) + // ----- 10 (title=Mulligan, petType=dog, birthDate=1997-02-24) + // ----- 12 (title=Lucky, petType=dog, birthDate=2000-06-24) + // --- lizards (title=Lizards) + // ----- 5 (title=Iggy, petType=lizard, birthDate=2000-11-30) + // --- snakes (title=Snakes) + // ----- 6 (title=George, petType=snake, birthDate=2000-01-20) + // --- birds (title=Birds) + // ----- 9 (title=Lucky, petType=bird, birthDate=1999-08-06) + // ----- 11 (title=Freddy, petType=bird, birthDate=2000-03-09) + // --- hamsters (title=Hamsters) + // ----- 2 (title=Basil, petType=hamster, birthDate=2002-08-06) + MgnlContext.getHierarchyManager(ContentRepository.WEBSITE).save(); + } - /** - * Tests the xpath query statement produced by a Criteria instance. - * - * @throws Exception - */ - @Test - public void testToXpathExpression() throws Exception { - Criteria criteria = toXpathExpressionJavadocExampleCriteria(); + /** + * Tests the xpath query statement produced by a Criteria instance. + * @throws Exception + */ + @Test + public void testToXpathExpression() throws Exception + { + Criteria criteria = toXpathExpressionJavadocExampleCriteria(); - String expectedStmt = "//pets//*" - + "[((jcr:contains(@title, 'Lucky')) and (@petType='dog')" - + " and (@birthDate >=xs:dateTime('1999-01-01T00:00:00.000+00:00')" - + " and @birthDate <=xs:dateTime('2001-12-31T23:59:59.999+00:00')))]" - + " order by @title descending"; - String actualStmt = criteria.toXpathExpression(); - Assert.assertEquals(StringUtils.remove(actualStmt, ' '), StringUtils - .remove(expectedStmt, ' ')); - } + Calendar begin = Calendar.getInstance(); + begin.set(1999, Calendar.JANUARY, 1); + begin.set(Calendar.HOUR, 0); + begin.set(Calendar.MINUTE, 0); + begin.set(Calendar.SECOND, 0); + begin.set(Calendar.MILLISECOND, 0); + Calendar end = Calendar.getInstance(); + end.set(2001, Calendar.DECEMBER, 31); + end.set(Calendar.HOUR, 0); + end.set(Calendar.MINUTE, 0); + end.set(Calendar.SECOND, 0); + end.set(Calendar.MILLISECOND, 0); + end.add(Calendar.MILLISECOND, -1); + end.add(Calendar.DATE, 1); - /** - * @throws Exception - */ - @Test - public void testExecuteTrivial() throws Exception { - HierarchyManager hm = MgnlContext - .getHierarchyManager(ContentRepository.WEBSITE); - Content node = hm.getContent("/pets"); - Assert.assertEquals(node.getTitle(), "Pets"); + String expectedStmt = "//pets//*" + + "[((jcr:contains(@title, 'Lucky')) and (@petType='dog')" + + " and (@birthDate >=xs:dateTime('" + + XPathTextUtils.toXsdDate(begin) + + "')" + + " and @birthDate <=xs:dateTime('" + + XPathTextUtils.toXsdDate(end) + + "')))]" + + " order by @title descending"; - Criteria criteria = JCRCriteriaFactory.createCriteria().setWorkspace( - ContentRepository.WEBSITE).setBasePath("/jcr:root/*").add( - Restrictions.eq("@jcr:primaryType", ItemType.CONTENT - .getSystemName())).add( - Restrictions.eq("@title", "Pets")); - AdvancedResult result = criteria.execute(); - ResultIterator<AdvancedResultItem> iterator = result.getItems(); - Assert.assertTrue(iterator.hasNext()); - Content resultNode = iterator.next(); - Assert.assertEquals(resultNode.getTitle(), "Pets"); - } + log.debug(expectedStmt); - /** - * Tests the query execution of a Criteria instance. - * - * @throws Exception - */ - @Test - public void testExecute() throws Exception { - Criteria criteria = toXpathExpressionJavadocExampleCriteria(); + // @birthDate >=xs:dateTime('1999-01-01T00:00:00.000+01:00') + // and + // @birthDate <=xs:dateTime('2001-12-31T23:59:59.999+01:00') - AdvancedResult result = criteria.execute(); - Assert.assertEquals(result.getTotalSize(), 1); + String actualStmt = criteria.toXpathExpression(); - ResultIterator<AdvancedResultItem> iterator = result.getItems(); - Assert.assertEquals(iterator.getSize(), 1); - Assert.assertEquals(iterator.next().getName(), "12"); - } + Assert.assertEquals(StringUtils.remove(actualStmt, ' '), StringUtils.remove(expectedStmt, ' ')); + } - /** - * @return - */ - private Criteria toXpathExpressionJavadocExampleCriteria() { - Calendar begin = Calendar.getInstance(); - begin.set(1999, Calendar.JANUARY, 1); - Calendar end = Calendar.getInstance(); - end.set(2001, Calendar.DECEMBER, 31); + /** + * @throws Exception + */ + @Test + public void testExecuteTrivial() throws Exception + { + HierarchyManager hm = MgnlContext.getHierarchyManager(ContentRepository.WEBSITE); + Content node = hm.getContent("/pets"); + Assert.assertEquals(node.getTitle(), "Pets"); - Criteria criteria = JCRCriteriaFactory.createCriteria().setWorkspace( - ContentRepository.WEBSITE).setBasePath("/pets").add( - Restrictions.contains("@title", "Lucky")).add( - Restrictions.eq("@petType", "dog")).add( - Restrictions.betweenDates("@birthDate", begin, end)).addOrder( - Order.desc("@title")); - return criteria; - } + Criteria criteria = JCRCriteriaFactory + .createCriteria() + .setWorkspace(ContentRepository.WEBSITE) + .setBasePath("/jcr:root/*") + .add(Restrictions.eq("@jcr:primaryType", ItemType.CONTENT.getSystemName())) + .add(Restrictions.eq("@title", "Pets")); + AdvancedResult result = criteria.execute(); + ResultIterator<AdvancedResultItem> iterator = result.getItems(); + Assert.assertTrue(iterator.hasNext()); + Content resultNode = iterator.next(); + Assert.assertEquals(resultNode.getTitle(), "Pets"); + } - /** - * Tests pagination of results. - * - * @throws Exception - */ - @Test - public void testSetFirstResultAndMaxResults() throws Exception { - Calendar begin = Calendar.getInstance(); - begin.set(1999, Calendar.JANUARY, 1); - Calendar end = Calendar.getInstance(); - end.set(2001, Calendar.DECEMBER, 31); + /** + * Tests the query execution of a Criteria instance. + * @throws Exception + */ + @Test + public void testExecute() throws Exception + { + Criteria criteria = toXpathExpressionJavadocExampleCriteria(); - Criteria criteria = JCRCriteriaFactory.createCriteria().setWorkspace( - ContentRepository.WEBSITE).setBasePath("/pets").add( - Restrictions.betweenDates("@birthDate", begin, end)).addOrder( - Order.asc("@birthDate")).setFirstResult(5).setMaxResults(5); + AdvancedResult result = criteria.execute(); + Assert.assertEquals(result.getTotalSize(), 1); - AdvancedResult result = criteria.execute(); - // first page: - // --- 9 (title=Lucky, petType=bird, birthDate=1999-08-06) - // --- 6 (title=George, petType=snake, birthDate=2000-01-20) - // --- 4 (title=Jewel, petType=dog, birthDate=2000-03-07) - // --- 11 (title=Freddy, petType=bird, birthDate=2000-03-09) - // --- 12 (title=Lucky, petType=dog, birthDate=2000-06-24) - // second page: - // --- 1 (title=Leo, petType=cat, birthDate=2000-09-07) - // --- 5 (title=Iggy, petType=lizard, birthDate=2000-11-30) - // --- 3 (title=Rosy, petType=dog, birthDate=2001-04-17) - Assert.assertEquals(result.getTotalSize(), 8); + ResultIterator<AdvancedResultItem> iterator = result.getItems(); + Assert.assertEquals(iterator.getSize(), 1); + Assert.assertEquals(iterator.next().getName(), "12"); + } - ResultIterator<AdvancedResultItem> iterator = result.getItems(); - Assert.assertEquals(iterator.getSize(), 3); - Assert.assertEquals(iterator.next().getName(), "1"); - Assert.assertEquals(iterator.next().getName(), "5"); - Assert.assertEquals(iterator.next().getName(), "3"); - } + /** + * @return + */ + private Criteria toXpathExpressionJavadocExampleCriteria() + { + Calendar begin = Calendar.getInstance(); + begin.set(1999, Calendar.JANUARY, 1); + Calendar end = Calendar.getInstance(); + end.set(2001, Calendar.DECEMBER, 31); - /** - * Tests pagination of results. - * - * @throws Exception - */ - @Test - public void testSetPaging() throws Exception { - Calendar begin = Calendar.getInstance(); - begin.set(1999, Calendar.JANUARY, 1); - Calendar end = Calendar.getInstance(); - end.set(2001, Calendar.DECEMBER, 31); + Criteria criteria = JCRCriteriaFactory + .createCriteria() + .setWorkspace(ContentRepository.WEBSITE) + .setBasePath("/pets") + .add(Restrictions.contains("@title", "Lucky")) + .add(Restrictions.eq("@petType", "dog")) + .add(Restrictions.betweenDates("@birthDate", begin, end)) + .addOrder(Order.desc("@title")); + return criteria; + } - Criteria criteria = JCRCriteriaFactory.createCriteria().setWorkspace( - ContentRepository.WEBSITE).setBasePath("/pets").add( - Restrictions.betweenDates("@birthDate", begin, end)).addOrder( - Order.asc("@birthDate")).setPaging(5, 2); + /** + * Tests pagination of results. + * @throws Exception + */ + @Test + public void testSetFirstResultAndMaxResults() throws Exception + { + Calendar begin = Calendar.getInstance(); + begin.set(1999, Calendar.JANUARY, 1); + Calendar end = Calendar.getInstance(); + end.set(2001, Calendar.DECEMBER, 31); - AdvancedResult result = criteria.execute(); - // first page: - // --- 9 (title=Lucky, petType=bird, birthDate=1999-08-06) - // --- 6 (title=George, petType=snake, birthDate=2000-01-20) - // --- 4 (title=Jewel, petType=dog, birthDate=2000-03-07) - // --- 11 (title=Freddy, petType=bird, birthDate=2000-03-09) - // --- 12 (title=Lucky, petType=dog, birthDate=2000-06-24) - // second page: - // --- 1 (title=Leo, petType=cat, birthDate=2000-09-07) - // --- 5 (title=Iggy, petType=lizard, birthDate=2000-11-30) - // --- 3 (title=Rosy, petType=dog, birthDate=2001-04-17) - Assert.assertEquals(result.getTotalSize(), 8); + Criteria criteria = JCRCriteriaFactory + .createCriteria() + .setWorkspace(ContentRepository.WEBSITE) + .setBasePath("/pets") + .add(Restrictions.betweenDates("@birthDate", begin, end)) + .addOrder(Order.asc("@birthDate")) + .setFirstResult(5) + .setMaxResults(5); - ResultIterator<AdvancedResultItem> iterator = result.getItems(); - Assert.assertEquals(iterator.getSize(), 3); - Assert.assertEquals(iterator.next().getName(), "1"); - Assert.assertEquals(iterator.next().getName(), "5"); - Assert.assertEquals(iterator.next().getName(), "3"); - } + AdvancedResult result = criteria.execute(); + // first page: + // --- 9 (title=Lucky, petType=bird, birthDate=1999-08-06) + // --- 6 (title=George, petType=snake, birthDate=2000-01-20) + // --- 4 (title=Jewel, petType=dog, birthDate=2000-03-07) + // --- 11 (title=Freddy, petType=bird, birthDate=2000-03-09) + // --- 12 (title=Lucky, petType=dog, birthDate=2000-06-24) + // second page: + // --- 1 (title=Leo, petType=cat, birthDate=2000-09-07) + // --- 5 (title=Iggy, petType=lizard, birthDate=2000-11-30) + // --- 3 (title=Rosy, petType=dog, birthDate=2001-04-17) + Assert.assertEquals(result.getTotalSize(), 8); - /** - * Tests ordering, both ascending and descending. - * - * @throws Exception - */ - @Test - public void testAddOrder() throws Exception { - Criteria criteria; - ResultIterator<AdvancedResultItem> iterator; - Calendar birthDate; + ResultIterator<AdvancedResultItem> iterator = result.getItems(); + Assert.assertEquals(iterator.getSize(), 3); + Assert.assertEquals(iterator.next().getName(), "1"); + Assert.assertEquals(iterator.next().getName(), "5"); + Assert.assertEquals(iterator.next().getName(), "3"); + } - // gets the oldest pet (ascending order) - criteria = JCRCriteriaFactory.createCriteria().setWorkspace( - ContentRepository.WEBSITE).setBasePath("/pets").add( - Restrictions.isNotNull("@petType")).addOrder( - Order.asc("@birthDate")); - iterator = criteria.execute().getItems(); - // ----- 7 (title=Samantha, petType=cat, birthDate=1995-09-04) - // ----- 8 (title=Max, petType=cat, birthDate=1995-09-04) - Assert.assertTrue(iterator.hasNext()); - birthDate = NodeDataUtil.getDate(iterator.next(), "birthDate", null); - Assert.assertEquals(birthDate.get(Calendar.YEAR), 1995); - Assert.assertEquals(birthDate.get(Calendar.MONTH) + 1, 9); - Assert.assertEquals(birthDate.get(Calendar.DAY_OF_MONTH), 4); + /** + * Tests pagination of results. + * @throws Exception + */ + @Test + public void testSetPaging() throws Exception + { + Calendar begin = Calendar.getInstance(); + begin.set(1999, Calendar.JANUARY, 1); + Calendar end = Calendar.getInstance(); + end.set(2001, Calendar.DECEMBER, 31); - // gets the youngest pet (descending order) - criteria = JCRCriteriaFactory.createCriteria().setWorkspace( - ContentRepository.WEBSITE).setBasePath("/pets").add( - Restrictions.isNotNull("@petType")).addOrder( - Order.desc("@birthDate")); - iterator = criteria.execute().getItems(); - // ----- 2 (title=Basil, petType=hamster, birthDate=2002-08-06) - Assert.assertTrue(iterator.hasNext()); - birthDate = NodeDataUtil.getDate(iterator.next(), "birthDate", null); - Assert.assertEquals(birthDate.get(Calendar.YEAR), 2002); - Assert.assertEquals(birthDate.get(Calendar.MONTH) + 1, 8); - Assert.assertEquals(birthDate.get(Calendar.DAY_OF_MONTH), 6); - } + Criteria criteria = JCRCriteriaFactory + .createCriteria() + .setWorkspace(ContentRepository.WEBSITE) + .setBasePath("/pets") + .add(Restrictions.betweenDates("@birthDate", begin, end)) + .addOrder(Order.asc("@birthDate")) + .setPaging(5, 2); - /** - * Tests multiple ordering, playing on the fact that the two oldests pets - * are born on the same date but have different name. - * - * @throws Exception - */ - @Test - public void testAddOrderMultiple() throws Exception { - Criteria criteria; - ResultIterator<AdvancedResultItem> iterator; + AdvancedResult result = criteria.execute(); + // first page: + // --- 9 (title=Lucky, petType=bird, birthDate=1999-08-06) + // --- 6 (title=George, petType=snake, birthDate=2000-01-20) + // --- 4 (title=Jewel, petType=dog, birthDate=2000-03-07) + // --- 11 (title=Freddy, petType=bird, birthDate=2000-03-09) + // --- 12 (title=Lucky, petType=dog, birthDate=2000-06-24) + // second page: + // --- 1 (title=Leo, petType=cat, birthDate=2000-09-07) + // --- 5 (title=Iggy, petType=lizard, birthDate=2000-11-30) + // --- 3 (title=Rosy, petType=dog, birthDate=2001-04-17) + Assert.assertEquals(result.getTotalSize(), 8); - // order by @birthDate ascending, @title ascending - criteria = JCRCriteriaFactory.createCriteria().setWorkspace( - ContentRepository.WEBSITE).setBasePath("/pets").add( - Restrictions.isNotNull("@petType")).addOrder( - Order.asc("@birthDate")).addOrder(Order.asc("@title")); - iterator = criteria.execute().getItems(); - // ----- 8 (title=Max, petType=cat, birthDate=1995-09-04) - // ----- 7 (title=Samantha, petType=cat, birthDate=1995-09-04) - Assert.assertTrue(iterator.hasNext()); - Assert.assertEquals(iterator.next().getTitle(), "Max"); - Assert.assertTrue(iterator.hasNext()); - Assert.assertEquals(iterator.next().getTitle(), "Samantha"); + ResultIterator<AdvancedResultItem> iterator = result.getItems(); + Assert.assertEquals(iterator.getSize(), 3); + Assert.assertEquals(iterator.next().getName(), "1"); + Assert.assertEquals(iterator.next().getName(), "5"); + Assert.assertEquals(iterator.next().getName(), "3"); + } - // order by @birthDate ascending, @title descending - criteria = JCRCriteriaFactory.createCriteria().setWorkspace( - ContentRepository.WEBSITE).setBasePath("/pets").add( - Restrictions.isNotNull("@petType")).addOrder( - Order.asc("@birthDate")).addOrder(Order.desc("@title")); - iterator = criteria.execute().getItems(); - // ----- 7 (title=Samantha, petType=cat, birthDate=1995-09-04) - // ----- 8 (title=Max, petType=cat, birthDate=1995-09-04) - Assert.assertTrue(iterator.hasNext()); - Assert.assertEquals(iterator.next().getTitle(), "Samantha"); - Assert.assertTrue(iterator.hasNext()); - Assert.assertEquals(iterator.next().getTitle(), "Max"); - } + /** + * Tests ordering, both ascending and descending. + * @throws Exception + */ + @Test + public void testAddOrder() throws Exception + { + Criteria criteria; + ResultIterator<AdvancedResultItem> iterator; + Calendar birthDate; - @Test - public void testDateComparison() throws Exception { - Criteria criteria; - ResultIterator<AdvancedResultItem> iterator; - Content node; - Calendar date; + // gets the oldest pet (ascending order) + criteria = JCRCriteriaFactory + .createCriteria() + .setWorkspace(ContentRepository.WEBSITE) + .setBasePath("/pets") + .add(Restrictions.isNotNull("@petType")) + .addOrder(Order.asc("@birthDate")); + iterator = criteria.execute().getItems(); + // ----- 7 (title=Samantha, petType=cat, birthDate=1995-09-04) + // ----- 8 (title=Max, petType=cat, birthDate=1995-09-04) + Assert.assertTrue(iterator.hasNext()); + birthDate = NodeDataUtil.getDate(iterator.next(), "birthDate", null); + Assert.assertEquals(birthDate.get(Calendar.YEAR), 1995); + Assert.assertEquals(birthDate.get(Calendar.MONTH) + 1, 9); + Assert.assertEquals(birthDate.get(Calendar.DAY_OF_MONTH), 4); - criteria = JCRCriteriaFactory.createCriteria().setWorkspace( - ContentRepository.WEBSITE).setBasePath("/pets").add( - Restrictions.isNotNull("@petType")).add( - Restrictions.eq("@title", "Leo")); - iterator = criteria.execute().getItems(); - Assert.assertTrue(iterator.hasNext()); - node = iterator.next(); - Assert.assertEquals(node.getTitle(), "Leo"); + // gets the youngest pet (descending order) + criteria = JCRCriteriaFactory + .createCriteria() + .setWorkspace(ContentRepository.WEBSITE) + .setBasePath("/pets") + .add(Restrictions.isNotNull("@petType")) + .addOrder(Order.desc("@birthDate")); + iterator = criteria.execute().getItems(); + // ----- 2 (title=Basil, petType=hamster, birthDate=2002-08-06) + Assert.assertTrue(iterator.hasNext()); + birthDate = NodeDataUtil.getDate(iterator.next(), "birthDate", null); + Assert.assertEquals(birthDate.get(Calendar.YEAR), 2002); + Assert.assertEquals(birthDate.get(Calendar.MONTH) + 1, 8); + Assert.assertEquals(birthDate.get(Calendar.DAY_OF_MONTH), 6); + } - date = (Calendar) node.getMetaData().getCreationDate().clone(); - date.add(Calendar.DAY_OF_YEAR, 1); - criteria = JCRCriteriaFactory.createCriteria().setWorkspace( - ContentRepository.WEBSITE).setBasePath("/pets").add( - Restrictions.isNotNull("@petType")).add( - Restrictions.eq("@title", "Leo")); - criteria.add(Restrictions.lt("MetaData/@mgnl:creationdate", date)); - iterator = criteria.execute().getItems(); - Assert.assertTrue(iterator.hasNext()); - node = iterator.next(); - Assert.assertEquals(node.getTitle(), "Leo"); + /** + * Tests multiple ordering, playing on the fact that the two oldests pets are born on the same date but have + * different name. + * @throws Exception + */ + @Test + public void testAddOrderMultiple() throws Exception + { + Criteria criteria; + ResultIterator<AdvancedResultItem> iterator; - date = (Calendar) node.getMetaData().getCreationDate().clone(); - date.add(Calendar.HOUR, 1); - criteria = JCRCriteriaFactory.createCriteria().setWorkspace( - ContentRepository.WEBSITE).setBasePath("/pets").add( - Restrictions.isNotNull("@petType")).add( - Restrictions.eq("@title", "Leo")); - criteria.add(Restrictions.lt("MetaData/@mgnl:creationdate", date)); - iterator = criteria.execute().getItems(); - Assert.assertTrue(iterator.hasNext()); - node = iterator.next(); - Assert.assertEquals(node.getTitle(), "Leo"); - } + // order by @birthDate ascending, @title ascending + criteria = JCRCriteriaFactory + .createCriteria() + .setWorkspace(ContentRepository.WEBSITE) + .setBasePath("/pets") + .add(Restrictions.isNotNull("@petType")) + .addOrder(Order.asc("@birthDate")) + .addOrder(Order.asc("@title")); + iterator = criteria.execute().getItems(); + // ----- 8 (title=Max, petType=cat, birthDate=1995-09-04) + // ----- 7 (title=Samantha, petType=cat, birthDate=1995-09-04) + Assert.assertTrue(iterator.hasNext()); + Assert.assertEquals(iterator.next().getTitle(), "Max"); + Assert.assertTrue(iterator.hasNext()); + Assert.assertEquals(iterator.next().getTitle(), "Samantha"); + + // order by @birthDate ascending, @title descending + criteria = JCRCriteriaFactory + .createCriteria() + .setWorkspace(ContentRepository.WEBSITE) + .setBasePath("/pets") + .add(Restrictions.isNotNull("@petType")) + .addOrder(Order.asc("@birthDate")) + .addOrder(Order.desc("@title")); + iterator = criteria.execute().getItems(); + // ----- 7 (title=Samantha, petType=cat, birthDate=1995-09-04) + // ----- 8 (title=Max, petType=cat, birthDate=1995-09-04) + Assert.assertTrue(iterator.hasNext()); + Assert.assertEquals(iterator.next().getTitle(), "Samantha"); + Assert.assertTrue(iterator.hasNext()); + Assert.assertEquals(iterator.next().getTitle(), "Max"); + } + + @Test + public void testDateComparison() throws Exception + { + Criteria criteria; + ResultIterator<AdvancedResultItem> iterator; + Content node; + Calendar date; + + criteria = JCRCriteriaFactory + .createCriteria() + .setWorkspace(ContentRepository.WEBSITE) + .setBasePath("/pets") + .add(Restrictions.isNotNull("@petType")) + .add(Restrictions.eq("@title", "Leo")); + iterator = criteria.execute().getItems(); + Assert.assertTrue(iterator.hasNext()); + node = iterator.next(); + Assert.assertEquals(node.getTitle(), "Leo"); + + date = (Calendar) node.getMetaData().getCreationDate().clone(); + date.add(Calendar.DAY_OF_YEAR, 1); + criteria = JCRCriteriaFactory + .createCriteria() + .setWorkspace(ContentRepository.WEBSITE) + .setBasePath("/pets") + .add(Restrictions.isNotNull("@petType")) + .add(Restrictions.eq("@title", "Leo")); + criteria.add(Restrictions.lt("MetaData/@mgnl:creationdate", date)); + iterator = criteria.execute().getItems(); + Assert.assertTrue(iterator.hasNext()); + node = iterator.next(); + Assert.assertEquals(node.getTitle(), "Leo"); + + date = (Calendar) node.getMetaData().getCreationDate().clone(); + date.add(Calendar.HOUR, 1); + criteria = JCRCriteriaFactory + .createCriteria() + .setWorkspace(ContentRepository.WEBSITE) + .setBasePath("/pets") + .add(Restrictions.isNotNull("@petType")) + .add(Restrictions.eq("@title", "Leo")); + criteria.add(Restrictions.lt("MetaData/@mgnl:creationdate", date)); + iterator = criteria.execute().getItems(); + Assert.assertTrue(iterator.hasNext()); + node = iterator.next(); + Assert.assertEquals(node.getTitle(), "Leo"); + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |