public static PatternEvaluator build()

in common/src/main/java/org/apache/rocketmq/eventbridge/tools/pattern/PatternEvaluatorBuilder.java [44:140]


    public static PatternEvaluator build(String eventPattern) {
        PatternEvaluator patternEvaluator = new PatternEvaluator();
        if (JsonUtil.isEmptyJsonObject(eventPattern)) {
            return patternEvaluator;
        }
        final JsonElement rootElement;
        try {
            rootElement = jsonParser.parse(eventPattern);
        } catch (JsonSyntaxException e) {
            throw new InvalidEventPatternException(PatternErrorMessages.INVALID_JSON_STRING, e);
        }

        if (!rootElement.isJsonObject()) {
            throw new InvalidEventPatternException(PatternErrorMessages.NON_SUPPORTED_JSON);
        }

        JsonObject rootObj = rootElement.getAsJsonObject();
        JsonElement dataElement = null;

        for (final Map.Entry<String, JsonElement> elementEntry : rootObj.entrySet()) {
            String key = elementEntry.getKey();
            final JsonElement jsonElement = elementEntry.getValue();
            if (CLOUDEVENTS_DATA_KEY.equals(key)) {
                dataElement = jsonElement;
                continue;
            }

            if (!jsonElement.isJsonArray()) {
                throw new InvalidEventPatternException(
                    PatternErrorMessages.INVALID_PATTERN_VALUE + jsonElement.getAsString());
            }

            PatternEntry patternEntry = parsePatternEntry(key, "$." + key, jsonElement.getAsJsonArray());

            if (EventBridgeEvent.getAttributeKeys()
                .contains(key)) {
                // Add to spec attr rule entry list
                patternEvaluator.addSpecAttrPatternEntry(patternEntry);
                continue;
            }

            if (AppConfig.getGlobalConfig()
                .getEventExtensionKeys()
                .contains(key)) {
                patternEvaluator.addExtensionsAttrPatternEntry(patternEntry);
                continue;
            }

            // Unrecognized rule key
            throw new InvalidEventPatternException(PatternErrorMessages.UNRECOGNIZED_PATTERN_KEY + key);
        }

        if (dataElement != null) {
            if (!dataElement.isJsonObject()) {
                throw new InvalidEventPatternException(PatternErrorMessages.NO_DATA_PATTERN_KEY);
            }

            Deque<JsonObject> patternStack = new LinkedBlockingDeque<>();
            Deque<String> jsonPathStack = new LinkedBlockingDeque<>();

            patternStack.addFirst(dataElement.getAsJsonObject());
            jsonPathStack.push("$.");

            while (!patternStack.isEmpty()) {
                final JsonObject jsonObj = patternStack.pop();
                final String jsonPathPrefix = jsonPathStack.pop();
                final Set<Map.Entry<String, JsonElement>> entries = jsonObj.entrySet();
                for (final Map.Entry<String, JsonElement> elementEntry : entries) {
                    String key = elementEntry.getKey();
                    JsonElement element = elementEntry.getValue();

                    String jsonPath = jsonPathPrefix + key;

                    if (element.isJsonArray()) {
                        patternEvaluator.addDataPatternEntry(
                            parsePatternEntry(key, jsonPathPrefix + key, element.getAsJsonArray()));
                        continue;
                    }

                    if (element.isJsonObject()) {
                        patternStack.push(element.getAsJsonObject());
                        jsonPathStack.push(jsonPath + '.');
                        continue;
                    }

                    // Shouldn't be json null and json primitive
                    throw new InvalidEventPatternException(
                        PatternErrorMessages.INVALID_PATTERN_VALUE + element.getAsString());
                }

                if (entries.size() == 0) {
                    throw new InvalidEventPatternException(PatternErrorMessages.NO_DATA_PATTERN_KEY);
                }
            }
        }
        return patternEvaluator;
    }