001: /*
002: * Copyright 2004-2006 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.compass.core.transaction;
018:
019: import org.apache.commons.logging.Log;
020: import org.apache.commons.logging.LogFactory;
021: import org.compass.core.Compass;
022: import org.compass.core.CompassException;
023: import org.compass.core.CompassSession;
024: import org.compass.core.CompassTransaction;
025: import org.compass.core.CompassTransaction.TransactionIsolation;
026: import org.compass.core.config.CompassEnvironment;
027: import org.compass.core.config.CompassSettings;
028: import org.compass.core.spi.InternalCompassSession;
029:
030: /**
031: * @author kimchy
032: */
033: public abstract class AbstractTransactionFactory implements
034: TransactionFactory {
035:
036: protected final Log log = LogFactory.getLog(getClass());
037:
038: protected Compass compass;
039:
040: protected boolean commitBeforeCompletion;
041:
042: private boolean disableAutoJoinSession = false;
043:
044: public void configure(Compass compass, CompassSettings settings)
045: throws CompassException {
046: this .compass = compass;
047: this .commitBeforeCompletion = settings
048: .getSettingAsBoolean(
049: CompassEnvironment.Transaction.COMMIT_BEFORE_COMPLETION,
050: false);
051: disableAutoJoinSession = settings
052: .getSettingAsBoolean(
053: CompassEnvironment.Transaction.DISABLE_AUTO_JOIN_SESSION,
054: false);
055: doConfigure(settings);
056: }
057:
058: protected void doConfigure(CompassSettings settings) {
059:
060: }
061:
062: public boolean tryJoinExistingTransaction(
063: InternalCompassSession session) throws CompassException {
064: if (disableAutoJoinSession) {
065: return false;
066: }
067: if (!isWithinExistingTransaction(session)) {
068: return false;
069: }
070: beginTransaction(session, null);
071: return true;
072: }
073:
074: protected abstract boolean isWithinExistingTransaction(
075: InternalCompassSession session) throws CompassException;
076:
077: public CompassTransaction beginTransaction(
078: InternalCompassSession session,
079: TransactionIsolation transactionIsolation)
080: throws CompassException {
081:
082: CompassSession boundSession = getTransactionBoundSession();
083: InternalCompassTransaction tr;
084: if (boundSession == null || boundSession != session) {
085: tr = doBeginTransaction(session, transactionIsolation);
086: doBindSessionToTransaction(tr, session);
087: } else {
088: tr = doContinueTransaction(session);
089: }
090: tr.setBegun(true);
091: return tr;
092: }
093:
094: protected abstract InternalCompassTransaction doBeginTransaction(
095: InternalCompassSession session,
096: TransactionIsolation transactionIsolation)
097: throws CompassException;
098:
099: protected abstract InternalCompassTransaction doContinueTransaction(
100: InternalCompassSession session) throws CompassException;
101:
102: protected abstract void doBindSessionToTransaction(
103: CompassTransaction tr, CompassSession session)
104: throws CompassException;
105: }
|