// Path: plugin/src/main/java/org/eddy/xml/context/XmlDataContext.java
// @Getter
// public class XmlDataContext {
// 
//     private static final Logger logger = LoggerFactory.getLogger(XmlDataContext.class);
// 
//     private List<RuleNode> nodes;
// 
//     private static XmlDataContext context = new XmlDataContext("rule/rule.xml");
// 
// 
//     public static XmlDataContext getContext() {
//         return context;
//     }
// 
//     //**********************私有构造函数*************************
// 
//     private XmlDataContext(String path) {
//         try {
//             this.nodes = loadXml(path);
//         } catch (Exception e) {
//             logger.error("parse xml error", e);
//             throw new RuntimeException("parse xml error", e);
//         }
//     }
// 
//     //**********************解析xml*****************************
// 
//     private List<RuleNode> loadXml(String path) throws Exception{
//         DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//         DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder();
//         builder.setEntityResolver(new UrlDtdPathResolver());
//         Document document = builder.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream(path));
// 
//         List<RuleNode> results = new ArrayList<>();
// 
//         NodeList rootChildren = document.getDocumentElement().getChildNodes();
//         for (int i = 0; i < rootChildren.getLength(); i++) {
// 
//             Optional.ofNullable(parseNode(rootChildren.item(i))).ifPresent(node -> results.add(node));
// 
//         }
// 
//         return results.stream().filter(Objects::nonNull).collect(Collectors.toList());
//     }
// 
//     private RuleNode parseNode(Node item) throws Exception{
// 
//         // 节点非element节点 或 element节点name非rule, 则直接返回
//         if (item.getNodeType() != Node.ELEMENT_NODE || !StringUtils.equals(item.getNodeName(), RuleNode.RULE_NODE_NAME)) {
//             return null;
//         }
// 
//         Element ruleNode = (Element) item;
// 
//         String table = ruleNode.getAttribute("table");
//         String column = ruleNode.getAttribute("column");
//         String javaType = ruleNode.getAttribute("javaType");
//         KeyColumn keyColumn = new KeyColumn(table, column, javaType);
// 
//         String comparator = ruleNode.getAttribute("class");
//         Comparator comparatorClass = (Comparator) Class.forName(comparator).newInstance();
// 
//         RuleNode node = new RuleNode(keyColumn, comparatorClass);
// 
//         NodeList ruleChildren = item.getChildNodes();
//         for (int i = 0; i < ruleChildren.getLength(); i++) {
// 
//             Optional.ofNullable(parseData(ruleChildren.item(i))).ifPresent(dataNode -> {
//                 node.add(dataNode);
//                 dataNode.setRuleNode(node);
//             });
// 
//         }
// 
//         return node;
//     }
// 
//     private DataNode parseData(Node item) throws Exception {
//         // 节点非element节点 或 element节点name非data, 则直接返回
//         if (item.getNodeType() != Node.ELEMENT_NODE || !StringUtils.equals(item.getNodeName(), DataNode.DATA_NODE_NAME)) {
//             return null;
//         }
// 
//         Element dataElement = (Element) item;
//         String schema = dataElement.getAttribute("schema");
//         String table = dataElement.getAttribute("table");
//         String script = dataElement.getAttribute("script");
// 
//         return new DataNode(schema, table, script);
//     }
// }
// 
// Path: plugin/src/main/java/org/eddy/xml/data/RuleNode.java
// @Getter
// @Setter
// @ToString(exclude = "dataNodes")
// @NoArgsConstructor
// @RequiredArgsConstructor
// public class RuleNode {
// 
//     public static final String RULE_NODE_NAME = "rule";
// 
//     @NonNull
//     private KeyColumn keyColumn;
// 
//     private List<DataNode> dataNodes = new ArrayList<>();
// 
//     /**
//      * 比较器
//      */
//     @NonNull
//     private Comparator comparator;
// 
//     public String sourceTable() {
//         return keyColumn.getTable();
//     }
// 
//     public void add(DataNode dataNode) {
//         dataNodes.add(dataNode);
//     }
// }


import net.sf.jsqlparser.schema.Table;
import org.apache.commons.lang3.StringUtils;
import org.eddy.xml.context.XmlDataContext;
import org.eddy.xml.data.RuleNode;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.regex.Pattern;
package org.eddy.util;



/**
 * Created by eddy on 2017/6/8.
 */
public class TableList {

    private static Pattern pattern = Pattern.compile("'|\"|`");

    private List<String> tables = new ArrayList<>();

