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