/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.openejb.assembler.classic; import org.apache.openejb.OpenEJBException; import org.apache.openejb.loader.SystemInstance; import org.apache.openejb.persistence.PersistenceClassLoaderHandler; import org.apache.openejb.persistence.PersistenceUnitInfoImpl; import org.apache.openejb.spi.ContainerSystem; import org.apache.openejb.util.LogCategory; import org.apache.openejb.util.Logger; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.persistence.SharedCacheMode; import javax.persistence.ValidationMode; import javax.persistence.spi.PersistenceUnitTransactionType; import javax.sql.CommonDataSource; import javax.sql.DataSource; import javax.validation.ValidatorFactory; import java.util.Map; public class PersistenceBuilder { public static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP, PersistenceBuilder.class); /** * External handler which handles adding a runtime ClassTransformer to the classloader. */ private final PersistenceClassLoaderHandler persistenceClassLoaderHandler; public PersistenceBuilder(final PersistenceClassLoaderHandler persistenceClassLoaderHandler) { this.persistenceClassLoaderHandler = persistenceClassLoaderHandler; } public ReloadableEntityManagerFactory createEntityManagerFactory(final PersistenceUnitInfo info, final ClassLoader classLoader, final Map<ComparableValidationConfig, ValidatorFactory> validators, final boolean hasCdi) throws Exception { final PersistenceUnitInfoImpl unitInfo = new PersistenceUnitInfoImpl(persistenceClassLoaderHandler); // Persistence Unit Id unitInfo.setId(info.id); // Persistence Unit Name unitInfo.setPersistenceUnitName(info.name); // Persistence Provider Class Name unitInfo.setPersistenceProviderClassName(info.provider); // ClassLoader unitInfo.setClassLoader(classLoader); // Exclude Unlisted Classes unitInfo.setExcludeUnlistedClasses(info.excludeUnlistedClasses); unitInfo.setLazilyInitialized(info.webappName != null || "true".equalsIgnoreCase(info.properties.getProperty("tomee.jpa.factory.lazy", SystemInstance.get().getProperty("tomee.jpa.factory.lazy", "false")))); final Context context = SystemInstance.get().getComponent(ContainerSystem.class).getJNDIContext(); // JTA Datasource String jtaDataSourceId = info.jtaDataSource; unitInfo.setJtaDataSourceName(jtaDataSourceId); if (jtaDataSourceId != null) { if (!SystemInstance.get().hasProperty("openejb.geronimo")) { final String initialJndiName = jtaDataSourceId; try { if (!jtaDataSourceId.startsWith("java:openejb/Resource/") && !jtaDataSourceId.startsWith("openejb/Resource/")) { jtaDataSourceId = "openejb/Resource/" + jtaDataSourceId; } final CommonDataSource jtaDataSource = (CommonDataSource) context.lookup(jtaDataSourceId); unitInfo.setJtaDataSource(jtaDataSource); } catch (final NamingException e) { try { unitInfo.setJtaDataSource((DataSource) new InitialContext().lookup(initialJndiName)); } catch (final NamingException ne) { throw new OpenEJBException("Could not lookup <jta-data-source> '" + jtaDataSourceId + "' for unit '" + unitInfo.getPersistenceUnitName() + "'", e); } } } } // Managed Class Names unitInfo.setManagedClassNames(info.classes); // Mapping File Names unitInfo.setMappingFileNames(info.mappingFiles); // Handle Properties unitInfo.setProperties(info.properties); // Schema version of the persistence.xml file unitInfo.setPersistenceXMLSchemaVersion(info.persistenceXMLSchemaVersion); // Second-level cache mode for the persistence unit final SharedCacheMode sharedCacheMode = Enum.valueOf(SharedCacheMode.class, info.sharedCacheMode); unitInfo.setSharedCacheMode(sharedCacheMode); // The validation mode to be used for the persistence unit final ValidationMode validationMode = Enum.valueOf(ValidationMode.class, info.validationMode); unitInfo.setValidationMode(validationMode); // Persistence Unit Transaction Type final PersistenceUnitTransactionType type = Enum.valueOf(PersistenceUnitTransactionType.class, info.transactionType); unitInfo.setTransactionType(type); // Non JTA Datasource String nonJtaDataSourceId = info.nonJtaDataSource; unitInfo.setNonJtaDataSourceName(nonJtaDataSourceId); if (nonJtaDataSourceId != null) { if (!SystemInstance.get().hasProperty("openejb.geronimo")) { final String initialJndiName = nonJtaDataSourceId; try { if (!nonJtaDataSourceId.startsWith("java:openejb/Resource/")) { nonJtaDataSourceId = "java:openejb/Resource/" + nonJtaDataSourceId; } final CommonDataSource nonJtaDataSource = (CommonDataSource) context.lookup(nonJtaDataSourceId); unitInfo.setNonJtaDataSource(nonJtaDataSource); } catch (final NamingException e) { try { unitInfo.setNonJtaDataSource((DataSource) new InitialContext().lookup(initialJndiName)); } catch (final NamingException ne) { throw new OpenEJBException("Could not lookup <non-jta-data-source> '" + nonJtaDataSourceId + "' for unit '" + unitInfo.getPersistenceUnitName() + "'", e); } } } } // Persistence Unit Root Url unitInfo.setRootUrlAndJarUrls(info.persistenceUnitRootUrl, info.jarFiles); // create the persistence provider final String persistenceProviderClassName = unitInfo.getPersistenceProviderClassName(); unitInfo.setPersistenceProviderClassName(persistenceProviderClassName); final EntityManagerFactoryCallable callable = new EntityManagerFactoryCallable(persistenceProviderClassName, unitInfo, classLoader, validators, hasCdi); return new ReloadableEntityManagerFactory(classLoader, callable, unitInfo); } public static String getOpenEJBJndiName(final String unit) { return Assembler.PERSISTENCE_UNIT_NAMING_CONTEXT + unit; } }