r3068 - in trunk: topia-it/src/test/java/org/nuiton/topia/persistence/internal topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/support
Author: athimel Date: 2014-04-16 10:22:06 +0200 (Wed, 16 Apr 2014) New Revision: 3068 Url: http://forge.nuiton.org/projects/topia/repository/revisions/3068 Log: fixes #3153 Fix possible NPE Modified: trunk/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaDaoTest.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/support/TopiaHibernateEventListener.java Modified: trunk/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaDaoTest.java =================================================================== --- trunk/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaDaoTest.java 2014-04-15 15:54:37 UTC (rev 3067) +++ trunk/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaDaoTest.java 2014-04-16 08:22:06 UTC (rev 3068) @@ -37,6 +37,7 @@ import org.nuiton.topia.it.legacy.test.entities.Person; import org.nuiton.topia.it.legacy.test.entities.PersonTopiaDao; +import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.nuiton.topia.persistence.TopiaDao; @@ -209,4 +210,19 @@ protected Person createPerson(String name) throws TopiaException { return dao.create(Person.PROPERTY_NAME, name); } + + @Test // Test to avoid NPE during update(...) on non persisted entity (see http://nuiton.org/issues/3153) + public void findUpdateNonPersistedEntity() throws TopiaException { + + Person person = dao.newInstance(); + person.setName("whatever"); + + Assert.assertFalse(person.isPersisted()); + + dao.update(person); + + Assert.assertTrue(person.isPersisted()); + Assert.assertTrue(!Strings.isNullOrEmpty(person.getTopiaId())); + } + } Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/support/TopiaHibernateEventListener.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/support/TopiaHibernateEventListener.java 2014-04-15 15:54:37 UTC (rev 3067) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/support/TopiaHibernateEventListener.java 2014-04-16 08:22:06 UTC (rev 3068) @@ -57,6 +57,7 @@ import org.nuiton.topia.persistence.TopiaEntityContextable; import com.google.common.base.Preconditions; +import com.google.common.base.Strings; /** * @author Arnaud Thimel : thimel@codelutin.com @@ -235,9 +236,19 @@ if (log.isDebugEnabled()) { log.debug("Adding topiaId into entity " + entity.getClass()); } + + // TopiaIdFactory#newTopiaId only requires interface. First get the entity class name. + String entityClassName = event.getEntityName(); + // event.getEntityName() may be null in case .update(...) method is called on a new (not yet persisted) entity (see http://nuiton.org/issues/3153) + if (Strings.isNullOrEmpty(entityClassName)) { + entityClassName = entity.getClass().getName(); + } + + // Then extract interface name // FIXME echatellier 20130713 : hack to find interface for current entity class - // #newTopiaId only accept interface - Class entityInterface = Class.forName(event.getEntityName().replace("Impl", "")); + Class entityInterface = Class.forName(entityClassName.replace("Impl", "")); + + // Generate topiaId String topiaId = context.getTopiaIdFactory().newTopiaId(entityInterface, entity); entity.setTopiaId(topiaId); }
participants (1)
-
athimelï¼ users.nuiton.org