KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > myoodb > collectable > LogStoreDbImpl


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.collectable;
25
26 public class LogStoreDbImpl extends CollectableDbImpl implements LogStore
27 {
28     protected TreeMap m_ContainerOfContainers;
29
30     public LogStoreDbImpl()
31     {
32         m_ContainerOfContainers = (TreeMap) getDatabase().createObject(TreeMapDbImpl.class.getName());
33     }
34
35     protected java.util.Set JavaDoc getContainerOfContainersKeySet()
36     {
37         java.util.Set JavaDoc retval = null;
38
39         synchronized(this)
40         {
41             retval = m_ContainerOfContainers.keySet();
42         }
43
44         return retval;
45     }
46
47     protected java.util.Collection JavaDoc getContainerOfContainersValues()
48     {
49         java.util.Collection JavaDoc retval = null;
50
51         synchronized(this)
52         {
53             retval = m_ContainerOfContainers.values();
54         }
55
56         return retval;
57     }
58
59     protected java.util.ArrayList JavaDoc getContainerIndexes(long start, long end)
60     {
61         java.util.ArrayList JavaDoc retval = new java.util.ArrayList JavaDoc();
62  
63         end = (end == 0) ? Long.MAX_VALUE : end;
64
65         if (start <= end)
66         {
67             Long JavaDoc lastTime = null;
68             boolean lastTimeAdded = false;
69
70             java.util.Iterator JavaDoc iter = getContainerOfContainersKeySet().iterator();
71             while (iter.hasNext())
72             {
73                 Long JavaDoc time = (Long JavaDoc) iter.next();
74                 long timeValue = time.longValue();
75
76                 if (timeValue > end)
77                 {
78                     if ((start == end) && (retval.size() == 0))
79                     {
80                         if (lastTime != null)
81                         {
82                             retval.add(lastTime);
83                         }
84                         else
85                         {
86                             retval.add(time);
87                         }
88                     }
89
90                     break;
91                 }
92
93                 boolean tempLastTimeAdded = false;
94                 if (((start <= timeValue) && (timeValue <= end)) || (iter.hasNext() == false))
95                 {
96                     retval.add(time);
97
98                     tempLastTimeAdded = true;
99                 }
100
101                 if ((lastTime != null) && (lastTimeAdded == false))
102                 {
103                     long prevIndexBeginTime = lastTime.longValue();
104                     long prevIndexEndTime = timeValue - 1;
105
106                     if (((start <= prevIndexBeginTime) && (prevIndexBeginTime <= end)) || ((start <= prevIndexEndTime) && (prevIndexEndTime <= end)) ||
107                         ((prevIndexBeginTime <= start) && (start <= prevIndexEndTime) && (prevIndexBeginTime <= end) && (end <= prevIndexEndTime)))
108                     {
109                         retval.add(lastTime);
110                     }
111                 }
112
113                 lastTime = time;
114                 lastTimeAdded = tempLastTimeAdded;
115             }
116         }
117
118         return retval;
119     }
120
121     protected java.util.ArrayList JavaDoc getLogStoreRange(Long JavaDoc index)
122     {
123         java.util.ArrayList JavaDoc retval = new java.util.ArrayList JavaDoc();
124
125         synchronized(this)
126         {
127             LinkedList list = (LinkedList) m_ContainerOfContainers.get(index);
128
129             if (list != null)
130             {
131                 retval.addAll(list.toArrayList());
132             }
133         }
134
135         return retval;
136     }
137
138     protected java.util.ArrayList JavaDoc getLogStoreRange(java.util.Collection JavaDoc indexList)
139     {
140         java.util.ArrayList JavaDoc retval = retval = new java.util.ArrayList JavaDoc();
141
142         java.util.Iterator JavaDoc iter = indexList.iterator();
143         while (iter.hasNext())
144         {
145             retval.addAll(getLogStoreRange((Long JavaDoc) iter.next()));
146         }
147
148         return retval;
149     }
150
151     public void fixUpReference(long fixUpTime)
152     {
153         if (referenceHasBeenFixedUp(fixUpTime) == true)
154         {
155             return;
156         }
157
158         super.fixUpReference(fixUpTime);
159
160         try
161         {
162             m_ContainerOfContainers.fixUpReference(fixUpTime);
163         }
164         catch (org.myoodb.exception.ObjectNotFoundException e)
165         {
166             m_ContainerOfContainers = (TreeMap) getDatabase().createObject(TreeMapDbImpl.class.getName());
167         }
168     }
169
170     public void cleanUpReference()
171     {
172         java.util.Iterator JavaDoc iter = getLogObjects().iterator();
173         while (iter.hasNext())
174         {
175             LogObject logObject = (LogObject) iter.next();
176
177             getDatabase().delete(removeLogObject(logObject));
178         }
179
180         getDatabase().delete(m_ContainerOfContainers);
181     }
182
183     public LogObject addLogObject(LogObject logObject)
184     {
185         /*
186         if ((isExplicitLock() == true) || (logObject.isExplicitLock() == true))
187         {
188             throw new org.myoodb.exception.PermissionException("Invocation cannot be part of a transaction");
189         }
190         */

191
192         synchronized(this)
193         {
194             LinkedList list = null;
195             long logTime = logObject.getTime();
196
197             if (logTime == -1) // XXX: should ensure associated LogStore is this LogStore
198
{
199                 throw new org.myoodb.exception.PermissionException("LogObject not associated with a LogStore");
200             }
201
202             java.util.ArrayList JavaDoc indexes = getContainerIndexes(logTime, logTime);
203
204             if (indexes.size() != 0)
205             {
206                 Long JavaDoc index = (Long JavaDoc) indexes.get(0);
207                 list = (LinkedList) m_ContainerOfContainers.get(index);
208             }
209
210             if ((list == null) || (list.size() >= Container.SIZE.intValue()))
211             {
212                 list = (LinkedList) getDatabase().createObject(LinkedListDbImpl.class.getName());
213                 m_ContainerOfContainers.put(logTime, list);
214             }
215
216             list.add(logObject);
217
218         }
219
220         return logObject;
221     }
222
223     public LogObject removeLogObject(LogObject logObject)
224     {
225         /*
226         if ((isExplicitLock() == true) || (logObject.isExplicitLock() == true))
227         {
228             throw new org.myoodb.exception.PermissionException("Invocation cannot be part of a transaction");
229         }
230         */

231
232         LogObject retval = null;
233
234         synchronized(this)
235         {
236             long logTime = logObject.getTime();
237
238             if (logTime == -1) // XXX: should ensure associated LogStore is this LogStore
239
{
240                 throw new org.myoodb.exception.PermissionException("LogObject not associated with a LogStore");
241             }
242
243             java.util.ArrayList JavaDoc indexes = getContainerIndexes(logTime, logTime);
244
245             if (indexes.size() != 0)
246             {
247                 Long JavaDoc index = (Long JavaDoc) indexes.get(0);
248                 LinkedList list = (LinkedList) m_ContainerOfContainers.get(index);
249
250                 if (list != null)
251                 {
252                     retval = (LogObject) list.get(logObject);
253
254                     if (retval != null)
255                     {
256                         list.remove(logObject);
257
258                         if (list.size() == 0)
259                         {
260                             list = (LinkedList) m_ContainerOfContainers.remove(index);
261                             getDatabase().delete(list);
262                         }
263                     }
264                 }
265             }
266         }
267
268         return retval;
269     }
270
271     public LogObject getFirstLogObject()
272     {
273         LogObject retval = null;
274
275         synchronized(this)
276         {
277             if (m_ContainerOfContainers.size() != 0)
278             {
279                 Long JavaDoc index = (Long JavaDoc) m_ContainerOfContainers.firstKey();
280                 LinkedList list = (LinkedList) m_ContainerOfContainers.get(index);
281                 retval = ((list != null) && (list.size() != 0)) ? (LogObject) list.getFirst() : null;
282             }
283         }
284
285         return retval;
286     }
287
288     public LogObject getLastLogObject()
289     {
290         LogObject retval = null;
291
292         synchronized(this)
293         {
294             if (m_ContainerOfContainers.size() != 0)
295             {
296                 Long JavaDoc index = (Long JavaDoc) m_ContainerOfContainers.lastKey();
297                 LinkedList list = (LinkedList) m_ContainerOfContainers.get(index);
298                 retval = ((list != null) && (list.size() != 0)) ? (LogObject) list.getLast() : null;
299             }
300         }
301
302         return retval;
303     }
304
305     public LogObject getLogObject(long time)
306     {
307         java.util.ArrayList JavaDoc list = getLogObjects(time, time);
308         return (list.size() != 0) ? (LogObject) list.get(0) : null;
309     }
310
311     public java.util.ArrayList JavaDoc getLogObjects()
312     {
313         return getLogStoreRange(getContainerOfContainersKeySet());
314     }
315
316     public java.util.ArrayList JavaDoc getLogObjects(long start, long end)
317     {
318         return getLogObjects(start, end, LogObject.class);
319     }
320
321     public java.util.ArrayList JavaDoc getLogObjects(long start, long end, Class JavaDoc baseLogObjectType)
322     {
323         java.util.ArrayList JavaDoc retval = new java.util.ArrayList JavaDoc();
324
325         java.util.ArrayList JavaDoc logObjects = getLogStoreRange(getContainerIndexes(start, end));
326
327         for (int i = 0; i < logObjects.size(); i++)
328         {
329             LogObject logObject = (LogObject) logObjects.get(i);
330
331             if (baseLogObjectType.isAssignableFrom(logObject.getClass()) == false)
332             {
333                 continue;
334             }
335
336             if (((start == 0) || (logObject.getTime() >= start)) && ((end == 0) || (logObject.getTime() <= end)))
337             {
338                 retval.add(logObject);
339             }
340         }
341
342         return retval;
343     }
344
345     public java.util.ArrayList JavaDoc getLogObjects(long moment, int number, Direction direction)
346     {
347         return getLogObjects(moment, number, direction, LogObject.class);
348     }
349
350     public java.util.ArrayList JavaDoc getLogObjects(long moment, int number, Direction direction, Class JavaDoc baseLogObjectType)
351     {
352         java.util.ArrayList JavaDoc retval = new java.util.ArrayList JavaDoc();
353
354         java.util.LinkedList JavaDoc keys = new java.util.LinkedList JavaDoc(getContainerOfContainersKeySet());
355
356         boolean done = false;
357
358         // walk forward
359
if (direction == LogStore.Direction.FORWARDS)
360         {
361             java.util.ListIterator JavaDoc iter = keys.listIterator();
362             while ((done == false) && iter.hasNext())
363             {
364                 java.util.ArrayList JavaDoc logObjects = getLogStoreRange((Long JavaDoc) iter.next());
365
366                 for (int i = 0; (done == false) && (i < logObjects.size()); i++)
367                 {
368                     LogObject logObject = (LogObject) logObjects.get(i);
369
370                     if (baseLogObjectType.isAssignableFrom(logObject.getClass()) == false)
371                     {
372                         continue;
373                     }
374
375                     if ((logObject.getTime() >= moment) && (retval.size() < number))
376                     {
377                         retval.add(logObject);
378                     }
379                     else if (retval.size() >= number)
380                     {
381                         done = true;
382                         break;
383                     }
384                 }
385             }
386         }
387         // walk backwards
388
else
389         {
390             java.util.ListIterator JavaDoc iter = keys.listIterator(keys.size());
391             while ((done == false) && iter.hasPrevious())
392             {
393                 java.util.ArrayList JavaDoc logObjects = getLogStoreRange((Long JavaDoc) iter.previous());
394
395                 for (int i = (logObjects.size() - 1); (done == false) && (i >= 0); i--)
396                 {
397                     LogObject logObject = (LogObject) logObjects.get(i);
398
399                     if (baseLogObjectType.isAssignableFrom(logObject.getClass()) == false)
400                     {
401                         continue;
402                     }
403
404                     if ((logObject.getTime() <= moment) && (retval.size() < number))
405                     {
406                         retval.add(logObject);
407                     }
408                     else if (retval.size() >= number)
409                     {
410                         done = true;
411                         break;
412                     }
413                 }
414             }
415         }
416
417         return retval;
418     }
419
420     public long getLogStoreSize()
421     {
422         int size = 0;
423
424         java.util.Iterator JavaDoc iter = getContainerOfContainersValues().iterator();
425         while (iter.hasNext())
426         {
427             LinkedList list = (LinkedList) iter.next();
428             size += list.size();
429         }
430
431         return size;
432     }
433
434     public String JavaDoc toString()
435     {
436         return new String JavaDoc("LogStore: " + getLogStoreSize());
437     }
438 }
439
Popular Tags