/*
* Copyright (C) 2013, VistaTEC or third-party contributors as indicated
* by the @author tags or express copyright attribution statements applied by
* the authors. All third-party contributions are distributed under license by
* VistaTEC.
*
* This file is part of Ocelot.
*
* Ocelot is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Ocelot is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, write to:
*
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301
* USA
*
* Also, see the full LGPL text here: <http://www.gnu.org/copyleft/lesser.html>
*/
package com.vistatec.ocelot.rules;
import com.vistatec.ocelot.its.model.ITSMetadata;
import com.vistatec.ocelot.segment.model.OcelotSegment;
import java.awt.Color;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
/**
* Collection of RuleFilters used to determine whether to filter out a segment
* from the SegmentView.
*/
public class RuleConfiguration {
private HashMap<String,Rule> rules = new HashMap<String, Rule>();
private List<Rule> ruleOrdering = new ArrayList<Rule>();
private ArrayList<RuleListener> ruleListeners = new ArrayList<RuleListener>();
private EnumMap<StateQualifier, StateQualifierRule> stateQualifierRules =
new EnumMap<StateQualifier, StateQualifierRule>(StateQualifier.class);
protected FilterMode filterMode = FilterMode.ALL;
protected StateQualifierMode stateQualifierMode = StateQualifierMode.ALL;
public enum FilterMode {
ALL,
ALL_WITH_METADATA,
SELECTED_SEGMENTS;
}
public enum StateQualifierMode {
ALL,
SELECTED_STATES;
}
public RuleConfiguration(RuleListener listener) {
this();
this.ruleListeners.add(listener);
}
public RuleConfiguration() {
initStateQualifierRules();
}
void initStateQualifierRules() {
for (StateQualifier sq : StateQualifier.values()) {
StateQualifierRule rule = new StateQualifierRule(sq);
stateQualifierRules.put(sq, rule);
}
}
public void addRuleListener(RuleListener listener) {
this.ruleListeners.add(listener);
}
public void enableRule(Rule rule, boolean enabled) {
rule.setEnabled(enabled);
for (RuleListener listener : ruleListeners) {
listener.enabledRule(rule.getLabel(), enabled);
}
}
public FilterMode getFilterMode() {
return filterMode;
}
public void setFilterMode(FilterMode mode) {
this.filterMode = mode;
for (RuleListener listener : ruleListeners) {
listener.setFilterMode(mode);
}
}
/**
* Return a list of all rules in the order they're defined.
* @return list of Rule objects
*/
public List<Rule> getRules() {
return ruleOrdering;
}
public void addRule(Rule rule) {
rules.put(rule.getLabel(), rule);
ruleOrdering.add(rule);
}
public Rule removeRule(Rule rule) {
Rule r = rules.remove(rule.getLabel());
ruleOrdering.remove(rule);
return r;
}
public Rule getRule(String label) {
return rules.get(label);
}
private Rule getOrCreateRule(String label) {
Rule r = getRule(label);
if (r == null) {
r = new Rule();
r.setLabel(label);
addRule(r);
}
return r;
}
void addRuleConstaint(String ruleLabel, RuleMatcher ruleMatcher) {
getOrCreateRule(ruleLabel).addRuleMatcher(ruleMatcher);
}
private DataCategoryFlag getDataCategoryFlag(String ruleLabel) {
return getOrCreateRule(ruleLabel).getFlag();
}
void addFill(String ruleLabel, Color fill) {
getDataCategoryFlag(ruleLabel).setFill(fill);
}
void addBorder(String ruleLabel, Color border) {
getDataCategoryFlag(ruleLabel).setBorderColor(border);
}
void addText(String ruleLabel, String text) {
getDataCategoryFlag(ruleLabel).setText(text);
}
/**
* Find the first flag for the specified metadata flag.
* @param its
* @return
*/
public DataCategoryFlag getFlagForMetadata(ITSMetadata its) {
for (int pos = ruleOrdering.size() - 1; pos >= 0; pos--) {
Rule r = ruleOrdering.get(pos);
if (r.matches(its)) {
return r.getFlag();
}
}
return null;
}
/**
* Note: this examines rules in reverse-order in which they are added
* to the configuration (ie, last rule in rules.properties) is checked
* first.
*/
public ITSMetadata getTopDataCategory(OcelotSegment seg, int flagCol) {
LinkedList<ITSMetadata> displayFlags = new LinkedList<ITSMetadata>();
for (int pos = ruleOrdering.size()-1; pos >= 0; pos--) {
Rule r = ruleOrdering.get(pos);
List<ITSMetadata> itsMatches = r.displayMatches(seg);
for (ITSMetadata its : itsMatches) {
its.setFlag(r.getFlag());
if (!displayFlags.contains(its)) {
displayFlags.add(its);
}
}
if (displayFlags.size() > flagCol) {
return displayFlags.get(flagCol);
}
}
for (ITSMetadata its : seg.getITSMetadata()) {
if (!displayFlags.contains(its)) {
displayFlags.add(its);
if (displayFlags.size() > flagCol) {
return displayFlags.get(flagCol);
}
}
}
return null;
}
public StateQualifierMode getStateQualifierMode() {
return stateQualifierMode;
}
public void setStateQualifierMode(StateQualifierMode mode) {
this.stateQualifierMode = mode;
for (RuleListener listener : ruleListeners) {
listener.setStateQualifierMode(mode);
}
}
public void setStateQualifierColor(StateQualifier stateQualifier, Color color) {
stateQualifierRules.get(stateQualifier).setColor(color);
}
public Color getStateQualifierColor(StateQualifier stateQualifier) {
return stateQualifierRules.get(stateQualifier).getColor();
}
public boolean getStateQualifierEnabled(StateQualifier stateQualifier) {
return stateQualifierRules.get(stateQualifier).getEnabled();
}
public void setStateQualifierEnabled(StateQualifier stateQualifier, boolean flag) {
StateQualifierRule rule = stateQualifierRules.get(stateQualifier);
// Only notify listeners on change
if (flag != rule.getEnabled()) {
rule.setEnabled(flag);
for (RuleListener listener : ruleListeners) {
listener.enabledRule(stateQualifier.getName(), flag);
}
}
}
}