/*
* Hibernate OGM, Domain model persistence for NoSQL datastores
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.ogm.hibernatecore.impl;
import org.hibernate.Session;
import org.hibernate.engine.spi.AbstractDelegatingSessionBuilderImplementor;
import org.hibernate.engine.spi.SessionBuilderImplementor;
import org.hibernate.engine.spi.SessionOwner;
import org.hibernate.event.spi.EventSource;
import org.hibernate.ogm.OgmSession;
import org.hibernate.ogm.OgmSessionFactory;
import org.hibernate.ogm.engine.spi.OgmSessionBuilderImplementor;
import org.hibernate.ogm.jpa.impl.OgmExceptionMapper;
import org.hibernate.resource.transaction.backend.jta.internal.synchronization.AfterCompletionAction;
import org.hibernate.resource.transaction.backend.jta.internal.synchronization.ExceptionMapper;
import org.hibernate.resource.transaction.backend.jta.internal.synchronization.ManagedFlushChecker;
/**
* @author Emmanuel Bernard <emmanuel@hibernate.org>
*/
public class OgmSessionBuilderDelegator extends AbstractDelegatingSessionBuilderImplementor implements OgmSessionBuilderImplementor {
private final SessionBuilderImplementor builder;
private final OgmSessionFactory factory;
public OgmSessionBuilderDelegator(SessionBuilderImplementor sessionBuilder, OgmSessionFactory factory) {
super( sessionBuilder );
this.builder = sessionBuilder;
this.factory = factory;
}
@Override
public OgmSession openSession() {
Session session = builder.openSession();
return new OgmSessionImpl( factory, (EventSource) session );
}
@Override
public OgmSessionBuilderImplementor owner(SessionOwner sessionOwner) {
if ( sessionOwner.getExceptionMapper() != null ) {
sessionOwner = new OgmExceptionMapperSessionOwner( sessionOwner );
}
builder.owner( sessionOwner );
return this;
}
/**
* {@link SessionOwner} which injects OGM's {@link ExceptionMapper}.
*
* @author Gunnar Morling
*/
private static class OgmExceptionMapperSessionOwner extends ForwardingSessionOwner {
public OgmExceptionMapperSessionOwner(SessionOwner delegate) {
super( delegate );
}
@Override
public ExceptionMapper getExceptionMapper() {
return new OgmExceptionMapper( super.getExceptionMapper() );
}
}
/**
* Delegating {@link SessionOwner}.
*
* @author Gunnar Morling
*/
private abstract static class ForwardingSessionOwner implements SessionOwner {
private final SessionOwner delegate;
public ForwardingSessionOwner(SessionOwner delegate) {
this.delegate = delegate;
}
@Override
public boolean shouldAutoCloseSession() {
return delegate.shouldAutoCloseSession();
}
@Override
public ExceptionMapper getExceptionMapper() {
return delegate.getExceptionMapper();
}
@Override
public AfterCompletionAction getAfterCompletionAction() {
return delegate.getAfterCompletionAction();
}
@Override
public ManagedFlushChecker getManagedFlushChecker() {
return delegate.getManagedFlushChecker();
}
}
}