/*
* JBoss, Home of Professional Open Source
* Copyright 2009 Red Hat Inc. and/or its affiliates and other
* contributors as indicated by the @author tags. All rights reserved.
* See the copyright.txt in the distribution for a full listing of
* individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.infinispan.query.backend;
import org.hibernate.search.backend.TransactionContext;
import org.infinispan.util.logging.Log;
import org.infinispan.util.logging.LogFactory;
import javax.transaction.Synchronization;
import javax.transaction.SystemException;
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
import javax.transaction.TransactionSynchronizationRegistry;
/**
* This class implements the {@link org.hibernate.search.backend.TransactionContext} interface. It retrieves
* transaction context information from the {@link javax.transaction.TransactionManager} that gets passed in as a
* parameter upon instantiation.
* <p/>
* It is used by the {@link QueryInterceptor} to pass transaction information to a Hibernate Search {@link
* org.hibernate.search.backend.Work} object.
* <p/>
* <p/>
*
* @author Navin Surtani
* @see QueryInterceptor
*/
public class TransactionalEventTransactionContext implements TransactionContext {
private final TransactionManager transactionManager;
private final TransactionSynchronizationRegistry transactionSynchronizationRegistry;
private static final Log log = LogFactory.getLog(TransactionalEventTransactionContext.class);
/**
* Creates a new instance of NodeModifiedTransactionContext.
* <p/>
*
* @param transactionManager a NodeModifiedEvent to wrap. Should not be null.
* @param transactionSynchronizationRegistry
* @throws NullPointerException if event is null.
*/
public TransactionalEventTransactionContext(TransactionManager transactionManager, final TransactionSynchronizationRegistry transactionSynchronizationRegistry) {
this.transactionManager = transactionManager;
this.transactionSynchronizationRegistry = transactionSynchronizationRegistry;
}
/**
* Returns a boolean value whether or not a transaction is in progress (JTA transaction and in this case *not* an
* org.hibernate transaction).
*
* @return true if a transaction is in progress, false otherwise.
*/
@Override
public boolean isTransactionInProgress() {
if (transactionManager == null) return false;
Transaction transaction = null;
try {
transaction = transactionManager.getTransaction();
}
catch (SystemException e) {
log.debug("Caught SystemException in TransactionalEventTransactionContext", e);
}
return (transaction != null);
}
/**
* Returns a JTA transaction.
*
* @return a JTA transaction if one is available, or a null otherwise.
* @see javax.transaction.TransactionManager
*/
@Override
public Object getTransactionIdentifier() {
if (transactionManager == null) return null;
Transaction transaction = null;
try {
transaction = transactionManager.getTransaction();
}
catch (SystemException e) {
log.debug("Caught SystemException in TransactionalEventTransactionContext", e);
}
return transaction;
}
/**
* Registers the synchronization passed in as a parameter with the ongoing transaction.
* <p/>
* If there is no ongoing transaction, then this method will do nothing and simply return.
* <p/>
*
* @param synchronization synchronization to register. Must not be null.
* @throws NullPointerException if the synchronization is null.
*/
@Override
public void registerSynchronization(Synchronization synchronization) {
if(transactionSynchronizationRegistry != null) {
if (synchronization == null) throw new NullPointerException("Synchronization passed in is null!");
transactionSynchronizationRegistry.registerInterposedSynchronization(synchronization);
}
else if (transactionManager != null) {
if (synchronization == null) throw new NullPointerException("Synchronization passed in is null!");
try {
Transaction transaction = transactionManager.getTransaction();
transaction.registerSynchronization(synchronization);
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}