    public void add(Table table, Supplier holder) {
        Objects.requireNonNull(holder);
// Path: plugin/src/main/java/org/eddy/xml/context/XmlDataContext.java
// @Getter
// public class XmlDataContext {
// 
//     private static final Logger logger = LoggerFactory.getLogger(XmlDataContext.class);
// 
//     private List<RuleNode> nodes;
// 
//     private static XmlDataContext context = new XmlDataContext("rule/rule.xml");
// 
// 
//     public static XmlDataContext getContext() {
//         return context;
//     }
// 
//     //**********************私有构造函数*************************
// 
//     private XmlDataContext(String path) {
//         try {
//             this.nodes = loadXml(path);
//         } catch (Exception e) {
//             logger.error("parse xml error", e);
//             throw new RuntimeException("parse xml error", e);
//         }
//     }
// 
//     //**********************解析xml*****************************
// 
//     private List<RuleNode> loadXml(String path) throws Exception{
//         DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//         DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder();
//         builder.setEntityResolver(new UrlDtdPathResolver());
//         Document document = builder.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream(path));
// 
//         List<RuleNode> results = new ArrayList<>();
// 
//         NodeList rootChildren = document.getDocumentElement().getChildNodes();
//         for (int i = 0; i < rootChildren.getLength(); i++) {
// 
//             Optional.ofNullable(parseNode(rootChildren.item(i))).ifPresent(node -> results.add(node));
// 
//         }
// 
//         return results.stream().filter(Objects::nonNull).collect(Collectors.toList());
//     }
// 
//     private RuleNode parseNode(Node item) throws Exception{
// 
//         // 节点非element节点 或 element节点name非rule, 则直接返回
//         if (item.getNodeType() != Node.ELEMENT_NODE || !StringUtils.equals(item.getNodeName(), RuleNode.RULE_NODE_NAME)) {
//             return null;
//         }
// 
//         Element ruleNode = (Element) item;
// 
//         String table = ruleNode.getAttribute("table");
//         String column = ruleNode.getAttribute("column");
//         String javaType = ruleNode.getAttribute("javaType");
//         KeyColumn keyColumn = new KeyColumn(table, column, javaType);
// 
//         String comparator = ruleNode.getAttribute("class");
//         Comparator comparatorClass = (Comparator) Class.forName(comparator).newInstance();
// 
//         RuleNode node = new RuleNode(keyColumn, comparatorClass);
// 
//         NodeList ruleChildren = item.getChildNodes();
//         for (int i = 0; i < ruleChildren.getLength(); i++) {
// 
//             Optional.ofNullable(parseData(ruleChildren.item(i))).ifPresent(dataNode -> {
//                 node.add(dataNode);
//                 dataNode.setRuleNode(node);
//             });
// 
//         }
// 
//         return node;
//     }
// 
//     private DataNode parseData(Node item) throws Exception {
//         // 节点非element节点 或 element节点name非data, 则直接返回
//         if (item.getNodeType() != Node.ELEMENT_NODE || !StringUtils.equals(item.getNodeName(), DataNode.DATA_NODE_NAME)) {
//             return null;
//         }
// 
//         Element dataElement = (Element) item;
//         String schema = dataElement.getAttribute("schema");
//         String table = dataElement.getAttribute("table");
//         String script = dataElement.getAttribute("script");
// 
//         return new DataNode(schema, table, script);
//     }
// }
// 
// Path: plugin/src/main/java/org/eddy/xml/data/RuleNode.java
// @Getter
// @Setter
// @ToString(exclude = "dataNodes")
// @NoArgsConstructor
// @RequiredArgsConstructor
// public class RuleNode {
// 
//     public static final String RULE_NODE_NAME = "rule";
// 
//     @NonNull
//     private KeyColumn keyColumn;
// 
//     private List<DataNode> dataNodes = new ArrayList<>();
// 
//     /**
//      * 比较器
//      */
//     @NonNull
//     private Comparator comparator;
// 
//     public String sourceTable() {
//         return keyColumn.getTable();
//     }
// 
//     public void add(DataNode dataNode) {
//         dataNodes.add(dataNode);
//     }
// }


// Path: plugin/src/main/java/org/eddy/util/TableList.java
import net.sf.jsqlparser.schema.Table;
import org.apache.commons.lang3.StringUtils;
import org.eddy.xml.context.XmlDataContext;
import org.eddy.xml.data.RuleNode;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.regex.Pattern;

package org.eddy.util;



/**
 * Created by eddy on 2017/6/8.
 */
public class TableList {

    private static Pattern pattern = Pattern.compile("'|\"|`");

    private List<String> tables = new ArrayList<>();

    public void add(Table table, Supplier holder) {
        Objects.requireNonNull(holder);
        tables.add(holder.getName(table));