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}