/* * Copyright 2012 The Solmix Project * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.gnu.org/licenses/ * or see the FSF site: http://www.fsf.org. */ package org.solmix.jpa; import java.util.Map; import javax.annotation.Resource; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.spi.PersistenceProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.solmix.runtime.SystemContext; /** * * @author solmix.f@gmail.com * @version $Id$ 2013-10-21 */ @SuppressWarnings("rawtypes") public class LocalEntityManagerFactoryProvider implements EntityManagerFactoryProvider { private PersistenceProvider persistenceProvider; private final Map<String,EntityManagerFactory> _tempCache= new java.util.concurrent.ConcurrentHashMap<String, EntityManagerFactory>(); private final Logger logger = LoggerFactory.getLogger(getClass()); private SystemContext sc; public LocalEntityManagerFactoryProvider(){ } public LocalEntityManagerFactoryProvider(final SystemContext sc){ setSystemContext(sc); } /** * @param systemContext */ @Resource public void setSystemContext(final SystemContext systemcontext) { this.sc=systemcontext; if(sc!=null){ sc.setExtension(this, EntityManagerFactoryProvider.class); } } /** * @return the persistenceProvider */ public PersistenceProvider getPersistenceProvider() { return persistenceProvider; } /** * @param persistenceProvider the persistenceProvider to set */ public void setPersistenceProvider(PersistenceProvider persistenceProvider) { this.persistenceProvider = persistenceProvider; } @Override public EntityManagerFactory createEntityManagerFactory(String persistenceUnitName){ return createEntityManagerFactory(persistenceUnitName,null); } @Override public EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map jpaProperties){ if(_tempCache.get(persistenceUnitName)!=null){ logger.debug("return EntityManagerFactory from locale cache"); EntityManagerFactory emf= _tempCache.get(persistenceUnitName); if(!emf.isOpen()){ _tempCache.remove(persistenceUnitName); }else{ return emf; } } if (logger.isDebugEnabled()) { logger.debug("Building JPA EntityManagerFactory for persistence unit '" + persistenceUnitName + "'"); } EntityManagerFactory emf; PersistenceProvider provider = getPersistenceProvider(); if (provider != null) { // Create EntityManagerFactory directly through PersistenceProvider. emf = provider.createEntityManagerFactory(persistenceUnitName, jpaProperties); if (emf == null) { throw new IllegalStateException("PersistenceProvider [" + provider + "] did not return an EntityManagerFactory for name '" + persistenceUnitName + "'"); } } else { // Let JPA perform its standard PersistenceProvider autodetection. emf= Persistence.createEntityManagerFactory(persistenceUnitName, jpaProperties); } _tempCache.put(persistenceUnitName, emf); return emf; } }