View Javadoc

1   package org.apache.ojb.broker.util.sequence;
2   
3   /* Copyright 2002-2005 The Apache Software Foundation
4    *
5    * Licensed under the Apache License, Version 2.0 (the "License");
6    * you may not use this file except in compliance with the License.
7    * You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  import java.util.Properties;
19  
20  import org.apache.ojb.broker.PersistenceBroker;
21  import org.apache.ojb.broker.accesslayer.JdbcAccess;
22  import org.apache.ojb.broker.metadata.ClassDescriptor;
23  import org.apache.ojb.broker.metadata.FieldDescriptor;
24  import org.apache.ojb.broker.metadata.SequenceDescriptor;
25  import org.apache.ojb.broker.platforms.Platform;
26  
27  /**
28   * A base class for sequence manager implementations.
29   * <br/>
30   * All sequence manager implementations need a constructor
31   * with a PersistenceBroker argument used by the
32   * {@link org.apache.ojb.broker.util.sequence.SequenceManagerFactory}.
33   *
34   * @author <a href="mailto:armin@codeAuLait.de">Armin Waibel</a>
35   * @version $Id: AbstractSequenceManager.java,v 1.1 2007-08-24 22:17:29 ewestfal Exp $
36   */
37  public abstract class AbstractSequenceManager implements SequenceManager
38  {
39      // private Logger log = LoggerFactory.getLogger(AbstractSequenceManager.class);
40      public static final String PROPERTY_AUTO_NAMING = "autoNaming";
41      protected static final String GLOBAL_SEQUENCE_NAME = "ojb.global.sequence";
42  
43      private PersistenceBroker brokerForClass;
44      private Platform platform;
45      private Properties configurationProperties;
46  
47      /**
48       * Constructor used by
49       * {@link org.apache.ojb.broker.util.sequence.SequenceManagerFactory}
50       *
51       * @param broker  PB instance to perform the
52       * id generation.
53       */
54      public AbstractSequenceManager(PersistenceBroker broker)
55      {
56          this.brokerForClass = broker;
57          this.configurationProperties = new Properties();
58          this.platform = brokerForClass.serviceConnectionManager().getSupportedPlatform();
59          SequenceDescriptor sd = brokerForClass.serviceConnectionManager().
60                  getConnectionDescriptor().getSequenceDescriptor();
61          if (sd != null)
62          {
63              this.configurationProperties.putAll(sd.getConfigurationProperties());
64          }
65      }
66  
67      /**
68       * returns a unique long value for field.
69       * the returned number is unique accross all tables in the extent of clazz.
70       */
71      abstract protected long getUniqueLong(FieldDescriptor field) throws SequenceManagerException;
72  
73  
74      public Platform getPlatform()
75      {
76          return platform;
77      }
78  
79      public PersistenceBroker getBrokerForClass()
80      {
81          return brokerForClass;
82      }
83  
84      public Properties getConfigurationProperties()
85      {
86          return this.configurationProperties;
87      }
88  
89      public void setConfigurationProperties(Properties prop)
90      {
91          this.configurationProperties.putAll(prop);
92      }
93  
94      public String getConfigurationProperty(String key, String defaultValue)
95      {
96          String result = this.configurationProperties.getProperty(key);
97          return result != null ? result : defaultValue;
98      }
99  
100     public void setConfigurationProperty(String key, String value)
101     {
102         this.configurationProperties.setProperty(key, value);
103     }
104 
105     public boolean useAutoNaming()
106     {
107         return (Boolean.valueOf(getConfigurationProperty(PROPERTY_AUTO_NAMING, "true"))).booleanValue();
108     }
109 
110     public String calculateSequenceName(FieldDescriptor field) throws SequenceManagerException
111     {
112         String seqName;
113         seqName = field.getSequenceName();
114         /*
115         if we found no sequence name for the given field, we try to
116         assign a automatic generated sequence name.
117         */
118         if(seqName == null)
119         {
120             seqName = SequenceManagerHelper.buildSequenceName(getBrokerForClass(), field, useAutoNaming());
121             // already done in method above
122             // if(useAutoNaming()) field.setSequenceName(seqName);
123         }
124         return seqName;
125     }
126 
127 
128     //****************************************************************
129     // method implementations of SequenceManager interface
130     //****************************************************************
131     /**
132      * Returns a unique object for the given field attribute.
133      * The returned value takes in account the jdbc-type
134      * and the FieldConversion.sql2java() conversion defined for <code>field</code>.
135      * The returned object is unique accross all tables in the extent
136      * of class the field belongs to.
137      */
138     public Object getUniqueValue(FieldDescriptor field) throws SequenceManagerException
139     {
140         Object result = field.getJdbcType().sequenceKeyConversion(new Long(getUniqueLong(field)));
141         // perform a sql to java conversion here, so that clients do
142         // not see any db specific values
143         result = field.getFieldConversion().sqlToJava(result);
144         return result;
145     }
146 
147     /**
148      * noop
149      */
150     public void afterStore(JdbcAccess dbAccess, ClassDescriptor cld, Object obj)
151             throws SequenceManagerException
152     {
153         // do nothing
154     }
155 
156     /**
157      * noop
158      */
159     public void setReferenceFKs(Object obj, ClassDescriptor cld)
160             throws SequenceManagerException
161     {
162        // do nothing
163     }
164 }