package com.traxel.lumbermill.log;
import com.traxel.lumbermill.event.Event;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public static final int PLAY = 0;
public static final int PAUSE = 1;
public static final int STOP = 2;
public static final String INFO_PROPERTY_NAME = "_info";
private final List CACHE = Collections.synchronizedList(new ArrayList());
private final List EVENTS = Collections.synchronizedList(new ArrayList());
private final Set LISTENERS = Collections.synchronizedSet(new HashSet());
private final Set PROPERTY_LISTENERS = Collections.synchronizedSet(new HashSet());
private int _minSize = 4500;
private int _maxSize = 5000;
private int _activeState = PLAY;
private Integer addLocker = 0;
public void setMinMax(
final int minSize,
final int maxSize) {
_minSize = minSize;
_maxSize = maxSize;
}
return _minSize;
}
return _maxSize;
}
return _activeState;
}
if (_activeState == state) {
return;
}
firePropertyChange("_activeState",
new Integer(_activeState),
new Integer(state));
_activeState = state;
}
return EVENTS.size();
}
synchronized (PROPERTY_LISTENERS) {
PROPERTY_LISTENERS.add(l);
}
}
public void add(
final Event e) {
if (e != null) {
synchronized (addLocker) {
if (PLAY == getActiveState()) {
EVENTS.add(e);
fireAdded(e);
if (EVENTS.size() > getMaxSize()) {
final int firstKept;
final Event[] removed;
firstKept = EVENTS.size() - _minSize;
removed = new Event[firstKept];
for (int i = firstKept - 1; i >= 0; i--) {
removed[i] = (Event)EVENTS.get(i);
EVENTS.remove(i);
}
fireRemoved(removed);
}
} else if (PAUSE == getActiveState()) {
if (CACHE.size() >= getMaxSize()) {
stop();
CACHE.clear();
firePropertyChange(INFO_PROPERTY_NAME,
null,
"Pause Buffer Overflow");
} else {
CACHE.add(e);
}
}
}
}
}
public void remove(
final Event e) {
EVENTS.remove(e);
fireRemoved(new Event[] { e });
}
final List events;
synchronized (EVENTS) {
events = new ArrayList(EVENTS);
}
return events.iterator();
}
if (l != null) {
synchronized (LISTENERS) {
LISTENERS.add(l);
}
}
}
synchronized (EVENTS) {
return (Event[])EVENTS.toArray(new Event[0]);
}
}
synchronized (EVENTS) {
final Iterator it;
setActiveState(PLAY);
it = CACHE.iterator();
while (it.hasNext()) {
add((Event)it.next());
}
CACHE.clear();
}
}
synchronized (EVENTS) {
setActiveState(PAUSE);
}
}
synchronized (EVENTS) {
setActiveState(STOP);
}
}
synchronized (EVENTS) {
EVENTS.clear();
CACHE.clear();
fireCleared();
}
}
synchronized (LISTENERS) {
final Iterator it = LISTENERS.iterator();
while (it.hasNext()) {
((LogListener)it.next()).added(this, event);
}
}
}
synchronized (LISTENERS) {
final Iterator it = LISTENERS.iterator();
while (it.hasNext()) {
((LogListener)it.next()).removed(this, events);
}
}
}
synchronized (LISTENERS) {
final Iterator it = LISTENERS.iterator();
while (it.hasNext()) {
((LogListener)it.next()).cleared(this);
}
}
}
private void firePropertyChange(
final String property,
final Object oldValue,
final Object newValue) {
final PropertyChangeEvent event = new PropertyChangeEvent(this, property,
oldValue, newValue);
synchronized (PROPERTY_LISTENERS) {
final Iterator it;
PropertyChangeListener listener;
it = PROPERTY_LISTENERS.iterator();
while (it.hasNext()) {
listener = (PropertyChangeListener)it.next();
listener.propertyChange(event);
}
}
}
}