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;
}