JsonPathExpressionEngine.java
- /*
- * GovWay - A customizable API Gateway
- * https://govway.org
- *
- * Copyright (c) 2005-2025 Link.it srl (https://link.it).
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3, as published by
- * the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
- package org.openspcoop2.utils.json;
- import java.io.InputStream;
- import java.io.UnsupportedEncodingException;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Map;
- import org.openspcoop2.utils.UtilsException;
- import org.slf4j.Logger;
- import com.fasterxml.jackson.databind.JsonNode;
- import com.fasterxml.jackson.databind.node.TextNode;
- import com.jayway.jsonpath.JsonPath;
- import com.jayway.jsonpath.spi.cache.CacheProvider;
- import com.jayway.jsonpath.spi.cache.NOOPCache;
- import net.minidev.json.JSONArray;
- import net.minidev.json.JSONObject;
- import net.minidev.json.parser.JSONParser;
- import net.minidev.json.parser.ParseException;
- /**
- * PathExpressionEngine
- *
- * @author Poli Andrea (apoli@link.it)
- * @author $Author$
- * @version $Rev$, $Date$
- */
- public class JsonPathExpressionEngine {
- public static void disableCacheJsonPathEngine() {
- CacheProvider.setCache(new NOOPCache());
- }
-
- public static String getAsString(JsonNode element) {
- try{
- return getJsonUtils().toString(element);
- }catch(Exception e){
- return null;
- }
- }
- private static JSONUtils jsonUtils;
- public static synchronized void initJsonUtils() throws UtilsException {
- if(jsonUtils == null) {
- jsonUtils = JSONUtils.getInstance();
- }
- }
- public static JSONUtils getJsonUtils() throws UtilsException {
- if(jsonUtils == null) {
- initJsonUtils();
- }
- return jsonUtils;
- }
-
-
- public static JSONObject getJSONObject(InputStream is) throws JsonPathException {
- if(is == null)
- throw new JsonPathException("Document (InputStream) is null");
- try {
- return getJSONParser().parse(is, JSONObject.class);
- } catch (UnsupportedEncodingException e) {
- throw new JsonPathException(e.getMessage(), e);
- } catch (ParseException e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- }
- public static JSONArray getJSONArray(InputStream is) throws JsonPathException {
- if(is == null)
- throw new JsonPathException("Document (InputStream) is null");
- try {
- return getJSONParser().parse(is, JSONArray.class);
- } catch (UnsupportedEncodingException e) {
- throw new JsonPathException(e.getMessage(), e);
- } catch (ParseException e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- }
- public static JSONObject getJSONObject(String contenuto) throws JsonPathException {
- if(contenuto == null)
- throw new JsonPathException("Document (String) is null");
- try {
- return getJSONParser().parse(contenuto, JSONObject.class);
- } catch (ParseException e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- }
- public static JSONArray getJSONArray(String contenuto) throws JsonPathException {
- if(contenuto == null)
- throw new JsonPathException("Document (String) is null");
- try {
- return getJSONParser().parse(contenuto, JSONArray.class);
- } catch (ParseException e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- }
- public static JSONObject getJSONObject(JsonNode document) throws JsonPathException {
- if(document == null)
- throw new JsonPathException("Document (JsonNode) is null");
- try {
- return getJSONParser().parse(getAsString(document), JSONObject.class);
- } catch (ParseException e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- }
- public static JSONArray getJSONArray(JsonNode document) throws JsonPathException {
- if(document == null)
- throw new JsonPathException("Document (JsonNode) is null");
- try {
- return getJSONParser().parse(getAsString(document), JSONArray.class);
- } catch (ParseException e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- }
- // Bug: JSONParser is not thread safe!
- // private static JSONParser jsonParser;
- // public static synchronized void initJSONParser() {
- // if(jsonParser == null) {
- // jsonParser = new JSONParser(JSONParser.MODE_PERMISSIVE);
- // }
- // }
- public static JSONParser getJSONParser() {
- // if(jsonParser == null) {
- // initJSONParser();
- // }
- // return jsonParser;
- return new JSONParser(JSONParser.MODE_PERMISSIVE);
- }
- /* ---------- METODI RITORNANO STRINGHE -------------- */
-
- public List<String> getStringMatchPattern(JSONObject input, String pattern) throws JsonPathException, JsonPathNotFoundException, JsonPathNotValidException {
- if(input == null)
- throw new JsonPathException("Document (JSONObject) is null");
- if(pattern == null)
- throw new JsonPathException("Pattern is null");
- this.validate(pattern);
-
- try {
- List<String> l = new ArrayList<>();
- Object o = JsonPath.read(input, pattern);
- _parseStringMatchPatternResult(o, l);
- if(l==null || l.size()<=0) {
- throw new com.jayway.jsonpath.PathNotFoundException("Nessun match trovato per l'espressione jsonPath ["+pattern+"]");
- }
- return l;
- }catch(com.jayway.jsonpath.PathNotFoundException notFound) {
- throw new JsonPathNotFoundException(notFound.getMessage(),notFound);
- } catch(Exception e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- }
- public List<String> getStringMatchPattern(JsonNode document, String pattern) throws JsonPathException, JsonPathNotFoundException, JsonPathNotValidException {
-
- if(document == null)
- throw new JsonPathException("Document (JsonNode) is null");
- if(pattern == null)
- throw new JsonPathException("Pattern is null");
- this.validate(pattern);
-
- try {
- List<String> l = new ArrayList<>();
- Object o = JsonPath.read(getAsString(document), pattern);
- _parseStringMatchPatternResult(o, l);
- if(l==null || l.size()<=0) {
- throw new com.jayway.jsonpath.PathNotFoundException("Nessun match trovato per l'espressione jsonPath ["+pattern+"]");
- }
- return l;
- }catch(com.jayway.jsonpath.PathNotFoundException notFound) {
- throw new JsonPathNotFoundException(notFound.getMessage(),notFound);
- } catch(Exception e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- }
-
- public List<String> getStringMatchPattern(InputStream is, String pattern) throws JsonPathException, JsonPathNotFoundException, JsonPathNotValidException {
- if(is == null)
- throw new JsonPathException("Document (InputStream) is null");
- if(pattern == null)
- throw new JsonPathException("Pattern is null");
- this.validate(pattern);
-
- try {
- List<String> l = new ArrayList<>();
- Object o = JsonPath.read(is, pattern);
- _parseStringMatchPatternResult(o, l);
- if(l==null || l.size()<=0) {
- throw new com.jayway.jsonpath.PathNotFoundException("Nessun match trovato per l'espressione jsonPath ["+pattern+"]");
- }
- return l;
- }catch(com.jayway.jsonpath.PathNotFoundException notFound) {
- throw new JsonPathNotFoundException(notFound.getMessage(),notFound);
- } catch(Exception e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- }
-
- public List<String> getStringMatchPattern(String contenuto, String pattern) throws JsonPathException, JsonPathNotFoundException, JsonPathNotValidException {
- if(contenuto == null)
- throw new JsonPathException("Document (String) is null");
- if(pattern == null)
- throw new JsonPathException("Pattern is null");
- this.validate(pattern);
-
- try {
- List<String> l = new ArrayList<>();
- Object o = JsonPath.read(contenuto, pattern);
- _parseStringMatchPatternResult(o, l);
- if(l==null || l.size()<=0) {
- throw new com.jayway.jsonpath.PathNotFoundException("Nessun match trovato per l'espressione jsonPath ["+pattern+"]");
- }
- return l;
- }catch(com.jayway.jsonpath.PathNotFoundException notFound) {
- throw new JsonPathNotFoundException(notFound.getMessage(),notFound);
- } catch(Exception e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- }
- private void _parseStringMatchPatternResult(Object o, List<String> l) throws Exception {
- if(o!=null) {
- if(o instanceof Map<?, ?>) {
- // Lasciare questo if per formattare correttamente i nomi degli elementi tramite le utility (vedi test org.openspcoop2.pdd.core.trasformazioni.Test)
- throw new Exception("Unexpected type '"+o.getClass().getName()+"' (is instanceof Map)");
- }
- else if(o instanceof List) {
- List<?> lO = (List<?>) o;
- if(!lO.isEmpty()) {
- int position = 0;
- for (Object object : lO) {
- if(object!=null) {
- if(object instanceof String) {
- l.add((String)object);
- }
- else if(object instanceof Number) {
- l.add(object.toString());
- }
- else if(object instanceof Boolean) {
- l.add(object.toString());
- }
- else{
- throw new Exception("Unexpected type '"+object.getClass().getName()+"' at position "+position);
- }
- }
- position++;
- }
- }
- }
- else if(o instanceof String) {
- l.add((String)o);
- }
- else if(o instanceof Number) {
- l.add(o.toString());
- }
- else if(o instanceof Boolean) {
- l.add(o.toString());
- }
- else {
- throw new Exception("Unexpected type '"+o.getClass().getName()+"'");
- }
- }
- }
-
-
- /* ---------- METODI RITORNANO NUMBER -------------- */
- public List<Number> getNumberMatchPattern(JSONObject input, String pattern) throws JsonPathException, JsonPathNotFoundException, JsonPathNotValidException {
- if(input == null)
- throw new JsonPathException("Document (JSONObject) is null");
- if(pattern == null)
- throw new JsonPathException("Pattern is null");
- this.validate(pattern);
-
- try {
- List<Number> l = new ArrayList<Number>();
- Object o = JsonPath.read(input, pattern);
- _parseNumberMatchPatternResult(o, l);
- if(l==null || l.size()<=0) {
- throw new com.jayway.jsonpath.PathNotFoundException("Nessun match trovato per l'espressione jsonPath ["+pattern+"]");
- }
- return l;
- }catch(com.jayway.jsonpath.PathNotFoundException notFound) {
- throw new JsonPathNotFoundException(notFound.getMessage(),notFound);
- } catch(Exception e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- }
- public List<Number> getNumberMatchPattern(JsonNode document, String pattern) throws JsonPathException, JsonPathNotFoundException, JsonPathNotValidException {
- if(document == null)
- throw new JsonPathException("Document (JsonNode) is null");
- if(pattern == null)
- throw new JsonPathException("Pattern is null");
- this.validate(pattern);
-
- try {
- List<Number> l = new ArrayList<Number>();
- Object o = JsonPath.read(getAsString(document), pattern);
- _parseNumberMatchPatternResult(o, l);
- if(l==null || l.size()<=0) {
- throw new com.jayway.jsonpath.PathNotFoundException("Nessun match trovato per l'espressione jsonPath ["+pattern+"]");
- }
- return l;
- }catch(com.jayway.jsonpath.PathNotFoundException notFound) {
- throw new JsonPathNotFoundException(notFound.getMessage(),notFound);
- } catch(Exception e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- }
-
- public List<Number> getNumberMatchPattern(InputStream is, String pattern) throws JsonPathException, JsonPathNotFoundException, JsonPathNotValidException {
- if(is == null)
- throw new JsonPathException("Document (InputStream) is null");
- if(pattern == null)
- throw new JsonPathException("Pattern is null");
- this.validate(pattern);
-
- try {
- List<Number> l = new ArrayList<Number>();
- Object o = JsonPath.read(is, pattern);
- _parseNumberMatchPatternResult(o, l);
- if(l==null || l.size()<=0) {
- throw new com.jayway.jsonpath.PathNotFoundException("Nessun match trovato per l'espressione jsonPath ["+pattern+"]");
- }
- return l;
- }catch(com.jayway.jsonpath.PathNotFoundException notFound) {
- throw new JsonPathNotFoundException(notFound.getMessage(),notFound);
- } catch(Exception e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- }
-
- public List<Number> getNumberMatchPattern(String contenuto, String pattern) throws JsonPathException, JsonPathNotFoundException, JsonPathNotValidException {
- if(contenuto == null)
- throw new JsonPathException("Document (String) is null");
- if(pattern == null)
- throw new JsonPathException("Pattern is null");
- this.validate(pattern);
-
- try {
- List<Number> l = new ArrayList<Number>();
- Object o = JsonPath.read(contenuto, pattern);
- _parseNumberMatchPatternResult(o, l);
- if(l==null || l.size()<=0) {
- throw new com.jayway.jsonpath.PathNotFoundException("Nessun match trovato per l'espressione jsonPath ["+pattern+"]");
- }
- return l;
- }catch(com.jayway.jsonpath.PathNotFoundException notFound) {
- throw new JsonPathNotFoundException(notFound.getMessage(),notFound);
- }catch(Exception e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- }
-
- private void _parseNumberMatchPatternResult(Object o, List<Number> l) throws Exception {
- if(o!=null) {
- if(o instanceof List) {
- List<?> lO = (List<?>) o;
- if(!lO.isEmpty()) {
- int position = 0;
- for (Object object : lO) {
- if(object!=null) {
- if(object instanceof Number) {
- l.add((Number)object);
- }
- else{
- throw new Exception("Unexpected type '"+object.getClass().getName()+"' at position "+position);
- }
- }
- position++;
- }
- }
- }
- else if(o instanceof Number) {
- l.add((Number)o);
- }
- else {
- throw new Exception("Unexpected type '"+o.getClass().getName()+"'");
- }
- }
- }
-
- /* ---------- METODI RITORNANO BOOLEAN -------------- */
- public List<Boolean> getBooleanMatchPattern(JSONObject input, String pattern) throws JsonPathException, JsonPathNotFoundException, JsonPathNotValidException {
- if(input == null)
- throw new JsonPathException("Document (JSONObject) is null");
- if(pattern == null)
- throw new JsonPathException("Pattern is null");
- this.validate(pattern);
-
- try {
- List<Boolean> l = new ArrayList<Boolean>();
- Object o = JsonPath.read(input, pattern);
- _parseBooleanMatchPatternResult(o, l);
- if(l==null || l.size()<=0) {
- throw new com.jayway.jsonpath.PathNotFoundException("Nessun match trovato per l'espressione jsonPath ["+pattern+"]");
- }
- return l;
- }catch(com.jayway.jsonpath.PathNotFoundException notFound) {
- throw new JsonPathNotFoundException(notFound.getMessage(),notFound);
- }catch(Exception e) {
- throw new JsonPathException(e.getMessage(), e);
- }
-
- }
- public List<Boolean> getBooleanMatchPattern(JsonNode document, String pattern) throws JsonPathException, JsonPathNotFoundException, JsonPathNotValidException {
- if(document == null)
- throw new JsonPathException("Document (JsonNode) is null");
- if(pattern == null)
- throw new JsonPathException("Pattern is null");
- this.validate(pattern);
-
- try {
- List<Boolean> l = new ArrayList<Boolean>();
- Object o = JsonPath.read(getAsString(document), pattern);
- _parseBooleanMatchPatternResult(o, l);
- if(l==null || l.size()<=0) {
- throw new com.jayway.jsonpath.PathNotFoundException("Nessun match trovato per l'espressione jsonPath ["+pattern+"]");
- }
- return l;
- }catch(com.jayway.jsonpath.PathNotFoundException notFound) {
- throw new JsonPathNotFoundException(notFound.getMessage(),notFound);
- }catch(Exception e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- }
-
- public List<Boolean> getBooleanMatchPattern(InputStream is, String pattern) throws JsonPathException, JsonPathNotFoundException, JsonPathNotValidException {
- if(is == null)
- throw new JsonPathException("Document (InputStream) is null");
- if(pattern == null)
- throw new JsonPathException("Pattern is null");
- this.validate(pattern);
-
- try {
- List<Boolean> l = new ArrayList<Boolean>();
- Object o = JsonPath.read(is, pattern);
- _parseBooleanMatchPatternResult(o, l);
- if(l==null || l.size()<=0) {
- throw new com.jayway.jsonpath.PathNotFoundException("Nessun match trovato per l'espressione jsonPath ["+pattern+"]");
- }
- return l;
- }catch(com.jayway.jsonpath.PathNotFoundException notFound) {
- throw new JsonPathNotFoundException(notFound.getMessage(),notFound);
- } catch(Exception e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- }
-
- public List<Boolean> getBooleanMatchPattern(String contenuto, String pattern) throws JsonPathException, JsonPathNotFoundException, JsonPathNotValidException {
- if(contenuto == null)
- throw new JsonPathException("Document (String) is null");
- if(pattern == null)
- throw new JsonPathException("Pattern is null");
- this.validate(pattern);
-
- try {
- List<Boolean> l = new ArrayList<Boolean>();
- Object o = JsonPath.read(contenuto, pattern);
- _parseBooleanMatchPatternResult(o, l);
- if(l==null || l.size()<=0) {
- throw new com.jayway.jsonpath.PathNotFoundException("Nessun match trovato per l'espressione jsonPath ["+pattern+"]");
- }
- return l;
- }catch(com.jayway.jsonpath.PathNotFoundException notFound) {
- throw new JsonPathNotFoundException(notFound.getMessage(),notFound);
- }catch(Exception e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- }
-
- private void _parseBooleanMatchPatternResult(Object o, List<Boolean> l) throws Exception {
- if(o!=null) {
- if(o instanceof List) {
- List<?> lO = (List<?>) o;
- if(!lO.isEmpty()) {
- int position = 0;
- for (Object object : lO) {
- if(object!=null) {
- if(object instanceof Boolean) {
- l.add((Boolean)object);
- }
- else{
- throw new Exception("Unexpected type '"+object.getClass().getName()+"' at position "+position);
- }
- }
- position++;
- }
- }
- }
- else if(o instanceof Boolean) {
- l.add((Boolean)o);
- }
- else {
- throw new Exception("Unexpected type '"+o.getClass().getName()+"'");
- }
- }
- }
-
- /* ---------- METODI RITORNANO JSON NODE -------------- */
- public JsonNode getJsonNodeMatchPattern(JSONObject input, String pattern) throws JsonPathException, JsonPathNotFoundException, JsonPathNotValidException {
- if(input == null)
- throw new JsonPathException("Document (JSONObject) is null");
- if(pattern == null)
- throw new JsonPathException("Pattern is null");
- this.validate(pattern);
-
- try {
- Object object = JsonPath.read(input, pattern);
- if(object==null) {
- throw new com.jayway.jsonpath.PathNotFoundException("Nessun match trovato per l'espressione jsonPath ["+pattern+"]");
- }
- return this.convertToJsonNode(object);
- }catch(com.jayway.jsonpath.PathNotFoundException notFound) {
- throw new JsonPathNotFoundException(notFound.getMessage(),notFound);
- }catch(Exception e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- }
- public JsonNode getJsonNodeMatchPattern(JsonNode document, String pattern) throws JsonPathException, JsonPathNotFoundException, JsonPathNotValidException {
- if(document == null)
- throw new JsonPathException("Document (JsonNode) is null");
- if(pattern == null)
- throw new JsonPathException("Pattern is null");
-
- this.validate(pattern);
-
- try {
- String inputString = getAsString(document);
- Object object = JsonPath.read(inputString, pattern);
- if(object==null) {
- throw new com.jayway.jsonpath.PathNotFoundException("Nessun match trovato per l'espressione jsonPath ["+pattern+"]");
- }
- return this.convertToJsonNode(object);
- }catch(com.jayway.jsonpath.PathNotFoundException notFound) {
- throw new JsonPathNotFoundException(notFound.getMessage(),notFound);
- }catch(Exception e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- }
-
- public JsonNode getJsonNodeMatchPattern(InputStream is, String pattern) throws JsonPathException, JsonPathNotFoundException, JsonPathNotValidException {
- if(is == null)
- throw new JsonPathException("Document (InputStream) is null");
- if(pattern == null)
- throw new JsonPathException("Pattern is null");
-
- this.validate(pattern);
-
- try {
- Object object = JsonPath.read(is, pattern);
- if(object==null) {
- throw new com.jayway.jsonpath.PathNotFoundException("Nessun match trovato per l'espressione jsonPath ["+pattern+"]");
- }
- return this.convertToJsonNode(object);
- }catch(com.jayway.jsonpath.PathNotFoundException notFound) {
- throw new JsonPathNotFoundException(notFound.getMessage(),notFound);
- }catch(Exception e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- }
-
- public JsonNode getJsonNodeMatchPattern(String contenuto, String pattern) throws JsonPathException, JsonPathNotFoundException, JsonPathNotValidException {
- if(contenuto == null)
- throw new JsonPathException("Document (String) is null");
- if(pattern == null)
- throw new JsonPathException("Pattern is null");
- this.validate(pattern);
-
- try {
- Object object = JsonPath.read(contenuto, pattern);
- if(object==null) {
- throw new com.jayway.jsonpath.PathNotFoundException("Nessun match trovato per l'espressione jsonPath ["+pattern+"]");
- }
- return this.convertToJsonNode(object);
- }catch(com.jayway.jsonpath.PathNotFoundException notFound) {
- throw new JsonPathNotFoundException(notFound.getMessage(),notFound);
- }catch(Exception e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- }
- private JsonNode convertToJsonNode(Object object) throws UtilsException {
- if(object instanceof String) {
- return getJsonUtils().getAsNode("\""+((String) object)+"\"");
- }
- else if(object instanceof JSONArray) {
- JSONArray jsonObject = (JSONArray) object;
- return getJsonUtils().getAsNode(jsonObject.toString());
- }
- else if(object instanceof JSONObject) {
- JSONObject jsonObject = (JSONObject) object;
- return getJsonUtils().getAsNode(jsonObject.toString());
- }
- else if(object instanceof Map<?, ?>) {
- Map<?, ?> map = (Map<?, ?>) object;
- return getJsonUtils().getAsNode(map);
- }
- else {
- return getJsonUtils().getAsNode(object.toString());
- }
- }
-
- /* ---------- METODI RITORNANO OGGETTI -------------- */
- public Object getMatchPattern(JSONObject input, String pattern, JsonPathReturnType returnType) throws JsonPathException, JsonPathNotFoundException, JsonPathNotValidException {
- if(input == null)
- throw new JsonPathException("Document (JSONObject)is null");
- if(pattern == null)
- throw new JsonPathException("Pattern is null");
- this.validate(pattern);
-
- if(returnType == null)
- throw new JsonPathException("JsonPathReturnType is null");
- Object risposta = null;
- switch(returnType) {
- case STRING:
- risposta = getStringMatchPattern(input, pattern);
- break;
- case NUMBER:
- risposta = getNumberMatchPattern(input, pattern);
- break;
- case BOOLEAN:
- risposta = getBooleanMatchPattern(input, pattern);
- break;
- case NODE:
- risposta = getJsonNodeMatchPattern(input, pattern);
- break;
- default:
- try {
- risposta = JsonPath.read(input, pattern);
- }catch(com.jayway.jsonpath.PathNotFoundException notFound) {
- throw new JsonPathNotFoundException(notFound.getMessage(),notFound);
- }
- break;
- }
- if(risposta==null) {
- throw new com.jayway.jsonpath.PathNotFoundException("Nessun match trovato per l'espressione jsonPath ["+pattern+"]");
- }
- return risposta;
- }
-
- public Object getMatchPattern(JsonNode input, String pattern, JsonPathReturnType returnType) throws JsonPathException, JsonPathNotFoundException, JsonPathNotValidException {
- if(input == null)
- throw new JsonPathException("Document (JsonNode)is null");
- if(pattern == null)
- throw new JsonPathException("Pattern is null");
- this.validate(pattern);
-
- if(returnType == null)
- throw new JsonPathException("JsonPathReturnType is null");
- Object risposta = null;
- String inputString = getAsString(input);
- switch(returnType) {
- case STRING:
- risposta = getStringMatchPattern(inputString, pattern);
- break;
- case NUMBER:
- risposta = getNumberMatchPattern(inputString, pattern);
- break;
- case BOOLEAN:
- risposta = getBooleanMatchPattern(inputString, pattern);
- break;
- case NODE:
- risposta = getJsonNodeMatchPattern(inputString, pattern);
- break;
- default:
- try {
- risposta = JsonPath.read(input, pattern);
- }catch(com.jayway.jsonpath.PathNotFoundException notFound) {
- throw new JsonPathNotFoundException(notFound.getMessage(),notFound);
- }
- break;
- }
- if(risposta==null) {
- throw new com.jayway.jsonpath.PathNotFoundException("Nessun match trovato per l'espressione jsonPath ["+pattern+"]");
- }
- return risposta;
- }
-
- public Object getMatchPattern(InputStream input, String pattern, JsonPathReturnType returnType)throws JsonPathException, JsonPathNotFoundException, JsonPathNotValidException {
- if(input == null)
- throw new JsonPathException("Document (InputStream) is null");
- if(pattern == null)
- throw new JsonPathException("Pattern is null");
- this.validate(pattern);
-
- if(returnType == null)
- throw new JsonPathException("JsonPathReturnType is null");
- Object risposta = null;
- switch(returnType) {
- case STRING:
- risposta = getStringMatchPattern(input, pattern);
- break;
- case NUMBER:
- risposta = getNumberMatchPattern(input, pattern);
- break;
- case BOOLEAN:
- risposta = getBooleanMatchPattern(input, pattern);
- break;
- case NODE:
- risposta = getJsonNodeMatchPattern(input, pattern);
- break;
- default:
- try {
- risposta = JsonPath.read(input, pattern);
- }catch(com.jayway.jsonpath.PathNotFoundException notFound) {
- throw new JsonPathNotFoundException(notFound.getMessage(),notFound);
- }catch(Exception e) {
- throw new JsonPathException(e.getMessage(), e);
- }
- break;
- }
- if(risposta==null) {
- throw new com.jayway.jsonpath.PathNotFoundException("Nessun match trovato per l'espressione jsonPath ["+pattern+"]");
- }
- return risposta;
- }
-
- public Object getMatchPattern(String input, String pattern, JsonPathReturnType returnType) throws JsonPathException, JsonPathNotFoundException, JsonPathNotValidException {
- if(input == null)
- throw new JsonPathException("Document (String) is null");
-
- if(pattern == null)
- throw new JsonPathException("Pattern is null");
- this.validate(pattern);
-
- if(returnType == null)
- throw new JsonPathException("JsonPathReturnType is null");
- Object risposta = null;
- switch(returnType) {
- case STRING:
- risposta = getStringMatchPattern(input, pattern);
- break;
- case NUMBER:
- risposta = getNumberMatchPattern(input, pattern);
- break;
- case BOOLEAN:
- risposta = getBooleanMatchPattern(input, pattern);
- break;
- case NODE:
- risposta = getJsonNodeMatchPattern(input, pattern);
- break;
- default:
- try {
- risposta = JsonPath.read(input, pattern);
- }catch(com.jayway.jsonpath.PathNotFoundException notFound) {
- throw new JsonPathNotFoundException(notFound.getMessage(),notFound);
- }
- break;
- }
- if(risposta==null) {
- throw new com.jayway.jsonpath.PathNotFoundException("Nessun match trovato per l'espressione jsonPath ["+pattern+"]");
- }
- return risposta;
- }
-
-
- /* ---------- VALIDATORE -------------- */
-
- public void validate(String path) throws JsonPathNotValidException{
- try {
- JsonPath.compile(path);
- } catch(Exception e) {
- throw new JsonPathNotValidException("Validazione del jsonPath indicato ["+path+"] fallita: "+e.getMessage(),e);
- }
- }
-
- public static String extractAndConvertResultAsString(String elementJson, String pattern, Logger log) throws Exception {
- List<String> l = _extractAndConvertResultAsString(elementJson, pattern, log, false);
- if(l!=null && !l.isEmpty()) {
- return l.get(0);
- }
- else {
- return null;
- }
- }
- public static List<String> extractAndConvertResultAsList(String elementJson, String pattern, Logger log) throws Exception {
- return _extractAndConvertResultAsString(elementJson, pattern, log, true);
- }
- private static List<String> _extractAndConvertResultAsString(String elementJson, String pattern, Logger log, boolean returnAsList) throws Exception {
-
- List<String> lReturn = new ArrayList<>();
-
- JsonPathExpressionEngine engine = new JsonPathExpressionEngine();
-
- Exception exceptionNodeSet = null;
- try{
- List<?> l = engine.getStringMatchPattern(elementJson, pattern);
- if(l!=null && l.size()>0) {
- if(returnAsList) {
- for (Object s : l) {
- if(s instanceof String) {
- lReturn.add((String)s);
- }
- else if(s instanceof Map<?, ?>) {
- try {
- Map<?,?> map = (Map<?,?>) s;
- if(!map.isEmpty()) {
- StringBuilder sb = new StringBuilder("{");
- for (Object keyO : map.keySet()) {
- if(sb.length()>1) {
- sb.append(",");
- }
- //System.out.println("KEY '"+keyO+"' ("+keyO.getClass().getName()+")");
- String key = (String) keyO;
- sb.append("\"").append(key).append("\": ");
- Object valueO = map.get(keyO);
- if(valueO instanceof Boolean ||
- valueO instanceof Short ||
- valueO instanceof Integer ||
- valueO instanceof Long ||
- valueO instanceof Double ||
- valueO instanceof Float) {
- sb.append(valueO);
- }
- else {
- sb.append("\"").append(valueO).append("\"");
- }
- }
- sb.append("}");
- lReturn.add(sb.toString());
- }
- }catch(Throwable t) {
- lReturn.add(s.toString());
- }
- }
- else {
- lReturn.add(s.toString());
- }
- }
- }
- else {
- StringBuilder sbReturn = new StringBuilder();
- // if(l instanceof net.minidev.json.JSONArray) {
- // sbReturn.append("[");
- // }
-
- boolean first = true;
- for (Object s : l) {
- if(!first) {
- sbReturn.append(",");
- }
- if(s instanceof String) {
- sbReturn.append((String)s);
- }
- else if(s instanceof Map<?, ?>) {
- try {
- Map<?,?> map = (Map<?,?>) s;
- if(!map.isEmpty()) {
- StringBuilder sb = new StringBuilder("{");
- for (Object keyO : map.keySet()) {
- if(sb.length()>1) {
- sb.append(",");
- }
- //System.out.println("KEY '"+keyO+"' ("+keyO.getClass().getName()+")");
- String key = (String) keyO;
- sb.append("\"").append(key).append("\": ");
- Object valueO = map.get(keyO);
- if(valueO instanceof Boolean ||
- valueO instanceof Short ||
- valueO instanceof Integer ||
- valueO instanceof Long ||
- valueO instanceof Double ||
- valueO instanceof Float) {
- sb.append(valueO);
- }
- else {
- sb.append("\"").append(valueO).append("\"");
- }
- }
- sb.append("}");
- sbReturn.append(sb.toString());
- }
- }catch(Throwable t) {
- sbReturn.append(s.toString());
- }
- }
- else {
- sbReturn.append(s.toString());
- }
- first=false;
- }
-
- // if(l instanceof net.minidev.json.JSONArray) {
- // sbReturn.append("]");
- // }
- lReturn.add(sbReturn.toString());
- }
- }
-
- }catch(Exception e){
- exceptionNodeSet = e;
- }
-
- if(lReturn.isEmpty()){
-
- JsonNode obj = engine.getJsonNodeMatchPattern(elementJson, pattern);
- String risultato = null;
- if(obj!=null) {
- if(obj instanceof TextNode) {
- TextNode text = (TextNode) obj;
- risultato = text.asText();
- }
- else {
- risultato = obj.toString();
- }
- }
- if(risultato!=null && risultato.startsWith("[") && risultato.endsWith("]")) {
- risultato = risultato.substring(1, risultato.length()-1);
- }
- if(risultato!=null && !"".equals(risultato)) {
- lReturn.add(risultato);
- }
-
- if(exceptionNodeSet!=null){
- log.debug("Non sono stati trovati risultati tramite l'invocazione del metodo getStringMatchPattern("+pattern
- +") invocato in seguito all'errore dell'invocazione getJsonNodeMatchPattern("+
- pattern+",NODESET): "+exceptionNodeSet.getMessage(),exceptionNodeSet);
- // lancio questo errore.
- // Questo errore puo' avvenire perche' ho provato a fare xpath con nodeset
- //throw exceptionNodeSet;
- }
-
- }
-
- return lReturn;
- }
- }