001package gudusoft.gsqlparser.dlineage.graph.utils;
002
003import gudusoft.gsqlparser.util.Logger;
004import gudusoft.gsqlparser.util.LoggerFactory;
005import org.w3c.dom.Document;
006import org.w3c.dom.Element;
007import org.w3c.dom.Node;
008import org.w3c.dom.NodeList;
009import org.xml.sax.InputSource;
010
011import javax.xml.parsers.DocumentBuilder;
012import javax.xml.parsers.DocumentBuilderFactory;
013import javax.xml.transform.Transformer;
014import javax.xml.transform.TransformerFactory;
015import javax.xml.transform.dom.DOMSource;
016import javax.xml.transform.stream.StreamResult;
017import java.io.StringReader;
018import java.io.StringWriter;
019
020public class XMLUtil {
021    private static final Logger logger = LoggerFactory.getLogger(XMLUtil.class);
022    private static final TransformerFactory transformerFactory = TransformerFactory.newInstance();
023
024    public static Document parseXmlString(String xmlString) {
025        try (StringReader stringReader = new StringReader(xmlString.replaceAll("<data key=\"d\\d+\"/>", ""))) {
026            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
027            DocumentBuilder builder = factory.newDocumentBuilder();
028            return builder.parse(new InputSource(stringReader));
029        } catch (Exception e) {
030            logger.error("parse xml string failed.", e);
031            return null;
032        }
033    }
034
035    public static boolean containsNode(Document document, String nodeName) {
036        if (document != null && nodeName != null) {
037            Element rootElement = document.getDocumentElement();
038            return containsNodeInElement(rootElement, nodeName);
039        }
040        return false;
041    }
042
043    private static boolean containsNodeInElement(Element element, String nodeName) {
044        if (element.getNodeName().equals(nodeName)) {
045            return true;
046        }
047
048        NodeList childNodes = element.getChildNodes();
049        for (int i = 0; i < childNodes.getLength(); i++) {
050            Node node = childNodes.item(i);
051            if (node.getNodeType() == Node.ELEMENT_NODE) {
052                if (containsNodeInElement((Element) node, nodeName)) {
053                    return true;
054                }
055            }
056        }
057        return false;
058    }
059
060    public static String documentToString(Document document) {
061        try (StringWriter writer = new StringWriter()) {
062            Transformer transformer = transformerFactory.newTransformer();
063            transformer.transform(new DOMSource(document), new StreamResult(writer));
064            return writer.toString();
065        } catch (Exception e) {
066            logger.error("convert document to xml string failed.", e);
067            return null;
068        }
069    }
070
071    public static boolean containsText(Document document, String searchText) {
072        if (document != null && searchText != null) {
073            String documentString = documentToString(document);
074            return documentString != null && documentString.contains(searchText);
075        }
076        return false;
077    }
078
079    public static String getFirstNodeLabelTextRecursive(Node node) {
080        if (node != null && node.getNodeType() == Node.ELEMENT_NODE) {
081            Element element = (Element) node;
082            NodeList nodeList = element.getElementsByTagName("NodeLabel");
083
084            if (nodeList.getLength() > 0) {
085                Node firstNodeLabel = nodeList.item(0);
086                return firstNodeLabel.getTextContent().trim();
087            }
088
089            NodeList childNodes = element.getChildNodes();
090            for (int i = 0; i < childNodes.getLength(); i++) {
091                String childNodeLabelText = getFirstNodeLabelTextRecursive(childNodes.item(i));
092                if (childNodeLabelText != null) {
093                    return childNodeLabelText;
094                }
095            }
096        }
097        return null;
098    }
099}