KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > myoodb > event > EventLogDbImpl


1 ///////////////////////////////////////////////////////////////////////////////
2
//
3
// Copyright (C) 2003-@year@ by Thomas M. Hazel, MyOODB (www.myoodb.org)
4
//
5
// All Rights Reserved
6
//
7
// This program is free software; you can redistribute it and/or modify
8
// it under the terms of the GNU General Public License and GNU Library
9
// General Public License as published by the Free Software Foundation;
10
// either version 2, or (at your option) any later version.
11
//
12
// This program is distributed in the hope that it will be useful,
13
// but WITHOUT ANY WARRANTY; without even the implied warranty of
14
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
// GNU General Public License and GNU Library General Public License
16
// for more details.
17
//
18
// You should have received a copy of the GNU General Public License
19
// and GNU Library General Public License along with this program; if
20
// not, write to the Free Software Foundation, 675 Mass Ave, Cambridge,
21
// MA 02139, USA.
22
//
23
///////////////////////////////////////////////////////////////////////////////
24
package org.myoodb.event;
25
26 import org.myoodb.collectable.*;
27
28 public class EventLogDbImpl extends LogStoreDbImpl implements EventLog
29 {
30     public EventLogDbImpl()
31     {
32     }
33
34     private boolean shouldEventBeAdded(java.util.ArrayList JavaDoc listOfInterest, org.myoodb.core.Identifier handle)
35     {
36         boolean retval = false;
37
38         if ((listOfInterest != null) && (listOfInterest.size() != 0))
39         {
40             java.util.Iterator JavaDoc objectIter = listOfInterest.iterator();
41             while (objectIter.hasNext())
42             {
43                 if (objectIter.next().equals(handle) == true)
44                 {
45                     retval = true;
46                     break;
47                 }
48             }
49         }
50         else
51         {
52             retval = true;
53         }
54
55         return retval;
56     }
57
58     public void fixUpReference(long fixUpTime)
59     {
60         if (referenceHasBeenFixedUp(fixUpTime) == true)
61         {
62             return;
63         }
64
65         super.fixUpReference(fixUpTime);
66     }
67
68     public void cleanUpReference()
69     {
70         super.cleanUpReference();
71     }
72
73     public Event addEvent(Event event)
74     {
75         if (isExplicitLock() == true)
76         {
77             throw new org.myoodb.exception.PermissionException("Invocation cannot be part of a transaction");
78         }
79
80         event = (Event) super.addLogObject((LogObject) event);
81
82         synchronized(this)
83         {
84             notifyAll();
85         }
86
87         return event;
88     }
89
90     public Event removeEvent(Event event)
91     {
92         if (isExplicitLock() == true)
93         {
94             throw new org.myoodb.exception.PermissionException("Invocation cannot be part of a transaction");
95         }
96
97         event = (Event) super.removeLogObject((LogObject) event);
98
99         return event;
100     }
101
102     public Event getFirstEvent()
103     {
104         return (Event) super.getFirstLogObject();
105     }
106
107     public Event getLastEvent()
108     {
109         return (Event) super.getLastLogObject();
110     }
111
112     public Event getEvent(long time)
113     {
114         return (Event) super.getLogObject(time);
115     }
116
117     public java.util.ArrayList JavaDoc getEvents()
118     {
119         return super.getLogObjects();
120     }
121
122     public java.util.ArrayList JavaDoc getEvents(long start, long end)
123     {
124         return getEvents(start, end, Event.class);
125     }
126
127     public java.util.ArrayList JavaDoc getEvents(long start, long end, Collectable ofInterest)
128     {
129         return getEvents(start, end, Event.class, ofInterest);
130     }
131
132     public java.util.ArrayList JavaDoc getEvents(long start, long end, java.util.ArrayList JavaDoc listOfInterest)
133     {
134         return getEvents(start, end, Event.class, listOfInterest);
135     }
136
137     public java.util.ArrayList JavaDoc getEvents(long start, long end, Class JavaDoc baseEventType)
138     {
139         return super.getLogObjects(start, end, baseEventType);
140     }
141
142     public java.util.ArrayList JavaDoc getEvents(long start, long end, Class JavaDoc baseEventType, Collectable ofInterest)
143     {
144         java.util.ArrayList JavaDoc retval = new java.util.ArrayList JavaDoc(); retval.add(ofInterest);
145
146         return getEvents(start, end, baseEventType, retval);
147     }
148
149     public java.util.ArrayList JavaDoc getEvents(long start, long end, Class JavaDoc baseEventType, java.util.ArrayList JavaDoc listOfInterest)
150     {
151         java.util.ArrayList JavaDoc retval = new java.util.ArrayList JavaDoc();
152
153         java.util.ArrayList JavaDoc events = getLogStoreRange(getContainerIndexes(start, end));
154
155         for (int i = 0; i < events.size(); i++)
156         {
157             Event event = (Event) events.get(i);
158             org.myoodb.core.Identifier handle = event.getCollectableHandle();
159
160             if ((handle == null) || (baseEventType.isAssignableFrom(event.getClass()) == false))
161             {
162                 continue;
163             }
164
165             if (((start == 0) || (event.getTime() >= start)) && ((end == 0) || (event.getTime() <= end)))
166             {
167                 if (shouldEventBeAdded(listOfInterest, handle) == true)
168                 {
169                     retval.add(event);
170                 }
171             }
172         }
173
174         return retval;
175     }
176
177     public java.util.ArrayList JavaDoc getEvents(long moment, int number, Direction direction)
178     {
179         return getEvents(moment, number, direction, Event.class);
180     }
181
182     public java.util.ArrayList JavaDoc getEvents(long moment, int number, Direction direction, Collectable ofInterest)
183     {
184         java.util.ArrayList JavaDoc retval = new java.util.ArrayList JavaDoc(); retval.add(ofInterest);
185
186         return getEvents(moment, number, direction, Event.class, retval);
187     }
188
189     public java.util.ArrayList JavaDoc getEvents(long moment, int number, Direction direction, java.util.ArrayList JavaDoc listOfInterest)
190     {
191         return getEvents(moment, number, direction, Event.class, listOfInterest);
192     }
193
194     public java.util.ArrayList JavaDoc getEvents(long moment, int number, Direction direction, Class JavaDoc baseEventType)
195     {
196         return super.getLogObjects(moment, number, direction, baseEventType);
197     }
198
199     public java.util.ArrayList JavaDoc getEvents(long moment, int number, Direction direction, Class JavaDoc baseEventType, Collectable ofInterest)
200     {
201         java.util.ArrayList JavaDoc retval = new java.util.ArrayList JavaDoc(); retval.add(ofInterest);
202
203         return getEvents(moment, number, direction, baseEventType, retval);
204     }
205
206     public java.util.ArrayList JavaDoc getEvents(long moment, int number, Direction direction, Class JavaDoc baseEventType, java.util.ArrayList JavaDoc listOfInterest)
207     {
208         boolean done = false;
209         java.util.ArrayList JavaDoc retval = new java.util.ArrayList JavaDoc();
210         java.util.LinkedList JavaDoc keys = new java.util.LinkedList JavaDoc(getContainerOfContainersKeySet());
211
212         // walk forward
213
if (direction == LogStore.Direction.FORWARDS)
214         {
215             java.util.ListIterator JavaDoc iter = keys.listIterator();
216             while ((done == false) && iter.hasNext())
217             {
218                 java.util.ArrayList JavaDoc events = getLogStoreRange((Long JavaDoc) iter.next());
219
220                 for (int i = 0; (done == false) && (i < events.size()); i++)
221                 {
222                     Event event = (Event) events.get(i);
223                     org.myoodb.core.Identifier handle = event.getCollectableHandle();
224
225                     if ((handle == null) || (baseEventType.isAssignableFrom(event.getClass()) == false))
226                     {
227                         continue;
228                     }
229
230                     if ((event.getTime() >= moment) && (retval.size() < number))
231                     {
232                         if (shouldEventBeAdded(listOfInterest, handle) == true)
233                         {
234                             retval.add(event);
235                         }
236                     }
237                     else if (retval.size() >= number)
238                     {
239                         done = true;
240                         break;
241                     }
242                 }
243             }
244         }
245         // walk backwards
246
else
247         {
248             java.util.ListIterator JavaDoc iter = keys.listIterator(keys.size());
249             while ((done == false) && iter.hasPrevious())
250             {
251                 java.util.ArrayList JavaDoc events = getLogStoreRange((Long JavaDoc) iter.previous());
252
253                 for (int i = (events.size() - 1); (done == false) && (i >= 0); i--)
254                 {
255                     Event event = (Event) events.get(i);
256                     org.myoodb.core.Identifier handle = event.getCollectableHandle();
257
258                     if ((handle == null) || (baseEventType.isAssignableFrom(event.getClass()) == false))
259                     {
260                         continue;
261                     }
262
263                     if ((event.getTime() <= moment) && (retval.size() < number))
264                     {
265                         if (shouldEventBeAdded(listOfInterest, handle) == true)
266                         {
267                             retval.add(event);
268                         }
269                     }
270                     else if (retval.size() >= number)
271                     {
272                         done = true;
273                         break;
274                     }
275                 }
276             }
277         }
278
279         return retval;
280     }
281
282     //
283
// The following methods are associated with:
284
//
285
// - Listening for Event notification
286
//
287

288     public java.util.ArrayList JavaDoc listenForEvents(Class JavaDoc baseEventType)
289     {
290         return listenForEvents(0, baseEventType, (java.util.ArrayList JavaDoc) null);
291     }
292
293     public java.util.ArrayList JavaDoc listenForEvents(Class JavaDoc baseEventType, Collectable ofInterest)
294     {
295         java.util.ArrayList JavaDoc list = null;
296
297         if (ofInterest != null)
298         {
299             list = new java.util.ArrayList JavaDoc();
300             list.add(ofInterest);
301         }
302
303         return listenForEvents(0, baseEventType, list, 0);
304     }
305
306     public java.util.ArrayList JavaDoc listenForEvents(Class JavaDoc baseEventType, java.util.ArrayList JavaDoc listOfInterest)
307     {
308         return listenForEvents(0, baseEventType, listOfInterest, 0);
309     }
310
311     public java.util.ArrayList JavaDoc listenForEvents(Class JavaDoc baseEventType, long timeout)
312     {
313         return listenForEvents(0, baseEventType, new java.util.ArrayList JavaDoc(), timeout);
314     }
315
316     public java.util.ArrayList JavaDoc listenForEvents(Class JavaDoc baseEventType, Collectable ofInterest, long timeout)
317     {
318         java.util.ArrayList JavaDoc list = null;
319
320         if (ofInterest != null)
321         {
322             list = new java.util.ArrayList JavaDoc();
323             list.add(ofInterest);
324         }
325
326         return listenForEvents(0, baseEventType, list, timeout);
327     }
328
329     public java.util.ArrayList JavaDoc listenForEvents(Class JavaDoc baseEventType, java.util.ArrayList JavaDoc listOfInterest, long timeout)
330     {
331         return listenForEvents(0, baseEventType, listOfInterest, timeout);
332     }
333
334     public java.util.ArrayList JavaDoc listenForEvents(long moment, Class JavaDoc baseEventType)
335     {
336         return listenForEvents(moment, baseEventType, new java.util.ArrayList JavaDoc());
337     }
338
339     public java.util.ArrayList JavaDoc listenForEvents(long moment, Class JavaDoc baseEventType, Collectable ofInterest)
340     {
341         java.util.ArrayList JavaDoc list = null;
342
343         if (ofInterest != null)
344         {
345             list = new java.util.ArrayList JavaDoc();
346             list.add(ofInterest);
347         }
348
349         return listenForEvents(moment, baseEventType, list, 0);
350     }
351
352     public java.util.ArrayList JavaDoc listenForEvents(long moment, Class JavaDoc baseEventType, java.util.ArrayList JavaDoc listOfInterest)
353     {
354         return listenForEvents(moment, baseEventType, listOfInterest, 0);
355     }
356
357     public java.util.ArrayList JavaDoc listenForEvents(long moment, Class JavaDoc baseEventType, long timeout)
358     {
359         return listenForEvents(moment, baseEventType, new java.util.ArrayList JavaDoc(), timeout);
360     }
361
362     public java.util.ArrayList JavaDoc listenForEvents(long moment, Class JavaDoc baseEventType, Collectable ofInterest, long timeout)
363     {
364         java.util.ArrayList JavaDoc list = null;
365
366         if (ofInterest != null)
367         {
368             list = new java.util.ArrayList JavaDoc();
369             list.add(ofInterest);
370         }
371
372         return listenForEvents(moment, baseEventType, list, timeout);
373     }
374
375     public java.util.ArrayList JavaDoc listenForEvents(long moment, Class JavaDoc baseEventType, java.util.ArrayList JavaDoc listOfInterest, long timeout)
376     {
377         if (isExplicitLock() == true)
378         {
379             throw new org.myoodb.exception.PermissionException("Invocation cannot be part of a transaction");
380         }
381
382         // need to normalize "Moment in Time" to "Management Server Time"
383
if (moment == 0)
384         {
385             moment = getLocalTime();
386         }
387
388         // timeout granularity is 1000 milli-seconds
389
if (timeout != 0)
390         {
391             if (timeout < 1000)
392             {
393                 timeout = 1000;
394             }
395         }
396
397         java.util.ArrayList JavaDoc list = new java.util.ArrayList JavaDoc();
398
399         do
400         {
401             // check first since moment might be back in time (requires looping twice in timeout case)
402
try
403             {
404                 long nextMoment = getLocalTime();
405
406                 list = getEvents(moment, 0, baseEventType, listOfInterest);
407
408                 moment = nextMoment;
409             }
410             catch (Exception JavaDoc e)
411             {
412                 break;
413             }
414
415             if ((timeout >= 0) && (list.size() == 0))
416             {
417                 try
418                 {
419                     long timeRemaining = 0;
420
421                     if (timeout == 0)
422                     {
423                         synchronized(this)
424                         {
425                             wait(5000);
426                         }
427                     }
428                     else
429                     {
430                         long startTime = System.currentTimeMillis();
431
432                         synchronized(this)
433                         {
434                             wait(timeout);
435                         }
436
437                         long endTime = System.currentTimeMillis();
438
439                         timeRemaining = timeout - (endTime - startTime);
440                         timeRemaining -= 500; // see Thread.sleep below
441

442                         if (timeRemaining <= 0) // greater than zero means keep going
443
{
444                             timeRemaining = -1;
445                         }
446                     }
447
448                     timeout = timeRemaining;
449
450                     Thread.sleep(500); // encourage q-ing & reduce thrashing
451
}
452                 catch (Exception JavaDoc e)
453                 {
454                    throw new org.myoodb.exception.InternalException("Internal Error", e);
455                 }
456             }
457             else
458             {
459                 break;
460             }
461         }
462         while (true);
463
464         return list;
465     }
466 }
467
Popular Tags