/* BookFilterProcessor.java created 2008-02-28
*
*/
package org.signalml.domain.book;
import java.beans.PropertyChangeEvent;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import org.signalml.domain.book.filter.AtomFilterChain;
/** BookFilterProcessor
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public class BookFilterProcessor extends BookProcessor {
private static int CACHE_SIZE = 16;
public static final String FILTER_CHAIN_PROPERTY = "filterChain";
private AtomFilterChain filterChain;
private LinkedHashMap<Integer, StandardBookSegment[]> segmentCache;
public BookFilterProcessor(StandardBook source) {
super(source);
segmentCache = new LinkedHashMap<Integer, StandardBookSegment[]>() {
private static final long serialVersionUID = 1L;
@Override
protected boolean removeEldestEntry(Entry<Integer, StandardBookSegment[]> eldest) {
return(size() > CACHE_SIZE);
}
};
}
public AtomFilterChain getFilterChain() {
return filterChain;
}
public void setFilterChain(AtomFilterChain filterChain) {
if (this.filterChain != filterChain) {
AtomFilterChain oldChain = this.filterChain;
this.filterChain = filterChain;
segmentCache.clear();
pcSupport.firePropertyChange(FILTER_CHAIN_PROPERTY, oldChain, filterChain);
}
}
@Override
public StandardBookSegment[] getSegmentAt(int segmentIndex) {
StandardBookSegment[] segments = segmentCache.get(new Integer(segmentIndex));
if (segments == null) {
StandardBookSegment[] sourceSegments = source.getSegmentAt(segmentIndex);
if (filterChain == null || !filterChain.isFiltered()) {
segments = sourceSegments;
} else {
int channelCount = source.getChannelCount();
segments = new FilteredBookSegment[ channelCount ];
for (int i=0; i<channelCount; i++) {
segments[i] = new FilteredBookSegment(sourceSegments[i], filterChain);
}
}
segmentCache.put(segmentIndex, segments);
}
return segments;
}
@Override
public StandardBookSegment getSegmentAt(int segmentIndex, int channelIndex) {
return getSegmentAt(segmentIndex)[channelIndex];
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
segmentCache.clear();
super.propertyChange(evt);
}
@Override
protected void onAnyBookEvent(BookEvent ev) {
segmentCache.clear();
super.onAnyBookEvent(ev);
}
}