diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/PersistenceUnitReader.java b/spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/PersistenceUnitReader.java index d2af772d348..433f775e28c 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/PersistenceUnitReader.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/PersistenceUnitReader.java @@ -21,6 +21,7 @@ import java.io.InputStream; import java.net.URL; import java.util.LinkedList; import java.util.List; + import javax.persistence.SharedCacheMode; import javax.persistence.ValidationMode; import javax.persistence.spi.PersistenceUnitTransactionType; @@ -34,7 +35,6 @@ import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; - import org.springframework.core.io.Resource; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.jdbc.datasource.lookup.DataSourceLookup; @@ -83,6 +83,8 @@ class PersistenceUnitReader { private static final String META_INF = "META-INF"; + private static final String VERSION_1 = "1.0"; + private final Log logger = LogFactory.getLog(getClass()); @@ -268,8 +270,14 @@ class PersistenceUnitReader { // exclude unlisted classes Element excludeUnlistedClasses = DomUtils.getChildElementByTagName(persistenceUnit, EXCLUDE_UNLISTED_CLASSES); - if (excludeUnlistedClasses != null) { - unitInfo.setExcludeUnlistedClasses(true); + if (excludeUnlistedClasses == null) { + // element is not defined, use default appropriate for version + unitInfo.setExcludeUnlistedClasses(!VERSION_1.equals(version)); + } + else { + String excludeText = DomUtils.getTextValue(excludeUnlistedClasses); + unitInfo.setExcludeUnlistedClasses(StringUtils.isEmpty(excludeText) || + Boolean.valueOf(excludeText)); } // set JPA 2.0 shared cache mode diff --git a/spring-orm/src/test/java/org/springframework/orm/jpa/persistence-exclude-1.0.xml b/spring-orm/src/test/java/org/springframework/orm/jpa/persistence-exclude-1.0.xml new file mode 100644 index 00000000000..6218437f289 --- /dev/null +++ b/spring-orm/src/test/java/org/springframework/orm/jpa/persistence-exclude-1.0.xml @@ -0,0 +1,20 @@ + + + + + + + + + + true + + + + false + + diff --git a/spring-orm/src/test/java/org/springframework/orm/jpa/persistence-exclude-2.0.xml b/spring-orm/src/test/java/org/springframework/orm/jpa/persistence-exclude-2.0.xml new file mode 100644 index 00000000000..6127bb6946f --- /dev/null +++ b/spring-orm/src/test/java/org/springframework/orm/jpa/persistence-exclude-2.0.xml @@ -0,0 +1,20 @@ + + + + + + + + + + true + + + + false + + diff --git a/spring-orm/src/test/java/org/springframework/orm/jpa/persistenceunit/PersistenceXmlParsingTests.java b/spring-orm/src/test/java/org/springframework/orm/jpa/persistenceunit/PersistenceXmlParsingTests.java index 496d9d641ac..a25ce237467 100644 --- a/spring-orm/src/test/java/org/springframework/orm/jpa/persistenceunit/PersistenceXmlParsingTests.java +++ b/spring-orm/src/test/java/org/springframework/orm/jpa/persistenceunit/PersistenceXmlParsingTests.java @@ -43,6 +43,7 @@ import static org.junit.Assert.*; * * @author Costin Leau * @author Juergen Hoeller + * @author Nicholas Williams */ public class PersistenceXmlParsingTests { @@ -60,6 +61,8 @@ public class PersistenceXmlParsingTests { assertEquals(2, info[0].getJarFileUrls().size()); assertEquals(new ClassPathResource("order.jar").getURL(), info[0].getJarFileUrls().get(0)); assertEquals(new ClassPathResource("order-supplemental.jar").getURL(), info[0].getJarFileUrls().get(1)); + + assertFalse("Exclude unlisted should default false in 1.0.", info[0].excludeUnlistedClasses()); } @Test @@ -72,6 +75,8 @@ public class PersistenceXmlParsingTests { assertNotNull(info); assertEquals(1, info.length); assertEquals("OrderManagement", info[0].getPersistenceUnitName()); + + assertFalse("Exclude unlisted should default false in 1.0.", info[0].excludeUnlistedClasses()); } @Test @@ -89,6 +94,8 @@ public class PersistenceXmlParsingTests { assertEquals(1, info[0].getMappingFileNames().size()); assertEquals("mappings.xml", info[0].getMappingFileNames().get(0)); assertEquals(0, info[0].getProperties().keySet().size()); + + assertFalse("Exclude unlisted should default false in 1.0.", info[0].excludeUnlistedClasses()); } @Test @@ -109,6 +116,8 @@ public class PersistenceXmlParsingTests { assertEquals(0, info[0].getProperties().keySet().size()); assertNull(info[0].getJtaDataSource()); assertNull(info[0].getNonJtaDataSource()); + + assertFalse("Exclude unlisted should default false in 1.0.", info[0].excludeUnlistedClasses()); } @Test @@ -134,7 +143,7 @@ public class PersistenceXmlParsingTests { assertEquals("com.acme.Customer", info[0].getManagedClassNames().get(1)); assertEquals("com.acme.Item", info[0].getManagedClassNames().get(2)); - assertTrue(info[0].excludeUnlistedClasses()); + assertTrue("Exclude unlisted should be true when no value.", info[0].excludeUnlistedClasses()); assertSame(PersistenceUnitTransactionType.RESOURCE_LOCAL, info[0].getTransactionType()); assertEquals(0, info[0].getProperties().keySet().size()); @@ -163,6 +172,8 @@ public class PersistenceXmlParsingTests { assertEquals("com.acme.AcmePersistence", info[0].getPersistenceProviderClassName()); assertEquals(0, info[0].getProperties().keySet().size()); + + assertFalse("Exclude unlisted should default false in 1.0.", info[0].excludeUnlistedClasses()); } @Test @@ -206,6 +217,8 @@ public class PersistenceXmlParsingTests { assertSame(ds, pu1.getJtaDataSource()); + assertFalse("Exclude unlisted should default false in 1.0.", pu1.excludeUnlistedClasses()); + PersistenceUnitInfo pu2 = info[1]; assertSame(PersistenceUnitTransactionType.JTA, pu2.getTransactionType()); @@ -222,6 +235,8 @@ public class PersistenceXmlParsingTests { assertNull(pu2.getJtaDataSource()); assertEquals(ds, pu2.getNonJtaDataSource()); + + assertTrue("Exclude unlisted should be true when no value.", pu2.excludeUnlistedClasses()); } @Test @@ -233,6 +248,8 @@ public class PersistenceXmlParsingTests { assertEquals(1, info.length); assertEquals("pu", info[0].getPersistenceUnitName()); assertEquals(0, info[0].getProperties().keySet().size()); + + assertFalse("Exclude unlisted should default false in 1.0.", info[0].excludeUnlistedClasses()); } @Ignore // not doing schema parsing anymore for JPA 2.0 compatibility @@ -290,4 +307,66 @@ public class PersistenceXmlParsingTests { assertTrue("the archive location should have been returned", archive.getURL().sameFile(url)); } + @Test + public void testJpa1ExcludeUnlisted() throws Exception { + PersistenceUnitReader reader = new PersistenceUnitReader( + new PathMatchingResourcePatternResolver(), new JndiDataSourceLookup()); + String resource = "/org/springframework/orm/jpa/persistence-exclude-1.0.xml"; + PersistenceUnitInfo[] info = reader.readPersistenceUnitInfos(resource); + + assertNotNull(info); + assertEquals("The number of persistence units is incorrect.", 4, info.length); + + PersistenceUnitInfo noExclude = info[0]; + assertNotNull("noExclude should not be null.", noExclude); + assertEquals("noExclude name is not correct.", "NoExcludeElement", noExclude.getPersistenceUnitName()); + assertFalse("Exclude unlisted should default false in 1.0.", noExclude.excludeUnlistedClasses()); + + PersistenceUnitInfo emptyExclude = info[1]; + assertNotNull("emptyExclude should not be null.", emptyExclude); + assertEquals("emptyExclude name is not correct.", "EmptyExcludeElement", emptyExclude.getPersistenceUnitName()); + assertTrue("emptyExclude should be true.", emptyExclude.excludeUnlistedClasses()); + + PersistenceUnitInfo trueExclude = info[2]; + assertNotNull("trueExclude should not be null.", trueExclude); + assertEquals("trueExclude name is not correct.", "TrueExcludeElement", trueExclude.getPersistenceUnitName()); + assertTrue("trueExclude should be true.", trueExclude.excludeUnlistedClasses()); + + PersistenceUnitInfo falseExclude = info[3]; + assertNotNull("falseExclude should not be null.", falseExclude); + assertEquals("falseExclude name is not correct.", "FalseExcludeElement", falseExclude.getPersistenceUnitName()); + assertFalse("falseExclude should be false.", falseExclude.excludeUnlistedClasses()); + } + + @Test + public void testJpa2ExcludeUnlisted() throws Exception { + PersistenceUnitReader reader = new PersistenceUnitReader( + new PathMatchingResourcePatternResolver(), new JndiDataSourceLookup()); + String resource = "/org/springframework/orm/jpa/persistence-exclude-2.0.xml"; + PersistenceUnitInfo[] info = reader.readPersistenceUnitInfos(resource); + + assertNotNull(info); + assertEquals("The number of persistence units is incorrect.", 4, info.length); + + PersistenceUnitInfo noExclude = info[0]; + assertNotNull("noExclude should not be null.", noExclude); + assertEquals("noExclude name is not correct.", "NoExcludeElement", noExclude.getPersistenceUnitName()); + assertTrue("Exclude unlisted should default true in 2.0.", noExclude.excludeUnlistedClasses()); + + PersistenceUnitInfo emptyExclude = info[1]; + assertNotNull("emptyExclude should not be null.", emptyExclude); + assertEquals("emptyExclude name is not correct.", "EmptyExcludeElement", emptyExclude.getPersistenceUnitName()); + assertTrue("emptyExclude should be true.", emptyExclude.excludeUnlistedClasses()); + + PersistenceUnitInfo trueExclude = info[2]; + assertNotNull("trueExclude should not be null.", trueExclude); + assertEquals("trueExclude name is not correct.", "TrueExcludeElement", trueExclude.getPersistenceUnitName()); + assertTrue("trueExclude should be true.", trueExclude.excludeUnlistedClasses()); + + PersistenceUnitInfo falseExclude = info[3]; + assertNotNull("falseExclude should not be null.", falseExclude); + assertEquals("falseExclude name is not correct.", "FalseExcludeElement", falseExclude.getPersistenceUnitName()); + assertFalse("falseExclude should be false.", falseExclude.excludeUnlistedClasses()); + } + }