From 7c89740c3756df828eee01cde5fc19a818f430ae Mon Sep 17 00:00:00 2001 From: Adrien LAUER Date: Fri, 10 Apr 2015 08:01:35 +0100 Subject: [PATCH] Added classloader for persistence unit info --- .../org.seedstack.seed.persistence.jpa.props | 2 +- .../src/it/resources/META-INF/otherItem.xml | 3 +- .../internal/InternalPersistenceUnitInfo.java | 10 +-- .../persistence/jpa/internal/JpaPlugin.java | 12 +++- .../SeedConfEntityManagerFactoryResolver.java | 62 +++++++++++-------- 5 files changed, 53 insertions(+), 36 deletions(-) diff --git a/persistence-support/jpa/src/it/resources/META-INF/configuration/org.seedstack.seed.persistence.jpa.props b/persistence-support/jpa/src/it/resources/META-INF/configuration/org.seedstack.seed.persistence.jpa.props index 2329c7be0..bffaff188 100644 --- a/persistence-support/jpa/src/it/resources/META-INF/configuration/org.seedstack.seed.persistence.jpa.props +++ b/persistence-support/jpa/src/it/resources/META-INF/configuration/org.seedstack.seed.persistence.jpa.props @@ -46,7 +46,7 @@ property.sql.enforce_strict_size=true [org.seedstack.seed.persistence.jpa.unit.unit4] datasource=datasource1 #jta-datasource=datasource1 -mapping-file = META-INF/otherItem.xml +mapping-files = META-INF/otherItem.xml property.hibernate.dialect=org.hibernate.dialect.HSQLDialect property.hibernate.hbm2ddl.auto=create diff --git a/persistence-support/jpa/src/it/resources/META-INF/otherItem.xml b/persistence-support/jpa/src/it/resources/META-INF/otherItem.xml index 34134b151..e5fb0a33b 100644 --- a/persistence-support/jpa/src/it/resources/META-INF/otherItem.xml +++ b/persistence-support/jpa/src/it/resources/META-INF/otherItem.xml @@ -11,8 +11,7 @@ --> + xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0"> My First JPA XML Application org.seedstack.seed.persistence.jpa.sample2 diff --git a/persistence-support/jpa/src/main/java/org/seedstack/seed/persistence/jpa/internal/InternalPersistenceUnitInfo.java b/persistence-support/jpa/src/main/java/org/seedstack/seed/persistence/jpa/internal/InternalPersistenceUnitInfo.java index f8171ca8b..ded9c154d 100644 --- a/persistence-support/jpa/src/main/java/org/seedstack/seed/persistence/jpa/internal/InternalPersistenceUnitInfo.java +++ b/persistence-support/jpa/src/main/java/org/seedstack/seed/persistence/jpa/internal/InternalPersistenceUnitInfo.java @@ -12,6 +12,8 @@ */ package org.seedstack.seed.persistence.jpa.internal; +import org.seedstack.seed.core.utils.SeedReflectionUtils; + import java.net.URL; import java.util.Collections; import java.util.List; @@ -121,19 +123,17 @@ public String getPersistenceXMLSchemaVersion() { @Override public ClassLoader getClassLoader() { - // not supported - return null; + return SeedReflectionUtils.findMostCompleteClassLoader(InternalPersistenceUnitInfo.class); } @Override public void addTransformer(ClassTransformer transformer) { - // does nothing + throw new UnsupportedOperationException("class transformation is not supported by managed JPA units"); } @Override public ClassLoader getNewTempClassLoader() { - // not supported - return null; + throw new UnsupportedOperationException("temporary classloader is not supported by managed JPA units"); } } diff --git a/persistence-support/jpa/src/main/java/org/seedstack/seed/persistence/jpa/internal/JpaPlugin.java b/persistence-support/jpa/src/main/java/org/seedstack/seed/persistence/jpa/internal/JpaPlugin.java index 1c66f45c5..9d6519e10 100644 --- a/persistence-support/jpa/src/main/java/org/seedstack/seed/persistence/jpa/internal/JpaPlugin.java +++ b/persistence-support/jpa/src/main/java/org/seedstack/seed/persistence/jpa/internal/JpaPlugin.java @@ -63,6 +63,7 @@ public InitState init(InitContext initContext) { TransactionPlugin transactionPlugin = null; JdbcPlugin jdbcPlugin = null; Application application = null; + for (Plugin plugin : initContext.pluginsRequired()) { if (plugin instanceof ApplicationPlugin) { application = ((ApplicationPlugin) plugin).getApplication(); @@ -82,21 +83,25 @@ public InitState init(InitContext initContext) { } String[] persistenceUnitNames = jpaConfiguration.getStringArray("units"); - if (persistenceUnitNames != null && persistenceUnitNames.length == 0) { + + if (persistenceUnitNames == null || persistenceUnitNames.length == 0) { LOGGER.info("No JPA persistence unit configured, JPA support disabled"); return InitState.INITIALIZED; } + for (String persistenceUnit : persistenceUnitNames) { Configuration persistenceUnitConfiguration = jpaConfiguration.subset("unit." + persistenceUnit); Iterator it = persistenceUnitConfiguration.getKeys("property"); Map properties = new HashMap(); + while (it.hasNext()) { String name = it.next(); properties.put(name.substring(9), persistenceUnitConfiguration.getString(name)); } SeedConfEntityManagerFactoryResolver confResolver = new SeedConfEntityManagerFactoryResolver(); - EntityManagerFactory emf = null; + EntityManagerFactory emf; + try { emf = Persistence.createEntityManagerFactory(persistenceUnit, properties); } catch (PersistenceException e) { @@ -113,7 +118,9 @@ public InitState init(InitContext initContext) { throw e; } } + entityManagerFactories.put(persistenceUnit, emf); + String exceptionHandler = persistenceUnitConfiguration.getString("exception-handler"); if (exceptionHandler != null && !exceptionHandler.isEmpty()) { try { @@ -123,6 +130,7 @@ public InitState init(InitContext initContext) { } } } + if (persistenceUnitNames.length == 1) { JpaTransactionMetadataResolver.defaultJpaUnit = persistenceUnitNames[0]; } diff --git a/persistence-support/jpa/src/main/java/org/seedstack/seed/persistence/jpa/internal/SeedConfEntityManagerFactoryResolver.java b/persistence-support/jpa/src/main/java/org/seedstack/seed/persistence/jpa/internal/SeedConfEntityManagerFactoryResolver.java index 1a0f0c763..6b645186d 100644 --- a/persistence-support/jpa/src/main/java/org/seedstack/seed/persistence/jpa/internal/SeedConfEntityManagerFactoryResolver.java +++ b/persistence-support/jpa/src/main/java/org/seedstack/seed/persistence/jpa/internal/SeedConfEntityManagerFactoryResolver.java @@ -13,15 +13,9 @@ package org.seedstack.seed.persistence.jpa.internal; import io.nuun.kernel.api.plugin.PluginException; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; +import org.apache.commons.configuration.Configuration; +import org.seedstack.seed.core.api.Application; +import org.seedstack.seed.persistence.jdbc.internal.JdbcPlugin; import javax.persistence.EntityManagerFactory; import javax.persistence.PersistenceException; @@ -31,27 +25,28 @@ import javax.persistence.spi.PersistenceProviderResolverHolder; import javax.persistence.spi.PersistenceUnitTransactionType; import javax.sql.DataSource; - -import org.apache.commons.configuration.Configuration; -import org.seedstack.seed.core.api.Application; -import org.seedstack.seed.persistence.jdbc.internal.JdbcPlugin; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Properties; class SeedConfEntityManagerFactoryResolver { - Map entityManagerFactories = new HashMap(); - - Map unitsInException = new HashMap(); - - EntityManagerFactory resolve(String persistenceUnit, Map properties, Configuration unitConfiguration, Application application, - JdbcPlugin jdbcPlugin, Collection> scannedClasses) throws UnitNotConfiguredException { + EntityManagerFactory resolve(String persistenceUnit, Map properties, Configuration unitConfiguration, Application application, JdbcPlugin jdbcPlugin, Collection> scannedClasses) throws UnitNotConfiguredException { String dataSourceName = unitConfiguration.getString("datasource"); String jtaDataSourceName = unitConfiguration.getString("jta-datasource"); + if (dataSourceName == null && jtaDataSourceName == null) { throw new UnitNotConfiguredException("No property datasource or jta-datasource found for persistenceUnit [" + persistenceUnit + "]. One of these properties is required to load the persistence unit from seed configuration"); } + DataSource dataSource; boolean isJta = false; + if (jtaDataSourceName != null) { dataSource = jdbcPlugin.getDataSources().get(jtaDataSourceName); isJta = true; @@ -60,11 +55,13 @@ EntityManagerFactory resolve(String persistenceUnit, Map propert } InternalPersistenceUnitInfo unitInfo = new InternalPersistenceUnitInfo(); + unitInfo.persistenceUnitName = persistenceUnit; - if (isJta) + if (isJta) { unitInfo.jtaDataSource = dataSource; - else + } else { unitInfo.nonJtaDataSource = dataSource; + } unitInfo.managedClassNames = new ArrayList(); for (Class managed : scannedClasses) { @@ -72,22 +69,31 @@ EntityManagerFactory resolve(String persistenceUnit, Map propert unitInfo.managedClassNames.add(managed.getName()); } } + if (unitInfo.managedClassNames.isEmpty()) { throw new PluginException("No class was configured to belong to jpa unit [" + persistenceUnit + "]"); } - if (unitConfiguration.getString("mapping-file") != null) { - unitInfo.mappingFileNames = Arrays.asList(unitConfiguration.getString("mapping-file")); + + if (unitConfiguration.getString("mapping-files") != null) { + unitInfo.mappingFileNames = Arrays.asList(unitConfiguration.getStringArray("mapping-files")); } else { unitInfo.mappingFileNames = Collections.emptyList(); } + unitInfo.properties = new Properties(); unitInfo.properties.putAll(properties); - if (unitConfiguration.getString("validation-mode") != null) + + if (unitConfiguration.getString("validation-mode") != null) { unitInfo.validationMode = ValidationMode.valueOf(unitConfiguration.getString("validation-mode")); - if (unitConfiguration.getString("shared-cache-mode") != null) + } + + if (unitConfiguration.getString("shared-cache-mode") != null) { unitInfo.sharedCacheMode = SharedCacheMode.valueOf(unitConfiguration.getString("shared-cache-mode")); - if (unitConfiguration.getString("transaction-type") != null) + } + + if (unitConfiguration.getString("transaction-type") != null) { unitInfo.persistenceUnitTransactionType = PersistenceUnitTransactionType.valueOf(unitConfiguration.getString("transaction-type")); + } return createEntityManagerFactory(unitInfo, properties); } @@ -96,6 +102,7 @@ EntityManagerFactory resolve(String persistenceUnit, Map propert private EntityManagerFactory createEntityManagerFactory(InternalPersistenceUnitInfo info, Map map) { EntityManagerFactory fac = null; List persistenceProviders = PersistenceProviderResolverHolder.getPersistenceProviderResolver().getPersistenceProviders(); + for (PersistenceProvider persistenceProvider : persistenceProviders) { info.persistenceProviderClassName = persistenceProvider.getClass().getName(); fac = persistenceProvider.createContainerEntityManagerFactory(info, map); @@ -103,9 +110,12 @@ private EntityManagerFactory createEntityManagerFactory(InternalPersistenceUnitI break; } } + if (fac == null) { throw new PersistenceException("No Persistence provider for EntityManager named " + info.getPersistenceUnitName()); } + return fac; } + }