Author: bleny Date: 2013-11-15 10:57:02 +0100 (Fri, 15 Nov 2013) New Revision: 2874 Url: http://nuiton.org/projects/topia/repository/revisions/2874 Log: fixes #2896 introduce TopiaNoResultException and TopiaNonUniqueResultException Added: trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaNoResultException.java trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaNonUniqueResultException.java trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaQueryException.java Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDao.java Added: trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaNoResultException.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaNoResultException.java (rev 0) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaNoResultException.java 2013-11-15 09:57:02 UTC (rev 2874) @@ -0,0 +1,16 @@ +package org.nuiton.topia; + +import java.util.Map; + +/** + * Exception raised when a query returned no result while at least one + * result was expected. + * + * @since 3.0 + */ +public class TopiaNoResultException extends TopiaQueryException { + + public TopiaNoResultException(String hql, Map<String, Object> hqlParameters) { + super("given query doesn't returns any result (at least one expected)", hql, hqlParameters); + } +} Added: trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaNonUniqueResultException.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaNonUniqueResultException.java (rev 0) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaNonUniqueResultException.java 2013-11-15 09:57:02 UTC (rev 2874) @@ -0,0 +1,17 @@ +package org.nuiton.topia; + +import java.util.Map; + +/** + * Exception raised when a query returns more than one result while it was + * expected to return only one (or no result). + * + * @since 3.0 + */ +public class TopiaNonUniqueResultException extends TopiaQueryException { + + public TopiaNonUniqueResultException(String hql, Map<String, Object> hqlParameters) { + super("given query returns more than one result", hql, hqlParameters); + } + +} Added: trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaQueryException.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaQueryException.java (rev 0) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaQueryException.java 2013-11-15 09:57:02 UTC (rev 2874) @@ -0,0 +1,54 @@ +package org.nuiton.topia; + +import java.util.Map; + +/** + * Exception raised when an error occur in the context of a + * particular query. Catching this exception class allow you + * to get the buggy request and its parameters. + * + * When cathing such an exception you may ease development by + * logging all the provided information given by {@link #getHql()} + * and {@link #getHqlParameters()} but it's considered dangerous + * since parameters can contain sensible data (such as passwords) + * that should not be printed anywhere. + * + * @since 3.0 + */ +public class TopiaQueryException extends TopiaException { + + protected String hql; + + protected Map<String, Object> hqlParameters; + + public TopiaQueryException(String hql, Map<String, Object> hqlParameters) { + this.hql = hql; + this.hqlParameters = hqlParameters; + } + + public TopiaQueryException(String message, String hql, Map<String, Object> hqlParameters) { + super(message); + this.hql = hql; + this.hqlParameters = hqlParameters; + } + + public TopiaQueryException(String message, Throwable cause, String hql, Map<String, Object> hqlParameters) { + super(message, cause); + this.hql = hql; + this.hqlParameters = hqlParameters; + } + + public TopiaQueryException(Throwable cause, String hql, Map<String, Object> hqlParameters) { + super(cause); + this.hql = hql; + this.hqlParameters = hqlParameters; + } + + public String getHql() { + return hql; + } + + public Map<String, Object> getHqlParameters() { + return hqlParameters; + } +} Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDao.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDao.java 2013-11-15 09:54:20 UTC (rev 2873) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDao.java 2013-11-15 09:57:02 UTC (rev 2874) @@ -52,6 +52,8 @@ import org.nuiton.topia.TopiaHibernateSupport; import org.nuiton.topia.TopiaJpaSupport; import org.nuiton.topia.TopiaListenableSupport; +import org.nuiton.topia.TopiaNoResultException; +import org.nuiton.topia.TopiaNonUniqueResultException; import org.nuiton.topia.TopiaSqlSupport; import org.nuiton.topia.event.TopiaEntityListener; import org.nuiton.topia.event.TopiaEntityVetoable; @@ -459,8 +461,7 @@ protected <R> R findUnique(String hql, Map<String, Object> hqlParameters, Class<R> type) { R result = findUniqueOrNull(hql, hqlParameters, type); if (result == null) { - // TODO brendan 30/09/13 throw another exception if no result - throw new TopiaException("query " + hql + " returns no elements"); + throw new TopiaNoResultException(hql, hqlParameters); } return result; } @@ -475,10 +476,7 @@ List<R> results = findAll(hql, hqlParameters, type, 0, 1); // If there is more than 1 result, throw an exception if (results.size() > 1) { - String message = String.format( - "The query '%s' returns more than 1 unique result", hql); - // TODO AThimel 02/08/13 Throw another exception if more than 1 result is found - throw new TopiaException(message); + throw new TopiaNonUniqueResultException(hql, hqlParameters); } // otherwise return the first one, or null R result = Iterables.getOnlyElement(results, null); @@ -488,8 +486,7 @@ protected <R> R findFirst(String hql, Map<String, Object> hqlParameters, Class<R> type) { R result = findFirstOrNull(hql, hqlParameters, type); if (result == null) { - // TODO brendan 30/09/13 throw another exception if no result - throw new TopiaException("query " + hql + " returns no elements"); + throw new TopiaNoResultException(hql, hqlParameters); } return result; } @@ -509,8 +506,7 @@ protected <R> R findAny(String hql, Map<String, Object> hqlParameters, Class<R> type) { R result = findAnyOrNull(hql, hqlParameters, type); if (result == null) { - // TODO brendan 30/09/13 throw another exception if no result - throw new TopiaException(String.format("Query '%s' returns no elements", hql)); + throw new TopiaNoResultException(hql, hqlParameters); } return result; } @@ -803,18 +799,36 @@ } @Override + public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addNotEquals(String property, Object value) { + hqlAndParametersBuilder.addNotEquals(property, value); + return this; + } + + @Override public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addIn(String property, Iterable<Object> values) { hqlAndParametersBuilder.addIn(property, values); return this; } @Override + public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addNotIn(String property, Iterable<Object> values) { + hqlAndParametersBuilder.addNotIn(property, values); + return this; + } + + @Override public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addContains(String property, Object value) { hqlAndParametersBuilder.addContains(property, value); return this; } @Override + public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addNotContains(String property, Object value) { + hqlAndParametersBuilder.addNotContains(property, value); + return this; + } + + @Override public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addNull(String property) { hqlAndParametersBuilder.addNull(property); return this;