/** * Copyright (c) 2009 - 2017 Red Hat, Inc. * * This software is licensed to you under the GNU General Public License, * version 2 (GPLv2). There is NO WARRANTY for this software, express or * implied, including the implied warranties of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 * along with this software; if not, see * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. * * Red Hat trademarks are not licensed under GPLv2. No permission is * granted to use or replicate Red Hat trademarks that are incorporated * in this software or its documentation. */ package org.candlepin.test; import org.hibernate.CacheMode; import org.hibernate.Criteria; import org.hibernate.FlushMode; import org.hibernate.Filter; import org.hibernate.HibernateException; import org.hibernate.LobHelper; import org.hibernate.LockMode; import org.hibernate.LockOptions; import org.hibernate.MultiIdentifierLoadAccess; import org.hibernate.IdentifierLoadAccess; import org.hibernate.Interceptor; import org.hibernate.NaturalIdLoadAccess; import org.hibernate.Query; import org.hibernate.ReplicationMode; import org.hibernate.ScrollableResults; import org.hibernate.ScrollMode; import org.hibernate.Session; import org.hibernate.SessionEventListener; import org.hibernate.SessionFactory; import org.hibernate.SharedSessionBuilder; import org.hibernate.SimpleNaturalIdLoadAccess; import org.hibernate.SQLQuery; import org.hibernate.Transaction; import org.hibernate.TypeHelper; import org.hibernate.UnknownProfileException; import org.hibernate.collection.spi.PersistentCollection; import org.hibernate.loader.custom.CustomQuery; import org.hibernate.engine.jdbc.LobCreationContext; import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess; import org.hibernate.engine.jdbc.spi.JdbcCoordinator; import org.hibernate.engine.query.spi.sql.NativeSQLQuerySpecification; import org.hibernate.engine.spi.EntityKey; import org.hibernate.engine.spi.LoadQueryInfluencers; import org.hibernate.engine.spi.NamedQueryDefinition; import org.hibernate.engine.spi.NamedSQLQueryDefinition; import org.hibernate.engine.spi.PersistenceContext; import org.hibernate.engine.spi.QueryParameters; import org.hibernate.engine.spi.SessionEventListenerManager; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.jdbc.ReturningWork; import org.hibernate.jdbc.Work; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.procedure.ProcedureCall; import org.hibernate.resource.transaction.TransactionCoordinator; import org.hibernate.stat.SessionStatistics; import org.hibernate.type.descriptor.WrapperOptions; import java.io.Serializable; import java.sql.Connection; import java.util.Iterator; import java.util.List; /** * The SessionWrapper is a utility class intended to be used in places where we need to spy on an * existing session instance, but are unable to due to the "final" nature of Hibernate's * SessionImpl class. */ public class SessionWrapper implements Session, SessionImplementor { protected final Session session; protected final SessionImplementor sessionImpl; public SessionWrapper(Session session) { if (session == null) { throw new IllegalArgumentException("session is null"); } this.session = session; this.sessionImpl = (SessionImplementor) session; } // Session methods /** * {@inheritDoc} */ @Override public SharedSessionBuilder sessionWithOptions() { return this.session.sessionWithOptions(); } /** * {@inheritDoc} */ @Override public void flush() throws HibernateException { this.session.flush(); } /** * {@inheritDoc} */ @Override public void setFlushMode(FlushMode flushMode) { this.session.setFlushMode(flushMode); } /** * {@inheritDoc} */ @Override public FlushMode getFlushMode() { return this.session.getFlushMode(); } /** * {@inheritDoc} */ @Override public void setCacheMode(CacheMode cacheMode) { this.session.setCacheMode(cacheMode); } /** * {@inheritDoc} */ @Override public CacheMode getCacheMode() { return this.session.getCacheMode(); } /** * {@inheritDoc} */ @Override public SessionFactory getSessionFactory() { return this.session.getSessionFactory(); } /** * {@inheritDoc} */ @Override public void close() throws HibernateException { this.session.close(); } /** * {@inheritDoc} */ @Override public void cancelQuery() throws HibernateException { this.session.cancelQuery(); } /** * {@inheritDoc} */ @Override public boolean isOpen() { return this.session.isOpen(); } /** * {@inheritDoc} */ @Override public boolean isConnected() { return this.session.isConnected(); } /** * {@inheritDoc} */ @Override public boolean isDirty() throws HibernateException { return this.session.isDirty(); } /** * {@inheritDoc} */ @Override public boolean isDefaultReadOnly() { return this.session.isDefaultReadOnly(); } /** * {@inheritDoc} */ @Override public void setDefaultReadOnly(boolean readOnly) { this.session.setDefaultReadOnly(readOnly); } /** * {@inheritDoc} */ @Override public Serializable getIdentifier(Object object) { return this.session.getIdentifier(object); } /** * {@inheritDoc} */ @Override public boolean contains(Object object) { return this.session.contains(object); } /** * {@inheritDoc} */ @Override public void evict(Object object) { this.session.evict(object); } /** * {@inheritDoc} */ @Override public <T> T load(Class<T> theClass, Serializable id, LockMode lockMode) { return this.session.load(theClass, id, lockMode); } /** * {@inheritDoc} */ @Override public <T> T load(Class<T> theClass, Serializable id, LockOptions lockOptions) { return this.session.load(theClass, id, lockOptions); } /** * {@inheritDoc} */ @Override public Object load(String entityName, Serializable id, LockMode lockMode) { return this.session.load(entityName, id, lockMode); } /** * {@inheritDoc} */ @Override public Object load(String entityName, Serializable id, LockOptions lockOptions) { return this.session.load(entityName, id, lockOptions); } /** * {@inheritDoc} */ @Override public <T> T load(Class<T> theClass, Serializable id) { return this.session.load(theClass, id); } /** * {@inheritDoc} */ @Override public Object load(String entityName, Serializable id) { return this.session.load(entityName, id); } /** * {@inheritDoc} */ @Override public void load(Object object, Serializable id) { this.session.load(object, id); } /** * {@inheritDoc} */ @Override public void replicate(Object object, ReplicationMode replicationMode) { this.session.replicate(object, replicationMode); } /** * {@inheritDoc} */ @Override public void replicate(String entityName, Object object, ReplicationMode replicationMode) { this.session.replicate(entityName, object, replicationMode); } /** * {@inheritDoc} */ @Override public Serializable save(Object object) { return this.session.save(object); } /** * {@inheritDoc} */ @Override public Serializable save(String entityName, Object object) { return this.session.save(entityName, object); } /** * {@inheritDoc} */ @Override public void saveOrUpdate(Object object) { this.session.saveOrUpdate(object); } /** * {@inheritDoc} */ @Override public void saveOrUpdate(String entityName, Object object) { this.session.saveOrUpdate(entityName, object); } /** * {@inheritDoc} */ @Override public void update(Object object) { this.session.update(object); } /** * {@inheritDoc} */ @Override public void update(String entityName, Object object) { this.session.update(entityName, object); } /** * {@inheritDoc} */ @Override public Object merge(Object object) { return this.session.merge(object); } /** * {@inheritDoc} */ @Override public Object merge(String entityName, Object object) { return this.session.merge(entityName, object); } /** * {@inheritDoc} */ @Override public void persist(Object object) { this.session.persist(object); } /** * {@inheritDoc} */ @Override public void persist(String entityName, Object object) { this.session.persist(entityName, object); } /** * {@inheritDoc} */ @Override public void delete(Object object) { this.session.delete(object); } /** * {@inheritDoc} */ @Override public void delete(String entityName, Object object) { this.session.delete(entityName, object); } /** * {@inheritDoc} */ @Override public void lock(Object object, LockMode lockMode) { this.session.lock(object, lockMode); } /** * {@inheritDoc} */ @Override public void lock(String entityName, Object object, LockMode lockMode) { this.session.lock(entityName, object, lockMode); } /** * {@inheritDoc} */ @Override public LockRequest buildLockRequest(LockOptions lockOptions) { return this.session.buildLockRequest(lockOptions); } /** * {@inheritDoc} */ @Override public void refresh(Object object) { this.session.refresh(object); } /** * {@inheritDoc} */ @Override public void refresh(String entityName, Object object) { this.session.refresh(entityName, object); } /** * {@inheritDoc} */ @Override public void refresh(Object object, LockMode lockMode) { this.session.refresh(object, lockMode); } /** * {@inheritDoc} */ @Override public void refresh(Object object, LockOptions lockOptions) { this.session.refresh(object, lockOptions); } /** * {@inheritDoc} */ @Override public void refresh(String entityName, Object object, LockOptions lockOptions) { this.session.refresh(entityName, object, lockOptions); } /** * {@inheritDoc} */ @Override public LockMode getCurrentLockMode(Object object) { return this.session.getCurrentLockMode(object); } /** * {@inheritDoc} */ @Override public Query createFilter(Object collection, String queryString) { return this.session.createFilter(collection, queryString); } /** * {@inheritDoc} */ @Override public void clear() { this.session.clear(); } /** * {@inheritDoc} */ @Override public <T> T get(Class<T> entityType, Serializable id) { return this.session.get(entityType, id); } /** * {@inheritDoc} */ @Override public <T> T get(Class<T> entityType, Serializable id, LockMode lockMode) { return this.session.get(entityType, id, lockMode); } /** * {@inheritDoc} */ @Override public <T> T get(Class<T> entityType, Serializable id, LockOptions lockOptions) { return this.session.get(entityType, id, lockOptions); } /** * {@inheritDoc} */ @Override public Object get(String entityName, Serializable id) { return this.session.get(entityName, id); } /** * {@inheritDoc} */ @Override public Object get(String entityName, Serializable id, LockMode lockMode) { return this.session.get(entityName, id, lockMode); } /** * {@inheritDoc} */ @Override public Object get(String entityName, Serializable id, LockOptions lockOptions) { return this.session.get(entityName, id, lockOptions); } /** * {@inheritDoc} */ @Override public String getEntityName(Object object) { return this.session.getEntityName(object); } /** * {@inheritDoc} */ @Override public IdentifierLoadAccess byId(String entityName) { return this.session.byId(entityName); } /** * {@inheritDoc} */ @Override public <T> IdentifierLoadAccess<T> byId(Class<T> entityClass) { return this.session.byId(entityClass); } /** * {@inheritDoc} */ @Override public MultiIdentifierLoadAccess byMultipleIds(String entityName) { return this.session.byMultipleIds(entityName); } /** * {@inheritDoc} */ @Override public <T> MultiIdentifierLoadAccess<T> byMultipleIds(Class<T> entityClass) { return this.session.byMultipleIds(entityClass); } /** * {@inheritDoc} */ @Override public NaturalIdLoadAccess byNaturalId(String entityName) { return this.session.byNaturalId(entityName); } /** * {@inheritDoc} */ @Override public <T> NaturalIdLoadAccess<T> byNaturalId(Class<T> entityClass) { return this.session.byNaturalId(entityClass); } /** * {@inheritDoc} */ @Override public SimpleNaturalIdLoadAccess bySimpleNaturalId(String entityName) { return this.session.bySimpleNaturalId(entityName); } /** * {@inheritDoc} */ @Override public <T> SimpleNaturalIdLoadAccess<T> bySimpleNaturalId(Class<T> entityClass) { return this.session.bySimpleNaturalId(entityClass); } /** * {@inheritDoc} */ @Override public Filter enableFilter(String filterName) { return this.session.enableFilter(filterName); } /** * {@inheritDoc} */ @Override public Filter getEnabledFilter(String filterName) { return this.session.getEnabledFilter(filterName); } /** * {@inheritDoc} */ @Override public void disableFilter(String filterName) { this.session.disableFilter(filterName); } /** * {@inheritDoc} */ @Override public SessionStatistics getStatistics() { return this.session.getStatistics(); } /** * {@inheritDoc} */ @Override public boolean isReadOnly(Object entityOrProxy) { return this.session.isReadOnly(entityOrProxy); } /** * {@inheritDoc} */ @Override public void setReadOnly(Object entityOrProxy, boolean readOnly) { this.session.setReadOnly(entityOrProxy, readOnly); } /** * {@inheritDoc} */ @Override public void doWork(Work work) throws HibernateException { this.session.doWork(work); } /** * {@inheritDoc} */ @Override public <T> T doReturningWork(ReturningWork<T> work) throws HibernateException { return this.session.doReturningWork(work); } /** * {@inheritDoc} */ @Override public Connection disconnect() { return this.session.disconnect(); } /** * {@inheritDoc} */ @Override public void reconnect(Connection connection) { this.session.reconnect(connection); } /** * {@inheritDoc} */ @Override public boolean isFetchProfileEnabled(String name) throws UnknownProfileException { return this.session.isFetchProfileEnabled(name); } /** * {@inheritDoc} */ @Override public void enableFetchProfile(String name) throws UnknownProfileException { this.session.enableFetchProfile(name); } /** * {@inheritDoc} */ @Override public void disableFetchProfile(String name) throws UnknownProfileException { this.session.disableFetchProfile(name); } /** * {@inheritDoc} */ @Override public TypeHelper getTypeHelper() { return this.session.getTypeHelper(); } /** * {@inheritDoc} */ @Override public LobHelper getLobHelper() { return this.session.getLobHelper(); } /** * {@inheritDoc} */ @Override public void addEventListeners(SessionEventListener... listeners) { this.session.addEventListeners(listeners); } // SharedSessionContract methods /** * {@inheritDoc} */ @Override public Transaction beginTransaction() { return this.session.beginTransaction(); } /** * {@inheritDoc} */ @Override public Criteria createCriteria(Class persistentClass) { return this.session.createCriteria(persistentClass); } /** * {@inheritDoc} */ @Override public Criteria createCriteria(Class persistentClass, String alias) { return this.session.createCriteria(persistentClass, alias); } /** * {@inheritDoc} */ @Override public Criteria createCriteria(String entityName) { return this.session.createCriteria(entityName); } /** * {@inheritDoc} */ @Override public Criteria createCriteria(String entityName, String alias) { return this.session.createCriteria(entityName, alias); } /** * {@inheritDoc} */ @Override public Query createQuery(String queryString) { return this.session.createQuery(queryString); } /** * {@inheritDoc} */ @Override public SQLQuery createSQLQuery(String queryString) { return this.session.createSQLQuery(queryString); } /** * {@inheritDoc} */ @Override public ProcedureCall createStoredProcedureCall(String procedureName) { return this.session.createStoredProcedureCall(procedureName); } /** * {@inheritDoc} */ @Override public ProcedureCall createStoredProcedureCall(String procedureName, Class... resultClasses) { return this.session.createStoredProcedureCall(procedureName, resultClasses); } /** * {@inheritDoc} */ @Override public ProcedureCall createStoredProcedureCall(String procedureName, String... resultSetMappings) { return this.session.createStoredProcedureCall(procedureName, resultSetMappings); } /** * {@inheritDoc} */ @Override public ProcedureCall getNamedProcedureCall(String name) { return this.session.getNamedProcedureCall(name); } /** * {@inheritDoc} */ @Override public Query getNamedQuery(String queryName) { return this.session.getNamedQuery(queryName); } /** * {@inheritDoc} */ @Override public String getTenantIdentifier() { return this.session.getTenantIdentifier(); } /** * {@inheritDoc} */ @Override public Transaction getTransaction() { return this.session.getTransaction(); } // SessionImplementor methods /** * {@inheritDoc} */ @Override public JdbcConnectionAccess getJdbcConnectionAccess() { return this.sessionImpl.getJdbcConnectionAccess(); } /** * {@inheritDoc} */ @Override public EntityKey generateEntityKey(Serializable id, EntityPersister persister) { return this.sessionImpl.generateEntityKey(id, persister); } /** * {@inheritDoc} */ @Override public Interceptor getInterceptor() { return this.sessionImpl.getInterceptor(); } /** * {@inheritDoc} */ @Override public void setAutoClear(boolean enabled) { this.sessionImpl.setAutoClear(enabled); } /** * {@inheritDoc} */ @Override public void disableTransactionAutoJoin() { this.sessionImpl.disableTransactionAutoJoin(); } /** * {@inheritDoc} */ @Override public boolean isTransactionInProgress() { return this.sessionImpl.isTransactionInProgress(); } /** * {@inheritDoc} */ @Override public void initializeCollection(PersistentCollection collection, boolean writing) throws HibernateException { this.sessionImpl.initializeCollection(collection, writing); } /** * {@inheritDoc} */ @Override public Object internalLoad(String entityName, Serializable id, boolean eager, boolean nullable) throws HibernateException { return this.sessionImpl.internalLoad(entityName, id, eager, nullable); } /** * {@inheritDoc} */ @Override public Object immediateLoad(String entityName, Serializable id) throws HibernateException { return this.sessionImpl.immediateLoad(entityName, id); } /** * {@inheritDoc} */ @Override public long getTimestamp() { return this.sessionImpl.getTimestamp(); } /** * {@inheritDoc} */ @Override public SessionFactoryImplementor getFactory() { return this.sessionImpl.getFactory(); } /** * {@inheritDoc} */ @Override public List list(String query, QueryParameters queryParameters) throws HibernateException { return this.sessionImpl.list(query, queryParameters); } /** * {@inheritDoc} */ @Override public Iterator iterate(String query, QueryParameters queryParameters) throws HibernateException { return this.sessionImpl.iterate(query, queryParameters); } /** * {@inheritDoc} */ @Override public ScrollableResults scroll(String query, QueryParameters queryParameters) throws HibernateException { return this.sessionImpl.scroll(query, queryParameters); } /** * {@inheritDoc} */ @Override public ScrollableResults scroll(Criteria criteria, ScrollMode scrollMode) { return this.sessionImpl.scroll(criteria, scrollMode); } /** * {@inheritDoc} */ @Override public List list(Criteria criteria) { return this.sessionImpl.list(criteria); } /** * {@inheritDoc} */ @Override public List listFilter(Object collection, String filter, QueryParameters queryParameters) throws HibernateException { return this.sessionImpl.listFilter(collection, filter, queryParameters); } /** * {@inheritDoc} */ @Override public Iterator iterateFilter(Object collection, String filter, QueryParameters queryParameters) throws HibernateException { return this.sessionImpl.iterateFilter(collection, filter, queryParameters); } /** * {@inheritDoc} */ @Override public EntityPersister getEntityPersister(String entityName, Object object) throws HibernateException { return this.sessionImpl.getEntityPersister(entityName, object); } /** * {@inheritDoc} */ @Override public Object getEntityUsingInterceptor(EntityKey key) throws HibernateException { return this.sessionImpl.getEntityUsingInterceptor(key); } /** * {@inheritDoc} */ @Override public Serializable getContextEntityIdentifier(Object object) { return this.sessionImpl.getContextEntityIdentifier(object); } /** * {@inheritDoc} */ @Override public String bestGuessEntityName(Object object) { return this.sessionImpl.bestGuessEntityName(object); } /** * {@inheritDoc} */ @Override public Connection connection() { return this.sessionImpl.connection(); } /** * {@inheritDoc} */ @Override public String guessEntityName(Object entity) throws HibernateException { return this.sessionImpl.guessEntityName(entity); } /** * {@inheritDoc} */ @Override public Object instantiate(String entityName, Serializable id) throws HibernateException { return this.sessionImpl.instantiate(entityName, id); } /** * {@inheritDoc} */ @Override public List listCustomQuery(CustomQuery customQuery, QueryParameters queryParameters) throws HibernateException { return this.sessionImpl.listCustomQuery(customQuery, queryParameters); } /** * {@inheritDoc} */ @Override public ScrollableResults scrollCustomQuery(CustomQuery customQuery, QueryParameters queryParameters) throws HibernateException { return this.sessionImpl.scrollCustomQuery(customQuery, queryParameters); } /** * {@inheritDoc} */ @Override public List list(NativeSQLQuerySpecification spec, QueryParameters queryParameters) throws HibernateException { return this.sessionImpl.list(spec, queryParameters); } /** * {@inheritDoc} */ @Override public ScrollableResults scroll(NativeSQLQuerySpecification spec, QueryParameters queryParameters) { return this.sessionImpl.scroll(spec, queryParameters); } /** * {@inheritDoc} */ @Override public int getDontFlushFromFind() { return this.sessionImpl.getDontFlushFromFind(); } /** * {@inheritDoc} */ @Override public PersistenceContext getPersistenceContext() { return this.sessionImpl.getPersistenceContext(); } /** * {@inheritDoc} */ @Override public int executeUpdate(String query, QueryParameters queryParameters) throws HibernateException { return this.sessionImpl.executeUpdate(query, queryParameters); } /** * {@inheritDoc} */ @Override public int executeNativeUpdate(NativeSQLQuerySpecification specification, QueryParameters queryParameters) throws HibernateException { return this.sessionImpl.executeNativeUpdate(specification, queryParameters); } /** * {@inheritDoc} */ @Override public Query getNamedSQLQuery(String name) { return this.sessionImpl.getNamedSQLQuery(name); } /** * {@inheritDoc} */ @Override public boolean isEventSource() { return this.sessionImpl.isEventSource(); } /** * {@inheritDoc} */ @Override public void afterScrollOperation() { this.sessionImpl.afterScrollOperation(); } /** * {@inheritDoc} */ @Override public TransactionCoordinator getTransactionCoordinator() { return this.sessionImpl.getTransactionCoordinator(); } /** * {@inheritDoc} */ @Override public JdbcCoordinator getJdbcCoordinator() { return this.sessionImpl.getJdbcCoordinator(); } /** * {@inheritDoc} */ @Override public boolean isClosed() { return this.sessionImpl.isClosed(); } /** * {@inheritDoc} */ @Override public boolean shouldAutoClose() { return this.sessionImpl.shouldAutoClose(); } /** * {@inheritDoc} */ @Override public boolean isAutoCloseSessionEnabled() { return this.sessionImpl.isAutoCloseSessionEnabled(); } /** * {@inheritDoc} */ @Override public LoadQueryInfluencers getLoadQueryInfluencers() { return this.sessionImpl.getLoadQueryInfluencers(); } /** * {@inheritDoc} */ @Override public Query createQuery(NamedQueryDefinition namedQueryDefinition) { return this.sessionImpl.createQuery(namedQueryDefinition); } /** * {@inheritDoc} */ @Override public SQLQuery createSQLQuery(NamedSQLQueryDefinition namedQueryDefinition) { return this.sessionImpl.createSQLQuery(namedQueryDefinition); } /** * {@inheritDoc} */ @Override public SessionEventListenerManager getEventListenerManager() { return this.sessionImpl.getEventListenerManager(); } // LobCreationContext methods /** * {@inheritDoc} */ @Override public <T> T execute(LobCreationContext.Callback<T> callback) { return this.sessionImpl.execute(callback); } // WrapperOptionsContext methods /** * {@inheritDoc} */ @Override public WrapperOptions getWrapperOptions() { return this.sessionImpl.getWrapperOptions(); } }