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}