diff --git a/src/main/java/io/mapsmessaging/selector/resolvers/JsonEvaluator.java b/src/main/java/io/mapsmessaging/selector/resolvers/JsonEvaluator.java index f36f34e..93f84cf 100644 --- a/src/main/java/io/mapsmessaging/selector/resolvers/JsonEvaluator.java +++ b/src/main/java/io/mapsmessaging/selector/resolvers/JsonEvaluator.java @@ -1,10 +1,111 @@ package io.mapsmessaging.selector.resolvers; +import io.mapsmessaging.selector.IdentifierMutator; +import org.json.JSONArray; import org.json.JSONObject; -public class JsonEvaluator extends MapEvaluator { +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; - public JsonEvaluator(JSONObject bean){ - super(bean.toMap()); +public class JsonEvaluator implements IdentifierMutator { + + private final JSONObject jsonObject; + + public JsonEvaluator(JSONObject jsonObject){ + this.jsonObject = jsonObject; + } + + + @Override + public Object get(String key) { + String[] keyPath = getKeyPath(key); + Object lookup = locateObject(jsonObject, keyPath); + return parseJSON(lookup); + } + + @Override + public Object remove(String key) { + return get(key); + } + + @Override + public Object set(String key, Object value) { + return false; } + + private String[] getKeyPath(String key){ + String[] keyPath; + if(key.contains(".")){ + var stringTokenizer = new StringTokenizer(key, "."); + List tmp = new ArrayList<>(); + while(stringTokenizer.hasMoreElements()){ + tmp.add(stringTokenizer.nextElement().toString()); + } + var tmpPath = new String[tmp.size()]; + keyPath = tmp.toArray(tmpPath); + } + else{ + keyPath = new String[1]; + keyPath[0] = key; + } + return keyPath; + } + + private static Object locateObject(JSONObject json, String[] searchPath){ + if(searchPath != null){ + // Walk the JSON path first + for(var x=0;x