package ch.x42.terye.observation;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import javax.jcr.observation.Event;
import ch.x42.terye.SessionImpl;
import ch.x42.terye.persistence.ChangeLog;
import ch.x42.terye.persistence.ItemState;
public class EventCollection {
private SessionImpl session;
private List<EventImpl> events;
public EventCollection(ChangeLog log, SessionImpl session) {
this.session = session;
createEvents(log);
}
private void createEvents(ChangeLog log) {
events = new LinkedList<EventImpl>();
// NODE_ADDED, PROPERTY_ADDED
for (ItemState state : log.getAddedStates()) {
// if the state is the destination of a move, don't generate ADDED
// event for it
if (log.getMovedDestStates().contains(state)) {
continue;
}
int type;
if (state.isNode()) {
type = Event.NODE_ADDED;
} else {
type = Event.PROPERTY_ADDED;
}
events.add(new EventImpl(type, System.currentTimeMillis(), state
.getPath(), session));
}
// PROPERTY_CHANGED
for (ItemState state : log.getModifiedStates()) {
if (!state.isNode()) {
events.add(new EventImpl(Event.PROPERTY_CHANGED, System
.currentTimeMillis(), state.getPath(), session));
}
}
// NODE_REMOVED, PROPERTY_REMOVED
for (ItemState state : log.getRemovedStates()) {
// if the state is the source of a move, don't generate REMOVED
// event for it
if (log.getMovedSrcStates().contains(state)) {
continue;
}
int type;
if (state.isNode()) {
type = Event.NODE_REMOVED;
} else {
type = Event.PROPERTY_REMOVED;
}
events.add(new EventImpl(type, System.currentTimeMillis(), state
.getPath(), session));
}
// NODE_MOVED
for (ItemState state : log.getMovedDestStates()) {
if (state.isNode()) {
events.add(new EventImpl(Event.NODE_MOVED, System
.currentTimeMillis(), state.getPath(), session));
}
}
}
public Iterator<EventImpl> iterator() {
return events.iterator();
}
}