/*
* 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.config.CompassEnvironment;
import org.compass.core.config.CompassSettings;
import org.compass.core.transaction.manager.Glassfish;
import org.compass.core.transaction.manager.JBoss;
import org.compass.core.transaction.manager.JOTM;
import org.compass.core.transaction.manager.JOnAS;
import org.compass.core.transaction.manager.JRun4;
import org.compass.core.transaction.manager.OC4J;
import org.compass.core.transaction.manager.Orion;
import org.compass.core.transaction.manager.Resin;
import org.compass.core.transaction.manager.WebSphere;
import org.compass.core.transaction.manager.Weblogic;
import org.compass.core.util.ClassUtils;
/**
* @author kimchy
*/
public final class TransactionManagerLookupFactory {
private static final Log log = LogFactory.getLog(TransactionManagerLookupFactory.class);
private static Class[] autoDetectOrder = {WebSphere.class, Weblogic.class, JOnAS.class, JOTM.class, JBoss.class,
Glassfish.class, Orion.class, Resin.class, OC4J.class, JRun4.class};
private TransactionManagerLookupFactory() {
}
public static TransactionManagerLookup getTransactionManagerLookup(CompassSettings settings)
throws TransactionException {
String tmLookupClass = settings.getSetting(CompassEnvironment.Transaction.MANAGER_LOOKUP);
if (tmLookupClass == null) {
// try and auto detect the transaction manager
log.info("JTA Transaction Manager Lookup setting not found, auto detecting....");
for (Class anAutoDetectOrder : autoDetectOrder) {
if (log.isDebugEnabled()) {
log.debug("Trying [" + anAutoDetectOrder.getName() + "]");
}
TransactionManagerLookup tmLookup = detect(anAutoDetectOrder, settings);
if (tmLookup != null) {
log.info("Detected JTA Transaction Manager [" + anAutoDetectOrder.getName() + "]");
return tmLookup;
}
}
return null;
} else {
log.debug("Instansiating TransactionManagerLookup [" + tmLookupClass + "]");
try {
return (TransactionManagerLookup) ClassUtils.forName(tmLookupClass, settings.getClassLoader()).newInstance();
} catch (Exception e) {
throw new TransactionException("Could not instantiate TransactionManagerLookup", e);
}
}
}
private static TransactionManagerLookup detect(Class tmClass, CompassSettings settings) {
try {
TransactionManagerLookup tmLookup = (TransactionManagerLookup) tmClass.newInstance();
if (tmLookup.getTransactionManager(settings) != null) {
return tmLookup;
}
} catch (Exception e) {
// do nothing here
}
return null;
}
}