sascha@176: package de.intevation.flys.backend;
sascha@176: 
sascha@3333: import java.lang.management.ManagementFactory;
sascha@176: 
sascha@176: import java.util.Properties;
sascha@176: 
ingo@2337: import javax.management.InstanceAlreadyExistsException;
ingo@2337: import javax.management.MBeanRegistrationException;
ingo@2337: import javax.management.MBeanServer;
sascha@3333: import javax.management.MalformedObjectNameException;
ingo@2337: import javax.management.NotCompliantMBeanException;
ingo@2337: import javax.management.ObjectName;
ingo@2337: 
sascha@3333: import org.apache.log4j.Logger;
sascha@3333: 
sascha@176: import org.hibernate.SessionFactory;
sascha@176: 
sascha@3333: import org.hibernate.cfg.Configuration;
sascha@3333: import org.hibernate.cfg.Environment;
sascha@3333: 
ingo@2361: import org.hibernate.impl.SessionFactoryImpl;
ingo@2361: 
ingo@2337: import org.hibernate.jmx.StatisticsService;
ingo@2337: 
sascha@176: public final class SessionFactoryProvider
sascha@176: {
sascha@176:     private static Logger log = Logger.getLogger(SessionFactoryProvider.class);
sascha@176: 
ingo@2337:     public static final boolean ENABLE_JMX =
ingo@2337:         Boolean.getBoolean("flys.backend.enablejmx");
ingo@2337: 
sascha@3333:     private static SessionFactory flysSessionFactory;
sascha@3333:     private static SessionFactory sedDBSessionFactory;
sascha@176: 
sascha@176:     private SessionFactoryProvider() {
sascha@176:     }
sascha@176: 
sascha@176:     public static synchronized SessionFactory getSessionFactory() {
sascha@3333:         if (flysSessionFactory == null) {
sascha@3333:             flysSessionFactory =
sascha@3333:                 createSessionFactory(FLYSCredentials.getInstance());
sascha@176:         }
sascha@3333:         return flysSessionFactory;
sascha@176:     }
sascha@176: 
sascha@179:     public static SessionFactory createSessionFactory() {
sascha@3333:         return createSessionFactory(FLYSCredentials.getDefault());
sascha@3333:     }
sascha@3333: 
sascha@3333:     public static synchronized SessionFactory getSedDBSessionFactory() {
sascha@3333:         if (sedDBSessionFactory == null) {
sascha@3333:             sedDBSessionFactory =
sascha@3333:                 createSessionFactory(SedDBCredentials.getInstance());
sascha@3333:         }
sascha@3333:         return sedDBSessionFactory;
sascha@3333:     }
sascha@3333: 
sascha@3333:     public static SessionFactory createSedDBSessionFactory() {
sascha@3333:         return createSessionFactory(SedDBCredentials.getDefault());
sascha@179:     }
sascha@179: 
sascha@178:     public static SessionFactory createSessionFactory(
sascha@3333:         Credentials credentials
sascha@178:     ) {
sascha@3333:         Configuration cfg = createConfiguration(credentials);
sascha@1229: 
ingo@2337:         SessionFactory factory = cfg.buildSessionFactory();
ingo@2337: 
ingo@2337:         if (ENABLE_JMX) {
ingo@2337:             registerAsMBean(factory);
ingo@2337:         }
ingo@2337:         else {
ingo@2337:             log.info("No JMX support for hibernate.");
ingo@2337:         }
ingo@2337: 
ingo@2337:         return factory;
sascha@1229:     }
sascha@1229: 
ingo@2337:     public static void registerAsMBean(SessionFactory factory) {
ingo@2337: 
ingo@2337:         StatisticsService statsMBean = new StatisticsService();
ingo@2337:         statsMBean.setSessionFactory(factory);
ingo@2337:         statsMBean.setStatisticsEnabled(true);
ingo@2337: 
ingo@2337:         try {
ingo@2337:             MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
ingo@2337:             mbs.registerMBean(
ingo@2337:                 statsMBean,
ingo@2337:                 new ObjectName("Hibernate:application=Statistics"));
ingo@2337: 
ingo@2337:             log.info("Enabled JMX support for hibernate.");
ingo@2337:         }
ingo@2337:         catch (MalformedObjectNameException mone) {
ingo@2337:             log.warn(mone, mone);
ingo@2337:         }
ingo@2337:         catch (InstanceAlreadyExistsException iaee) {
ingo@2337:             log.warn(iaee, iaee);
ingo@2337:         }
ingo@2337:         catch (MBeanRegistrationException mbre) {
ingo@2337:             log.warn(mbre, mbre);
ingo@2337:         }
ingo@2337:         catch (NotCompliantMBeanException ncmbe) {
ingo@2337:             log.warn(ncmbe, ncmbe);
ingo@2337:         }
ingo@2337:     }
ingo@2337: 
sascha@1229:     public static Configuration createConfiguration() {
sascha@3333:         return createConfiguration(FLYSCredentials.getInstance());
sascha@1229:     }
sascha@1229: 
sascha@1229:     public static Configuration createConfiguration(
sascha@3333:         Credentials credentials
sascha@1229:     ) {
sascha@176:         Configuration cfg = new Configuration();
sascha@176: 
sascha@3333:         for (Class clazz: credentials.getClasses()) {
sascha@3333:             cfg.addAnnotatedClass(clazz);
sascha@3333:         }
sascha@176: 
sascha@176:         if (log.isDebugEnabled()) {
sascha@3333:             log.debug("user: "    + credentials.getUser());
sascha@3333:             log.debug("dialect: " + credentials.getDialect());
sascha@3333:             log.debug("driver: "  + credentials.getDriver());
sascha@3333:             log.debug("url: "     + credentials.getUrl());
sascha@176:         }
sascha@176: 
sascha@176:         Properties props = new Properties();
sascha@176: 
sascha@176:         // We rely on our own connection pool
sascha@176:         props.setProperty(
sascha@176:             "hibernate.connection.provider_class",
ingo@3337:             "de.intevation.flys.utils.DBCPConnectionProvider");
sascha@176: 
sascha@3333:         props.setProperty(Environment.DIALECT, credentials.getDialect());
sascha@3333:         props.setProperty(Environment.USER,    credentials.getUser());
sascha@3333:         props.setProperty(Environment.PASS,    credentials.getPassword());
sascha@3333:         props.setProperty(Environment.DRIVER,  credentials.getDriver());
sascha@3333:         props.setProperty(Environment.URL,     credentials.getUrl());
sascha@176: 
sascha@176:         cfg.mergeProperties(props);
sascha@176: 
sascha@1229:         return cfg;
sascha@176:     }
ingo@2361: 
ingo@2361: 
ingo@2362:     public static String getProperty(SessionFactoryImpl factory, String key) {
ingo@2361:         Properties props = factory.getProperties();
ingo@2362:         return props.getProperty(key);
ingo@2362:     }
ingo@2361: 
ingo@2362:     public static String getUser(SessionFactoryImpl factory) {
ingo@2362:         return getProperty(factory, Environment.USER);
ingo@2362:     }
ingo@2362: 
ingo@2362: 
ingo@2362:     public static String getPass(SessionFactoryImpl factory) {
ingo@2362:         return getProperty(factory, Environment.PASS);
ingo@2362:     }
ingo@2362: 
ingo@2362: 
ingo@2362:     public static String getURL(SessionFactoryImpl factory) {
ingo@2362:         return getProperty(factory, Environment.URL);
ingo@2362:     }
ingo@2362: 
ingo@2362: 
ingo@2362:     public static String getDriver(SessionFactoryImpl factory) {
ingo@2362:         return getProperty(factory, Environment.DRIVER);
ingo@2361:     }
sascha@176: }
sascha@176: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :