1 package org.controlhaus.hibernate;
2
3 import java.io.File;
4 import java.net.URL;
5 import java.util.HashMap;
6 import java.util.Map;
7
8 import net.sf.hibernate.HibernateException;
9 import net.sf.hibernate.SessionFactory;
10 import net.sf.hibernate.cfg.Configuration;
11
12 import org.apache.log4j.Logger;
13
14 /***
15 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
16 * @since Oct 30, 2004
17 */
18 public class HibernateFactory
19 {
20 private static Logger logger = Logger.getLogger(HibernateFactory.class.getName());
21
22 private Map<String,SessionFactory> factories = new HashMap<String,SessionFactory>();
23
24 private static HibernateFactory factory = new HibernateFactory();
25
26 public SessionFactory getSessionFactory(HibernateControl control)
27 {
28 String name = control.getHibernateInstance();
29
30 SessionFactory factory = factories.get(name);
31 if ( factory == null )
32 {
33 synchronized( factories )
34 {
35 factory = initializeHibernate(control);
36 factories.put( name, factory );
37 }
38 }
39
40 return factory;
41 }
42
43 private synchronized SessionFactory initializeHibernate(HibernateControl control)
44 {
45 logger.info( "Initializing Hibernate instance " + control.getHibernateInstance() + "." );
46 Configuration hibConfig = new Configuration();
47
48 try
49 {
50 String mapping = control.getConfigurationLocation();
51 logger.debug("Configuration mapping " + mapping);
52 File file = new File( mapping );
53
54 if ( file.exists() )
55 hibConfig.configure( file );
56 else
57 {
58 URL url = getClass().getResource(mapping);
59 if ( url != null )
60 {
61 hibConfig.configure(url);
62 }
63 else
64 {
65 logger.error("Couldn't find mapping file: " + mapping);
66 throw new RuntimeException("Couldn't find mapping file: " + mapping);
67 }
68 }
69
70 return hibConfig.buildSessionFactory();
71 }
72 catch (HibernateException e)
73 {
74 logger.error("Mapping problem.", e);
75 throw new RuntimeException( "Mapping problem.", e );
76 }
77 }
78
79 public static HibernateFactory getInstance()
80 {
81 return factory;
82 }
83 }