package tc.oc.pgm.filters.parser;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.google.common.collect.ImmutableList;
import org.jdom2.Element;
import tc.oc.pgm.filters.Filter;
import tc.oc.pgm.filters.matcher.block.MaterialFilter;
import tc.oc.pgm.filters.operator.AnyFilter;
import tc.oc.pgm.filters.operator.FilterNode;
import tc.oc.pgm.filters.operator.InverseFilter;
import tc.oc.pgm.utils.MaterialPattern;
import tc.oc.pgm.utils.MethodParser;
import tc.oc.pgm.utils.XMLUtils;
import tc.oc.pgm.xml.InvalidXMLException;
import tc.oc.pgm.xml.Node;
import static tc.oc.commons.core.exception.LambdaExceptionUtils.rethrowFunction;
public class LegacyFilterDefinitionParser extends FilterDefinitionParser {
protected List<? extends Filter> parseGrandchildren(Element parent, String childName) throws InvalidXMLException {
return parent.getChildren(childName)
.stream()
.flatMap(rethrowFunction(filterParser::parseChildren))
.collect(Collectors.toList());
}
protected List<? extends Filter> parseParents(Element el) throws InvalidXMLException {
return Node.tryAttr(el, "parents")
.map(attr -> Stream.of(attr.getValueNormalize().split("\\s"))
.map(rethrowFunction(name -> filterParser.parseReference(attr, name)))
.collect(tc.oc.commons.core.stream.Collectors.toImmutableList()))
.orElse(ImmutableList.of());
}
// Deprecated uses of <filter>
@MethodParser("filter")
public Filter parseFilter(Element el) throws InvalidXMLException {
if(el.getAttribute("parents") != null || el.getChild("allow") != null || el.getChild("deny") != null) {
// A weird node thing
return new FilterNode(parseParents(el),
parseGrandchildren(el, "allow"),
parseGrandchildren(el, "deny"));
} else {
// An alias for <all> (is this actually used anywhere?)
return parseAll(el);
}
}
// Deprecated alias for <material> removed to avoid conflict with <block> region
@MethodParser("block")
public Filter parseBlock(Element el) throws InvalidXMLException {
MaterialPattern pattern = XMLUtils.parseMaterialPattern(el);
if(!pattern.getMaterial().isBlock()) {
throw new InvalidXMLException("Material is not a block", el);
}
return new MaterialFilter(pattern);
}
// Deprecated <not> syntax with multiple child filters
@MethodParser("not")
public Filter parseNot(Element el) throws InvalidXMLException {
return new InverseFilter(new AnyFilter(filterParser.parseChildList(el)));
}
}