1 /****************************************************************************** 2 * HibernateUtil.java - Non-object access to the database 3 * $Id$ 4 * 5 * BuckoFIBS - Backgammon by BuckoSoft 6 * Copyright© 2009,2010 - Dick Balaska - BuckoSoft, Corp. 7 * 8 * $Log$ 9 * Revision 1.7 2011/05/31 19:36:38 dick 10 * Privatize our private parts. 11 * 12 * Revision 1.6 2011/05/10 05:48:10 dick 13 * Add support for an in-memory database. Used by TEST. 14 * 15 * Revision 1.5 2011/05/09 17:09:39 dick 16 * HibernateUtil goes from static to an object, so that during test we can keep 17 * reinstantiating it. 18 * 19 * Revision 1.4 2011/05/08 21:41:40 dick 20 * Add support for a test (in memory) database. 21 * 22 * Revision 1.3 2010/03/03 13:12:21 inim 23 * Replaced (c) sign in comment mangled by CVS default encoding back to UTF-8 24 * 25 * Revision 1.2 2010/03/03 12:19:48 inim 26 * Moved source to UTF8 encoding from CP1252 encoding. To this end all source files' (c) message was updated to "Copyright© 2009,2010 - Dick Balaska - BuckoSoft, Corp.". This replaces the (c) sign to UTF8, and adds the new year 2010. 27 * 28 * Revision 1.1 2010/02/04 05:57:53 inim 29 * Mavenized project folder layout 30 * 31 * Revision 1.1 2009/02/20 10:24:51 dick 32 * Non-object access to the database. 33 * 34 */ 35 36 /* 37 * This program is free software: you can redistribute it and/or modify 38 * it under the terms of the GNU General Public License as published by 39 * the Free Software Foundation, either version 3 of the License, or 40 * (at your option) any later version. 41 * 42 * This program is distributed in the hope that it will be useful, 43 * but WITHOUT ANY WARRANTY; without even the implied warranty of 44 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 45 * GNU General Public License for more details. 46 * 47 * You should have received a copy of the GNU General Public License 48 * along with this program. If not, see <http://www.gnu.org/licenses/>. 49 * 50 * The Original Code is BuckoFIBS, <http://www.buckosoft.com/BuckoFIBS/>. 51 * The Initial Developer of the Original Code is Dick Balaska and BuckoSoft, Corp. 52 */ 53 package com.buckosoft.fibs.BuckoFIBS.db; 54 55 import java.io.File; 56 57 import org.hibernate.Session; 58 import org.hibernate.SessionFactory; 59 import org.hibernate.cfg.Configuration; 60 import org.hibernate.tool.hbm2ddl.SchemaExport; 61 62 /** Non-object access to the database. <br> 63 * This class is really private to DatabaseImpl. 64 * @author Dick Balaska 65 * @since 2009/02/18 66 * @version $Revision$ <br> $Date$ 67 * @see <a href="http://cvs.buckosoft.com/Projects/BuckoFIBS/BuckoFIBS/src/main/java/com/buckosoft/fibs/BuckoFIBS/db/HibernateUtil.java">cvs HibernateUtil.java</a> 68 */ 69 final class HibernateUtil { 70 private SessionFactory sessionFactory; 71 private Configuration configuration = null; 72 73 /** for TEST, increment the database name on each instantation */ 74 private static int serialNumber = 0; 75 76 private void initConfiguration(String url) { 77 try { 78 // Create the SessionFactory from hibernate.cfg.xml 79 if (url == null) { 80 String s = "jdbc:hsqldb:file:" + getUserDatabaseDirectory() + "/BuckoFIBS"; 81 configuration = new Configuration().configure().setProperty("hibernate.connection.url", 82 s); 83 } 84 else if (url.equals("mem")) 85 configuration = new Configuration().configure().setProperty("hibernate.connection.url", 86 "jdbc:hsqldb:mem:mymemdb" + serialNumber++); 87 else if (url.equals("testfile")) 88 configuration = new Configuration().configure().setProperty("hibernate.connection.url", 89 "jdbc:hsqldb:file:db/test/BuckoFIBSTest" + serialNumber++); 90 sessionFactory = configuration.buildSessionFactory(); 91 } catch (Throwable ex) { 92 // Make sure you log the exception, as it might be swallowed 93 System.err.println("Initial SessionFactory creation failed." + ex); 94 throw new ExceptionInInitializerError(ex); 95 } 96 } 97 98 protected SessionFactory getSessionFactory() { 99 return sessionFactory; 100 } 101 102 protected void maybeCreateNewDatabase(String url) { 103 initConfiguration(url); 104 Session session = getSessionFactory().getCurrentSession(); 105 session.beginTransaction(); 106 Object o = null; 107 try { 108 o = session.createQuery("from Player where id = ?") 109 .setInteger(0, 1).uniqueResult(); 110 } catch (Exception e) { 111 System.out.println("maybeCreateNewDatabase needs to create database"); 112 //e.printStackTrace(); 113 } 114 session.getTransaction().commit(); 115 if (o != null) // database ok. 116 return; 117 118 SchemaExport se = new SchemaExport(configuration); 119 se.execute(true, true, false, true); 120 } 121 122 /** Return the location for user data 123 * @return The absolute string for {user.home}/jIBS 124 */ 125 public static String getUserDataDirectory() { 126 String s = "{user.home}" + File.separator + "BuckoFIBS"; 127 return(HibernateUtil.unwindProperties(s)); 128 } 129 130 /** Return the location of our hsqldb database 131 * @return The absolute string for {user.home}/jIBS/database 132 */ 133 public static String getUserDatabaseDirectory() { 134 return(getUserDataDirectory() + File.separator + "database"); 135 } 136 137 /** Given a string, substitute any System properties in that string. 138 * A property is denoted with {}, i.e. <code>{user.home}</code> 139 * @param in The string to unwind 140 * @return The resultant string. The original string is returned if no left brace '{' is found. 141 */ 142 public static String unwindProperties(String in) { 143 int i = in.indexOf('{'); 144 if (i == -1) 145 return(in); 146 int j = in.indexOf('}'); 147 String out = in.substring(0, i); 148 String s = System.getProperty(in.substring(i+1, j)); 149 out += s; 150 out += in.substring(j+1); 151 return(out); 152 } 153 }