View Javadoc

1   /*
2    * Copyright 2001,2004 The Apache Software Foundation.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.apache.commons.scaffold.sql;
18  
19  
20  import java.sql.SQLException;
21  import java.util.Collection;
22  import java.util.Properties;
23  
24  
25  import org.apache.commons.scaffold.lang.ParameterException;
26  import org.apache.commons.scaffold.lang.PopulateException;
27  import org.apache.commons.scaffold.lang.PropertiesException;
28  import org.apache.commons.scaffold.lang.ResourceException;
29  
30  import org.apache.commons.scaffold.lucene.SearchUtils;
31  import org.apache.commons.scaffold.lucene.Engine;
32  
33  import org.apache.commons.scaffold.sql.StatementUtils;
34  
35  
36  /**
37   * Common data access methods.
38   *
39   * @author Ted Husted
40   * @author OK State DEQ
41   * @version $Revision: 155464 $ $Date: 2005-02-26 13:26:54 +0000 (Sat, 26 Feb 2005) $
42   * @deprecated Use StorageBean instead.
43   */
44  public class AccessBase {
45  
46  
47      /**
48       * [:TODO: Javadoc]
49       */
50      public static String KEYS_NEXT = "keys.next";
51  
52      /**
53       * [:TODO: Javadoc]
54       */
55      public static String KEYS_INC = "keys.inc";
56  
57  
58  
59  // ----------------------------------------------------------- Commands
60  
61      /**
62       * Our command string properties.
63       * Can be loaded from an external properties file at startup.
64       */
65      private static Properties commands;
66  
67  
68      /**
69       * Retrieve command from <code>commands</code> Properties for
70       * <code>key</code>.
71       *
72       * @fixme Could use a merge feature to reuse common substrings,
73       * like table names ["SELECT ${searchFields} FROM ${articleTable}"]
74       */
75      public static final String getCommand(String key)
76              throws PropertiesException {
77  
78              // MissingResourceException ?
79          if (null==commands) throw new PropertiesException();
80  
81          return commands.getProperty(key);
82      }
83  
84  
85      /**
86       * Set the Properties file to be used for SQL commands.
87       * This can be called by main or in a servlet.init
88       * method at startup. If called more than once, the
89       * new commands are added to the existing store.
90       * If  keys clash,the last one wins.
91       */
92      public static final void init(Properties _commands) {
93  
94          if (null==commands) {
95              commands = _commands;
96          }
97          else {
98              commands.putAll(_commands);
99          }
100     }
101 
102 
103 // ================================================================ API
104 
105 
106 
107 // ----------------------------------------------------- Create Methods
108 
109     /**
110      * Lookup command and execute "update" query to create a table,
111      * seed it with data, et cetera.
112      * <p>
113      * @param command Name of command to execute
114      * @exception Resource exception if data access error occurs
115      * @author Ted Husted
116      * @version $Revision: 155464 $ $Date: 2005-02-26 13:26:54 +0000 (Sat, 26 Feb 2005) $
117      */
118     public static final void executeUpdate(String command)
119             throws ResourceException {
120 
121         try {
122 
123              int result = StatementUtils.executeUpdate(
124                  null,getCommand(command));
125 
126         }
127         catch (SQLException e) {
128             throw new ResourceException(e);
129         }
130 
131     } // end createTables()
132 
133 
134     /**
135      * Returns next sequential key for given set of keys.
136      * Expects KEYS_NET nd KEYS_INC commands to be defined.
137      *
138      * @return A String representing the allocated key
139      * @exception ResourceException if data access error occurs
140      * @param keyName The name of the key set to use to generate the key
141      */
142     public static final Integer createKey(String keyName)
143             throws ResourceException {
144 
145         Integer result = null;
146 
147         try {
148 
149                 // createKey is syncronized
150             result = (Integer) StatementUtils.createKey(
151                 null,
152                 1,
153                 getCommand(KEYS_NEXT),
154                 getCommand(keyName),
155                 getCommand(KEYS_INC)
156             );
157         }
158 
159         catch (SQLException e) {
160             throw new ResourceException(e);
161         }
162 
163         return result;
164 
165    } // end createKey()
166 
167 
168 
169 // -------------------------------------------------- Retrieval Methods
170 
171 
172     /**
173      * Retrieve entry from data storage.
174      * <P>
175      * <B>NOTE</B> that the key and command parameters to this utility
176      * should have been swapped for consistency with other
177      * methods in this package. But since this class is deprecated,
178      * a fix has not been made.
179      * @return Collection with record or empty collection
180      * @exception ResourceException if SQL error occurs
181      * @param key The primary key of the entry
182      * @param target Bean to hold copy of entry being retrieved
183      * @param command The name of the data access command
184      * collection
185      */
186     public static boolean findElement(
187             Object target,
188             Object key,
189             String command) throws ResourceException {
190 
191         boolean found = false;
192 
193         try {
194 
195             found = StatementUtils.getElement(null,target,
196                 getCommand(command),key);
197 
198         }
199         catch (SQLException e) {
200             throw new ResourceException(e);
201         }
202 
203         return found;
204 
205    } // end findElement
206 
207 
208     /**
209      * Retrieve a collection of beans from data stoarge.
210      * <p>
211      * @return Collection with entry or empty collection
212      * @exception throws PropertiesException, ResourceException
213      * if data access error occurs
214      * @param target Object to use as factory when populating
215      * @param command Name of the data access command
216      * collection
217      */
218     public static final Collection findCollection(Object target,
219         String command) throws ResourceException {
220 
221         try {
222 
223             return StatementUtils.getCollection(null,
224                 target,getCommand(command));
225 
226         }
227         catch (SQLException e) {
228             throw new ResourceException(e);
229         }
230 
231     } // end findCollection
232 
233 
234     /**
235      * Retrieve a collection of beans from data stoarge.
236      * <p>
237      * @return Collection with entry or empty collection
238      * @exception throws PropertiesException, ResourceException
239      * if data access error occurs
240      * @param target Object to use as factory when populating
241      * @param command Name of the data access command
242      * collection
243      * @param parameters An array of parameters to be used with command
244      */
245     public static final Collection findCollection(Object target,
246         String command, Object[] parameters) throws ResourceException {
247 
248         try {
249 
250             return StatementUtils.getCollection(null,
251                 target,getCommand(command),parameters);
252 
253         }
254         catch (SQLException e) {
255             throw new ResourceException(e);
256         }
257 
258     } // end findCollection
259 
260 
261     /**
262      * Retrieve a collection of beans from data stoarge.
263      * <p>
264      * @return Collection with entry or empty collection
265      * @exception throws PropertiesException, ResourceException
266      * if data access error occurs
267      * @param target Object to use as factory when populating
268      * @param command Name of the data access command
269      * collection
270      * @param parameter A String parameter to be used with command
271      */
272     public static final Collection findCollection(Object target,
273         String command, Object parameter) throws ResourceException {
274 
275         try {
276 
277             return StatementUtils.getCollection(null,
278                 target,getCommand(command),parameter);
279 
280         }
281         catch (SQLException e) {
282             throw new ResourceException(e);
283         }
284 
285     } // end findCollection
286 
287 
288     /**
289      * Retrieve a collection of beans from data stoarge.
290      * <p>
291      * @return Collection with entry or empty collection
292      * @exception throws PropertiesException, ResourceException
293      * if data access error occurs
294      * @param target Object to use as factory when populating
295      * @param command Name of the data access command
296      * collection
297      * @param parameter An int parameter to be used with command
298      */
299     public static final Collection findCollection(Object target,
300         String command, int parameter) throws ResourceException {
301 
302         return findCollection(target,command,new Integer(parameter));
303 
304     } // end findCollection
305 
306 
307     /**
308      * Retrieve a collection of beans from data stoarge.
309      * <p>
310      * @return Collection with entry or empty collection
311      * @exception throws PropertiesException, ResourceException
312      * if data access error occurs
313      * @param target Object to use as factory when populating
314      * @param command Name of the data access command
315      * collection
316      * @param parameter A String parameter to be used with command
317      */
318     public static final Collection findCollectionLike(Object target,
319         String command, String parameter) throws ResourceException {
320 
321         try {
322 
323             return StatementUtils.getCollection(null,
324                 target,getCommand(command),StatementUtils.like(parameter));
325 
326         }
327         catch (SQLException e) {
328             throw new ResourceException(e);
329         }
330 
331     } // end findCollectionLike
332 
333 
334     /**
335      * Select entries from data storage by indexed property..
336      * <p>
337      * @return Collection with record or empty Collection
338      * @param value Term to match
339      * @param property Field to search
340      * @param target Object to use as factory when populating
341      * collection
342      * @exception Throws ParameterException if value is not a search
343      * term for property
344      * @exception Throws PopulateExecption if result cannot be set to
345      * target
346      * @exception throws PropertiesException, ResourceException is SQL, IO, or other
347      * data access error occurs.
348      */
349     public static final Collection findByProperty(
350             Object target,
351             String property,
352             String value) throws ParameterException, PopulateException,
353             ResourceException {
354 
355          return SearchUtils.getCollection(target,
356             Engine.getHits(
357                 Engine.getQuery(value,property)));
358 
359     } // end findByProperty
360 
361 
362 // -------------------------------------------------------- UD Methods
363 
364     /**
365      * Commit record to storage.
366      * If create is true, entry is created.
367      * Otherwise, an existing entry is updated.
368      * @return 0 if fails
369      * @exception ResourceException if SQL error occurs
370      * @param insert True to insert, false to update.
371      * @insert The name of the insert command
372      * @update The name of the delete command
373      @ @parameters The parameters to use with either command
374      *
375      */
376     public static final int store (
377             boolean isInsert,
378             String insert,
379             String update,
380             Object[] parameters) throws ResourceException {
381 
382         String command = null;
383         if (isInsert) {
384             command = getCommand(insert);
385         }
386         else {
387             command = getCommand(update);
388         }
389 
390         int result = 0;
391         try {
392 
393             result = StatementUtils.executeUpdate(null,command,parameters);
394 
395         }
396         catch (SQLException e) {
397             throw new ResourceException(e);
398         }
399 
400         return result;
401 
402     } // end store
403 
404 
405     /**
406      * Mark entry for deletion.
407      * Returns copy of entry before update in target parameter.
408      *
409      * @return 0 if fails
410      * @exception ResourceException if SQL or other data-access error occurs
411      * @exception runtime Null Pointer Exception if either parameter is null
412      * @param target Bean to hold copy of record being marked
413      * @param article Primary key of record to mark
414      */
415     public static final int delete(Object target, Integer key, String command)
416             throws ResourceException {
417 
418         int result = 0;
419 
420         try {
421 
422             // Mark as deleted
423             result = StatementUtils.executeUpdate(null,
424                 getCommand(command),key);
425         }
426 
427         catch (SQLException e) {
428             throw new ResourceException(e);
429         }
430 
431         return result;
432 
433     } // end delete
434 
435 
436     /**
437      * Unmark entry for deletion.
438      * Returns copy of restored entry in target parameter.
439      *
440      * @return 0 if fails
441      * @exception ResourceException if data access error occurs
442      * @param target Bean to hold copy of record being unmarked
443      * @param article Primary key of record to unmark
444      */
445     public static final int restore(Object target, Integer key, String command)
446             throws ResourceException {
447 
448         int result = 0;
449 
450         try {
451 
452             result = StatementUtils.executeUpdate(null,
453                 getCommand(command),key);
454 
455         }
456         catch (SQLException e) {
457             throw new ResourceException(e);
458         }
459 
460         return result;
461 
462     } // end restore
463 
464 
465 } // end Access
466