package net.databinder.ao; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import net.databinder.DataApplicationBase; import net.java.ao.DatabaseProvider; import net.java.ao.EntityManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** Optional application base for ActiveObjects. */ public abstract class DataApplication extends DataApplicationBase implements ActiveObjectsApplication { private Logger logger = LoggerFactory.getLogger(DataApplication.class); /* Entity manager available to this application, default has key of null. */ private Map<Object, EntityManager> entityManagers = new HashMap<Object, EntityManager>(); /** * Initializes a default ActiveObjects entity manager. This is called * automatically during start-up. Applications with one entity manager * will not normally need to override. */ protected void dataInit() { initEntityManager(null); } /** * Initializes entity manager and generates schema if in development mode. */ protected void initEntityManager(Object key) { EntityManager entityManager = buildEntityManager(key, buildDatabaseProvider(key)); setEntityManager(key, entityManager); if (isDevelopment()) try { generateSchema(entityManager, key); } catch (SQLException e) { logger.error("Error generating schema", e); } } /** * @param provider provider returned by buildDatabaseProvider(key) * @return instantiated EntityManager in default implementation, override for subclass */ protected EntityManager buildEntityManager(Object key, DatabaseProvider provider) { return new EntityManager(provider); } /** * @return database provider for key, ignore key if app needs only one provider */ protected abstract DatabaseProvider buildDatabaseProvider(Object key); /** Generate schema if desired, called only in development mode. */ protected void generateSchema(EntityManager entityManager, Object key) throws SQLException { } /** Sets entity manager in map. */ protected void setEntityManager(Object key, EntityManager entityManager) { entityManagers.put(key, entityManager); } /** @return entity manager for given key */ public EntityManager getEntityManager(Object key) { return entityManagers.get(key); } }