diff --git a/eventmesh-filter/build.gradle b/eventmesh-function/build.gradle
similarity index 92%
rename from eventmesh-filter/build.gradle
rename to eventmesh-function/build.gradle
index ba88591b41..2944f98194 100644
--- a/eventmesh-filter/build.gradle
+++ b/eventmesh-function/build.gradle
@@ -14,8 +14,3 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-
-dependencies {
- implementation project(":eventmesh-common")
-}
diff --git a/eventmesh-transformer/build.gradle b/eventmesh-function/eventmesh-function-api/build.gradle
similarity index 92%
rename from eventmesh-transformer/build.gradle
rename to eventmesh-function/eventmesh-function-api/build.gradle
index ba88591b41..2944f98194 100644
--- a/eventmesh-transformer/build.gradle
+++ b/eventmesh-function/eventmesh-function-api/build.gradle
@@ -14,8 +14,3 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-
-dependencies {
- implementation project(":eventmesh-common")
-}
diff --git a/eventmesh-function/eventmesh-function-api/src/main/java/org/apache/eventmesh/function/api/AbstractEventMeshFunctionChain.java b/eventmesh-function/eventmesh-function-api/src/main/java/org/apache/eventmesh/function/api/AbstractEventMeshFunctionChain.java
new file mode 100644
index 0000000000..8cbb0f9381
--- /dev/null
+++ b/eventmesh-function/eventmesh-function-api/src/main/java/org/apache/eventmesh/function/api/AbstractEventMeshFunctionChain.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.function.api;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * AbstractEventMeshFunctionChain is an abstract class that implements the {@link EventMeshFunction} interface and provides a framework
+ * for chaining multiple {@link EventMeshFunction} instances that operate on inputs of type {@code T} and produce outputs of type
+ * {@code R}. This class can be extended to create specific function chains with customized behavior for different
+ * data types.
+ *
+ *
The primary purpose of this class is to allow the sequential execution of functions, where the output of one
+ * function is passed as the input to the next function in the chain. The chain can be dynamically modified by adding
+ * functions either at the beginning or the end of the chain.
+ *
+ * @param the type of the input to the function
+ * @param the type of the result of the function
+ */
+public abstract class AbstractEventMeshFunctionChain implements EventMeshFunction {
+
+ protected final List> functions;
+
+ /**
+ * Default constructor that initializes an empty function chain.
+ */
+ public AbstractEventMeshFunctionChain() {
+ this.functions = new ArrayList<>();
+ }
+
+ /**
+ * Constructor that initializes the function chain with a given list of functions. The functions will be executed
+ * in the order they are provided when the {@link #apply(Object)} method is called.
+ *
+ * @param functions the initial list of functions to be added to the chain
+ */
+ public AbstractEventMeshFunctionChain(List> functions) {
+ this.functions = functions;
+ }
+
+ /**
+ * Adds a {@link EventMeshFunction} to the beginning of the chain. The function will be executed first when the
+ * {@link #apply(Object)} method is called.
+ *
+ * @param function the function to be added to the beginning of the chain
+ */
+ public void addFirst(EventMeshFunction function) {
+ this.functions.add(0, function);
+ }
+
+ /**
+ * Adds a {@link EventMeshFunction} to the end of the chain. The function will be executed in sequence after all previously
+ * added functions when the {@link #apply(Object)} method is called.
+ *
+ * @param function the function to be added to the end of the chain
+ */
+ public void addLast(EventMeshFunction function) {
+ this.functions.add(function);
+ }
+}
\ No newline at end of file
diff --git a/eventmesh-function/eventmesh-function-api/src/main/java/org/apache/eventmesh/function/api/EventMeshFunction.java b/eventmesh-function/eventmesh-function-api/src/main/java/org/apache/eventmesh/function/api/EventMeshFunction.java
new file mode 100644
index 0000000000..973f097ae0
--- /dev/null
+++ b/eventmesh-function/eventmesh-function-api/src/main/java/org/apache/eventmesh/function/api/EventMeshFunction.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.function.api;
+
+/**
+ * EventMesh Interface for a function that accepts one argument and produces a result. This is a functional interface whose functional method is
+ * {@link #apply(Object)}.
+ *
+ * This interface is similar to {@link java.util.function.Function},
+ * but it is specifically designed for use within the EventMesh. It allows defining custom functions to process data or events in the EventMesh. The
+ * main use case is to encapsulate operations that can be passed around and applied to data or event messages in the EventMesh processing
+ * pipeline.
+ *
+ * @param the type of the input to the function
+ * @param the type of the result of the function
+ */
+public interface EventMeshFunction {
+
+ /**
+ * Applies this function to the given argument within the context of the EventMesh module. This method encapsulates the logic for processing the
+ * input data and producing a result, which can be used in the EventMesh event processing pipeline.
+ *
+ * @param t the function argument, representing the input data or event to be processed
+ * @return the function result, representing the processed output
+ */
+ R apply(T t);
+
+}
\ No newline at end of file
diff --git a/eventmesh-function/eventmesh-function-filter/build.gradle b/eventmesh-function/eventmesh-function-filter/build.gradle
new file mode 100644
index 0000000000..21e28d7baf
--- /dev/null
+++ b/eventmesh-function/eventmesh-function-filter/build.gradle
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+dependencies {
+ implementation project(":eventmesh-common")
+ implementation project(":eventmesh-function:eventmesh-function-api")
+}
\ No newline at end of file
diff --git a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/PatternEntry.java b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/PatternEntry.java
similarity index 94%
rename from eventmesh-filter/src/main/java/org/apache/eventmesh/filter/PatternEntry.java
rename to eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/PatternEntry.java
index 5a2493a371..acc2d5f073 100644
--- a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/PatternEntry.java
+++ b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/PatternEntry.java
@@ -15,9 +15,9 @@
* limitations under the License.
*/
-package org.apache.eventmesh.filter;
+package org.apache.eventmesh.function.filter;
-import org.apache.eventmesh.filter.condition.Condition;
+import org.apache.eventmesh.function.filter.condition.Condition;
import java.util.ArrayList;
import java.util.List;
diff --git a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/AnythingButCondition.java b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/AnythingButCondition.java
similarity index 97%
rename from eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/AnythingButCondition.java
rename to eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/AnythingButCondition.java
index 2d58136a70..d4f209225e 100644
--- a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/AnythingButCondition.java
+++ b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/AnythingButCondition.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.eventmesh.filter.condition;
+package org.apache.eventmesh.function.filter.condition;
import java.util.ArrayList;
import java.util.Iterator;
diff --git a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/Condition.java b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/Condition.java
similarity index 94%
rename from eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/Condition.java
rename to eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/Condition.java
index fbb4276c7b..9890d5e0d3 100644
--- a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/Condition.java
+++ b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/Condition.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.eventmesh.filter.condition;
+package org.apache.eventmesh.function.filter.condition;
import com.fasterxml.jackson.databind.JsonNode;
diff --git a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/ConditionsBuilder.java b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/ConditionsBuilder.java
similarity index 97%
rename from eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/ConditionsBuilder.java
rename to eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/ConditionsBuilder.java
index 4e207663aa..961be85e5b 100644
--- a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/ConditionsBuilder.java
+++ b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/ConditionsBuilder.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.eventmesh.filter.condition;
+package org.apache.eventmesh.function.filter.condition;
import com.fasterxml.jackson.databind.JsonNode;
diff --git a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/ExistsCondition.java b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/ExistsCondition.java
similarity index 95%
rename from eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/ExistsCondition.java
rename to eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/ExistsCondition.java
index 53c15bb297..c085ba6585 100644
--- a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/ExistsCondition.java
+++ b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/ExistsCondition.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.eventmesh.filter.condition;
+package org.apache.eventmesh.function.filter.condition;
import com.fasterxml.jackson.databind.JsonNode;
diff --git a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/NumericCondition.java b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/NumericCondition.java
similarity index 97%
rename from eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/NumericCondition.java
rename to eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/NumericCondition.java
index 5eb5374c7c..40eb16a75e 100644
--- a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/NumericCondition.java
+++ b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/NumericCondition.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.eventmesh.filter.condition;
+package org.apache.eventmesh.function.filter.condition;
import java.util.ArrayList;
import java.util.List;
diff --git a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/PrefixCondition.java b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/PrefixCondition.java
similarity index 95%
rename from eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/PrefixCondition.java
rename to eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/PrefixCondition.java
index 633ed1fb02..ff5d0313ce 100644
--- a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/PrefixCondition.java
+++ b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/PrefixCondition.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.eventmesh.filter.condition;
+package org.apache.eventmesh.function.filter.condition;
import com.fasterxml.jackson.databind.JsonNode;
diff --git a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/SpecifiedCondition.java b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/SpecifiedCondition.java
similarity index 95%
rename from eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/SpecifiedCondition.java
rename to eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/SpecifiedCondition.java
index f9cc3fb5db..9eefb6b641 100644
--- a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/SpecifiedCondition.java
+++ b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/SpecifiedCondition.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.eventmesh.filter.condition;
+package org.apache.eventmesh.function.filter.condition;
import com.fasterxml.jackson.databind.JsonNode;
diff --git a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/SuffixCondition.java b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/SuffixCondition.java
similarity index 95%
rename from eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/SuffixCondition.java
rename to eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/SuffixCondition.java
index 805df0ee17..090df24834 100644
--- a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/condition/SuffixCondition.java
+++ b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/condition/SuffixCondition.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.eventmesh.filter.condition;
+package org.apache.eventmesh.function.filter.condition;
import com.fasterxml.jackson.databind.JsonNode;
diff --git a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/pattern/Pattern.java b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/pattern/Pattern.java
similarity index 75%
rename from eventmesh-filter/src/main/java/org/apache/eventmesh/filter/pattern/Pattern.java
rename to eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/pattern/Pattern.java
index 8abb306b84..955d9f59ef 100644
--- a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/pattern/Pattern.java
+++ b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/pattern/Pattern.java
@@ -15,10 +15,11 @@
* limitations under the License.
*/
-package org.apache.eventmesh.filter.pattern;
+package org.apache.eventmesh.function.filter.pattern;
import org.apache.eventmesh.common.utils.JsonPathUtils;
-import org.apache.eventmesh.filter.PatternEntry;
+import org.apache.eventmesh.function.api.EventMeshFunction;
+import org.apache.eventmesh.function.filter.PatternEntry;
import org.apache.commons.lang3.StringUtils;
@@ -29,12 +30,11 @@
import com.fasterxml.jackson.databind.JsonNode;
import com.jayway.jsonpath.PathNotFoundException;
-public class Pattern {
- private List requiredFieldList = new ArrayList<>();
- private List dataList = new ArrayList<>();
+public class Pattern implements EventMeshFunction {
- private String content;
+ private final List requiredFieldList = new ArrayList<>();
+ private final List dataList = new ArrayList<>();
public void addRequiredFieldList(PatternEntry patternEntry) {
this.requiredFieldList.add(patternEntry);
@@ -45,19 +45,22 @@ public void addDataList(PatternEntry patternEntry) {
}
public boolean filter(String content) {
- this.content = content;
- // this.jsonNode = JacksonUtils.STRING_TO_JSONNODE(content);
+ return matchRequiredFieldList(content, requiredFieldList) && matchRequiredFieldList(content, dataList);
+ }
- return matchRequiredFieldList(requiredFieldList) && matchRequiredFieldList(dataList);
+ @Override
+ public String apply(String content) {
+ // filter content
+ return filter(content) ? content : null;
}
- private boolean matchRequiredFieldList(List dataList) {
+ private boolean matchRequiredFieldList(String content, List dataList) {
for (final PatternEntry patternEntry : dataList) {
JsonNode jsonElement = null;
try {
// content:filter
- String matchRes = JsonPathUtils.matchJsonPathValue(this.content, patternEntry.getPatternPath());
+ String matchRes = JsonPathUtils.matchJsonPathValue(content, patternEntry.getPatternPath());
if (StringUtils.isNoneBlank(matchRes)) {
jsonElement = JsonPathUtils.parseStrict(matchRes);
diff --git a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/patternbuild/PatternBuilder.java b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/patternbuild/PatternBuilder.java
similarity index 85%
rename from eventmesh-filter/src/main/java/org/apache/eventmesh/filter/patternbuild/PatternBuilder.java
rename to eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/patternbuild/PatternBuilder.java
index 5f9a71d262..60193a4efa 100644
--- a/eventmesh-filter/src/main/java/org/apache/eventmesh/filter/patternbuild/PatternBuilder.java
+++ b/eventmesh-function/eventmesh-function-filter/src/main/java/org/apache/eventmesh/function/filter/patternbuild/PatternBuilder.java
@@ -15,13 +15,13 @@
* limitations under the License.
*/
-package org.apache.eventmesh.filter.patternbuild;
+package org.apache.eventmesh.function.filter.patternbuild;
import org.apache.eventmesh.common.exception.JsonException;
-import org.apache.eventmesh.filter.PatternEntry;
-import org.apache.eventmesh.filter.condition.Condition;
-import org.apache.eventmesh.filter.condition.ConditionsBuilder;
-import org.apache.eventmesh.filter.pattern.Pattern;
+import org.apache.eventmesh.function.filter.PatternEntry;
+import org.apache.eventmesh.function.filter.condition.Condition;
+import org.apache.eventmesh.function.filter.condition.ConditionsBuilder;
+import org.apache.eventmesh.function.filter.pattern.Pattern;
import java.util.ArrayDeque;
import java.util.Iterator;
@@ -38,19 +38,33 @@ public class PatternBuilder {
private static final ObjectMapper mapper = new ObjectMapper();
- public static Pattern build(String jsonStr) {
- Pattern pattern = new Pattern();
- JsonNode jsonNode = null;
+ public static Pattern build(String jsonStr) {
try {
- jsonNode = mapper.readTree(jsonStr);
+ JsonNode jsonNode = mapper.readTree(jsonStr);
+ if (jsonNode.isEmpty() || !jsonNode.isObject()) {
+ return null;
+ }
+ return build(jsonNode);
} catch (Exception e) {
throw new JsonException("INVALID_JSON_STRING", e);
}
+ }
- if (jsonNode.isEmpty() || !jsonNode.isObject()) {
- return null;
+ public static Pattern build(Map conditionMap) {
+ try {
+ JsonNode jsonNode = mapper.valueToTree(conditionMap);
+ if (jsonNode.isEmpty() || !jsonNode.isObject()) {
+ return null;
+ }
+ return build(jsonNode);
+ } catch (Exception e) {
+ throw new JsonException("INVALID_MAP", e);
}
+ }
+
+ public static Pattern build(JsonNode jsonNode) {
+ Pattern pattern = new Pattern();
// iter all json data
Iterator> iterator = jsonNode.fields();
diff --git a/eventmesh-filter/src/test/java/org/apache/eventmesh/filter/PatternTest.java b/eventmesh-function/eventmesh-function-filter/src/test/java/org/apache/eventmesh/function/filter/PatternTest.java
similarity index 82%
rename from eventmesh-filter/src/test/java/org/apache/eventmesh/filter/PatternTest.java
rename to eventmesh-function/eventmesh-function-filter/src/test/java/org/apache/eventmesh/function/filter/PatternTest.java
index 207992b0c1..bc0aeff4ea 100644
--- a/eventmesh-filter/src/test/java/org/apache/eventmesh/filter/PatternTest.java
+++ b/eventmesh-function/eventmesh-function-filter/src/test/java/org/apache/eventmesh/function/filter/PatternTest.java
@@ -15,10 +15,15 @@
* limitations under the License.
*/
-package org.apache.eventmesh.filter;
+package org.apache.eventmesh.function.filter;
-import org.apache.eventmesh.filter.pattern.Pattern;
-import org.apache.eventmesh.filter.patternbuild.PatternBuilder;
+import org.apache.eventmesh.function.filter.pattern.Pattern;
+import org.apache.eventmesh.function.filter.patternbuild.PatternBuilder;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@@ -144,4 +149,20 @@ public void testAnythingButFilter() {
Assertions.assertEquals(false, res);
}
+ @Test
+ public void testPrefixFilterMap() {
+ // Create the inner Map representing {prefix=eventmesh.}
+ Map innerMap = new HashMap<>();
+ innerMap.put("prefix", "eventmesh.");
+ // Create a List representing [{prefix=eventmesh.}]
+ List