From: <gca...@us...> - 2012-06-22 15:52:01
|
Revision: 4070 http://openutils.svn.sourceforge.net/openutils/?rev=4070&view=rev Author: gcatania Date: 2012-06-22 15:51:52 +0000 (Fri, 22 Jun 2012) Log Message: ----------- BSHD-15 fix example support for backref properties, added unit test Modified Paths: -------------- trunk/openutils-bshd5/src/main/java/it/openutils/hibernate/example/ExampleTree.java trunk/openutils-bshd5/src/test/java/it/openutils/hibernate/test/HibernateDAOPersistenceTest.java Modified: trunk/openutils-bshd5/src/main/java/it/openutils/hibernate/example/ExampleTree.java =================================================================== --- trunk/openutils-bshd5/src/main/java/it/openutils/hibernate/example/ExampleTree.java 2012-06-22 11:17:21 UTC (rev 4069) +++ trunk/openutils-bshd5/src/main/java/it/openutils/hibernate/example/ExampleTree.java 2012-06-22 15:51:52 UTC (rev 4070) @@ -50,6 +50,7 @@ import org.hibernate.criterion.Restrictions; import org.hibernate.engine.SessionImplementor; import org.hibernate.metadata.ClassMetadata; +import org.hibernate.property.BackrefPropertyAccessor; import org.hibernate.type.Type; @@ -68,8 +69,6 @@ private PropertySelector selector; - private DefaultPropertySelector defaultSelector = DefaultPropertySelector.NOT_NULL; - private MatchMode matchMode; private boolean isIgnoreCaseEnabled; @@ -132,8 +131,11 @@ */ public ExampleTree setPropertySelector(PropertySelector selector) { - this.selector = selector; - defaultSelector = null; + if (selector == null) + { + throw new NullPointerException("Null selector specified"); + } + this.selector = new ExcludeBackrefPropertySelector(selector); // BSHD-15 return this; } @@ -143,7 +145,7 @@ */ public ExampleTree excludeZeroes() { - return setDefaultSelector(DefaultPropertySelector.NOT_NULL_OR_ZERO); + return setPropertySelector(ExampleTreePropertySelectorSupport.NOT_NULL_OR_ZERO); } /** @@ -152,7 +154,7 @@ */ public ExampleTree excludeNone() { - return setDefaultSelector(DefaultPropertySelector.ALL); + return setPropertySelector(ExampleTreePropertySelectorSupport.ALL); } /** @@ -235,17 +237,6 @@ return add(associationPath, override); } - private static enum DefaultPropertySelector { - NOT_NULL, NOT_NULL_OR_ZERO, ALL; - } - - private ExampleTree setDefaultSelector(DefaultPropertySelector defaultSelector) - { - this.defaultSelector = defaultSelector; - selector = null; - return this; - } - private class ExampleTreeWalker implements Serializable { @@ -351,24 +342,7 @@ { ex.ignoreCase(); } - if (selector != null) - { - ex.setPropertySelector(selector); - } - else - { - switch (defaultSelector) - { - case NOT_NULL_OR_ZERO : - ex.excludeZeroes(); - break; - case ALL : - ex.excludeNone(); - break; - default : - break; - } - } + ex.setPropertySelector(selector != null ? selector : new ExcludeBackrefPropertySelector()); // BSHD-15 Set<String> excludedPropertiesForPath = excludedProperties.get(associationPath); if (excludedPropertiesForPath != null) { @@ -472,3 +446,97 @@ } } + + +/** + * support for BSHD-15 + * @author gcatania + * @version $Id$ + */ +class ExcludeBackrefPropertySelector implements PropertySelector +{ + + private static final long serialVersionUID = -2803322309158823550L; + + private final PropertySelector selector; + + public ExcludeBackrefPropertySelector(PropertySelector selector) + { + this.selector = selector; + } + + public ExcludeBackrefPropertySelector() + { + selector = ExampleTreePropertySelectorSupport.NOT_NULL; + } + + public boolean include(Object propertyValue, String propertyName, Type type) + { + if (BackrefPropertyAccessor.UNKNOWN.equals(propertyValue)) + { + return false; + } + return selector.include(propertyValue, propertyName, type); + } + +} + + +/** + * workaround to {@link Example} not exposing internal property selectors + * @author gcatania + * @version $Id$ + */ +@SuppressWarnings({"serial", "static-method"}) +class ExampleTreePropertySelectorSupport +{ + + static final PropertySelector NOT_NULL = new NotNullPropertySelector(); + + static final PropertySelector ALL = new AllPropertySelector(); + + static final PropertySelector NOT_NULL_OR_ZERO = new NotNullOrZeroPropertySelector(); + + static final class AllPropertySelector implements PropertySelector + { + + public boolean include(Object object, String propertyName, Type type) + { + return true; + } + + private Object readResolve() + { + return ALL; + } + } + + static final class NotNullPropertySelector implements PropertySelector + { + + public boolean include(Object object, String propertyName, Type type) + { + return object != null; + } + + private Object readResolve() + { + return NOT_NULL; + } + } + + static final class NotNullOrZeroPropertySelector implements PropertySelector + { + + public boolean include(Object object, String propertyName, Type type) + { + return object != null && (!(object instanceof Number) || ((Number) object).longValue() != 0); + } + + private Object readResolve() + { + return NOT_NULL_OR_ZERO; + } + } + +} \ No newline at end of file Modified: trunk/openutils-bshd5/src/test/java/it/openutils/hibernate/test/HibernateDAOPersistenceTest.java =================================================================== --- trunk/openutils-bshd5/src/test/java/it/openutils/hibernate/test/HibernateDAOPersistenceTest.java 2012-06-22 11:17:21 UTC (rev 4069) +++ trunk/openutils-bshd5/src/test/java/it/openutils/hibernate/test/HibernateDAOPersistenceTest.java 2012-06-22 15:51:52 UTC (rev 4070) @@ -65,7 +65,7 @@ /* * TODO tests to perform: 1) find filtered with collection with zero, one or more elements 2) find filtered with - * additional criteria 3) filter metadata support 4) find filtered with id 5) find filtered with backref + * additional criteria 3) filter metadata support */ @Autowired @@ -221,7 +221,7 @@ Designer designer = priusDesigner(prius); personDAO.save(designer); - // FIXME evicting breaks the test, there must be something wrong in the hibernate mapping configuration + // evicting breaks equals() on persistent bags // personDAO.evict(designer); // cannot use load() with entity inheritance, see https://forum.hibernate.org/viewtopic.php?p=2418875 @@ -462,6 +462,44 @@ Assert.assertEquals(alicesProperties[1], alice.getBirthDate()); } + + /** + * BSHD-15 check backref property accessors + */ + @Test + public void testOneToMany() + { + 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); + + Car chucksPrius = chucksPrius(chuck(), prius(toyota())); + chucksPrius.setStickers(Collections.singletonList(st1)); + Long savedId = carDAO.save(chucksPrius); + chucksPrius = carDAO.load(savedId); + // evicting breaks equals() on persistent bags + // carDAO.evict(chucksPrius); + + Car filter = chucksPrius.clone(); + // filter.setOwner(null); + // filter.setModel(null); + filter.setStickers(null); + // filter.setRegistrationDate(null); + // filter.setMarketValue(null); + // filter.setId(null); + + Car found = carDAO.findFilteredFirst(filter); + Assert.assertEquals(found, chucksPrius); + + // found = carDAO.findFilteredFirst(chucksPrius); + // Assert.assertEquals(found, chucksPrius); + } + // @Test // public void testExampleAssociations() // { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |