// 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.core.input;
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 org.dtangler.core.configuration.Arguments;
import org.dtangler.core.configuration.Group;
import org.dtangler.core.configuration.ParserConstants;
public class ArgumentParser {
protected Arguments args = new Arguments();
public Arguments getArguments() {
return args;
}
public Arguments parseArguments(Map<String, String> values) {
if (values.containsKey(ParserConstants.CLASS_PATH_KEY)
|| values.containsKey(ParserConstants.INPUT_KEY))
parseInput(values);
if (values.containsKey(ParserConstants.IGNORE_FILE_MASK_KEY))
parseIgnoredFileMasks(values);
if (values.containsKey(ParserConstants.GROUP_KEY)
|| values.containsKey(ParserConstants.GROUPS_KEY))
parseGroups(values);
if (values.containsKey(ParserConstants.CYCLES_ALLOWED_KEY))
parseCyclesAllowed(values);
if (values.containsKey(ParserConstants.RULES_KEY))
parseRules(values);
if (values.containsKey(ParserConstants.CONFIG_FILE_KEY))
parseConfigFileName(values);
if (values.containsKey(ParserConstants.SCOPE_KEY))
parseScope(values);
if (values.containsKey(ParserConstants.DEPENDENCY_ENGINE_ID_KEY))
parseDependencyEngineId(values);
return args;
}
private void parseScope(Map<String, String> values) {
String value = values.get(ParserConstants.SCOPE_KEY);
args.setScope(value);
}
private void parseConfigFileName(Map<String, String> values) {
args.setConfigFileName(values.get(ParserConstants.CONFIG_FILE_KEY));
}
private void parseDependencyEngineId(Map<String, String> values) {
args.setDependencyEngineId(values
.get(ParserConstants.DEPENDENCY_ENGINE_ID_KEY));
}
private void parseInput(Map<String, String> values) {
List<String> valueList = getValues(values,
ParserConstants.CLASS_PATH_KEY, ParserConstants.INPUT_KEY);
args.setInput(valueList);
}
private List<String> getValues(Map<String, String> values,
String... possibleKeys) {
return getValueList(getValue(values, possibleKeys),
ParserConstants.BIG_SEPARATOR);
}
private String getValue(Map<String, String> values, String... possibleKeys) {
for (String key : possibleKeys) {
String value = values.get(key);
if (value != null)
return value;
}
return new String();
}
private void parseIgnoredFileMasks(Map<String, String> values) {
args.setIgnoredFileMasks(getValueList(values
.get(ParserConstants.IGNORE_FILE_MASK_KEY),
ParserConstants.BIG_SEPARATOR));
}
private void parseGroups(Map<String, String> values) {
Map<String, Group> result = new HashMap();
String value = getValue(values, ParserConstants.GROUP_KEY,
ParserConstants.GROUPS_KEY);
String[] list = value.split(ParserConstants.BIG_SEPARATOR);
for (String group : list) {
if (!group.contains(ParserConstants.CONTAINS))
continue;
String[] parts = group.split(ParserConstants.CONTAINS, 2);
String name = parts[0].trim();
if (parts[1].contains(ParserConstants.DOES_NOT_CONTAIN)) {
String[] subParts = parts[1]
.split(ParserConstants.DOES_NOT_CONTAIN);
result.put(name, new Group(name, parseItems(subParts[0]),
parseItems(subParts[1])));
} else {
result.put(name, new Group(name, parseItems(parts[1])));
}
}
args.setGroups(result);
}
private void parseCyclesAllowed(Map<String, String> values) {
boolean cyclesAllowed = false;
String key = ParserConstants.CYCLES_ALLOWED_KEY;
String value = values.get(key);
if (value.equalsIgnoreCase(ParserConstants.VALUE_TRUE)) {
cyclesAllowed = true;
}
args.setCyclesAllowed(cyclesAllowed);
}
private void parseRules(Map<String, String> values) {
Map<String, Set<String>> cannotDepend = new HashMap();
Map<String, Set<String>> canDepend = new HashMap();
String[] ruleList = values.get(ParserConstants.RULES_KEY).split(
ParserConstants.BIG_SEPARATOR);
for (String ruleString : ruleList) {
if (ruleString.contains(ParserConstants.CANNOT_DEPEND))
addRule(ruleString, cannotDepend);
else if (ruleString.contains(ParserConstants.CAN_DEPEND))
addRule(ruleString, canDepend);
else
continue;
}
args.setForbiddenDependencies(cannotDepend);
args.setAllowedDependencies(canDepend);
}
private void addRule(String rule, Map<String, Set<String>> rules) {
Map<String, Set<String>> newRule = parseRule(rule);
for (String ruleKey : newRule.keySet()) {
Set<String> newValues = newRule.get(ruleKey);
if (rules.containsKey(ruleKey)) {
newValues.addAll(rules.get(ruleKey));
newRule.put(ruleKey, newValues);
}
}
rules.putAll(newRule);
}
private Map<String, Set<String>> parseRule(String rule) {
String ruleType;
if (rule.contains(ParserConstants.CANNOT_DEPEND))
ruleType = ParserConstants.CANNOT_DEPEND;
else if (rule.contains(ParserConstants.CAN_DEPEND))
ruleType = ParserConstants.CAN_DEPEND;
else
return Collections.EMPTY_MAP;
String[] separateSides = rule.split(ruleType, 2);
String leftSide = separateSides[0];
String rightSide = separateSides[1];
Set<String> leftSet = new HashSet();
Set<String> rightSet = new HashSet();
leftSet = parseItems(leftSide);
rightSet = parseItems(rightSide);
Map<String, Set<String>> formattedRule = new HashMap();
for (String leftRule : leftSet) {
Set<String> oldRules = formattedRule.get(leftRule);
// if the rule was already specified, add possible new rules
// to it:
if (oldRules != null) {
for (String old : oldRules) {
rightSet.add(old);
}
}
formattedRule.put(leftRule, rightSet);
}
return formattedRule;
}
private List<String> getValueList(String value, String separator) {
List<String> list = new ArrayList();
for (String item : value.split(separator)) {
list.add(item);
}
return list;
}
private Set<String> parseItems(String items) {
Set<String> itemSet = new HashSet();
String[] allItems = items.split(ParserConstants.SMALL_SEPARATOR);
for (String item : allItems) {
itemSet.add(item.trim());
}
return itemSet;
}
}