package org.needle4j.db.configuration; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; /** * Factory to create and access the configured persistence context. */ public final class PersistenceConfigurationFactory implements PersistenceConfiguration { private static final Map<PersistenceConfigurationFactory, PersistenceConfiguration> PERSISTENCE_MAP = new HashMap<PersistenceConfigurationFactory, PersistenceConfiguration>(); private String persistenceUnit; private Class<?>[] cfgClazzes; public PersistenceConfigurationFactory(final String persistenceUnit) { super(); this.persistenceUnit = persistenceUnit; } public PersistenceConfigurationFactory(final Class<?>[] cfgClazzes) { super(); this.cfgClazzes = Arrays.copyOf(cfgClazzes, cfgClazzes.length); } private PersistenceConfiguration getPersistenceConfiguration() { return getPersistenceConfiguration(this); } String getPersistenceUnit() { return persistenceUnit; } Class<?>[] getCfgClazzes() { return cfgClazzes; } /** * Returns the {@link EntityManager} instance which is associated with the * configured persistence context. * * @return {@link EntityManager} */ @Override public EntityManager getEntityManager() { return getPersistenceConfiguration().getEntityManager(); } /** * Returns the {@link EntityManagerFactory}. * * @return {@link EntityManagerFactory} */ @Override public EntityManagerFactory getEntityManagerFactory() { return getPersistenceConfiguration().getEntityManagerFactory(); } private static PersistenceConfiguration getPersistenceConfiguration( final PersistenceConfigurationFactory configuration) { PersistenceConfiguration result = PERSISTENCE_MAP.get(configuration); if (result == null) { result = createPersistenceConfiguration(configuration); PERSISTENCE_MAP.put(configuration, result); } return result; } private static PersistenceConfiguration createPersistenceConfiguration( final PersistenceConfigurationFactory configuration) { if (configuration.getPersistenceUnit() != null) { return new PersistenceUnitConfiguration(configuration.getPersistenceUnit()); } else if (configuration.getCfgClazzes() != null) { return new EJB3Configuration(configuration.getCfgClazzes()); } return null; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + Arrays.hashCode(cfgClazzes); result = prime * result + ((persistenceUnit == null) ? 0 : persistenceUnit.hashCode()); return result; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final PersistenceConfigurationFactory other = (PersistenceConfigurationFactory) obj; if (!Arrays.equals(cfgClazzes, other.cfgClazzes)) { return false; } if (persistenceUnit == null) { if (other.persistenceUnit != null) { return false; } } else if (!persistenceUnit.equals(other.persistenceUnit)) { return false; } return true; } }