001 package org.apache.ojb.broker.util.sequence;
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.ojb.broker.PersistenceBroker;
019 import org.apache.ojb.broker.PersistenceBrokerException;
020 import org.apache.ojb.broker.metadata.SequenceDescriptor;
021 import org.apache.ojb.broker.util.ClassHelper;
022 import org.apache.ojb.broker.util.logging.Logger;
023 import org.apache.ojb.broker.util.logging.LoggerFactory;
024
025 /**
026 * Threadsafe factory class, creates <code>SequenceManager</code> instances.
027 * The implementation class is configured by the OJB.properties file.
028 */
029 public class SequenceManagerFactory
030 {
031 private static Logger log = LoggerFactory.getLogger(SequenceManagerFactory.class);
032 private static SequenceManagerFactory singleton;
033
034 private Class defaultSeqManagerClass;
035
036 public SequenceManagerFactory()
037 {
038 defaultSeqManagerClass = SequenceManagerHighLowImpl.class;
039 if(log.isDebugEnabled()) log.debug("Default sequence manager class was " + defaultSeqManagerClass.getName());
040 }
041
042 public synchronized static SequenceManager getSequenceManager(PersistenceBroker broker)
043 {
044 if (singleton == null)
045 {
046 singleton = new SequenceManagerFactory();
047 }
048 return singleton.createNewSequenceManager(broker);
049 }
050
051 private SequenceManager createNewSequenceManager(PersistenceBroker broker)
052 {
053 synchronized (singleton)
054 {
055 if (log.isDebugEnabled()) log.debug("create new sequence manager for broker " + broker);
056 try
057 {
058 // first we use seqMan defined in the OJB.properties
059 Class seqManClass = defaultSeqManagerClass;
060 SequenceDescriptor sd = broker.serviceConnectionManager().getConnectionDescriptor().getSequenceDescriptor();
061 if (sd != null && sd.getSequenceManagerClass() != null)
062 {
063 // if a seqMan was defined in repository, use that
064 seqManClass = sd.getSequenceManagerClass();
065 if (log.isDebugEnabled())
066 {
067 log.debug("Jdbc-Connection-Descriptor '" +
068 broker.serviceConnectionManager().getConnectionDescriptor().getJcdAlias() +
069 "' use sequence manager: " + seqManClass);
070 }
071 }
072 return (SequenceManager) ClassHelper.newInstance(seqManClass, PersistenceBroker.class, broker);
073 }
074 catch (Exception ex)
075 {
076 log.error("Could not create sequence manager for broker " + broker, ex);
077 throw new PersistenceBrokerException(ex);
078 }
079 }
080 }
081 }