Author: athimel Date: 2012-06-01 18:02:06 +0200 (Fri, 01 Jun 2012) New Revision: 2574 Url: http://nuiton.org/repositories/revision/topia/2574 Log: fixes #2119 for ToPIA3 : Add TopiaContext#findUnique and its tests Added: trunk/topia-persistence-tck/src/test/java/org/nuiton/topia/tck/it/persistence/TopiaContextFindTest.java Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaContext.java trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaPersistenceException.java Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaContext.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaContext.java 2012-06-01 15:53:41 UTC (rev 2573) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaContext.java 2012-06-01 16:02:06 UTC (rev 2574) @@ -37,6 +37,7 @@ import org.nuiton.topia.framework.TopiaSQLWork; import org.nuiton.topia.framework.TopiaService; import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.TopiaPersistenceException; import java.beans.PropertyChangeListener; import java.io.File; @@ -388,6 +389,25 @@ throws TopiaException; /** + * Allow to do some JPA-QL query and return an unique result. If nothing if + * found by the query, will return null. If more than one result is found, + * will throw an exception. + * <p/> + * WARNING : Depending on the registered service, this method may not + * support something else than queries on TopiaEntity + * + * @param jpaql the JPA-QL query to execute + * @param paramNamesAndValues an array of query parameters based on + * [key,value,key,value,...] + * @return The result instance or null + * @throws TopiaException for any error during querying + * @throws TopiaPersistenceException if the the query returns more than one + * result. + */ + Object findUnique(String jpaql, Object... paramNamesAndValues) + throws TopiaException; + + /** * Execute JPA-QL operation on data (Update, Delete). * * @param jpaql the JPA-QL query to execute Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java 2012-06-01 15:53:41 UTC (rev 2573) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java 2012-06-01 16:02:06 UTC (rev 2574) @@ -42,6 +42,7 @@ import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaContextFactory; import org.nuiton.topia.TopiaContextIllegalStateException; +import org.nuiton.topia.TopiaException; import org.nuiton.topia.TopiaImportExportException; import org.nuiton.topia.TopiaMisconfigurationException; import org.nuiton.topia.TopiaNotFoundException; @@ -889,8 +890,7 @@ } @Override - public List<?> find(String jpaql, int startIndex, int endIndex, Object... paramNamesAndValues) - { + public List<?> find(String jpaql, int startIndex, int endIndex, Object... paramNamesAndValues) { checkClosed("find"); try { @@ -920,6 +920,27 @@ } @Override + public Object findUnique(String jpaql, Object... paramNamesAndValues) { + checkClosed("findUnique"); + + List<?> results = find(jpaql, 0, 1, paramNamesAndValues); + + // If there is more than 1 result, throw an exception + if (results.size() > 1) { + String message = String.format( + "Query '%s' returns more than 1 unique result", jpaql); + throw new TopiaPersistenceException(message); + } + + // otherwise return the first one, or null + Object result = null; + if (!results.isEmpty()) { + result = results.get(0); + } + return result; + } + + @Override public int execute(String jpaql, Object... paramNamesAndValues) { checkClosed("execute"); Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaPersistenceException.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaPersistenceException.java 2012-06-01 15:53:41 UTC (rev 2573) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaPersistenceException.java 2012-06-01 16:02:06 UTC (rev 2574) @@ -38,6 +38,10 @@ private static final long serialVersionUID = 7431698657423221049L; + public TopiaPersistenceException(String message) { + super(message); + } + public TopiaPersistenceException(String message, PersistenceException cause) { super(message, cause); } Added: trunk/topia-persistence-tck/src/test/java/org/nuiton/topia/tck/it/persistence/TopiaContextFindTest.java =================================================================== --- trunk/topia-persistence-tck/src/test/java/org/nuiton/topia/tck/it/persistence/TopiaContextFindTest.java (rev 0) +++ trunk/topia-persistence-tck/src/test/java/org/nuiton/topia/tck/it/persistence/TopiaContextFindTest.java 2012-06-01 16:02:06 UTC (rev 2574) @@ -0,0 +1,162 @@ +/* + * #%L + * ToPIA :: Persistence :: Test Compatibility Kit + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2004 - 2012 CodeLutin + * %% + * This program 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 3 of the + * License, or (at your option) any later version. + * + * This program 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 General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * #L% + */ +package org.nuiton.topia.tck.it.persistence; + +import junit.framework.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.nuiton.topia.TopiaContext; +import org.nuiton.topia.persistence.TopiaPersistenceException; +import org.nuiton.topia.tck.TopiaDatabase; +import org.nuiton.topia.tck.it.Address; +import org.nuiton.topia.tck.it.AddressDAO; +import org.nuiton.topia.tck.it.Gender; +import org.nuiton.topia.tck.it.Personne; +import org.nuiton.topia.tck.it.PersonneDAO; +import org.nuiton.topia.tck.it.TopiaDatabaseIt; +import org.nuiton.topia.tck.it.TopiaTckItDAOHelper; + +import java.util.List; + +/** + * Tests the TopiaContext#find|findAll|findUnique methods + * + * @author Arnaud Thimel <thimel@codelutin.com> + */ +public class TopiaContextFindTest { + + @Rule + public final TopiaDatabase db = new TopiaDatabaseIt(); + + protected TopiaContext context; + protected AddressDAO addressDAO; + protected PersonneDAO personneDAO; + protected Address address; + + @Before + public void createCompanies() { + context = db.beginTransaction(); + personneDAO = TopiaTckItDAOHelper.getPersonneDAO(context); + addressDAO = TopiaTckItDAOHelper.getAddressDAO(context); + + address = addressDAO.create( + Address.PROPERTY_ADRESS, "17 rue de la Pote Gellée, 44200 NANTES"); + + personneDAO.create( + Personne.PROPERTY_NAME, "Arnaud", + Personne.PROPERTY_GENDER, Gender.MALE); + personneDAO.create( + Personne.PROPERTY_NAME, "Charlotte", + Personne.PROPERTY_GENDER, Gender.FEMALE); + personneDAO.create( + Personne.PROPERTY_NAME, "Hortense", + Personne.PROPERTY_GENDER, Gender.FEMALE); + context.commitTransaction(); + } + + @Test + public void testFindDAO() { + Assert.assertEquals(3, personneDAO.count()); + + Assert.assertEquals(2, personneDAO.findAllByGender(Gender.FEMALE).size()); + Assert.assertNotNull(personneDAO.findByGender(Gender.FEMALE)); + Assert.assertNotNull(personneDAO.findByGender(Gender.MALE)); + Assert.assertNull(personneDAO.findByGender(null)); + + Assert.assertEquals(0, personneDAO.findAllByName("nobody").size()); + } + + @Test + public void testFindAll() { + Assert.assertEquals(3, personneDAO.count()); + + String query = "from " + Personne.class.getName() + + " where " + Personne.PROPERTY_GENDER + "=:g"; + + List females = context.findAll(query, "g", Gender.FEMALE); + Assert.assertEquals(2, females.size()); + + List males = context.findAll(query, "g", Gender.MALE); + Assert.assertEquals(1, males.size()); + + List all = context.findAll("from " + Personne.class.getName()); + Assert.assertEquals(3, all.size()); + + List none = context.findAll("from " + Personne.class.getName() + + " where " + Personne.PROPERTY_NAME + "=:pax", "pax", "nobody"); + Assert.assertEquals(0, none.size()); + } + + @Test + public void testFind() { + Assert.assertEquals(3, personneDAO.count()); + + String query = "from " + Personne.class.getName() + + " where " + Personne.PROPERTY_GENDER + "=:g"; + + List females = context.find(query, 0, 100, "g", Gender.FEMALE); + Assert.assertEquals(2, females.size()); + + females = context.find(query, 0, 0, "g", Gender.FEMALE); + Assert.assertEquals(1, females.size()); + Personne charlotte = (Personne)females.get(0); + + females = context.find(query, 1, 1, "g", Gender.FEMALE); + Assert.assertEquals(1, females.size()); + Personne hortense = (Personne)females.get(0); + + Assert.assertFalse(hortense.equals(charlotte)); + + females = context.find(query, 0, -1, "g", Gender.FEMALE); + Assert.assertEquals(2, females.size()); + } + + @Test + public void testFindUnique() { + Assert.assertEquals(3, personneDAO.count()); + + String query = "from " + Personne.class.getName() + + " where " + Personne.PROPERTY_GENDER + "=:g"; + + Object male = context.findUnique(query, "g", Gender.MALE); + Assert.assertNotNull(male); + + Object none = context.findUnique("from " + Personne.class.getName() + + " where " + Personne.PROPERTY_NAME + "=:pax", "pax", "nobody"); + Assert.assertNull(none); + } + + @Test(expected = TopiaPersistenceException.class) + public void testFindUniqueOutOfBounds() { + Assert.assertEquals(3, personneDAO.count()); + + String query = "from " + Personne.class.getName() + + " where " + Personne.PROPERTY_GENDER + "=:g"; + + Object female = context.findUnique(query, "g", Gender.FEMALE); + Assert.assertNotNull(female); + } + +} Property changes on: trunk/topia-persistence-tck/src/test/java/org/nuiton/topia/tck/it/persistence/TopiaContextFindTest.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native