/* AtomFilterChain.java created 2008-02-25
*
*/
package org.signalml.domain.book.filter;
import java.util.ArrayList;
import java.util.Iterator;
import org.signalml.app.config.preset.Preset;
import org.signalml.domain.book.StandardBookAtom;
import org.signalml.domain.book.StandardBookSegment;
import com.thoughtworks.xstream.annotations.XStreamAlias;
/** AtomFilterChain
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
@XStreamAlias("chain")
public class AtomFilterChain implements Preset {
private static final long serialVersionUID = 1L;
private String name;
private ArrayList<AbstractAtomFilter> chain;
private boolean filteringEnabled;
private boolean alternative;
public AtomFilterChain() {
chain = new ArrayList<AbstractAtomFilter>();
filteringEnabled = true;
alternative = false;
}
public AtomFilterChain(AtomFilterChain template) {
chain = new ArrayList<AbstractAtomFilter>();
Iterator<AbstractAtomFilter> it = template.chain.iterator();
while (it.hasNext()) {
chain.add(it.next().duplicate());
}
filteringEnabled = template.filteringEnabled;
alternative = template.alternative;
name = template.name;
}
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
public AtomFilterChain duplicate() {
return new AtomFilterChain(this);
}
public boolean isFilteringEnabled() {
return filteringEnabled;
}
public void setFilteringEnabled(boolean filteringEnabled) {
this.filteringEnabled = filteringEnabled;
}
public boolean isAlternative() {
return alternative;
}
public void setAlternative(boolean alternative) {
this.alternative = alternative;
}
public boolean isFiltered() {
if (!filteringEnabled) {
return false;
}
if (chain.isEmpty()) {
return false;
}
for (AbstractAtomFilter filter : chain) {
if (filter.isEnabled()) {
return true;
}
}
return false;
}
public int getFilterCount() {
return chain.size();
}
public AbstractAtomFilter getFilterAt(int index) {
return chain.get(index);
}
public int addFilter(AbstractAtomFilter filter) {
chain.add(filter);
return chain.indexOf(filter);
}
public AbstractAtomFilter removeFilterAt(int index) {
return chain.remove(index);
}
public boolean matches(StandardBookSegment segment, StandardBookAtom atom) {
boolean anyTried = false;
if (filteringEnabled) {
Iterator<AbstractAtomFilter> it = chain.iterator();
AbstractAtomFilter filter;
boolean passes;
while (it.hasNext()) {
filter = it.next();
if (filter.isEnabled()) {
anyTried = true;
passes = (filter.isBlocking() ^ filter.matches(segment, atom));
if (alternative) {
if (passes) {
return true;
}
} else {
if (!passes) {
return false;
}
}
}
}
}
if (alternative && anyTried) {
// at least one filter has been tried, and neither passed
return false;
}
// if there were no filters tried or all passed in AND mode then pass
return true;
}
public boolean isEmpty() {
return chain.isEmpty();
}
@Override
public String toString() {
return name;
}
}