|
From: <gca...@us...> - 2012-06-29 16:03:15
|
Revision: 4077
http://openutils.svn.sourceforge.net/openutils/?rev=4077&view=rev
Author: gcatania
Date: 2012-06-29 16:03:05 +0000 (Fri, 29 Jun 2012)
Log Message:
-----------
BSHD-2 adding tests for filter metadata, refactoring
Modified Paths:
--------------
trunk/openutils-bshd5/src/main/java/it/openutils/dao/hibernate/HibernateDAOImpl.java
trunk/openutils-bshd5/src/main/java/it/openutils/hibernate/example/FilterMetadataSupport.java
trunk/openutils-bshd5/src/test/java/it/openutils/hibernate/test/EntityBuilder.java
Added Paths:
-----------
trunk/openutils-bshd5/src/test/java/it/openutils/hibernate/test/HibernateDAOFilterMetadataTest.java
Modified: trunk/openutils-bshd5/src/main/java/it/openutils/dao/hibernate/HibernateDAOImpl.java
===================================================================
--- trunk/openutils-bshd5/src/main/java/it/openutils/dao/hibernate/HibernateDAOImpl.java 2012-06-29 15:10:22 UTC (rev 4076)
+++ trunk/openutils-bshd5/src/main/java/it/openutils/dao/hibernate/HibernateDAOImpl.java 2012-06-29 16:03:05 UTC (rev 4077)
@@ -38,7 +38,6 @@
import org.aopalliance.aop.AspectException;
import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Hibernate;
@@ -166,7 +165,7 @@
*/
public List<T> find(String query, Object paramValue, Type paramType)
{
- return getThis().find(query, new Object[]{paramValue }, new Type[]{paramType });
+ return getThis().find(query, new Object[]{paramValue}, new Type[]{paramType});
}
/**
@@ -723,7 +722,7 @@
* @author gcatania
*/
@SuppressWarnings("deprecation")
- private class LegacySupportCallback<R> extends ExampleTreeCallback<R>
+ private class LegacySupportCallback<R> extends BaseCallback<R>
{
private final T rootEntity;
@@ -740,7 +739,7 @@
List< ? extends Criterion> additionalCriteria,
Order... orders)
{
- super(new ExampleTree(rootEntity), maxResults, page, orders);
+ super(maxResults, page, orders);
this.rootEntity = rootEntity;
this.filterMetadata = metadata;
this.additionalCriteria = additionalCriteria;
@@ -749,11 +748,7 @@
@Override
protected Criteria createCriteria(Session session)
{
- Criteria crit = super.createCriteria(session);
- if (MapUtils.isNotEmpty(filterMetadata))
- {
- new FilterMetadataSupport(rootEntity, filterMetadata).appendTo(crit, session);
- }
+ Criteria crit = new FilterMetadataSupport(rootEntity, filterMetadata).create(session);
if (additionalCriteria != null)
{
for (Criterion c : additionalCriteria)
@@ -793,8 +788,12 @@
protected Criteria createCriteria(Session session)
{
Criteria crit = super.createCriteria(session);
- if (!CollectionUtils.isEmpty(properties))
+ if (CollectionUtils.isEmpty(properties))
{
+ crit.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
+ }
+ else
+ {
ProjectionList projectionList = Projections.projectionList();
for (String property : properties)
{
@@ -813,7 +812,7 @@
* @author gcatania
* @param R the result class
*/
-class ExampleTreeCallback<R> implements HibernateCallback<List<R>>
+abstract class BaseCallback<R> implements HibernateCallback<List<R>>
{
private final Order[] orders;
@@ -822,26 +821,23 @@
private final int page;
- private final ExampleTree exampleTree;
-
- protected ExampleTreeCallback(ExampleTree exampleTree, int maxResults, int page, Order... orders)
+ protected BaseCallback(int maxResults, int page, Order... orders)
{
- this.exampleTree = exampleTree;
this.maxResults = maxResults;
this.page = page;
this.orders = orders;
}
/**
- * internal method that creates the query criteria. Subclasses may override but should call {@code super()}
+ * internal method that creates the query criteria.
* @param session the hibernate session
* @return the hibernate criteria
*/
- protected Criteria createCriteria(Session session)
+ protected abstract Criteria createCriteria(Session session);
+
+ public final List<R> doInHibernate(Session session) throws HibernateException, SQLException
{
- Criteria crit = exampleTree.create(session);
-
- crit.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
+ Criteria crit = createCriteria(session);
crit.setMaxResults(maxResults);
crit.setFirstResult(maxResults * page);
if (orders != null)
@@ -851,13 +847,35 @@
crit.addOrder(o);
}
}
+ return crit.list();
+ }
+}
- return crit;
+
+/**
+ * @author gcatania
+ * @param R the result class
+ */
+class ExampleTreeCallback<R> extends BaseCallback<R>
+{
+
+ private final ExampleTree exampleTree;
+
+ protected ExampleTreeCallback(ExampleTree exampleTree, int maxResults, int page, Order... orders)
+ {
+ super(maxResults, page, orders);
+ this.exampleTree = exampleTree;
}
- public List<R> doInHibernate(Session session) throws HibernateException, SQLException
+ /**
+ * internal method that creates the query criteria. Subclasses may override.
+ * @param session the hibernate session
+ * @return the hibernate criteria
+ */
+ @Override
+ protected Criteria createCriteria(Session session)
{
- return createCriteria(session).list();
+ return exampleTree.create(session);
}
}
@@ -867,9 +885,12 @@
private final List<String> properties;
- protected ExampleTreePropertiesCallback(ExampleTree exampleTree, int maxResults, int page,
-
- List<String> properties, Order... orders)
+ protected ExampleTreePropertiesCallback(
+ ExampleTree exampleTree,
+ int maxResults,
+ int page,
+ List<String> properties,
+ Order... orders)
{
super(exampleTree, maxResults, page, orders);
this.properties = properties;
@@ -879,8 +900,12 @@
protected Criteria createCriteria(Session session)
{
Criteria crit = super.createCriteria(session);
- if (!CollectionUtils.isEmpty(properties))
+ if (CollectionUtils.isEmpty(properties))
{
+ crit.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
+ }
+ else
+ {
ProjectionList projectionList = Projections.projectionList();
for (String property : properties)
{
Modified: trunk/openutils-bshd5/src/main/java/it/openutils/hibernate/example/FilterMetadataSupport.java
===================================================================
--- trunk/openutils-bshd5/src/main/java/it/openutils/hibernate/example/FilterMetadataSupport.java 2012-06-29 15:10:22 UTC (rev 4076)
+++ trunk/openutils-bshd5/src/main/java/it/openutils/hibernate/example/FilterMetadataSupport.java 2012-06-29 16:03:05 UTC (rev 4077)
@@ -172,10 +172,12 @@
{
continue;
}
- String leftover = key.substring(path.length() + 1);
- // skip subproperties
+ // need to take into account leading dot for subproperties
+ int trimLength = path.isEmpty() ? 0 : path.length() + 1;
+ String leftover = key.substring(trimLength);
if (leftover.contains("."))
{
+ // skip subproperties
continue;
}
result.put(leftover, filterMetadata.get(key));
Modified: trunk/openutils-bshd5/src/test/java/it/openutils/hibernate/test/EntityBuilder.java
===================================================================
--- trunk/openutils-bshd5/src/test/java/it/openutils/hibernate/test/EntityBuilder.java 2012-06-29 15:10:22 UTC (rev 4076)
+++ trunk/openutils-bshd5/src/test/java/it/openutils/hibernate/test/EntityBuilder.java 2012-06-29 16:03:05 UTC (rev 4077)
@@ -105,6 +105,11 @@
return prius;
}
+ public static CarModel prius()
+ {
+ return prius(toyota());
+ }
+
public static Designer priusDesigner(CarModel prius)
{
FullName fullName = new FullName("Ken", "Shiro");
@@ -134,6 +139,11 @@
return bobsPrius;
}
+ public static Car bobsPrius()
+ {
+ return bobsPrius(bob(), prius());
+ }
+
public static Car chucksPrius(Owner chuck, CarModel prius)
{
Car chucksPrius = new Car();
Added: trunk/openutils-bshd5/src/test/java/it/openutils/hibernate/test/HibernateDAOFilterMetadataTest.java
===================================================================
--- trunk/openutils-bshd5/src/test/java/it/openutils/hibernate/test/HibernateDAOFilterMetadataTest.java (rev 0)
+++ trunk/openutils-bshd5/src/test/java/it/openutils/hibernate/test/HibernateDAOFilterMetadataTest.java 2012-06-29 16:03:05 UTC (rev 4077)
@@ -0,0 +1,155 @@
+/**
+ *
+ * openutils base Spring-Hibernate DAO (http://www.openmindlab.com/lab/products/bshd5.html)
+ *
+ * Copyright(C) 2005-2012, Openmind S.r.l. http://www.openmindonline.it
+ *
+ *
+ * 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; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl-2.1.html
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package it.openutils.hibernate.test;
+
+import static it.openutils.hibernate.test.EntityBuilder.bobsPrius;
+import static it.openutils.hibernate.test.EntityBuilder.chuck;
+import static it.openutils.hibernate.test.EntityBuilder.chucksPrius;
+import static it.openutils.hibernate.test.EntityBuilder.prius;
+import static it.openutils.hibernate.test.EntityBuilder.toyota;
+import it.openutils.hibernate.example.FilterMetadata;
+import it.openutils.hibernate.test.dao.CarDAO;
+import it.openutils.hibernate.test.dao.CarMakerDAO;
+import it.openutils.hibernate.test.dao.PersonDAO;
+import it.openutils.hibernate.test.dao.StickerDAO;
+import it.openutils.hibernate.test.model.Car;
+import it.openutils.hibernate.test.model.Sticker;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.hibernate.Criteria;
+import org.hibernate.criterion.Restrictions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+
+/**
+ * @author gcatania
+ */
+@SuppressWarnings("deprecation")
+@ContextConfiguration(locations = "/spring-tests.xml")
+public class HibernateDAOFilterMetadataTest extends AbstractTransactionalTestNGSpringContextTests
+{
+
+ @Autowired
+ private PersonDAO personDAO;
+
+ @Autowired
+ private CarMakerDAO carMakerDAO;
+
+ @Autowired
+ private CarDAO carDAO;
+
+ @Autowired
+ private StickerDAO stickerDAO;
+
+ @Test
+ public void testFindFilterMetadataBasic()
+ {
+ Sticker st1 = new Sticker();
+ st1.setName("Warning! Baby on board!");
+ st1.setHeight(20d);
+ st1.setWidth(10d);
+ Sticker st2 = new Sticker();
+ st2.setName("Objects in the mirror are losing");
+ st2.setHeight(5d);
+ st2.setWidth(10d);
+ Sticker st3 = new Sticker();
+ st3.setName("(tribal tattoo sticker)");
+ st3.setHeight(35d);
+ st3.setWidth(18d);
+
+ Car chucksPrius = chucksPrius(chuck(), prius(toyota()));
+ chucksPrius.setStickers(Arrays.asList(st1, st2, st3));
+ carDAO.save(chucksPrius);
+ carDAO.evict(chucksPrius);
+
+ FilterMetadata fm = new FilterMetadata()
+ {
+
+ public void createFilter(Criteria criteria, String propertyName, Object propertyValue)
+ {
+ criteria.add(Restrictions.gt(propertyName, 18d));
+ criteria.add(Restrictions.lt(propertyName, 22d));
+ }
+ };
+ List<Sticker> found = stickerDAO.findFiltered(new Sticker(), Collections.singletonMap("height", fm));
+ Assert.assertEquals(found.size(), 1);
+ Assert.assertEquals(found.get(0), st1);
+ }
+
+ @Test
+ public void testFindFilterMetadataOnChildProperty()
+ {
+ Sticker st1 = new Sticker();
+ st1.setName("Warning! Baby on board!");
+ st1.setHeight(20d);
+ st1.setWidth(10d);
+ Sticker st2 = new Sticker();
+ st2.setName("Objects in the mirror are losing");
+ st2.setHeight(5d);
+ st2.setWidth(10d);
+ Sticker st3 = new Sticker();
+ st3.setName("(tribal tattoo sticker)");
+ st3.setHeight(35d);
+ st3.setWidth(18d);
+
+ Car chucksPrius = chucksPrius(chuck(), prius(toyota()));
+ chucksPrius.setStickers(Arrays.asList(st1, st2, st3));
+
+ Car bobsPrius = bobsPrius();
+ bobsPrius.setStickers(Arrays.asList(st2.clone()));
+
+ carDAO.save(chucksPrius);
+ carDAO.evict(chucksPrius);
+ carDAO.save(bobsPrius);
+ carDAO.evict(bobsPrius);
+
+ FilterMetadata fm = new FilterMetadata()
+ {
+
+ public void createFilter(Criteria criteria, String propertyName, Object propertyValue)
+ {
+ criteria.add(Restrictions.gt(propertyName, 18d));
+ criteria.add(Restrictions.lt(propertyName, 22d));
+ }
+ };
+ Car filter = new Car();
+ filter.setStickers(Collections.singletonList(new Sticker()));
+ List<Car> found = carDAO.findFiltered(filter, Collections.singletonMap("stickers.height", fm));
+ Assert.assertEquals(found.size(), 1);
+ Car actual = found.get(0);
+ Assert.assertEquals(actual.getStickers().size(), 3);
+ // full fledged equality fails because of Object.equals() on PersistentBag
+ Assert.assertEquals(actual.getOwner().getName(), chucksPrius.getOwner().getName());
+ }
+
+}
Property changes on: trunk/openutils-bshd5/src/test/java/it/openutils/hibernate/test/HibernateDAOFilterMetadataTest.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: svn:keywords
+ Author Date Id Revision
Added: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|