FileDocCategorySizeDatePackage
CyclicBuffer.javaAPI DocApache log4j 1.2.153864Sat Aug 25 00:09:40 BST 2007org.apache.log4j.helpers

CyclicBuffer

public class CyclicBuffer extends Object
CyclicBuffer is used by other appenders to hold {@link LoggingEvent LoggingEvents} for immediate or differed display.

This buffer gives read access to any element in the buffer not just the first or last element.

author
Ceki Gülcü
since
0.9.0

Fields Summary
LoggingEvent[]
ea
int
first
int
last
int
numElems
int
maxSize
Constructors Summary
public CyclicBuffer(int maxSize)
Instantiate a new CyclicBuffer of at most maxSize events. The maxSize argument must a positive integer.

param
maxSize The maximum number of elements in the buffer.

    if(maxSize < 1) {
      throw new IllegalArgumentException("The maxSize argument ("+maxSize+
			    ") is not a positive integer.");
    }
    this.maxSize = maxSize;
    ea = new LoggingEvent[maxSize];
    first = 0;
    last = 0;
    numElems = 0;
  
Methods Summary
public voidadd(org.apache.log4j.spi.LoggingEvent event)
Add an event as the last event in the buffer.

    
    ea[last] = event;    
    if(++last == maxSize)
      last = 0;

    if(numElems < maxSize)
      numElems++;
    else if(++first == maxSize)
      first = 0;
  
public org.apache.log4j.spi.LoggingEventget(int i)
Get the ith oldest event currently in the buffer. If i is outside the range 0 to the number of elements currently in the buffer, then null is returned.

    if(i < 0 || i >= numElems)
      return null;

    return ea[(first + i) % maxSize];
  
public org.apache.log4j.spi.LoggingEventget()
Get the oldest (first) element in the buffer. The oldest element is removed from the buffer.

    LoggingEvent r = null;
    if(numElems > 0) {
      numElems--;
      r = ea[first];
      ea[first] = null;
      if(++first == maxSize)
	first = 0;
    } 
    return r;
  
public intgetMaxSize()

    return maxSize;
  
public intlength()
Get the number of elements in the buffer. This number is guaranteed to be in the range 0 to maxSize (inclusive).

    return numElems;
  
public voidresize(int newSize)
Resize the cyclic buffer to newSize.

throws
IllegalArgumentException if newSize is negative.

    if(newSize < 0) {
      throw new IllegalArgumentException("Negative array size ["+newSize+
					 "] not allowed.");
    }
    if(newSize == numElems)
      return; // nothing to do
    
    LoggingEvent[] temp = new  LoggingEvent[newSize];

    int loopLen = newSize < numElems ? newSize : numElems;
    
    for(int i = 0; i < loopLen; i++) {
      temp[i] = ea[first];
      ea[first] = null;
      if(++first == numElems) 
	first = 0;
    }
    ea = temp;
    first = 0;
    numElems = loopLen;
    maxSize = newSize;
    if (loopLen == newSize) {
      last = 0;
    } else {
      last = loopLen;
    }