// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.graphview.core.util;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.util.Collection;
import org.openstreetmap.josm.plugins.graphview.core.data.Tag;
import org.openstreetmap.josm.plugins.graphview.core.data.TagGroup;
/**
* utility class for creating and combining TagCondition objects.
*/
public final class TagConditionLogic {
/** prevents instantiation */
private TagConditionLogic(){ }
/**
* creates a condition that is fulfilled if the set of tags contains a given tag
*
* @param tag tag that must be in the tag collection; != null
*/
public static TagCondition tag(final Tag tag) {
assert tag != null;
return new TagCondition() {
@Override
public boolean matches(TagGroup tags) {
return tags.contains(tag);
}
@Override
public String toString() {
return tag.toString();
}
};
}
/**
* creates a condition that is fulfilled if the set of tags contains a tag with the given key
*
* @param key the key to look for; != null
*/
public static TagCondition key(final String key) {
assert key != null;
return new TagCondition() {
@Override
public boolean matches(TagGroup tags) {
return tags.containsKey(key);
}
@Override
public String toString() {
return key;
}
};
}
/**
* combines conditions using a boolean "and"
*
* @param condition first condition; != null
* @param conditions more conditions; each != null
*/
public static TagCondition and(final TagCondition condition, final TagCondition... conditions) {
return new TagCondition() {
@Override
public boolean matches(TagGroup tags) {
for (TagCondition c : conditions) {
if (!c.matches(tags)) {
return false;
}
}
return condition.matches(tags);
}
@Override
public String toString() {
StringBuilder result = new StringBuilder();
result.append("(");
result.append(condition);
for (TagCondition c : conditions) {
result.append(" && ");
result.append(c);
}
result.append(")");
return result.toString();
}
};
}
/**
* combines conditions using a boolean "and"
*
* @param conditions collection of conditions, must contain at least one element; != null
*/
public static TagCondition and(final Collection<TagCondition> conditions) {
if (conditions.size() == 0) {
throw new IllegalArgumentException(tr("Collection must contain at least one condition"));
}
return new TagCondition() {
@Override
public boolean matches(TagGroup tags) {
for (TagCondition c : conditions) {
if (!c.matches(tags)) {
return false;
}
}
return true;
}
@Override
public String toString() {
StringBuilder result = new StringBuilder();
result.append("(");
boolean firstCondition = true;
for (TagCondition c : conditions) {
if (!firstCondition) {
result.append(" && ");
}
firstCondition = false;
result.append(c);
}
result.append(")");
return result.toString();
}
};
}
/**
* combines conditions using a boolean "or"
*
* @param condition first condition; != null
* @param conditions more conditions; each != null
*/
public static TagCondition or(final TagCondition condition, final TagCondition... conditions) {
return new TagCondition() {
@Override
public boolean matches(TagGroup tags) {
for (TagCondition c : conditions) {
if (c.matches(tags)) {
return true;
}
}
return condition.matches(tags);
}
@Override
public String toString() {
StringBuilder result = new StringBuilder();
result.append("(");
result.append(condition);
for (TagCondition c : conditions) {
result.append(" || ");
result.append(c);
}
result.append(")");
return result.toString();
}
};
}
/**
* combines conditions using a boolean "or"
*
* @param conditions collection of conditions, must contain at least one element; != null
*/
public static TagCondition or(final Collection<TagCondition> conditions) {
if (conditions.size() == 0) {
throw new IllegalArgumentException(tr("Collection must contain at least one condition"));
}
return new TagCondition() {
@Override
public boolean matches(TagGroup tags) {
for (TagCondition c : conditions) {
if (c.matches(tags)) {
return true;
}
}
return false;
}
@Override
public String toString() {
StringBuilder result = new StringBuilder();
result.append("(");
boolean firstCondition = true;
for (TagCondition c : conditions) {
if (!firstCondition) {
result.append(" || ");
}
firstCondition = false;
result.append(c);
}
result.append(")");
return result.toString();
}
};
}
/**
* inverts a condition
*
* @param condition condition to invert, != null
*/
public static TagCondition not(final TagCondition condition) {
return new TagCondition() {
@Override
public boolean matches(TagGroup tags) {
return !condition.matches(tags);
}
@Override
public String toString() {
return "!" + condition;
}
};
}
}