001package gudusoft.gsqlparser.dlineage.util;
002
003import java.util.ArrayList;
004import java.util.HashMap;
005import java.util.List;
006import java.util.Map;
007
008import gudusoft.gsqlparser.dlineage.dataflow.model.xml.column;
009import gudusoft.gsqlparser.dlineage.dataflow.model.xml.dataflow;
010import gudusoft.gsqlparser.dlineage.dataflow.model.xml.relationship;
011import gudusoft.gsqlparser.dlineage.dataflow.model.xml.sourceColumn;
012import gudusoft.gsqlparser.dlineage.dataflow.model.xml.table;
013import gudusoft.gsqlparser.util.json.JSON;
014
015public class XMLValidator {
016
017        public static boolean validate(String xml) {
018                boolean flag = true;
019
020                dataflow model = XML2Model.loadXML(dataflow.class, xml);
021
022                Map<String, Object> tableIdMap = new HashMap<String, Object>();
023                Map<String, Object> columnIdMap = new HashMap<String, Object>();
024
025                List<table> tables = new ArrayList<table>();
026
027                if (model.getTables() != null) {
028                        tables.addAll(model.getTables());
029                }
030                if (model.getViews() != null) {
031                        tables.addAll(model.getViews());
032                }
033
034                if (model.getResultsets() != null) {
035                        tables.addAll(model.getResultsets());
036                }
037
038                if (model.getStages() != null) {
039                        tables.addAll(model.getStages());
040                }
041
042                if (model.getSequences() != null) {
043                        tables.addAll(model.getSequences());
044                }
045
046                if (model.getDatasources() != null) {
047                        tables.addAll(model.getDatasources());
048                }
049
050                if (model.getVariables() != null) {
051                        tables.addAll(model.getVariables());
052                }
053
054                if (tables != null) {
055                        for (table tableItem : tables) {
056                                tableIdMap.put(tableItem.getId(), tableItem);
057                                if (tableItem.getColumns() != null) {
058                                        for (column columnItem : tableItem.getColumns()) {
059                                                columnIdMap.put(columnItem.getId(), columnItem);
060                                        }
061                                }
062                        }
063                }
064
065                if (model.getRelationships() != null) {
066                        for (relationship relationItem : model.getRelationships()) {
067                                if (relationItem.getTarget() != null) {
068                                        String targetId = relationItem.getTarget().getId();
069                                        if (!columnIdMap.containsKey(targetId)) {
070                                                System.err.println("relationship[id:" + relationItem.getId() + "] 's target[id:" + targetId
071                                                                + "] doesn't exist, targetColumn:" + JSON.toJSONString(relationItem.getTarget()));
072                                                flag = false;
073                                        }
074
075                                        String targetParentId = relationItem.getTarget().getParent_id();
076                                        if (!tableIdMap.containsKey(targetParentId)) {
077                                                System.err.println("relationship[id:" + relationItem.getId() + "] 's target parent[id:"
078                                                                + targetParentId + "] doesn't exist, targetColumn:"
079                                                                + JSON.toJSONString(relationItem.getTarget()));
080                                                flag = false;
081                                        }
082
083                                        if (relationItem.getSources() == null || relationItem.getSources().isEmpty()) {
084                                                System.err.println("relationship[id:" + relationItem.getId() + "] 's source is empty.");
085                                                flag = false;
086                                        } else {
087                                                for (sourceColumn sourceColumnItem : relationItem.getSources()) {
088                                                        if ("constant".equals(sourceColumnItem.getColumn_type())) {
089                                                                continue;
090                                                        }
091                                                        String sourceId = sourceColumnItem.getId();
092                                                        if (!columnIdMap.containsKey(sourceId)) {
093                                                                System.err.println("relationship[id:" + relationItem.getId() + "] 's source[id:" + sourceId
094                                                                                + "] doesn't exist, sourceColumn:" + JSON.toJSONString(sourceColumnItem));
095                                                                flag = false;
096                                                        }
097
098                                                        String sourceParentId = sourceColumnItem.getParent_id();
099                                                        if (sourceParentId != null && !tableIdMap.containsKey(sourceParentId)) {
100                                                                System.err.println("relationship[id:" + relationItem.getId() + "] 's source parent[id:"
101                                                                                + sourceParentId + "] doesn't exist, sourceColumn:"
102                                                                                + JSON.toJSONString(sourceColumnItem));
103                                                                flag = false;
104                                                        }
105                                                }
106                                        }
107                                }
108                        }
109                }
110
111                return flag;
112        }
113}