package org.apache.ojb.odmg.locking;
/* Copyright 2002-2005 The Apache Software Foundation
*
* 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.
*/
import org.apache.commons.lang.SystemUtils;
import org.apache.ojb.broker.OJBRuntimeException;
import org.apache.ojb.broker.locking.LockManager;
import org.apache.ojb.broker.util.ClassHelper;
import org.apache.ojb.broker.util.configuration.Configuration;
import org.apache.ojb.broker.util.configuration.impl.OjbConfigurator;
import org.apache.ojb.broker.util.logging.Logger;
import org.apache.ojb.broker.util.logging.LoggerFactory;
/**
* This factory class creates LockManager instances according
* to the setting in the OJB properties file.
*/
public class LockManagerFactory
{
private static LockManagerFactory lockManagerFactory = null;
private Logger log = LoggerFactory.getLogger(LockManagerFactory.class);
private org.apache.ojb.odmg.locking.LockManager lockManager;
private LockManagerFactory()
{
init();
}
private void init()
{
Configuration conf = OjbConfigurator.getInstance().getConfigurationFor(null);
Class lockMapClass = conf.getClass("LockMapClass", Object.class);
Class lockManagerClass = conf.getClass("LockManagerClass", null);
if(lockManagerClass == null)
{
throw new OJBRuntimeException(buildErrorMsg(lockMapClass, lockManagerClass));
}
if(!lockMapClass.equals(Object.class))
{
// use the deprecated old odmg locking stuff
log.info("Setup *deprecated* odmg-locking api.");
log.info("Used LockManagerClass=" + lockManagerClass);
log.info("Used LockMapClass=" + lockMapClass);
if(!org.apache.ojb.odmg.locking.LockManager.class.isAssignableFrom(lockManagerClass))
{
throw new OJBRuntimeException(buildErrorMsg(lockMapClass, lockManagerClass));
}
setupLockManager(lockManagerClass);
}
else
{
// use the kernel locking api
log.info("Setup odmg-locking api.");
log.info("Used LockManagerClass=" + lockManagerClass);
if(org.apache.ojb.odmg.locking.LockManager.class.isAssignableFrom(lockManagerClass))
{
throw new OJBRuntimeException(buildErrorMsg(lockMapClass, lockManagerClass));
}
setupLockManager(conf, lockManagerClass);
}
}
private void setupLockManager(Configuration conf, Class lockManagerClass)
{
long timeout = conf.getInteger("LockTimeout", 60000);
log.info("LockTimeout=" + timeout);
try
{
LockManager lm = (LockManager) ClassHelper.newInstance(lockManagerClass);
lm.setLockTimeout(timeout);
lockManager = new LockManagerOdmgImpl(lm);
}
catch(Exception e)
{
throw new OJBRuntimeException("Can't setup odmg lock manager instance", e);
}
}
private void setupLockManager(Class lockManagerClass)
{
try
{
lockManager = (org.apache.ojb.odmg.locking.LockManager) ClassHelper.newInstance(lockManagerClass);
}
catch(Exception e)
{
throw new OJBRuntimeException("Can't setup odmg lock manager instance", e);
}
}
private String buildErrorMsg(Class lockMap, Class lockManager)
{
String eol = SystemUtils.LINE_SEPARATOR;
StringBuffer msg = new StringBuffer("Can't setup LockManager. Current used properties are:" + eol);
msg.append("LockMapClass=").append(lockMap != null ? lockMap.getName() : null)
.append(eol)
.append("LockManagerClass=").append(lockManager != null ? lockManager.getName() : null).append(eol)
.append("For correct setup of the lock manager, please enable the 'LockManagerClass' property")
.append(" in OJB configuration, OJB expects an 'org.apache.ojb.broker.locking.LockManager' implementation class.")
.append(eol)
.append("Or to enable the *deprecated* odmg-locking api enable the 'LockMapClass' AND the 'LockManager' properties")
.append(", in this case OJB expects an 'org.apache.ojb.odmg.locking.LockManager' implementation class.");
return msg.toString();
}
private org.apache.ojb.odmg.locking.LockManager getManager()
{
return lockManager;
}
/**
* Get a {@link org.apache.ojb.odmg.locking.LockManager} instance. The implementation class is
* configured in the OJB properties file.
*/
public static synchronized org.apache.ojb.odmg.locking.LockManager getLockManager()
{
if(lockManagerFactory == null)
{
lockManagerFactory = new LockManagerFactory();
}
return lockManagerFactory.getManager();
}
}