From 393d3e2000086da4333c1a20031256030ebc6f0e Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 12 Apr 2012 09:35:53 +0200 Subject: [PATCH] DATAJPA-189, DATAJPA-190 - Improvements to MergingPersistenceUnitManager. MergingPersistenceUnitManager now also merges mapping file locations. We also make sure now that the persistence unit root URL does not get added twice accidentally as some persistence providers refuse to work then. --- .../MergingPersistenceUnitManager.java | 28 +++++++--- ...ergingPersistenceUnitManagerUnitTests.java | 54 +++++++++++++++++-- .../data/jpa/support/persistence.xml | 1 + .../data/jpa/support/persistence2.xml | 1 + 4 files changed, 73 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/springframework/data/jpa/support/MergingPersistenceUnitManager.java b/src/main/java/org/springframework/data/jpa/support/MergingPersistenceUnitManager.java index eae8cc1db..cab20a70d 100644 --- a/src/main/java/org/springframework/data/jpa/support/MergingPersistenceUnitManager.java +++ b/src/main/java/org/springframework/data/jpa/support/MergingPersistenceUnitManager.java @@ -61,29 +61,45 @@ public class MergingPersistenceUnitManager extends DefaultPersistenceUnitManager * (non-Javadoc) * @see org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager#isPersistenceUnitOverrideAllowed() */ + @Override protected boolean isPersistenceUnitOverrideAllowed() { return true; } void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui, PersistenceUnitInfo oldPui) { - for (URL url : oldPui.getJarFileUrls()) { + String persistenceUnitName = pui.getPersistenceUnitName(); - // Add jar file url to PUI + for (URL url : oldPui.getJarFileUrls()) { if (!pui.getJarFileUrls().contains(url)) { - log.debug("Adding {} to persistence units", url); + log.debug("Adding JAR file URL {} to persistence unit {}.", url, persistenceUnitName); pui.addJarFileUrl(url); } } for (String className : oldPui.getManagedClassNames()) { - if (!pui.getManagedClassNames().contains(className)) { - log.debug("Adding class {} to PersistenceUnit {}", className, pui.getPersistenceUnitName()); + log.debug("Adding class {} to PersistenceUnit {}", className, persistenceUnitName); pui.addManagedClassName(className); } } - pui.addJarFileUrl(oldPui.getPersistenceUnitRootUrl()); + for (String mappingFileName : oldPui.getMappingFileNames()) { + if (!pui.getMappingFileNames().contains(mappingFileName)) { + log.debug("Adding mapping file to persistence unit {}.", mappingFileName, persistenceUnitName); + pui.addMappingFileName(mappingFileName); + } + } + + URL newUrl = pui.getPersistenceUnitRootUrl(); + URL oldUrl = oldPui.getPersistenceUnitRootUrl(); + + boolean hasNewRootUrl = newUrl != null; + boolean rootUrlsDiffer = hasNewRootUrl && !newUrl.equals(oldUrl); + boolean urlNotInJarUrls = hasNewRootUrl && !pui.getJarFileUrls().contains(oldUrl); + + if (hasNewRootUrl && rootUrlsDiffer && urlNotInJarUrls) { + pui.addJarFileUrl(oldUrl); + } } } diff --git a/src/test/java/org/springframework/data/jpa/support/MergingPersistenceUnitManagerUnitTests.java b/src/test/java/org/springframework/data/jpa/support/MergingPersistenceUnitManagerUnitTests.java index 30529be67..6ac893ef8 100644 --- a/src/test/java/org/springframework/data/jpa/support/MergingPersistenceUnitManagerUnitTests.java +++ b/src/test/java/org/springframework/data/jpa/support/MergingPersistenceUnitManagerUnitTests.java @@ -25,7 +25,6 @@ import java.util.Arrays; import javax.persistence.spi.PersistenceUnitInfo; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -59,11 +58,7 @@ public class MergingPersistenceUnitManagerUnitTests { verify(newInfo).addJarFileUrl(jarFileUrl); } - /** - * @FIXME - Reactivate as soon as Spring 3.1.1 gets released - */ @Test - @Ignore public void mergesManagedClassesCorrectly() { MergingPersistenceUnitManager manager = new MergingPersistenceUnitManager(); @@ -74,5 +69,54 @@ public class MergingPersistenceUnitManagerUnitTests { PersistenceUnitInfo info = manager.obtainPersistenceUnitInfo("pu"); assertThat(info.getManagedClassNames().size(), is(2)); assertThat(info.getManagedClassNames(), hasItems(User.class.getName(), Role.class.getName())); + + assertThat(info.getMappingFileNames().size(), is(2)); + assertThat(info.getMappingFileNames(), hasItems("foo.xml", "bar.xml")); + + System.out.println(info.getPersistenceUnitRootUrl()); + } + + @Test + public void addsOldPersistenceUnitRootUrlIfDifferentFromNewOne() throws MalformedURLException { + + MutablePersistenceUnitInfo newInfo = new MutablePersistenceUnitInfo(); + newInfo.setPersistenceUnitRootUrl(new URL("file:bar")); + + when(oldInfo.getPersistenceUnitRootUrl()).thenReturn(new URL("file:/foo")); + + MergingPersistenceUnitManager manager = new MergingPersistenceUnitManager(); + manager.postProcessPersistenceUnitInfo(newInfo, oldInfo); + + assertThat(newInfo.getJarFileUrls().size(), is(1)); + assertThat(newInfo.getJarFileUrls(), hasItems(oldInfo.getPersistenceUnitRootUrl())); + } + + @Test + public void doesNotAddNewPuRootUrlIfNull() throws MalformedURLException { + + MutablePersistenceUnitInfo newInfo = new MutablePersistenceUnitInfo(); + + when(oldInfo.getPersistenceUnitRootUrl()).thenReturn(new URL("file:/foo")); + + MergingPersistenceUnitManager manager = new MergingPersistenceUnitManager(); + manager.postProcessPersistenceUnitInfo(newInfo, oldInfo); + + assertThat(newInfo.getJarFileUrls().isEmpty(), is(true)); + } + + @Test + public void doesNotAddNewPuRootUrlIfAlreadyOnTheListOfJarFileUrls() throws MalformedURLException { + + when(oldInfo.getPersistenceUnitRootUrl()).thenReturn(new URL("file:foo")); + + MutablePersistenceUnitInfo newInfo = new MutablePersistenceUnitInfo(); + newInfo.setPersistenceUnitRootUrl(new URL("file:bar")); + newInfo.addJarFileUrl(oldInfo.getPersistenceUnitRootUrl()); + + MergingPersistenceUnitManager manager = new MergingPersistenceUnitManager(); + manager.postProcessPersistenceUnitInfo(newInfo, oldInfo); + + assertThat(newInfo.getJarFileUrls().size(), is(1)); + assertThat(newInfo.getJarFileUrls(), hasItems(oldInfo.getPersistenceUnitRootUrl())); } } diff --git a/src/test/resources/org/springframework/data/jpa/support/persistence.xml b/src/test/resources/org/springframework/data/jpa/support/persistence.xml index 230d4bb2a..652dfa4de 100644 --- a/src/test/resources/org/springframework/data/jpa/support/persistence.xml +++ b/src/test/resources/org/springframework/data/jpa/support/persistence.xml @@ -1,6 +1,7 @@ + foo.xml org.springframework.data.jpa.domain.sample.User diff --git a/src/test/resources/org/springframework/data/jpa/support/persistence2.xml b/src/test/resources/org/springframework/data/jpa/support/persistence2.xml index 756e2aa4a..b954da49f 100644 --- a/src/test/resources/org/springframework/data/jpa/support/persistence2.xml +++ b/src/test/resources/org/springframework/data/jpa/support/persistence2.xml @@ -1,6 +1,7 @@ + bar.xml org.springframework.data.jpa.domain.sample.Role