package tc.oc.pgm.kits; import java.util.Optional; import java.util.stream.Stream; import com.google.common.collect.ImmutableList; import org.jdom2.Element; import tc.oc.pgm.features.LegacyFeatureParser; import tc.oc.pgm.map.MapModule; import tc.oc.pgm.xml.InvalidXMLException; public class KitParser extends LegacyFeatureParser<Kit> implements MapModule { protected boolean hasParentsOrChildren(Element el) { return el.getAttribute("parent") != null || el.getAttribute("parents") != null || !el.getChildren().isEmpty(); } @Override public boolean isReference(Element el) throws InvalidXMLException { if(el.getAttribute(idAttributeName()) == null || hasParentsOrChildren(el)) return false; if(legacy) { // Default conditions are too strict for legacy XML (why?) return "kit".equals(el.getName()); } return super.isReference(el); } @Override public Optional<String> parseDefinitionId(Element el, Kit definition) throws InvalidXMLException { if(legacy && !"kit".equals(el.getName())) { // Only parse the 'name' attribute as an ID on <kit> elements, // because item kits use 'name' for something else return Optional.empty(); } return super.parseDefinitionId(el, definition); } @Override public Stream<Kit> parseChildren(Element parent) throws InvalidXMLException { return super.parseChildren(parent); } @Override protected boolean canIgnore(Element el) throws InvalidXMLException { return super.canIgnore(el) || (el.getName().equals("filter") && el.getParentElement() != null && "kit".equals(el.getParentElement().getName())); } @Override public KitPropertyBuilder property(Element element) { return property(element, propertyName()); } @Override public KitPropertyBuilder property(Element element, String name) { return new KitPropertyBuilder(element, name); } public class KitPropertyBuilder extends PropertyBuilder<KitPropertyBuilder> { public KitPropertyBuilder(Element element, String name) { super(element, name); } @Override protected void parseChild(ImmutableList.Builder<Kit> results, Element child) throws InvalidXMLException { // Parse property children as KitNodes, so they can have attributes results.add(((KitDefinitionParser) definitionParser.get()).kit(child)); } } }