/* * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License, version 2 as published by the Free Software * Foundation. * * You should have received a copy of the GNU General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * * Copyright 2006 - 2013 Pentaho Corporation. All rights reserved. */ package org.pentaho.platform.repository.hibernate; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.HibernateException; import org.hibernate.Interceptor; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Environment; import org.hibernate.dialect.Dialect; import org.hibernate.exception.ConstraintViolationException; import org.pentaho.platform.api.data.IDBDatasourceService; import org.pentaho.platform.api.engine.IApplicationContext; import org.pentaho.platform.api.engine.IPentahoSystemEntryPoint; import org.pentaho.platform.api.engine.IPentahoSystemExitPoint; import org.pentaho.platform.api.engine.ObjectFactoryException; import org.pentaho.platform.api.repository.ContentException; import org.pentaho.platform.api.repository.ISearchable; import org.pentaho.platform.api.repository.RepositoryException; import org.pentaho.platform.engine.core.system.PentahoSystem; import org.pentaho.platform.engine.services.connection.datasource.dbcp.JndiDatasourceService; import org.pentaho.platform.engine.services.solution.PentahoEntityResolver; import org.pentaho.platform.repository.messages.Messages; import org.pentaho.platform.util.StringUtil; import org.pentaho.platform.util.messages.MessageUtil; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Properties; import java.util.StringTokenizer; public class HibernateUtil implements IPentahoSystemEntryPoint, IPentahoSystemExitPoint { private static final Log log = LogFactory.getLog( HibernateUtil.class ); private static final boolean debug = PentahoSystem.debug; private static boolean useNewDatasourceService = false; private static Configuration configuration; private static SessionFactory sessionFactory; private static final byte[] lock = new byte[0]; private static final ThreadLocal<Session> threadSession = new ThreadLocal<Session>(); private static final ThreadLocal<Transaction> threadTransaction = new ThreadLocal<Transaction>(); private static final ThreadLocal<Interceptor> threadInterceptor = new ThreadLocal<Interceptor>(); // private static final ThreadLocal commitNeeded = new ThreadLocal(); private static boolean hibernateManaged; private static String factoryJndiName; private static String dialect; private static Context iniCtx; private static final String QUERYWILDCARD = "%{0}%"; //$NON-NLS-1$ static { // JIRA case #PLATFORM 150: removed listener and changed to lazy init HibernateUtil.initialize(); } public void setUseNewDatasourceService( boolean useNewService ) { // // The platform should not be calling this method. But, in case someone really // really wants to use the new datasource service features to hook up // a core service like Hibernate, this is now toggle-able. // synchronized ( HibernateUtil.lock ) { useNewDatasourceService = useNewService; } } // private HibernateUtil() { } protected static boolean initialize() { IApplicationContext applicationContext = PentahoSystem.getApplicationContext(); // Add to entry/exit points list HibernateUtil hUtil = new HibernateUtil(); applicationContext.addEntryPointHandler( hUtil ); applicationContext.addExitPointHandler( hUtil ); // Look for some hibernate-specific properties... String hibernateConfigurationFile = lookupSetting( applicationContext, "hibernateConfigPath", //$NON-NLS-1$ "settings/config-file", //$NON-NLS-1$ "hibernate/hibernateConfigPath" ); //$NON-NLS-1$ String hibernateManagedString = lookupSetting( applicationContext, "hibernateManaged", //$NON-NLS-1$ "settings/managed", //$NON-NLS-1$ "hibernate/hibernateManaged" ); //$NON-NLS-1$ if ( hibernateManagedString != null ) { hibernateManaged = Boolean.parseBoolean( hibernateManagedString ); } try { HibernateUtil.configuration = new Configuration(); HibernateUtil.configuration.setEntityResolver( new PentahoEntityResolver() ); HibernateUtil.configuration.setListener( "load", new HibernateLoadEventListener() ); //$NON-NLS-1$ if ( hibernateConfigurationFile != null ) { String configPath = applicationContext.getSolutionPath( hibernateConfigurationFile ); File cfgFile = new File( configPath ); if ( cfgFile.exists() ) { HibernateUtil.configuration.configure( cfgFile ); } else { HibernateUtil.log.error( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0012_CONFIG_NOT_FOUND", configPath ) ); //$NON-NLS-1$ return false; } } else { // Assume defaults which means we hope Hibernate finds a configuration // file in a file named hibernate.cfg.xml HibernateUtil.log.error( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0420_CONFIGURATION_ERROR_NO_HIB_CFG_FILE_SETTING" ) ); //$NON-NLS-1$ HibernateUtil.configuration.configure(); } String dsName = HibernateUtil.configuration.getProperty( "connection.datasource" ); //$NON-NLS-1$ if ( ( dsName != null ) && dsName.toUpperCase().endsWith( "HIBERNATE" ) ) { //$NON-NLS-1$ // IDBDatasourceService datasourceService = (IDBDatasourceService) PentahoSystem.getObjectFactory().getObject("IDBDatasourceService",null); //$NON-NLS-1$ IDBDatasourceService datasourceService = getDatasourceService(); String actualDSName = datasourceService.getDSBoundName( "Hibernate" ); //$NON-NLS-1$ HibernateUtil.configuration.setProperty( "hibernate.connection.datasource", actualDSName ); //$NON-NLS-1$ } HibernateUtil.dialect = HibernateUtil.configuration.getProperty( "dialect" ); //$NON-NLS-1$ /* * configuration.addResource("org/pentaho/platform/repository/runtime/RuntimeElement.hbm.xml"); //$NON-NLS-1$ * configuration.addResource("org/pentaho/platform/repository/content/ContentLocation.hbm.xml"); //$NON-NLS-1$ * configuration.addResource("org/pentaho/platform/repository/content/ContentItem.hbm.xml"); //$NON-NLS-1$ * configuration.addResource("org/pentaho/platform/repository/content/ContentItemFile.hbm.xml"); //$NON-NLS-1$ */ if ( !HibernateUtil.hibernateManaged ) { HibernateUtil.log.info( Messages.getInstance().getString( "HIBUTIL.USER_HIBERNATEUNMANAGED" ) ); //$NON-NLS-1$ HibernateUtil.sessionFactory = HibernateUtil.configuration.buildSessionFactory(); } else { HibernateUtil.factoryJndiName = HibernateUtil.configuration.getProperty( Environment.SESSION_FACTORY_NAME ); if ( HibernateUtil.factoryJndiName == null ) { HibernateUtil.log.error( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0013_NO_SESSION_FACTORY" ) ); return false; } HibernateUtil.log.info( Messages.getInstance().getString( "HIBUTIL.USER_HIBERNATEMANAGED" ) ); //$NON-NLS-1$ HibernateUtil.configuration.buildSessionFactory(); // Let hibernate Bind it // to JNDI... // BISERVER-2006: Below content is a community contribution see the JIRA case for more info // -------- Begin Contribution -------- // Build the initial context to use when looking up the session Properties contextProperties = new Properties(); if ( configuration.getProperty( "hibernate.jndi.url" ) != null ) { //$NON-NLS-1$ contextProperties.put( Context.PROVIDER_URL, configuration.getProperty( "hibernate.jndi.url" ) ); //$NON-NLS-1$ } if ( configuration.getProperty( "hibernate.jndi.class" ) != null ) { //$NON-NLS-1$ contextProperties.put( Context.INITIAL_CONTEXT_FACTORY, configuration.getProperty( "hibernate.jndi.class" ) ); //$NON-NLS-1$ } iniCtx = new InitialContext( contextProperties ); // --------- End Contribution --------- } Dialect.getDialect( HibernateUtil.configuration.getProperties() ); return true; } catch ( Throwable ex ) { HibernateUtil.log.error( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0006_BUILD_SESSION_FACTORY" ), ex ); //$NON-NLS-1$ throw new ExceptionInInitializerError( ex ); } } private static IDBDatasourceService getDatasourceService() throws ObjectFactoryException { // // Our new datasource stuff is provided for running queries and acquiring data. It is // NOT there for the inner workings of the platform. So, the Hibernate datasource should ALWAYS // be provided by JNDI. However, the class could be twiddled so that it will use the factory. // // And, since the default shipping condition should be to NOT use the factory (and force JNDI), // I've reversed the logic in the class to have the negative condition first (the default execution // path). // // Marc - BISERVER-2004 // if ( !useNewDatasourceService ) { return new JndiDatasourceService(); } else { IDBDatasourceService datasourceService = PentahoSystem.getObjectFactory().get( IDBDatasourceService.class, null ); return datasourceService; } } private static String lookupSetting( IApplicationContext applicationContext, String applicationContextName, String hibernateSettingsName, String pentahoXmlName ) { // 1- Look in applicationContext // 2- Look in PentahoSystem/hibernate-settings.xml // 3- Look in pentaho.xml String tmp = null; tmp = applicationContext.getProperty( applicationContextName, null ); if ( ( tmp != null ) && ( !StringUtil.isEmpty( tmp ) ) ) { return tmp.trim(); } if ( tmp == null ) { tmp = PentahoSystem.getSystemSetting( "hibernate/hibernate-settings.xml", hibernateSettingsName, null ); //$NON-NLS-1$ if ( ( tmp != null ) && ( !StringUtil.isEmpty( tmp ) ) ) { return tmp.trim(); } } if ( tmp == null ) { tmp = PentahoSystem.getSystemSetting( pentahoXmlName, null ); if ( ( tmp != null ) && ( !StringUtil.isEmpty( tmp ) ) ) { return tmp.trim(); } } return null; } /** * Returns the SessionFactory used for this static class. * * @return SessionFactory */ public static SessionFactory getSessionFactory() { if ( !HibernateUtil.hibernateManaged ) { return HibernateUtil.sessionFactory; } SessionFactory sf = null; try { if ( HibernateUtil.iniCtx == null ) { HibernateUtil.iniCtx = new InitialContext(); } String jndiName = HibernateUtil.factoryJndiName; try { sf = (SessionFactory) HibernateUtil.iniCtx.lookup( jndiName ); } catch ( Exception ignored ) { // CHECKSTYLES IGNORE } if ( sf == null ) { try { sf = (SessionFactory) HibernateUtil.iniCtx.lookup( "java:" + jndiName ); //$NON-NLS-1$ } catch ( Exception ignored ) { ignored.printStackTrace(); } } } catch ( NamingException ignored ) { // CHECKSTYLES IGNORE } return sf; } /** * Returns the original Hibernate configuration. * * @return Configuration */ public static Configuration getConfiguration() { return HibernateUtil.configuration; } /** * Rebuild the SessionFactory with the static Configuration. * */ public static void rebuildSessionFactory() throws RepositoryException { if ( !HibernateUtil.hibernateManaged ) { synchronized ( HibernateUtil.lock ) { try { HibernateUtil.sessionFactory = HibernateUtil.getConfiguration().buildSessionFactory(); } catch ( Exception ex ) { HibernateUtil.log.error( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0007_REBUILD_SESSION_FACTORY" ), ex ); //$NON-NLS-1$ throw new RepositoryException( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0007_REBUILD_SESSION_FACTORY" ), ex ); //$NON-NLS-1$ } } } else { try { HibernateUtil.getConfiguration().buildSessionFactory(); } catch ( Exception ex ) { HibernateUtil.log.error( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0007_REBUILD_SESSION_FACTORY" ), ex ); //$NON-NLS-1$ throw new RepositoryException( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0007_REBUILD_SESSION_FACTORY" ), ex ); //$NON-NLS-1$ } } } /** * Rebuild the SessionFactory with the given Hibernate Configuration. * * @param cfg */ public static void rebuildSessionFactory( final Configuration cfg ) throws RepositoryException { if ( !HibernateUtil.hibernateManaged ) { synchronized ( HibernateUtil.lock ) { try { HibernateUtil.sessionFactory = cfg.buildSessionFactory(); HibernateUtil.configuration = cfg; } catch ( Exception ex ) { HibernateUtil.log.error( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0007_REBUILD_SESSION_FACTORY" ), ex ); //$NON-NLS-1$ throw new RepositoryException( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0007_REBUILD_SESSION_FACTORY" ), ex ); //$NON-NLS-1$ } } } else { try { cfg.buildSessionFactory(); HibernateUtil.configuration = cfg; } catch ( Exception ex ) { HibernateUtil.log.error( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0007_REBUILD_SESSION_FACTORY" ), ex ); //$NON-NLS-1$ throw new RepositoryException( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0007_REBUILD_SESSION_FACTORY" ), ex ); //$NON-NLS-1$ } } } /** * Retrieves the current Session local to the thread. * <p/> * If no Session is open, opens a new Session for the running thread. * * @return Session */ public static Session getSession() throws RepositoryException { Session s = (Session) HibernateUtil.threadSession.get(); try { if ( s == null ) { if ( HibernateUtil.debug ) { HibernateUtil.log.debug( Messages.getInstance().getString( "HIBUTIL.DEBUG_OPEN_NEW_SESSION" ) ); //$NON-NLS-1$ } if ( HibernateUtil.getInterceptor() != null ) { if ( HibernateUtil.debug ) { HibernateUtil.log .debug( Messages.getInstance().getString( "HIBUTIL.DEBUG_USING_INTERCEPTOR" ) + HibernateUtil.getInterceptor().getClass() ); //$NON-NLS-1$ } s = HibernateUtil.getSessionFactory().openSession( HibernateUtil.getInterceptor() ); } else { s = HibernateUtil.getSessionFactory().openSession(); } HibernateUtil.threadSession.set( s ); } } catch ( HibernateException ex ) { HibernateUtil.log.error( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0005_GET_SESSION" ), ex ); //$NON-NLS-1$ throw new RepositoryException( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0005_GET_SESSION" ), ex ); //$NON-NLS-1$ } return s; } public static void flushSession() throws RepositoryException { try { Session s = HibernateUtil.getSession(); s.flush(); } catch ( HibernateException ex ) { throw new RepositoryException( ex ); } } /** * Closes the Session local to the thread. */ public static void closeSession() throws RepositoryException { try { Session s = (Session) HibernateUtil.threadSession.get(); HibernateUtil.threadSession.set( null ); if ( ( s != null ) && s.isOpen() ) { if ( HibernateUtil.debug ) { HibernateUtil.log.debug( Messages.getInstance().getString( "HIBUTIL.DEBUG_CLOSING_SESSION" ) ); //$NON-NLS-1$ } s.close(); } HibernateUtil.threadTransaction.set( null ); } catch ( HibernateException ex ) { HibernateUtil.log.error( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0009_CLOSE_SESSION" ), ex ); //$NON-NLS-1$ HibernateUtil.threadTransaction.set( null ); throw new RepositoryException( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0009_CLOSE_SESSION" ), ex ); //$NON-NLS-1$ } } /** * Start a new database transaction. */ public static void beginTransaction() throws RepositoryException { // commitNeeded.set(Boolean.TRUE); Transaction tx = (Transaction) HibernateUtil.threadTransaction.get(); try { if ( tx == null ) { if ( HibernateUtil.debug ) { HibernateUtil.log.debug( Messages.getInstance().getString( "HIBUTIL.DEBUG_START_TRANS" ) ); //$NON-NLS-1$ } tx = HibernateUtil.getSession().beginTransaction(); HibernateUtil.threadTransaction.set( tx ); } } catch ( HibernateException ex ) { HibernateUtil.log.error( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0004_START_TRANS" ), ex ); //$NON-NLS-1$ throw new RepositoryException( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0004_START_TRANS" ), ex ); //$NON-NLS-1$ } } /** * Commit the database transaction. */ public static void commitTransaction() throws RepositoryException { // Boolean needed = (Boolean)commitNeeded.get(); // if (needed.booleanValue()){ Transaction tx = (Transaction) HibernateUtil.threadTransaction.get(); try { if ( ( tx != null ) && !tx.wasCommitted() && !tx.wasRolledBack() ) { if ( HibernateUtil.debug ) { HibernateUtil.log.debug( Messages.getInstance().getString( "HIBUTIL.DEBUG_COMMIT_TRANS" ) ); //$NON-NLS-1$ } tx.commit(); } } catch ( HibernateException ex ) { HibernateUtil.log.error( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0008_COMMIT_TRANS" ), ex ); //$NON-NLS-1$ try { HibernateUtil.rollbackTransaction(); } catch ( Exception e2 ) { // CHECKSTYLES IGNORE } if ( ex instanceof ConstraintViolationException ) { throw new RepositoryException( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0008_COMMIT_TRANS" ), ex ); //$NON-NLS-1$ } // throw new // RepositoryException(Messages.getInstance().getErrorString("HIBUTIL.ERROR_0008_COMMIT_TRANS"), // ex); //$NON-NLS-1$ } finally { HibernateUtil.threadTransaction.set( null ); } // } // commitNeeded.set(Boolean.FALSE); } /** * Commit the database transaction. */ public static void rollbackTransaction() throws RepositoryException { Transaction tx = (Transaction) HibernateUtil.threadTransaction.get(); try { HibernateUtil.threadTransaction.set( null ); if ( ( tx != null ) && !tx.wasCommitted() && !tx.wasRolledBack() ) { if ( HibernateUtil.debug ) { HibernateUtil.log.debug( Messages.getInstance().getString( "HIBUTIL.DEBUG_ROLLBACK" ) ); //$NON-NLS-1$ } tx.rollback(); } } catch ( HibernateException ex ) { HibernateUtil.log.error( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0003_ROLLBACK" ), ex ); //$NON-NLS-1$ throw new RepositoryException( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0003_ROLLBACK" ), ex ); //$NON-NLS-1$ } finally { HibernateUtil.closeSession(); } } /** * Reconnects a Hibernate Session to the current Thread. * * @param session * The Hibernate Session to be reconnected. */ /* * public static void reconnect(Session session) throws RepositoryException { try { session.reconnect(); * threadSession.set(session); } catch (HibernateException ex) { * log.error(Messages.getInstance().getErrorString("HIBUTIL.ERROR_0001_RECONNECT"), ex); //$NON-NLS-1$ throw new * RepositoryException(ex); } } */ /** * Disconnect and return Session from current Thread. * * @return Session the disconnected Session */ public static Session disconnectSession() throws RepositoryException { Session session = HibernateUtil.getSession(); try { HibernateUtil.threadSession.set( null ); if ( session.isConnected() && session.isOpen() ) { session.disconnect(); } } catch ( HibernateException ex ) { HibernateUtil.log.error( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0002_DISCONNECT" ), ex ); //$NON-NLS-1$ throw new RepositoryException( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0002_DISCONNECT" ), ex ); //$NON-NLS-1$ } return session; } /** * Register a Hibernate interceptor with the current thread. * <p> * Every Session opened is opened with this interceptor after registration. Has no effect if the current Session * of the thread is already open, effective on next close()/getSession(). */ public static void registerInterceptor( final Interceptor interceptor ) { HibernateUtil.threadInterceptor.set( interceptor ); } private static Interceptor getInterceptor() { Interceptor interceptor = (Interceptor) HibernateUtil.threadInterceptor.get(); return interceptor; } /** * Searches an ISearchable object for a search term. The search rules are as follows: * * If the searchType is ISearchable.SEARCH_TYPE_PHRASE, then the fields in the table are searched for the exact * phrase given. * * If the searchType is ISearchable.SEARCH_TYPE_WORDS_AND or ..._OR, then the following happens: a- Each word in * the searchTerm is extracted and put into a list of search terms. b- Each search term is surrounded by the SQL * wildcard '%'. So each search term becomes %term%. c- A dynamic query is generated searching each of the * columns for each search term d- The searchType is used to determine the connector between each search term. e- * The AND will match only if all of the terms appear in a specific column - cross-column searching using ..._AND * will NOT work. In other words, if your search term is "East Sales", and your search type is ..._AND, a row * will be returned if one of the columns contains East and the same column contains Sales. A row will NOT be * returned if one column only contains East, and another column only contains Sales. This type of functionality * could be obtained using a view that concatenates all of the searchable columns together into one large column, * but this would be costly and database-specific. * * @param searchable * ISearchable to search * @param searchTerm * Search Term - see above for rules * @param searchType * One of: ISearchable.SEARCH_TYPE_PHRASE,ISearchable.SEARCH_TYPE_WORDS_AND, * ISearchable.SEARCH_TYPE_WORDS_OR * @return A list of objects from Hibernate that met the conditions specified. */ public static List searchForTerm( final ISearchable searchable, final String searchTerm, final int searchType ) { Session session = HibernateUtil.getSession(); if ( searchType == ISearchable.SEARCH_TYPE_PHRASE ) { Query qry = session.getNamedQuery( searchable.getPhraseSearchQueryName() ); String searchWildcard = MessageUtil.formatErrorMessage( HibernateUtil.QUERYWILDCARD, searchTerm ); qry.setString( "searchTerm", searchWildcard ); //$NON-NLS-1$ List rtn = qry.list(); return rtn; } String connector; if ( searchType == ISearchable.SEARCH_TYPE_WORDS_AND ) { connector = " and "; //$NON-NLS-1$ } else { connector = " or "; //$NON-NLS-1$ } StringTokenizer st = new StringTokenizer( searchTerm, " " ); //$NON-NLS-1$ List<String> searchWords = new ArrayList<String>(); while ( st.hasMoreTokens() ) { searchWords.add( MessageUtil.formatErrorMessage( HibernateUtil.QUERYWILDCARD, st.nextToken() ) ); } // Ok, we now have a list of search words. StringBuffer assembly = HibernateUtil.assembleQuery( searchable.getSearchableTable(), connector, searchWords, searchable .getSearchableColumns() ); Query qry = session.createQuery( assembly.toString() ); for ( int j = 0; j < searchWords.size(); j++ ) { qry.setParameter( "searchTerm" + j, searchWords.get( j ) ); //$NON-NLS-1$ } List rtn = qry.list(); return rtn; } private static StringBuffer assembleQuery( final String tableName, final String connector, final List<String> terms, final String[] columns ) { StringBuffer qry = new StringBuffer(); qry.append( "from " ).append( tableName ).append( " tbl where " ); //$NON-NLS-1$ //$NON-NLS-2$ String currCol, term; for ( int colno = 0; colno < columns.length; colno++ ) { currCol = columns[colno]; qry.append( "(" ); //$NON-NLS-1$ for ( int termNo = 0; termNo < terms.size(); termNo++ ) { term = (String) terms.get( termNo ); qry.append( "tbl." ).append( currCol ).append( " like :searchTerm" ).append( term ).append( " " ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ if ( termNo < terms.size() - 1 ) { qry.append( connector ); } } qry.append( ")" ); //$NON-NLS-1$ if ( colno < columns.length - 1 ) { qry.append( " or " ); // Columns are always or'd //$NON-NLS-1$ } } return qry; } public static void clear() { HibernateUtil.getSession().clear(); } /** * Persists changes to the object. Object must be defined to hibernate. * * @param obj * The object to make persistent * @throws RepositoryException */ public static void makePersistent( final Object obj ) throws RepositoryException { if ( HibernateUtil.debug ) { HibernateUtil.log.debug( Messages.getInstance().getString( "HIBUTIL.DEBUG_MAKE_PERSISTENT", obj.toString() ) ); //$NON-NLS-1$ } try { HibernateUtil.getSession().saveOrUpdate( obj ); } catch ( HibernateException ex ) { HibernateUtil.log.error( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0010_SAVING_UPDATING" ), ex ); //$NON-NLS-1$ throw new ContentException( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0010_SAVING_UPDATING" ), ex ); //$NON-NLS-1$ } } /** * Deletes the object from Hibernate * * @param obj * The object to make transient * @throws RepositoryException */ public static void makeTransient( final Object obj ) throws RepositoryException { if ( HibernateUtil.debug ) { HibernateUtil.log.debug( Messages.getInstance().getString( "HIBUTIL.DEBUG_MAKE_TRANSIENT", obj.toString() ) ); //$NON-NLS-1$ } try { HibernateUtil.getSession().delete( obj ); } catch ( HibernateException ex ) { HibernateUtil.log.error( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0011_DELETING_OBJ" ), ex ); //$NON-NLS-1$ throw new ContentException( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0011_DELETING_OBJ" ), ex ); //$NON-NLS-1$ } } /** * HACK This method is necessary to determine whether code should execute based on Oracle in use as the RDBMS * repository for the platform. Helps us work around Oracle JDBC driver bugs. * * @return true if Hibernate dialect for oracle is in use. */ public static boolean isOracleDialect() { return ( HibernateUtil.dialect.indexOf( "oracle" ) >= 0 ) || //$NON-NLS-1$ ( HibernateUtil.dialect.indexOf( "Oracle" ) >= 0 ) || //$NON-NLS-1$ ( HibernateUtil.dialect.indexOf( "ORACLE" ) >= 0 ); //$NON-NLS-1$ } /** * Evicts the object from the Hibernate cache. Call this if you don't believe you'll need this object in the * cache. This is also good to call if you're doing semi-mass updates. * * @param obj */ public static void evict( final Object obj ) { // if (debug) // log.debug(Messages.getInstance().getString("HIBUTIL.DEBUG_EVICT", obj.toString())); //$NON-NLS-1$ try { HibernateUtil.getSession().evict( obj ); } catch ( HibernateException ex ) { HibernateUtil.log.error( Messages.getInstance().getErrorString( "HIBUTIL.ERROR_0014_EVICTING_OBJECT" ), ex ); //$NON-NLS-1$ } } public void systemEntryPoint() { // No need to do anything for Hibernate here. } public void systemExitPoint() { try { HibernateUtil.commitTransaction(); } catch ( Throwable t ) { // get some real logging code in here t.printStackTrace(); } try { HibernateUtil.closeSession(); } catch ( Throwable t ) { // get some real logging code in here t.printStackTrace(); } } }