001    package org.apache.ojb.odmg.locking;
002    
003    /* Copyright 2002-2005 The Apache Software Foundation
004     *
005     * Licensed under the Apache License, Version 2.0 (the "License");
006     * you may not use this file except in compliance with the License.
007     * You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    
018    import org.apache.commons.lang.SystemUtils;
019    import org.apache.ojb.broker.OJBRuntimeException;
020    import org.apache.ojb.broker.locking.LockManager;
021    import org.apache.ojb.broker.util.ClassHelper;
022    import org.apache.ojb.broker.util.configuration.Configuration;
023    import org.apache.ojb.broker.util.configuration.impl.OjbConfigurator;
024    import org.apache.ojb.broker.util.logging.Logger;
025    import org.apache.ojb.broker.util.logging.LoggerFactory;
026    
027    /**
028     * This factory class creates LockManager instances according
029     * to the setting in the OJB properties file.
030     */
031    public class LockManagerFactory
032    {
033        private static LockManagerFactory lockManagerFactory = null;
034        private Logger log = LoggerFactory.getLogger(LockManagerFactory.class);
035        private org.apache.ojb.odmg.locking.LockManager lockManager;
036    
037        private LockManagerFactory()
038        {
039            init();
040        }
041    
042        private void init()
043        {
044            Configuration conf = OjbConfigurator.getInstance().getConfigurationFor(null);
045            Class lockMapClass = conf.getClass("LockMapClass", Object.class);
046            Class lockManagerClass = conf.getClass("LockManagerClass", null);
047            if(lockManagerClass == null)
048            {
049                throw new OJBRuntimeException(buildErrorMsg(lockMapClass, lockManagerClass));
050            }
051            if(!lockMapClass.equals(Object.class))
052            {
053                // use the deprecated old odmg locking stuff
054                log.info("Setup *deprecated* odmg-locking api.");
055                log.info("Used LockManagerClass=" + lockManagerClass);
056                log.info("Used LockMapClass=" + lockMapClass);
057                if(!org.apache.ojb.odmg.locking.LockManager.class.isAssignableFrom(lockManagerClass))
058                {
059                    throw new OJBRuntimeException(buildErrorMsg(lockMapClass, lockManagerClass));
060                }
061                setupLockManager(lockManagerClass);
062            }
063            else
064            {
065                // use the kernel locking api
066                log.info("Setup odmg-locking api.");
067                log.info("Used LockManagerClass=" + lockManagerClass);
068                if(org.apache.ojb.odmg.locking.LockManager.class.isAssignableFrom(lockManagerClass))
069                {
070                    throw new OJBRuntimeException(buildErrorMsg(lockMapClass, lockManagerClass));
071                }
072                setupLockManager(conf, lockManagerClass);
073            }
074        }
075    
076        private void setupLockManager(Configuration conf, Class lockManagerClass)
077        {
078            long timeout = conf.getInteger("LockTimeout", 60000);
079            log.info("LockTimeout=" + timeout);
080            try
081            {
082                LockManager lm = (LockManager) ClassHelper.newInstance(lockManagerClass);
083                lm.setLockTimeout(timeout);
084                lockManager = new LockManagerOdmgImpl(lm);
085            }
086            catch(Exception e)
087            {
088                throw new OJBRuntimeException("Can't setup odmg lock manager instance", e);
089            }
090        }
091    
092        private void setupLockManager(Class lockManagerClass)
093        {
094            try
095            {
096                lockManager = (org.apache.ojb.odmg.locking.LockManager) ClassHelper.newInstance(lockManagerClass);
097    
098            }
099            catch(Exception e)
100            {
101                throw new OJBRuntimeException("Can't setup odmg lock manager instance", e);
102            }
103        }
104    
105    
106        private String buildErrorMsg(Class lockMap, Class lockManager)
107        {
108            String eol = SystemUtils.LINE_SEPARATOR;
109            StringBuffer msg = new StringBuffer("Can't setup LockManager. Current used properties are:" + eol);
110            msg.append("LockMapClass=").append(lockMap != null ? lockMap.getName() : null)
111                    .append(eol)
112                    .append("LockManagerClass=").append(lockManager != null ? lockManager.getName() : null).append(eol)
113                    .append("For correct setup of the lock manager, please enable the 'LockManagerClass' property")
114                    .append(" in OJB configuration, OJB expects an 'org.apache.ojb.broker.locking.LockManager' implementation class.")
115                    .append(eol)
116                    .append("Or to enable the *deprecated* odmg-locking api enable the 'LockMapClass' AND the 'LockManager' properties")
117                    .append(", in this case OJB expects an 'org.apache.ojb.odmg.locking.LockManager' implementation class.");
118            return msg.toString();
119        }
120    
121        private org.apache.ojb.odmg.locking.LockManager getManager()
122        {
123            return lockManager;
124        }
125    
126        /**
127         * Get a {@link org.apache.ojb.odmg.locking.LockManager} instance. The implementation class is
128         * configured in the OJB properties file.
129         */
130        public static synchronized org.apache.ojb.odmg.locking.LockManager getLockManager()
131        {
132            if(lockManagerFactory == null)
133            {
134                lockManagerFactory = new LockManagerFactory();
135            }
136            return lockManagerFactory.getManager();
137        }
138    }