package com.github.sriki77.apiproxy.instrument.io;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public enum NodeCleaner {
PROXY_ENDPOINT_NODES("ProxyEndpoint", "FaultRules", "PreFlow", "PostFlow", "Flows"),
TARGET_ENDPOINT_NODES("TargetEndpoint", "FaultRules", "PreFlow", "PostFlow", "Flows"),
FLOWS_NODES("Flows", "Flow"),
FLOW_NODES("Flow", "Request", "Response", "Condition"),
REQ_NODES("Request", "Step"),
RES_NODES("Response", "Step"),
STEP_NODES("Step", "Name", "Condition"),
FAULT_NODES("FaultRules", "FaultRule"),
FAULT_RULE_NODES("FaultRule", "Step");
private final List<String> knownNodes;
private final String name;
private NodeCleaner(String name, String... knownNodes) {
this.name = name;
this.knownNodes = Arrays.asList(knownNodes);
}
public void cleanNode(Node node) {
final NodeList topChildren = node.getChildNodes();
List<Node> nodesToBeRemoved = new ArrayList<>();
for (int i = 0; i < topChildren.getLength(); i++) {
final Node n = topChildren.item(i);
if (!knownNodes.contains(n.getNodeName())) {
nodesToBeRemoved.add(n);
}
}
nodesToBeRemoved.stream().forEach(node::removeChild);
}
private static NodeCleaner toCleaner(Node node) {
final NodeCleaner[] nodeCleaners = values();
for (int i = 0; i < nodeCleaners.length; i++) {
NodeCleaner nodeCleaner = nodeCleaners[i];
if (nodeCleaner.name.equals(node.getNodeName())) {
return nodeCleaner;
}
}
return null;
}
public static void clean(Node n) {
final NodeCleaner nodeCleaner = toCleaner(n);
if (nodeCleaner != null) {
nodeCleaner.cleanNode(n);
}
}
}