package com.google.code.joto.eventrecorder.impl;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import com.google.code.joto.eventrecorder.RecordEventData;
import com.google.code.joto.eventrecorder.RecordEventStore;
import com.google.code.joto.eventrecorder.RecordEventStoreChange.TruncateRecordEventStoreEvent;
import com.google.code.joto.eventrecorder.RecordEventSummary;
import com.google.code.joto.util.ArrayList2;
/**
* in-memory implementation of RecordEventStore
*/
public class DefaultMemoryRecordEventStore extends AbstractRecordEventStore {
/** Factory pattern for RecordEventStore */
public static class DefaultMemoryRecordEventStoreFactory implements RecordEventStoreFactory {
/** internal for java.io.Serializable */
private static final long serialVersionUID = 1L;
public DefaultMemoryRecordEventStoreFactory() {
}
public RecordEventStore create() {
return new DefaultMemoryRecordEventStore();
}
}
protected ArrayList2<RecordEventData> eventDataList = new ArrayList2<RecordEventData>();
// ------------------------------------------------------------------------
public DefaultMemoryRecordEventStore() {
}
// ------------------------------------------------------------------------
@Override
public List<RecordEventSummary> getEvents(int fromEventId, int toEventId) {
List<RecordEventSummary> res = new ArrayList<RecordEventSummary>();
int availableFirstEventId = getFirstEventId();
if (fromEventId < availableFirstEventId) {
fromEventId = availableFirstEventId;
}
int availableLastEventId = getLastEventId();
if (toEventId == -1 || toEventId >= availableLastEventId) {
toEventId = availableLastEventId;
}
for(RecordEventData e : eventDataList) {
if (e.getEventId() < fromEventId) {
continue;
}
if (toEventId != -1 && e.getEventId() > toEventId) {
break;
}
res.add(e.getEventSummary());
}
return res;
}
public synchronized List<RecordEventSummary> getEvents() {
List<RecordEventSummary> res = eventDataListToEventHandleList(eventDataList);
return res;
}
public synchronized RecordEventData getEventData(RecordEventSummary eventHandle) {
if (eventDataList.isEmpty()) {
return null;
}
int eventId = eventHandle.getEventId();
int firstEventId = eventDataList.get(0).getEventId();
int index = eventId - firstEventId;
RecordEventData res;
if (index < eventDataList.size()) {
res = eventDataList.get(index);
} else {
// Should not occur!
res = null;
}
return res;
}
protected RecordEventData doAddEvent(RecordEventSummary eventInfo, Serializable objData) {
RecordEventData eventData = createNewEventData(eventInfo, objData);
eventDataList.add(eventData);
return eventData;
}
@Override
public void purgeEvents(int toEventId) {
int firstEventId = getFirstEventId();
if (toEventId == -1) {
toEventId = getLastEventId();
}
int truncatedLen = toEventId - firstEventId;
List<RecordEventSummary> truncateEvents = eventDataListToEventHandleList(eventDataList.subList(0, truncatedLen));
// do truncate
eventDataList.removeRange(0, truncatedLen);
// fire truncated event
fireStoreEvent(new TruncateRecordEventStoreEvent(firstEventId, toEventId, truncateEvents));
}
// override java.lang.Object
// -------------------------------------------------------------------------
@Override
public String toString() {
return "DefaultMemoryRecordEventStore["
+ "eventIds:" + getFirstEventId() + "-" + getLastEventId()
+ "]";
}
}