package com.google.code.joto.eventrecorder.writer;
import com.google.code.joto.eventrecorder.RecordEventData;
import com.google.code.joto.eventrecorder.RecordEventSummary;
import com.google.code.joto.eventrecorder.predicate.RecordEventSummaryPredicate;
import org.apache.commons.collections.Predicate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* proxy implementation of RecordEventWriter to add filtering
* with global boolean, or List<RecordEventSummaryPredicate>
*/
public class FilteringRecordEventWriter extends AbstractRecordEventWriter implements RecordEventWriter {
private static Logger log = LoggerFactory.getLogger(FilteringRecordEventWriter.class);
/** underlying proxy target object */
private RecordEventWriter target;
protected boolean enable = true;
/**
* list of predicate (filters) to filter on RecordEventSummary elements
*/
protected List<Predicate> eventPredicates = new ArrayList<Predicate>();
/** optional */
private Object owner;
/** optional */
private String name;
// -------------------------------------------------------------------------
public FilteringRecordEventWriter(RecordEventWriter target) {
this.target = target;
}
// -------------------------------------------------------------------------
@Override
public void addEvent(RecordEventSummary info, Serializable objData, RecordEventWriterCallback callback) {
if (enable == false || !isEnable(info)) {
if (callback != null) {
RecordEventData dummy = new RecordEventData(info, objData);
callback.onStore(dummy);
}
return;
}
// delegate to underlying
target.addEvent(info, objData, callback);
}
public boolean isEnable() {
return enable;
}
public void setEnable(boolean p) {
if (p != enable) {
boolean oldValue = enable;
this.enable = p;
changeSupport.firePropertyChange("enable", oldValue, p);
}
}
public List<Predicate> getEventPredicates() {
return Collections.unmodifiableList(eventPredicates);
}
public void setEventPredicateElts(List<Predicate> p) {
List<Predicate> old = new ArrayList<Predicate>(eventPredicates);
eventPredicates.clear();
if (p != null) {
eventPredicates.addAll(p);
}
changeSupport.firePropertyChange("eventPredicates", old, eventPredicates);
}
public void addEventPredicate(RecordEventSummaryPredicate p) {
List<Predicate> old = new ArrayList<Predicate>(eventPredicates);
eventPredicates.add(p);
changeSupport.firePropertyChange("eventPredicates", old, eventPredicates);
}
public void removeEventPredicate(Predicate p) {
List<Predicate> old = new ArrayList<Predicate>(eventPredicates);
eventPredicates.add(p);
changeSupport.firePropertyChange("eventPredicates", old, eventPredicates);
}
public boolean isEnable(RecordEventSummary eventInfo) {
boolean res = true;
if (eventInfo.getEventMethodName() != null
&& eventInfo.getEventMethodName().endsWith("UserAdvancement")) {
log.debug("event: " + eventInfo.getEventMethodName());
}
if (eventPredicates != null && !eventPredicates.isEmpty()) {
for(Predicate pred : eventPredicates) {
if (!pred.evaluate(eventInfo)) {
res = false;
break;
}
}
}
return res;
}
public Object getOwner() {
return owner;
}
public void setOwner(Object p) {
this.owner = p;
}
public String getName() {
return name;
}
public void setName(String p) {
this.name = p;
}
}