1 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 getContainerOfContainersKeySet() 36 { 37 java.util.Set retval = null; 38 39 synchronized(this) 40 { 41 retval = m_ContainerOfContainers.keySet(); 42 } 43 44 return retval; 45 } 46 47 protected java.util.Collection getContainerOfContainersValues() 48 { 49 java.util.Collection retval = null; 50 51 synchronized(this) 52 { 53 retval = m_ContainerOfContainers.values(); 54 } 55 56 return retval; 57 } 58 59 protected java.util.ArrayList getContainerIndexes(long start, long end) 60 { 61 java.util.ArrayList retval = new java.util.ArrayList (); 62 63 end = (end == 0) ? Long.MAX_VALUE : end; 64 65 if (start <= end) 66 { 67 Long lastTime = null; 68 boolean lastTimeAdded = false; 69 70 java.util.Iterator iter = getContainerOfContainersKeySet().iterator(); 71 while (iter.hasNext()) 72 { 73 Long time = (Long ) 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 getLogStoreRange(Long index) 122 { 123 java.util.ArrayList retval = new java.util.ArrayList (); 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 getLogStoreRange(java.util.Collection indexList) 139 { 140 java.util.ArrayList retval = retval = new java.util.ArrayList (); 141 142 java.util.Iterator iter = indexList.iterator(); 143 while (iter.hasNext()) 144 { 145 retval.addAll(getLogStoreRange((Long ) 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 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 191 192 synchronized(this) 193 { 194 LinkedList list = null; 195 long logTime = logObject.getTime(); 196 197 if (logTime == -1) { 199 throw new org.myoodb.exception.PermissionException("LogObject not associated with a LogStore"); 200 } 201 202 java.util.ArrayList indexes = getContainerIndexes(logTime, logTime); 203 204 if (indexes.size() != 0) 205 { 206 Long index = (Long ) 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 231 232 LogObject retval = null; 233 234 synchronized(this) 235 { 236 long logTime = logObject.getTime(); 237 238 if (logTime == -1) { 240 throw new org.myoodb.exception.PermissionException("LogObject not associated with a LogStore"); 241 } 242 243 java.util.ArrayList indexes = getContainerIndexes(logTime, logTime); 244 245 if (indexes.size() != 0) 246 { 247 Long index = (Long ) 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 index = (Long ) 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 index = (Long ) 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 list = getLogObjects(time, time); 308 return (list.size() != 0) ? (LogObject) list.get(0) : null; 309 } 310 311 public java.util.ArrayList getLogObjects() 312 { 313 return getLogStoreRange(getContainerOfContainersKeySet()); 314 } 315 316 public java.util.ArrayList getLogObjects(long start, long end) 317 { 318 return getLogObjects(start, end, LogObject.class); 319 } 320 321 public java.util.ArrayList getLogObjects(long start, long end, Class baseLogObjectType) 322 { 323 java.util.ArrayList retval = new java.util.ArrayList (); 324 325 java.util.ArrayList 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 getLogObjects(long moment, int number, Direction direction) 346 { 347 return getLogObjects(moment, number, direction, LogObject.class); 348 } 349 350 public java.util.ArrayList getLogObjects(long moment, int number, Direction direction, Class baseLogObjectType) 351 { 352 java.util.ArrayList retval = new java.util.ArrayList (); 353 354 java.util.LinkedList keys = new java.util.LinkedList (getContainerOfContainersKeySet()); 355 356 boolean done = false; 357 358 if (direction == LogStore.Direction.FORWARDS) 360 { 361 java.util.ListIterator iter = keys.listIterator(); 362 while ((done == false) && iter.hasNext()) 363 { 364 java.util.ArrayList logObjects = getLogStoreRange((Long ) 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 else 389 { 390 java.util.ListIterator iter = keys.listIterator(keys.size()); 391 while ((done == false) && iter.hasPrevious()) 392 { 393 java.util.ArrayList logObjects = getLogStoreRange((Long ) 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 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 toString() 435 { 436 return new String ("LogStore: " + getLogStoreSize()); 437 } 438 } 439
| Popular Tags
|