//This product is provided under the terms of EPL (Eclipse Public License)
//version 1.0.
//
//The full license text can be read from: http://www.eclipse.org/org/documents/epl-v10.php
package org.dtangler.swingui.rulesselector.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import org.dtangler.core.configuration.Arguments;
import org.dtangler.core.configuration.Group;
import org.dtangler.swingui.groupselector.GroupSelector;
import org.dtangler.swingui.rulememberselector.RuleMemberSelector;
public class DefaultRulesModel implements RulesModel {
private class DefaultRuleModel implements RuleModel {
private final Map<String, Set<String>> rules = new HashMap();
private final RuleMemberSelector ruleMemberSelector;
public DefaultRuleModel(RuleMemberSelector ruleMemberSelector,
Map<String, Set<String>> previousRules) {
this.ruleMemberSelector = ruleMemberSelector;
this.rules.putAll(previousRules);
}
public void addRule() {
String newRule = ruleMemberSelector
.selectRuleMember(getGroupNames());
if (newRule != null)
rules.put(newRule, Collections.EMPTY_SET);
}
public List<String> getRules() {
ArrayList arules = new ArrayList(rules.keySet());
Collections.sort(arules);
return arules;
}
public void removeRules(List<String> rulesToRemove) {
for (String rule : rulesToRemove)
rules.remove(rule);
}
public List<String> getRuleItems(List<String> forbiddenDependencyRules) {
if (forbiddenDependencyRules.size() != 1)
return Collections.EMPTY_LIST;
List<String> items = new ArrayList(rules
.get(forbiddenDependencyRules.get(0)));
Collections.sort(items);
return items;
}
public void addRuleItem(String ruleToAddTo) {
String newItem = ruleMemberSelector
.selectRuleMember(getGroupNames());
if (newItem == null)
return;
Set<String> allItems = new HashSet(rules.get(ruleToAddTo));
allItems.add(newItem);
rules.put(ruleToAddTo, allItems);
}
public void removeRuleItem(String ruleToRemoveFrom,
List<String> ruleItems) {
Set<String> allItems = new HashSet(rules.get(ruleToRemoveFrom));
allItems.removeAll(ruleItems);
rules.put(ruleToRemoveFrom, allItems);
}
public void updateRuleMemberName(String oldName, String newName) {
Map<String, Set<String>> newRules = new HashMap();
for (Entry<String, Set<String>> entry : rules.entrySet()) {
if (entry.getKey().equals(oldName))
newRules.put(newName, updateRuleMemberName(oldName,
newName, entry.getValue()));
else
newRules.put(entry.getKey(), updateRuleMemberName(oldName,
newName, entry.getValue()));
}
rules.clear();
rules.putAll(newRules);
}
private Set<String> updateRuleMemberName(String oldName,
String newName, Set<String> values) {
Set<String> result = new HashSet(values);
if (result.contains(oldName)) {
result.remove(oldName);
result.add(newName);
}
return result;
}
public void removeRuleMember(String name) {
rules.remove(name);
for (Set<String> ruleItems : rules.values())
ruleItems.remove(name);
}
}
private final DefaultRuleModel forbiddenDeps;
private final DefaultRuleModel allowedDeps;
private final Arguments prevArguments;
private Arguments arguments;
private final GroupSelector groupSelector;
private final Map<String, Group> groups;
public DefaultRulesModel(RuleMemberSelector ruleMemberSelector,
Arguments prevArguments, GroupSelector groupSelector) {
this.prevArguments = prevArguments;
this.groupSelector = groupSelector;
forbiddenDeps = new DefaultRuleModel(ruleMemberSelector, prevArguments
.getForbiddenDependencies());
allowedDeps = new DefaultRuleModel(ruleMemberSelector, prevArguments
.getAllowedDependencies());
this.groups = new HashMap(prevArguments.getGroups());
}
public void save() {
arguments = prevArguments.createDeepCopy();
arguments.setForbiddenDependencies(forbiddenDeps.rules);
arguments.setAllowedDependencies(allowedDeps.rules);
arguments.setGroups(groups);
}
public Arguments getArguments() {
return arguments;
}
public List<String> getGroupNames() {
List<String> groupNames = new ArrayList(groups.keySet());
Collections.sort(groupNames);
return groupNames;
}
public RuleModel forbiddenDepsModel() {
return forbiddenDeps;
}
public RuleModel allowedDepsModel() {
return allowedDeps;
}
public void newGroup() {
Group group = groupSelector.createGroup();
if (group != null)
groups.put(group.getName(), group);
}
public void removeGroups(List<String> groupNames) {
for (String groupName : groupNames) {
groups.remove(groupName);
removeRuleMember("@" + groupName);
}
}
public void editGroup(String groupName) {
Group editedGroup = groupSelector.editGroup(groups.get(groupName));
if (editedGroup != null) {
groups.remove(groupName);
groups.put(editedGroup.getName(), editedGroup);
if (!groupName.equals(editedGroup.getName()))
updateRuleMemberName("@" + groupName, "@"
+ editedGroup.getName());
}
}
private void updateRuleMemberName(String oldName, String newName) {
forbiddenDeps.updateRuleMemberName(oldName, newName);
allowedDeps.updateRuleMemberName(oldName, newName);
}
private void removeRuleMember(String name) {
forbiddenDeps.removeRuleMember(name);
allowedDeps.removeRuleMember(name);
}
}