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. |