001    /*
002     * Copyright 2001,2004 The Apache Software Foundation.
003     * 
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     * 
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    
017    package org.apache.commons.scaffold.sql;
018    
019    
020    import java.sql.SQLException;
021    import java.util.Collection;
022    import java.util.Properties;
023    
024    
025    import org.apache.commons.scaffold.lang.ParameterException;
026    import org.apache.commons.scaffold.lang.PopulateException;
027    import org.apache.commons.scaffold.lang.PropertiesException;
028    import org.apache.commons.scaffold.lang.ResourceException;
029    
030    import org.apache.commons.scaffold.lucene.SearchUtils;
031    import org.apache.commons.scaffold.lucene.Engine;
032    
033    import org.apache.commons.scaffold.sql.StatementUtils;
034    
035    
036    /**
037     * Common data access methods.
038     *
039     * @author Ted Husted
040     * @author OK State DEQ
041     * @version $Revision: 155464 $ $Date: 2005-02-26 13:26:54 +0000 (Sat, 26 Feb 2005) $
042     * @deprecated Use StorageBean instead.
043     */
044    public class AccessBase {
045    
046    
047        /**
048         * [:TODO: Javadoc]
049         */
050        public static String KEYS_NEXT = "keys.next";
051    
052        /**
053         * [:TODO: Javadoc]
054         */
055        public static String KEYS_INC = "keys.inc";
056    
057    
058    
059    // ----------------------------------------------------------- Commands
060    
061        /**
062         * Our command string properties.
063         * Can be loaded from an external properties file at startup.
064         */
065        private static Properties commands;
066    
067    
068        /**
069         * Retrieve command from <code>commands</code> Properties for
070         * <code>key</code>.
071         *
072         * @fixme Could use a merge feature to reuse common substrings,
073         * like table names ["SELECT ${searchFields} FROM ${articleTable}"]
074         */
075        public static final String getCommand(String key)
076                throws PropertiesException {
077    
078                // MissingResourceException ?
079            if (null==commands) throw new PropertiesException();
080    
081            return commands.getProperty(key);
082        }
083    
084    
085        /**
086         * Set the Properties file to be used for SQL commands.
087         * This can be called by main or in a servlet.init
088         * method at startup. If called more than once, the
089         * new commands are added to the existing store.
090         * If  keys clash,the last one wins.
091         */
092        public static final void init(Properties _commands) {
093    
094            if (null==commands) {
095                commands = _commands;
096            }
097            else {
098                commands.putAll(_commands);
099            }
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