/*
* Copyright 2004-2009 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.compass.core.transaction;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.compass.core.CompassException;
import org.compass.core.CompassSession;
import org.compass.core.spi.InternalCompass;
import org.compass.core.spi.InternalCompassSession;
/**
* @author kimchy
*/
public class LocalTransaction extends AbstractTransaction {
private static final Log log = LogFactory.getLog(LocalTransaction.class);
private static final int UNKNOWN = -1;
private static final int STARTED = 0;
private static final int COMMIT = 1;
private static final int ROLLBACK = 2;
private int state;
private InternalCompassSession session;
private InternalCompass compass;
public LocalTransaction(InternalCompassSession session, TransactionFactory transactionFactory) {
super(transactionFactory);
state = UNKNOWN;
this.session = session;
this.compass = session.getCompass();
}
public void join(InternalCompassSession session) throws CompassException {
this.session = session;
if (log.isDebugEnabled()) {
log.debug("Joining an existing local transcation on thread [" + Thread.currentThread().getName() +
"] Compass [" + System.identityHashCode(compass) + "] Session [" + System.identityHashCode(session) + "]");
}
}
public void begin() throws CompassException {
if (log.isDebugEnabled()) {
log.debug("Starting a new local transcation on thread [" + Thread.currentThread().getName() +
"] Compass [" + System.identityHashCode(compass) + "] Session [" + System.identityHashCode(session) + "]");
}
session.getSearchEngine().begin();
state = STARTED;
}
protected void doCommit() throws CompassException {
if (session.getSearchEngine().wasRolledBack()) {
// don't do anything, since it was rolled back already
}
if (state == UNKNOWN) {
log.debug("Not committing the transaction since within a local transaction on thread ["
+ Thread.currentThread().getName() + "] Compass [" + System.identityHashCode(compass)
+ "] Session [" + System.identityHashCode(session) + "]");
return;
}
// commit called by the high level local transaction
if (log.isDebugEnabled()) {
log.debug("Committing local transaction on thread [" + Thread.currentThread().getName() +
"] Compass [" + System.identityHashCode(compass) + "] Session [" + System.identityHashCode(session) + "]");
}
session.evictAll();
session.getSearchEngine().commit(true);
((LocalTransactionFactory) transactionFactory).unbindSessionFromTransaction(this, session);
state = COMMIT;
}
protected void doRollback() throws CompassException {
if (session.getSearchEngine().wasRolledBack()) {
// don't do anything, since it was rolled back already
}
if (state == UNKNOWN) {
if (log.isDebugEnabled()) {
log.debug("Rolling back local transaction, which exists within another local transaction "
+ " on thread [" + Thread.currentThread().getName() +
"] Compass [" + System.identityHashCode(compass) + "] Session [" + System.identityHashCode(session) + "]");
}
} else {
if (log.isDebugEnabled()) {
log.debug("Rolling back local transaction on thread [" + Thread.currentThread().getName() +
"] Compass [" + System.identityHashCode(compass) + "] Session [" + System.identityHashCode(session) + "]");
}
((LocalTransactionFactory) transactionFactory).unbindSessionFromTransaction(this, session);
}
state = ROLLBACK;
session.evictAll();
session.getSearchEngine().rollback();
}
public boolean wasRolledBack() throws CompassException {
return session.getSearchEngine().wasRolledBack();
}
public boolean wasCommitted() throws CompassException {
return session.getSearchEngine().wasCommitted();
}
public CompassSession getSession() {
return this.session;
}
}