001package gudusoft.gsqlparser.catalog.input; 002 003import gudusoft.gsqlparser.catalog.diagnostic.CatalogDiagnostic; 004import gudusoft.gsqlparser.catalog.diagnostic.CatalogDiagnosticSeverity; 005 006import java.util.ArrayList; 007import java.util.Collections; 008import java.util.List; 009import java.util.Objects; 010 011/** 012 * Outcome of {@link CatalogModelValidator#validate}: pass/fail plus collected diagnostics. 013 * 014 * <p>Plan ยง7.1. {@link #ok()} returns {@code true} when no {@link CatalogDiagnosticSeverity#ERROR} 015 * diagnostics were emitted; WARN/INFO diagnostics do not fail validation.</p> 016 */ 017public final class CatalogValidationResult { 018 019 private static final CatalogValidationResult EMPTY_OK = 020 new CatalogValidationResult(Collections.<CatalogDiagnostic>emptyList()); 021 022 private final List<CatalogDiagnostic> diagnostics; 023 private final boolean ok; 024 025 private CatalogValidationResult(List<CatalogDiagnostic> diagnostics) { 026 this.diagnostics = Collections.unmodifiableList(new ArrayList<CatalogDiagnostic>(diagnostics)); 027 boolean anyError = false; 028 for (CatalogDiagnostic d : this.diagnostics) { 029 if (d.severity() == CatalogDiagnosticSeverity.ERROR) { 030 anyError = true; 031 break; 032 } 033 } 034 this.ok = !anyError; 035 } 036 037 public static CatalogValidationResult of(List<CatalogDiagnostic> diagnostics) { 038 if (diagnostics == null || diagnostics.isEmpty()) { 039 return EMPTY_OK; 040 } 041 return new CatalogValidationResult(diagnostics); 042 } 043 044 public static CatalogValidationResult empty() { 045 return EMPTY_OK; 046 } 047 048 public boolean ok() { 049 return ok; 050 } 051 052 public List<CatalogDiagnostic> diagnostics() { 053 return diagnostics; 054 } 055 056 @Override 057 public boolean equals(Object o) { 058 if (this == o) return true; 059 if (!(o instanceof CatalogValidationResult)) return false; 060 CatalogValidationResult that = (CatalogValidationResult) o; 061 return ok == that.ok && diagnostics.equals(that.diagnostics); 062 } 063 064 @Override 065 public int hashCode() { 066 return Objects.hash(ok, diagnostics); 067 } 068 069 @Override 070 public String toString() { 071 return "CatalogValidationResult{ok=" + ok + ", diagnostics=" + diagnostics.size() + '}'; 072 } 073}