org.apache.ojb.odmg.locking.LockManagerFactory.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.ojb.odmg.locking.LockManagerFactory.java

Source

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();
    }
}