001package gudusoft.gsqlparser.common.structured; 002 003import gudusoft.gsqlparser.common.structured.adapters.SparkFromJsonExplodeAdapter; 004import gudusoft.gsqlparser.nodes.TParseTreeNode; 005 006import java.util.ArrayList; 007import java.util.Collections; 008import java.util.List; 009 010/** 011 * Process-wide registry of structured-dataflow adapters. The default 012 * registry ships with the Spark {@code from_json}+{@code explode} adapter 013 * registered first. Tests may construct a registry with no adapters. 014 */ 015public final class StructuredDataflowRegistry { 016 017 private static final StructuredDataflowRegistry DEFAULT_INSTANCE = buildDefault(); 018 019 private final List<StructuredDataflowAdapter> adapters; 020 021 public StructuredDataflowRegistry(List<StructuredDataflowAdapter> adapters) { 022 if (adapters == null) { 023 throw new IllegalArgumentException("adapters must not be null"); 024 } 025 this.adapters = Collections.unmodifiableList(new ArrayList<>(adapters)); 026 } 027 028 public static StructuredDataflowRegistry defaultRegistry() { 029 return DEFAULT_INSTANCE; 030 } 031 032 public static StructuredDataflowRegistry empty() { 033 return new StructuredDataflowRegistry(Collections.<StructuredDataflowAdapter>emptyList()); 034 } 035 036 /** 037 * Try each registered adapter in order until one returns a non-null 038 * descriptor. Returns {@code null} if none matches. 039 */ 040 public StructuredDataflowDescriptor describe(TParseTreeNode node, StructuredAdapterContext context) { 041 if (node == null || context == null) return null; 042 for (StructuredDataflowAdapter a : adapters) { 043 try { 044 StructuredDataflowDescriptor d = a.describe(node, context); 045 if (d != null) return d; 046 } catch (RuntimeException ex) { 047 // Adapters must not throw out; treat as no match. 048 } 049 } 050 return null; 051 } 052 053 private static StructuredDataflowRegistry buildDefault() { 054 List<StructuredDataflowAdapter> list = new ArrayList<>(); 055 list.add(new SparkFromJsonExplodeAdapter()); 056 return new StructuredDataflowRegistry(list); 057 } 058}