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 }