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    }