/**
*
*/
package org.minnal.jpa;
import java.util.List;
import javax.persistence.EntityManagerFactory;
import javax.persistence.spi.PersistenceProvider;
import javax.persistence.spi.PersistenceProviderResolverHolder;
import javax.persistence.spi.PersistenceUnitInfo;
import org.activejpa.jpa.JPA;
import org.minnal.core.Application;
import org.minnal.core.MinnalException;
import org.minnal.core.Plugin;
import org.minnal.core.config.ApplicationConfiguration;
/**
* @author ganeshs
*
*/
public class JPAPlugin implements Plugin {
private EntityManagerFactory factory;
public void init(Application<? extends ApplicationConfiguration> application) {
List<PersistenceProvider> providers = getProviders();
if (providers == null || providers.isEmpty()) {
throw new MinnalException("No JPA persistence provider found");
}
PersistenceProvider provider = providers.get(0);
PersistenceUnitInfo info = createPersistenceUnitInfo(application.getConfiguration(), provider);
factory = provider.createContainerEntityManagerFactory(info, null);
JPA.instance.addPersistenceUnit(info.getPersistenceUnitName(), factory);
application.addListener(new JerseyApplicationEventListener(application.getConfiguration().getDatabaseConfiguration()));
}
public void destroy() {
factory.close();
}
protected List<PersistenceProvider> getProviders() {
return PersistenceProviderResolverHolder.getPersistenceProviderResolver().getPersistenceProviders();
}
protected PersistenceUnitInfo createPersistenceUnitInfo(ApplicationConfiguration configuration, PersistenceProvider provider) {
return new MinnalPersistenceUnitInfo(configuration.getName(), configuration.getDatabaseConfiguration(), provider);
}
}