View Javadoc

1   /***
2    * Redistribution and use of this software and associated documentation
3    * ("Software"), with or without modification, are permitted provided
4    * that the following conditions are met:
5    *
6    * 1. Redistributions of source code must retain copyright
7    *    statements and notices.  Redistributions must also contain a
8    *    copy of this document.
9    *
10   * 2. Redistributions in binary form must reproduce the
11   *    above copyright notice, this list of conditions and the
12   *    following disclaimer in the documentation and/or other
13   *    materials provided with the distribution.
14   *
15   * 3. The name "Exolab" must not be used to endorse or promote
16   *    products derived from this Software without prior written
17   *    permission of Exoffice Technologies.  For written permission,
18   *    please contact info@exolab.org.
19   *
20   * 4. Products derived from this Software may not be called "Exolab"
21   *    nor may "Exolab" appear in their names without prior written
22   *    permission of Exoffice Technologies. Exolab is a registered
23   *    trademark of Exoffice Technologies.
24   *
25   * 5. Due credit should be given to the Exolab Project
26   *    (http://www.exolab.org/).
27   *
28   * THIS SOFTWARE IS PROVIDED BY EXOFFICE TECHNOLOGIES AND CONTRIBUTORS
29   * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
30   * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
31   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
32   * EXOFFICE TECHNOLOGIES OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39   * OF THE POSSIBILITY OF SUCH DAMAGE.
40   *
41   * Copyright 2000-2005 (C) Exoffice Technologies Inc. All Rights Reserved.
42   *
43   * $Id: PersistenceAdapter.java,v 1.2 2005/03/18 04:05:52 tanderson Exp $
44   */
45  package org.exolab.jms.persistence;
46  
47  import java.sql.Connection;
48  import java.util.Enumeration;
49  import java.util.HashMap;
50  import java.util.Vector;
51  
52  import org.exolab.jms.authentication.User;
53  import org.exolab.jms.client.JmsDestination;
54  import org.exolab.jms.message.MessageImpl;
55  import org.exolab.jms.messagemgr.MessageHandle;
56  
57  
58  /***
59   * This adapter is a wrapper class around the persistency mechanism.
60   * It isolates the client from the working specifics of the database, by
61   * providing a simple straight forward interface. Future changes to
62   * the database will only require changes to the adapter.
63   *
64   * @version     $Revision: 1.2 $ $Date: 2005/03/18 04:05:52 $
65   * @author      <a href="mailto:mourikis@exolab.org">Jim Mourikis</a>
66   * @see			org.exolab.jms.persistence.RDBMSAdapter
67   */
68  public abstract class PersistenceAdapter {
69  
70      /***
71       * Close the database if open.
72       *
73       */
74      public abstract void close();
75  
76      /***
77       * Check to see if the root is created. If its not then create it
78       * and initialise it to 0.
79       * Return the value of this root id.
80       *
81       * @return long The id of the last batch.
82       * @throws PersistenceException
83       */
84      public abstract long getLastId(Connection connection)
85          throws PersistenceException;
86  
87      /***
88       * Update the given id.
89       *
90       * @param connection - the connection to use
91       * @param id The id to set in the database.
92       * @throws PersistenceException
93       */
94      public abstract void updateIds(Connection connection, long id)
95          throws PersistenceException;
96  
97      /***
98       * Add a new message to the database.
99       *
100      * @param connection  the connection to use
101      * @param message the new message to add
102      * @throws PersistenceException
103      */
104     public abstract void addMessage(Connection connection,
105                                     MessageImpl message)
106         throws PersistenceException;
107 
108     /***
109      * Update this message in the database
110      *
111      * @param connection the connection to use
112      * @param message the message to update
113      * @throws PersistenceException
114      */
115     public abstract void updateMessage(Connection connection,
116                                        MessageImpl message)
117         throws PersistenceException;
118 
119     /***
120      * Remove the message with the specified identity from the database
121      *
122      * @param connection - the connection to use
123      * @param id the identity of the message to remove
124      * @throws PersistenceException
125      */
126     public abstract void removeMessage(Connection connection,
127                                        String id)
128         throws PersistenceException;
129 
130     /***
131      * Remove all expired messages and associated references from the
132      * database. It uses the current time to determine messages that
133      * have exipred.
134      *
135      * @param connection - the connection to use
136      * @throws PersistenceException
137      */
138     public abstract void removeExpiredMessages(Connection connection)
139         throws PersistenceException;
140 
141     /***
142      * Remove all expired messages handles associated with this durable
143      * consumer.
144      *
145      * @param connection - the connection to use
146      * @param consumer - the durable consumer name
147      * @throws PersistenceException
148      */
149     public abstract void removeExpiredMessageHandles(Connection connection,
150                                                      String consumer)
151         throws PersistenceException;
152 
153     /***
154      * Retrieve a list of unexpired {@link MessageHandle} objects,
155      * for the specified destination.
156      *
157      * @param connection - the connection to use
158      * @param destination - the destination in question
159      * @return Vector - collection of unexpired message handles
160      * @throws PersistenceException
161      */
162     public abstract Vector getNonExpiredMessages(Connection connection,
163                                                  JmsDestination destination)
164         throws PersistenceException;
165 
166     /***
167      * Get a message from the persistence store.
168      *
169      * @param connection - the connection to use
170      * @param id the id of the message to search for
171      * @return MessageImpl	 The message if found otherwise null
172      * @throws PersistenceException
173      */
174     public abstract MessageImpl getMessage(Connection connection,
175                                            String id)
176         throws PersistenceException;
177 
178     /***
179      * Get at least the next message given the specified persistent
180      * handle. The handle encodes all the information, including destination
181      * and timestamp, required to fetch that and successive messages. This
182      * will fault in more than one message for performance
183      *
184      * @param connection - the connection to use
185      * @param handle - the persistent handle to resolve
186      * @return Vector - a vector of MessageImpl
187      * @throws PersistenceException
188      */
189     public abstract Vector getMessages(Connection connection,
190                                        MessageHandle handle)
191         throws PersistenceException;
192 
193     /***
194      * Return a list of unprocessed messages. These are messages that have
195      * been stored in the database but not processed.
196      *
197      * @param connection - the connection to use
198      * @return Vector - a collection of un processed messages
199      * @throws PersistenceException
200      */
201     public abstract Vector getUnprocessedMessages(Connection connection)
202         throws PersistenceException;
203 
204     /***
205      * Add the specified persistent message handle.
206      *
207      * @param connection - the connection to use
208      * @param handle - the persistent handle to add
209      * @throws PersistenceException
210      */
211     public abstract void addMessageHandle(Connection connection,
212                                           MessageHandle handle)
213         throws PersistenceException;
214 
215     /***
216      * Update the specified persistent message handle.
217      *
218      * @param connection - the connection to use
219      * @param handle - the persistent handle to update
220      * @throws PersistenceException
221      */
222     public abstract void updateMessageHandle(Connection connection,
223                                              MessageHandle handle)
224         throws PersistenceException;
225 
226     /***
227      * Remove the specified persistent message handle.
228      *
229      * @param connection - the connection to use
230      * @param handle - the persistent handle to remove
231      * @throws PersistenceException
232      * @throws PersistenceException
233      */
234     public abstract void removeMessageHandle(Connection connection,
235                                              MessageHandle handle)
236         throws PersistenceException;
237 
238     /***
239      * Get all the persistent message handles for the specified destination
240      * and consumer name.
241      * <p>
242      * The returned messages reference unacked or unsent messages
243      * <p>
244      * NEED A STRATEGY WHEN WE HAVE LOTS OF MESSAGE HANDLES
245      *
246      * @param connection - the connection to use
247      * @param destination - the destination to reference
248      * @param name - the consumer name
249      * @throws PersistenceException
250      */
251     public abstract Vector getMessageHandles(Connection connection,
252                                              JmsDestination destination, String name)
253         throws PersistenceException;
254 
255     /***
256      * Add the specified durable consumer
257      *
258      * @param connection - the connection to use
259      * @param topic - the name of the topic
260      * @param consumer the name of the consumer
261      * @throws PersistenceException
262      */
263     public abstract void addDurableConsumer(Connection connection,
264                                             String topic, String consumer)
265         throws PersistenceException;
266 
267     /***
268      * Remove the durable consumer for the specified topic.
269      *
270      * @param connection - the connection to use
271      * @param consumer - the consumer name
272      * @throws PersistenceException
273      */
274     public abstract void removeDurableConsumer(Connection connection,
275                                                String consumer)
276         throws PersistenceException;
277 
278     /***
279      * Check if the durable consumer exists
280      *
281      * @param connection - the connection to use
282      * @param name - durable consumer name
283      * @return boolean - true if it exists and false otherwise
284      * @throws PersistenceException
285      */
286     public abstract boolean durableConsumerExists(Connection connection,
287                                                   String name)
288         throws PersistenceException;
289 
290     /***
291      * Get an enumerated list of all durable consumers for the
292      * specified JmsTopic destination
293      *
294      * @param connection - the connection to use
295      * @param topic - the topic to query
296      * @return Vector - list of durable subscriber names
297      * @throws PersistenceException
298      */
299     public abstract Enumeration getDurableConsumers(Connection connection,
300                                                     String topic)
301         throws PersistenceException;
302 
303     /***
304      * Return a dictionary of all registered durable consumers. The
305      * dictionary is keyed on consumer name and maps to the underlying
306      * destination name. The destination name maybe a wildcard
307      *
308      * @param connection - the connection to use
309      * @return HashMap key=consumer name and value is destination
310      * @throws PersistenceException
311      */
312     public abstract HashMap getAllDurableConsumers(Connection connection)
313         throws PersistenceException;
314 
315     /***
316      * Add a new destination to the database.
317      *
318      * @param connection - the connection to use
319      * @param name - the destination name
320      * @param queue - true if it pertains to a queue
321      * @throws PersistenceException
322      */
323     public abstract void addDestination(Connection connection,
324                                         String name, boolean queue)
325         throws PersistenceException;
326 
327     /***
328      * Remove the destination with the specified name and all registered
329      * consumers from the database.
330      * Consumer registrations.
331      *
332      * @param connection - the connection to use
333      * @param destination - the name of the destination
334      * @throws PersistenceException
335      */
336     public abstract void removeDestination(Connection connection,
337                                            String destination)
338         throws PersistenceException;
339 
340     /***
341      * Determine if a particular destination name exists
342      *
343      * @param connection - the connection to use
344      * @param name - the name to query
345      * @return boolean - true if it exists; false otherwise
346      * @throws PersistenceException
347      */
348     public abstract boolean checkDestination(Connection connection,
349                                              String name)
350         throws PersistenceException;
351 
352     /***
353      * Get a list of all destinations stored in the database
354      *
355      * @param connection - the connection to use
356      * @return Enumeration - the list of destinations
357      * @throws PersistenceException
358      */
359     public abstract Enumeration getAllDestinations(Connection connection)
360         throws PersistenceException;
361 
362     /***
363      * Get the number of unsent messages for a the specified queue
364      *
365      * @param connection - the connection to use
366      * @param name - the name of the queue
367      * @return int - the number of unsent or unacked messages
368      * @throws PersistenceException
369      */
370     public abstract int getQueueMessageCount(Connection connection,
371                                              String name)
372         throws PersistenceException;
373 
374     /***
375      * Return the number of unsent message for the specified durable
376      * consumer.
377      *
378      * @param connection - the connection to use
379      * @param destination - the destination name
380      * @param name - the name of the durable subscriber
381      * @return int - the nmber of unsent or unacked messages
382      * @throws PersistenceException
383      */
384     public abstract int getDurableConsumerMessageCount(Connection connection,
385                                                        String destination, String name)
386         throws PersistenceException;
387 
388     /***
389      * Purge all processed messages from the database.
390      *
391      * @return int - the number of messages purged
392      */
393     public abstract int purgeMessages();
394 
395     /***
396      * Return a connection to this persistent data store.
397      *
398      * @return Connection - a connection to the persistent store or null
399      * @throws PersistenceException - if it cannot retrieve a connection
400      */
401     public abstract Connection getConnection() throws PersistenceException;
402 
403 
404     public abstract Enumeration getAllUsers(Connection connection)
405         throws PersistenceException;
406 
407     public abstract void addUser(Connection connection, User user)
408         throws PersistenceException;
409 
410     public abstract void removeUser(Connection connection,
411                                     User user)
412         throws PersistenceException;
413 
414     public abstract void updateUser(Connection connection,
415                                     User user)
416         throws PersistenceException;
417 
418     public abstract User getUser(Connection connection,
419                                  User user)
420         throws PersistenceException;
421 
422 }
423 
424 
425 
426