[hotfix] Remove unused JsonUtils
diff --git a/flink-table/flink-table-runtime/src/main/java/org/apache/flink/table/runtime/functions/SqlFunctionUtils.java b/flink-table/flink-table-runtime/src/main/java/org/apache/flink/table/runtime/functions/SqlFunctionUtils.java
index 9425709..c9016eb 100644
--- a/flink-table/flink-table-runtime/src/main/java/org/apache/flink/table/runtime/functions/SqlFunctionUtils.java
+++ b/flink-table/flink-table-runtime/src/main/java/org/apache/flink/table/runtime/functions/SqlFunctionUtils.java
@@ -22,7 +22,6 @@
 import org.apache.flink.table.data.DecimalDataUtils;
 import org.apache.flink.table.data.binary.BinaryStringData;
 import org.apache.flink.table.data.binary.BinaryStringDataUtil;
-import org.apache.flink.table.runtime.util.JsonUtils;
 import org.apache.flink.table.utils.EncodingUtils;
 import org.apache.flink.table.utils.ThreadLocalCache;
 
@@ -739,11 +738,6 @@
         return ret;
     }
 
-    public static String jsonValue(String jsonString, String pathString) {
-        // TODO: refactor this to use jackson ?
-        return JsonUtils.getInstance().getJsonObject(jsonString, pathString);
-    }
-
     // SQL ROUND
     /** SQL <code>ROUND</code> operator applied to byte values. */
     public static byte sround(byte b0) {
diff --git a/flink-table/flink-table-runtime/src/main/java/org/apache/flink/table/runtime/util/JsonUtils.java b/flink-table/flink-table-runtime/src/main/java/org/apache/flink/table/runtime/util/JsonUtils.java
deleted file mode 100644
index 0580705..0000000
--- a/flink-table/flink-table-runtime/src/main/java/org/apache/flink/table/runtime/util/JsonUtils.java
+++ /dev/null
@@ -1,470 +0,0 @@
-/*
- * 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.flink.table.runtime.util;
-
-import org.apache.flink.shaded.guava30.com.google.common.collect.Iterators;
-import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.core.JsonFactory;
-import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.core.JsonParser;
-import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.databind.JavaType;
-import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.databind.type.TypeFactory;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/** Json scalar function util. */
-public class JsonUtils {
-    public static final Logger LOG = LoggerFactory.getLogger(JsonUtils.class);
-    public final Pattern patternKey = Pattern.compile("^([a-zA-Z0-9_\\-\\:\\s]+).*");
-    public final Pattern patternIndex = Pattern.compile("\\[([0-9]+|\\*)\\]");
-
-    public static final JsonFactory JSON_FACTORY = new JsonFactory();
-
-    static {
-        // Allows for unescaped ASCII control characters in JSON values
-        JSON_FACTORY.enable(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS);
-    }
-
-    public static final ObjectMapper MAPPER = new ObjectMapper(JSON_FACTORY);
-    public static final JavaType MAP_TYPE =
-            TypeFactory.defaultInstance().constructMapType(Map.class, Object.class, Object.class);
-    public static final JavaType LIST_TYPE =
-            TypeFactory.defaultInstance().constructRawCollectionType(List.class);
-
-    /** An LRU cache using a linked hash map. */
-    public static class HashCache<K, V> extends LinkedHashMap<K, V> {
-
-        private static final int CACHE_SIZE = 16;
-        private static final int INIT_SIZE = 32;
-        private static final float LOAD_FACTOR = 0.6f;
-
-        HashCache() {
-            super(INIT_SIZE, LOAD_FACTOR);
-        }
-
-        private static final long serialVersionUID = 1;
-
-        @Override
-        protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
-            return size() > CACHE_SIZE;
-        }
-    }
-
-    /** An ThreadLocal cache using a linked hash map. */
-    public static class ThreadLocalHashCache<K, V> {
-        private ThreadLocal<HashCache<K, V>> cache = new ThreadLocal<>();
-
-        public V get(K key) {
-            HashCache<K, V> m = cache.get();
-            if (m == null) {
-                m = new HashCache<>();
-                cache.set(m);
-            }
-            return m.get(key);
-        }
-
-        public V put(K key, V value) {
-            HashCache<K, V> m = cache.get();
-            if (m == null) {
-                m = new HashCache<>();
-                cache.set(m);
-            }
-            return m.put(key, value);
-        }
-
-        public void remove() {
-            cache.remove();
-        }
-    }
-
-    public static ThreadLocalHashCache<String, Object> extractObjectCache =
-            new ThreadLocalHashCache<String, Object>();
-    public static ThreadLocalHashCache<String, String[]> pathExprCache =
-            new ThreadLocalHashCache<String, String[]>();
-    public static ThreadLocalHashCache<String, ArrayList<String>> indexListCache =
-            new ThreadLocalHashCache<String, ArrayList<String>>();
-    public static ThreadLocalHashCache<String, String> mKeyGroup1Cache =
-            new ThreadLocalHashCache<String, String>();
-    public static ThreadLocalHashCache<String, Boolean> mKeyMatchesCache =
-            new ThreadLocalHashCache<String, Boolean>();
-
-    private static ThreadLocal<JsonUtils> instance = new ThreadLocal<JsonUtils>();
-
-    public static void remove() {
-        instance.remove();
-    }
-
-    public static JsonUtils getInstance() {
-        if (null == instance.get()) {
-            instance.set(new JsonUtils());
-        }
-        return instance.get();
-    }
-
-    public String getJsonObject(String jsonString, String pathString) {
-
-        if (jsonString == null
-                || jsonString.isEmpty()
-                || pathString == null
-                || pathString.isEmpty()
-                || pathString.charAt(0) != '$') {
-            LOG.error(
-                    "jsonString is null or empty, or path is null or empty, or path is not start with '$'! "
-                            + "jsonString: "
-                            + jsonString
-                            + ", path: "
-                            + pathString);
-            return null;
-        }
-
-        String result = new String();
-        int pathExprStart = 1;
-        boolean isRootArray = false;
-
-        if (pathString.length() > 1) {
-            if (pathString.charAt(1) == '[') {
-                pathExprStart = 0;
-                isRootArray = true;
-            } else if (pathString.charAt(1) == '.') {
-                isRootArray = pathString.length() > 2 && pathString.charAt(2) == '[';
-            } else {
-                LOG.error("path String illegal! path String: " + pathString);
-                return null;
-            }
-        }
-
-        // Cache pathExpr
-        String[] pathExpr = pathExprCache.get(pathString);
-        if (pathExpr == null) {
-            pathExpr = pathString.split("\\.", -1);
-            pathExprCache.put(pathString, pathExpr);
-        }
-
-        // Cache extractObject
-        Object extractObject = extractObjectCache.get(jsonString);
-        if (extractObject == null) {
-            JavaType javaType = isRootArray ? LIST_TYPE : MAP_TYPE;
-            try {
-                extractObject = MAPPER.readValue(jsonString, javaType);
-            } catch (Exception e) {
-                LOG.error(
-                        "Exception when read json value with type :"
-                                + javaType.toString()
-                                + ", and json string: "
-                                + jsonString,
-                        e);
-                return null;
-            }
-            extractObjectCache.put(jsonString, extractObject);
-        }
-        for (int i = pathExprStart; i < pathExpr.length; i++) {
-            if (extractObject == null) {
-                LOG.error(
-                        "path look up fail at: "
-                                + pathExpr[i - 1 >= 0 ? i - 1 : 0]
-                                + ", pathString: "
-                                + pathString
-                                + "json: "
-                                + jsonString);
-                return null;
-            }
-            extractObject = extract(extractObject, pathExpr[i], i == pathExprStart && isRootArray);
-        }
-        if (extractObject instanceof Map || extractObject instanceof List) {
-            try {
-                result = MAPPER.writeValueAsString(extractObject);
-            } catch (Exception e) {
-                LOG.error(
-                        "Exception when MAPPER.writeValueAsString :" + extractObject.toString(), e);
-                return null;
-            }
-        } else if (extractObject != null) {
-            result = extractObject.toString();
-        } else {
-            LOG.error(
-                    "path look up fail at: "
-                            + (pathExpr.length - 1 >= 0 ? pathExpr[pathExpr.length - 1] : null)
-                            + ", pathString: "
-                            + pathString
-                            + "json: "
-                            + jsonString);
-            return null;
-        }
-        return result;
-    }
-
-    public String[] getJsonObjectsWithoutDollar(String jsonString, String[] pathStrings) {
-        if (jsonString == null
-                || jsonString.isEmpty()
-                || pathStrings == null
-                || pathStrings.length == 0) {
-            LOG.error(
-                    "jsonString is null or empty, or path is null or empty! "
-                            + "jsonString: "
-                            + jsonString);
-            return new String[0];
-        }
-
-        int pathExprStart = 1;
-        boolean isRootArray = false;
-
-        Object rootExtractObject = extractObjectCache.get(jsonString);
-        if (rootExtractObject == null) {
-            JavaType javaType = isRootArray ? LIST_TYPE : MAP_TYPE;
-            try {
-                rootExtractObject = MAPPER.readValue(jsonString, javaType);
-            } catch (Exception e) {
-                LOG.error(
-                        "Exception when read json value with type :"
-                                + javaType.toString()
-                                + ", and json string: "
-                                + jsonString,
-                        e);
-                return new String[0];
-            }
-            extractObjectCache.put(jsonString, rootExtractObject);
-        }
-
-        String[] result = new String[pathStrings.length];
-        for (int i = 0; i < pathStrings.length; i++) {
-            String pathString = "$." + pathStrings[i];
-            if (pathString == null || pathString.length() == 0) {
-                result[i] = null;
-                LOG.error(i + "th path String is null or empty! " + "pathString: " + pathString);
-                continue;
-            }
-            if (pathString.length() > 1) {
-                if (pathString.charAt(1) == '[') {
-                    pathExprStart = 0;
-                    isRootArray = true;
-                } else if (pathString.charAt(1) == '.') {
-                    isRootArray = pathString.length() > 2 && pathString.charAt(2) == '[';
-                } else {
-                    result[i] = null;
-                    LOG.error(i + "th path String illegal! path String: " + pathString);
-                    continue;
-                }
-            }
-
-            // Cache pathExpr
-            String[] pathExpr = pathExprCache.get(pathString);
-            if (pathExpr == null) {
-                pathExpr = pathString.split("\\.", -1);
-                pathExprCache.put(pathString, pathExpr);
-            }
-
-            // Cache extractObject
-            Object extractObject = rootExtractObject;
-            if (extractObject == null) {
-                JavaType javaType = isRootArray ? LIST_TYPE : MAP_TYPE;
-                try {
-                    extractObject = MAPPER.readValue(jsonString, javaType);
-                } catch (Exception e) {
-                    LOG.error(
-                            "Exception when read json value with type :"
-                                    + javaType.toString()
-                                    + ", and json string: "
-                                    + jsonString,
-                            e);
-                    result[i] = null;
-                    continue;
-                }
-                extractObjectCache.put(jsonString, extractObject);
-            }
-            for (int j = pathExprStart; j < pathExpr.length; j++) {
-                if (extractObject == null) {
-                    result[i] = null;
-                    LOG.error(
-                            i
-                                    + "th path look up fail at: "
-                                    + pathExpr[j - 1 >= 0 ? j - 1 : 0]
-                                    + ", pathString: "
-                                    + pathString
-                                    + "json: "
-                                    + jsonString);
-                    continue;
-                }
-                extractObject =
-                        extract(extractObject, pathExpr[j], j == pathExprStart && isRootArray);
-            }
-            if (extractObject instanceof Map || extractObject instanceof List) {
-                try {
-                    result[i] = MAPPER.writeValueAsString(extractObject);
-                } catch (Exception e) {
-                    LOG.error(
-                            "Exception when MAPPER.writeValueAsString :" + extractObject.toString(),
-                            e);
-                    result[i] = null;
-                    continue;
-                }
-            } else if (extractObject != null) {
-                result[i] = extractObject.toString();
-            } else {
-                result[i] = null;
-                LOG.error(
-                        i
-                                + "th path look up fail at: "
-                                + (pathExpr.length - 1 >= 0 ? pathExpr[pathExpr.length - 1] : null)
-                                + ", pathString: "
-                                + pathString
-                                + "json: "
-                                + jsonString);
-                continue;
-            }
-        }
-        return result;
-    }
-
-    protected Object extract(Object json, String path, boolean skipMapProc) {
-        // skip MAP processing for the first path element if root is array
-        if (!skipMapProc) {
-            // Cache patternkey.matcher(path).matches()
-            Matcher mKey = null;
-            Boolean mKeyMatches = mKeyMatchesCache.get(path);
-            if (mKeyMatches == null) {
-                mKey = patternKey.matcher(path);
-                mKeyMatches = mKey.matches() ? Boolean.TRUE : Boolean.FALSE;
-                mKeyMatchesCache.put(path, mKeyMatches);
-            }
-            if (!mKeyMatches.booleanValue()) {
-                return null;
-            }
-
-            // Cache mkey.group(1)
-            String mKeyGroup1 = mKeyGroup1Cache.get(path);
-            if (mKeyGroup1 == null) {
-                if (mKey == null) {
-                    mKey = patternKey.matcher(path);
-                    mKeyMatches = mKey.matches() ? Boolean.TRUE : Boolean.FALSE;
-                    mKeyMatchesCache.put(path, mKeyMatches);
-                    if (!mKeyMatches.booleanValue()) {
-                        return null;
-                    }
-                }
-                mKeyGroup1 = mKey.group(1);
-                mKeyGroup1Cache.put(path, mKeyGroup1);
-            }
-            json = extractJsonWithkey(json, mKeyGroup1);
-        }
-        // Cache indexList
-        ArrayList<String> indexList = indexListCache.get(path);
-        if (indexList == null) {
-            Matcher mIndex = patternIndex.matcher(path);
-            indexList = new ArrayList<String>();
-            while (mIndex.find()) {
-                indexList.add(mIndex.group(1));
-            }
-            indexListCache.put(path, indexList);
-        }
-
-        if (indexList.size() > 0) {
-            json = extractJsonWithIndex(json, indexList);
-        }
-
-        return json;
-    }
-
-    private AddingList jsonList = new AddingList();
-
-    private static class AddingList extends ArrayList<Object> {
-        @Override
-        public java.util.Iterator<Object> iterator() {
-            return Iterators.forArray(toArray());
-        }
-
-        @Override
-        public void removeRange(int fromIndex, int toIndex) {
-            super.removeRange(fromIndex, toIndex);
-        }
-    }
-
-    protected Object extractJsonWithIndex(Object json, ArrayList<String> indexList) {
-
-        jsonList.clear();
-        jsonList.add(json);
-        AddingList tempJsonList = new AddingList();
-        for (String index : indexList) {
-            int targets = jsonList.size();
-            if (index.equalsIgnoreCase("*")) {
-                for (Object array : jsonList) {
-                    if (array instanceof List) {
-                        for (int j = 0; j < ((List<Object>) array).size(); j++) {
-                            jsonList.add(((List<Object>) array).get(j));
-                        }
-                    }
-                }
-            } else {
-                for (Object array : jsonList) {
-                    int indexValue = Integer.parseInt(index);
-                    if (!(array instanceof List)) {
-                        continue;
-                    }
-                    List<Object> list = (List<Object>) array;
-                    if (indexValue >= list.size()) {
-                        continue;
-                    }
-                    tempJsonList.add(list.get(indexValue));
-                }
-                jsonList.addAll(tempJsonList);
-            }
-            if (jsonList.size() == targets) {
-                return null;
-            }
-            jsonList.removeRange(0, targets);
-        }
-        if (jsonList.isEmpty()) {
-            return null;
-        }
-        return (jsonList.size() > 1) ? new ArrayList<Object>(jsonList) : jsonList.get(0);
-    }
-
-    protected Object extractJsonWithkey(Object json, String path) {
-        if (json instanceof List) {
-            List<Object> jsonArray = new ArrayList<Object>();
-            for (int i = 0; i < ((List<Object>) json).size(); i++) {
-                Object jsonElem = ((List<Object>) json).get(i);
-                Object jsonObj = null;
-                if (jsonElem instanceof Map) {
-                    jsonObj = ((Map<String, Object>) jsonElem).get(path);
-                } else {
-                    continue;
-                }
-                if (jsonObj instanceof List) {
-                    for (int j = 0; j < ((List<Object>) jsonObj).size(); j++) {
-                        jsonArray.add(((List<Object>) jsonObj).get(j));
-                    }
-                } else if (jsonObj != null) {
-                    jsonArray.add(jsonObj);
-                }
-            }
-            return (jsonArray.size() == 0) ? null : jsonArray;
-        } else if (json instanceof Map) {
-            return ((Map<String, Object>) json).get(path);
-        } else {
-            return null;
-        }
-    }
-}