DynamicStringReplace.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 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;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
/**
* DynamicStringReplace
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class DynamicStringReplace {
private static boolean containsKey(Map<?, ?> map, String key) {
// NOTA: prima volutamente viene cercata la stringa esatta per supportare più entry
boolean contains = map.containsKey(key) || map.containsKey(key.toLowerCase()) || map.containsKey(key.toUpperCase());
if(contains) {
return true;
}
else {
Iterator<?> keys = map.keySet().iterator();
while (keys.hasNext()) {
Object oKey = keys.next();
if(oKey!=null && oKey instanceof String) {
String keyIterator = (String) oKey;
String keyIteratorCaseInsensitive = keyIterator.toLowerCase();
String keyCaseInsensitive = key.toLowerCase();
if(keyCaseInsensitive.equals( keyIteratorCaseInsensitive )) {
return true;
}
}
}
}
return false;
}
private static Object get(Map<?, ?> map, String key) {
// NOTA: prima volutamente viene cercata la stringa esatta per supportare più entry
if(map.containsKey(key)) {
return map.get(key);
}
else if(map.containsKey(key.toLowerCase())) {
return map.get(key.toLowerCase());
}
else if(map.containsKey(key.toUpperCase())) {
return map.get(key.toUpperCase());
}
else {
Iterator<?> keys = map.keySet().iterator();
while (keys.hasNext()) {
Object oKey = keys.next();
if(oKey!=null && oKey instanceof String) {
String keyIterator = (String) oKey;
String keyIteratorCaseInsensitive = keyIterator.toLowerCase();
String keyCaseInsensitive = key.toLowerCase();
if(keyCaseInsensitive.equals( keyIteratorCaseInsensitive )) {
return map.get(oKey);
}
}
}
}
return null;
}
public static void validate(String messaggioWithPlaceHolder, boolean startWithDollaro) throws UtilsException{
String start = "{";
String startOptional = "{";
if(startWithDollaro) {
start = "${";
startOptional = "?{";
}
String end = "}";
int length = start.length()+end.length();
// Check di esistenza di almeno 1 '{' e '}'
if(messaggioWithPlaceHolder!=null && messaggioWithPlaceHolder.length()>length){
int index1 = messaggioWithPlaceHolder.indexOf(start);
if(index1<0) {
index1 = messaggioWithPlaceHolder.indexOf(startOptional);
}
int index2 = messaggioWithPlaceHolder.indexOf(end,index1+start.length());
if(index1<0 || index2<0){
return; // non serve il replace
}
}
if(messaggioWithPlaceHolder==null) {
return;
}
StringBuilder keyword = new StringBuilder();
//boolean required = true;
boolean keywordInCorso = false;
for(int i=0; i<messaggioWithPlaceHolder.length(); i++){
char ch = messaggioWithPlaceHolder.charAt(i);
boolean checkPossibleStart = false;
if(startWithDollaro) {
if(ch == '$' || ch == '?') {
//if(ch == '?') {
// required=false;
//}
checkPossibleStart = true;
if(i+1 < messaggioWithPlaceHolder.length()) {
i++;
ch = messaggioWithPlaceHolder.charAt(i);
}
}
}
else {
checkPossibleStart = true;
}
if(
( (checkPossibleStart && '{' == ch) )
||
( (keywordInCorso && '}' == ch) )
){
//char separatorChar = ch;
if(keywordInCorso==false){
// inizio keyword
//keyword.append(separatorChar);
keywordInCorso = true; // siamo nel caso di apertura, inizio keyword
}
else{
// fine keyword
//keyword.append(separatorChar);
String key = keyword.toString();
if(key.contains(":")==false){
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: wrong format, required {key:value}");
}
if(key.startsWith(":") || key.endsWith(":") ){
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: wrong format, required {key:value}");
}
String tipo = key.substring(0, key.indexOf(":"));
String value = key.substring(key.indexOf(":")+1);
if(tipo==null || "".equals(tipo.trim())){
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: wrong format, required {key:value}");
}
if(value==null || "".equals(value.trim())){
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: wrong format, required {key:value}");
}
keyword.delete(0, keyword.length());
keywordInCorso=false;
checkPossibleStart=false;
}
}else{
if(keywordInCorso){
// sto scrivendo la keyword
keyword.append(ch);
}
}
}
}
public static String replace(String messaggioWithPlaceHolder, Map<String, Object> map, boolean startWithDollaro) throws UtilsException{
return replace(messaggioWithPlaceHolder, map, startWithDollaro, true);
}
public static String replace(String messaggioWithPlaceHolder, Map<String, Object> map, boolean startWithDollaro, boolean complexField) throws UtilsException{
validate(messaggioWithPlaceHolder, startWithDollaro);
String start = "{";
String startOptional = "{";
if(startWithDollaro) {
start = "${";
startOptional = "?{";
}
String end = "}";
int length = start.length()+end.length();
// Check di esistenza di almeno 1 '{' e '}'
if(messaggioWithPlaceHolder!=null && messaggioWithPlaceHolder.length()>length){
int index1 = messaggioWithPlaceHolder.indexOf(start);
if(index1<0) {
index1 = messaggioWithPlaceHolder.indexOf(startOptional);
}
int index2 = messaggioWithPlaceHolder.indexOf(end,index1+start.length());
if(index1<0 || index2<0){
return messaggioWithPlaceHolder; // non serve il replace
}
}
if(messaggioWithPlaceHolder==null) {
return messaggioWithPlaceHolder;
}
StringBuilder bf = new StringBuilder();
StringBuilder keyword = new StringBuilder();
boolean required = true;
int countOptionalNotFoundBehaviour = 0;
boolean keywordInCorso = false;
for(int i=0; i<messaggioWithPlaceHolder.length(); i++){
char ch = messaggioWithPlaceHolder.charAt(i);
Character chDollaro = null;
boolean checkPossibleStart = false;
if(startWithDollaro) {
if(ch == '$' || ch == '?') {
// verifico che il prossimo carattere non sia un ulteriore carattere speciale
boolean analize = true;
if(i+1 < messaggioWithPlaceHolder.length()) {
char chNext = messaggioWithPlaceHolder.charAt(i+1);
if(chNext == '$' || chNext == '?') {
analize = false;
}
}
if(analize) {
if(ch == '?') {
required=false;
}
checkPossibleStart = true;
if(i+1 < messaggioWithPlaceHolder.length()) {
i++;
chDollaro = ch;
ch = messaggioWithPlaceHolder.charAt(i);
}
}
}
}
else {
checkPossibleStart = true;
}
if(
( (checkPossibleStart && '{' == ch) )
||
( (keywordInCorso && '}' == ch) )
){
//char separatorChar = ch;
if(keywordInCorso==false){
// inizio keyword
//keyword.append(separatorChar);
keywordInCorso = true; // siamo nel caso di apertura, inizio keyword
}
else{
// fine keyword
//keyword.append(separatorChar);
String key = keyword.toString();
if(key.contains(":")==false){
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: wrong format, required {key:value}");
}
if(key.startsWith(":") || key.endsWith(":") ){
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: wrong format, required {key:value}");
}
String tipo = key.substring(0, key.indexOf(":"));
String value = key.substring(key.indexOf(":")+1);
//if(map.containsKey(tipo)==false){
String valoreRimpiazzato = null;
if(containsKey(map, tipo)==false) {
if(required) {
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: object with key '"+tipo+"' not found");
}
else {
countOptionalNotFoundBehaviour++;
valoreRimpiazzato = "";
}
}
else {
//Object object = map.get(tipo);
Object object = get(map, tipo);
if(object==null){
if(required) {
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: object with key '"+tipo+"' is null");
}
else {
countOptionalNotFoundBehaviour++;
valoreRimpiazzato = "";
}
}
else {
valoreRimpiazzato = getValue(key, tipo, value, object, complexField, required);
if(valoreRimpiazzato==null){
if(required) {
throw new UtilsException("Placeholder [{"+key+"}] resolution failed");
}
else {
countOptionalNotFoundBehaviour++;
valoreRimpiazzato = "";
}
}
}
}
bf.append(valoreRimpiazzato);
keyword.delete(0, keyword.length());
keywordInCorso=false;
checkPossibleStart=false;
}
}else{
if(keywordInCorso){
// sto scrivendo la keyword
keyword.append(ch);
}else{
if(chDollaro!=null) {
bf.append(chDollaro);
}
bf.append(ch);
}
}
}
String result = bf.toString();
if(result==null) {
return null;
}
if(countOptionalNotFoundBehaviour > 0 && StringUtils.isEmpty(result)) {
return null;
}
return result;
}
private static String getValue(String key, String tipo, String value, Object object, boolean complexField, boolean required) throws UtilsException{
// Se l'oggetto nella mappa è una data utilizzo il valore come format
Date d = null;
if(object instanceof Date){
d = (Date) object;
}
else if(object instanceof java.sql.Date){
d = (java.sql.Date) object;
}
else if(object instanceof Calendar){
Calendar c = (Calendar) object;
d = c.getTime();
}
if(d!=null){
SimpleDateFormat sdf = new SimpleDateFormat(value);
return sdf.format(d);
}
// Se l'oggetto è una mappa provo ad estrarre l'oggetto indicato.
if(object instanceof List<?> || object instanceof Map<?,?> || object instanceof Object[]){
String position = value;
String newValue = value;
boolean existsUlterioreParametro = false;
boolean valueContainsPoint = value.contains(".");
if(valueContainsPoint && complexField){
// Devo convertire i punti dentro le quadre che potrebbero far parte delle chiavi
StringBuilder sbFormat = new StringBuilder();
boolean start = false;
int doppieVirgoletteIndex = -1;
boolean startDoppieVirgolette = false;
for (int i = 0; i < value.length(); i++) {
char c = value.charAt(i);
if((!start) && (c == '[')) {
start = true;
if((i+1 < value.length())) {
char cc = value.charAt(i+1);
if((cc == '"')) {
startDoppieVirgolette=true;
doppieVirgoletteIndex=i+1;
}
}
}
if((start) && (c == ']')) {
if(!startDoppieVirgolette) {
start = false;
}
}
if((startDoppieVirgolette) && (c == '"') && doppieVirgoletteIndex!=i) {
if((i+1 < value.length())) {
char cc = value.charAt(i+1);
if((cc == ']')) {
startDoppieVirgolette = false;
doppieVirgoletteIndex=i;
}
}
}
if(start && c == '.') {
sbFormat.append('_');
}
else {
sbFormat.append(c);
}
}
String internalNewValue = sbFormat.toString();
// Devo convertire i punti dentro le tonde che potrebbero far parte delle chiavi
sbFormat = new StringBuilder();
start = false;
doppieVirgoletteIndex = -1;
startDoppieVirgolette = false;
for (int i = 0; i < internalNewValue.length(); i++) {
char c = internalNewValue.charAt(i);
if((!start) && (c == '(')) {
start = true;
if((i+1 < internalNewValue.length())) {
char cc = internalNewValue.charAt(i+1);
if((cc == '"')) {
startDoppieVirgolette=true;
doppieVirgoletteIndex=i+1;
}
}
}
if((start) && (c == ')')) {
if(!startDoppieVirgolette) {
start = false;
}
}
if((startDoppieVirgolette) && (c == '"') && doppieVirgoletteIndex!=i) {
if((i+1 < internalNewValue.length())) {
char cc = internalNewValue.charAt(i+1);
if((cc == ')')) {
startDoppieVirgolette = false;
doppieVirgoletteIndex=i;
}
}
}
if(start && c == '.') {
sbFormat.append('_');
}
else {
sbFormat.append(c);
}
}
internalNewValue = sbFormat.toString();
//System.out.println("OLD ["+value+"]");
//System.out.println("NEW ["+internalNewValue+"]");
int indexOfPoint = internalNewValue.indexOf(".");
if(indexOfPoint>0) {
position = value.substring(0, indexOfPoint);
try{
newValue = value.substring(indexOfPoint+1);
}catch(Throwable e){
// ignore
}
}
else {
position = value;
newValue = null;
}
if(position!=null) {
if( (position.startsWith("[") || position.startsWith("("))
&&
position.length()>1) {
position = position.substring(1);
}
if( (position.endsWith("]") || position.endsWith(")"))
&&
position.length()>1) {
position = position.substring(0,(position.length()-1));
}
//System.out.println("position ["+position+"]");
}
if(newValue!=null && StringUtils.isNotEmpty(newValue.trim())) {
existsUlterioreParametro=true;
}
}
Object oInternal = null;
// Provo ad utilizzare il valore come indice
if(object instanceof List<?> || object instanceof Object[]){
int index = -1;
try{
index = Integer.parseInt(position);
}catch(Exception e){
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: object ["+object.getClass().getName()+"] with wrong position '"+position+"' (not integer?): "+e.getMessage());
}
if(object instanceof List<?>){
List<?> list = (List<?>) object;
if(list.size()<=index){
if(required) {
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: object ["+object.getClass().getName()+"] with wrong position '"+index+"' (list size:"+list.size()+")");
}
}
else {
oInternal = list.get(index);
}
}
else if(object instanceof Object[]){
Object[] arrayObj = (Object[]) object;
if(arrayObj.length<=index){
if(required) {
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: object ["+object.getClass().getName()+"] with wrong position '"+index+"' (array size:"+arrayObj.length+")");
}
}
else {
oInternal = arrayObj[index];
}
}
}
else if(object instanceof Map<?,?>){
Map<?,?> map = (Map<?,?>) object;
//if(map.containsKey(position)==false){
if(containsKey(map, position)==false) {
if(required) {
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: object ["+object.getClass().getName()+"] '"+position+"' not exists in map");
}
}
else {
//oInternal = map.get(position);
oInternal = get(map, position);
}
}
//if(newValue.contains(".") || (newValue.contains("[") && newValue.contains("]"))){
if(existsUlterioreParametro) { // se ho definito un parametro dopo la chiave della mappa devo usare il metodo 'readValueInObject'
if(oInternal==null){
if(required) {
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: object ["+object.getClass().getName()+"]["+position+"] return null object");
}
else {
return null;
}
}
else{
return readValueInObject(key, oInternal, newValue, complexField, required);
}
}
else{
// finale
if(oInternal!=null){
String finalValue = null;
if(oInternal instanceof Date){
SimpleDateFormat dateformat = new SimpleDateFormat("yyyyMMdd_HHmmssSSS");
finalValue = dateformat.format((Date)oInternal);
}
else if(oInternal instanceof byte[]){
// // 1024 = 1K
// // Visualizzo al massimo 1K
// int max = 1 * 1024;
// return org.openspcoop2.utils.Utilities.convertToPrintableText((byte[])ret, max);
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: object ["+object.getClass().getName()+"]["+position+"] return object with type ["+oInternal.getClass().getName()+"]");
}
else{
finalValue = oInternal.toString();
}
return finalValue;
}
else{
if(required) {
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: object ["+object.getClass().getName()+"]["+position+"] return null object");
}
else {
return null;
}
}
}
}
else{
// Altrimenti provo a navigarlo
return readValueInObject(key, object, value, complexField, required);
}
}
private static String readValueInObject(String key, Object o,String name, boolean complexField, boolean required) throws UtilsException{
//System.out.println("Invocato con oggetto["+o.getClass().getName()+"] nome["+name+"]");
String fieldName = name;
//String position = null;
List<String> arrayMapPosition = new ArrayList<>();
boolean nameContainsPoint = name.contains(".");
if(nameContainsPoint && complexField){
// Devo convertire i punti dentro le quadre che potrebbero far parte delle chiavi
StringBuilder sbFormat = new StringBuilder();
boolean start = false;
int doppieVirgoletteIndex = -1;
boolean startDoppieVirgolette = false;
for (int i = 0; i < name.length(); i++) {
char c = name.charAt(i);
if((!start) && (c == '[')) {
start = true;
if((i+1 < name.length())) {
char cc = name.charAt(i+1);
if((cc == '"')) {
startDoppieVirgolette=true;
doppieVirgoletteIndex=i+1;
}
}
}
if((start) && (c == ']')) {
if(!startDoppieVirgolette) {
start = false;
}
}
if((startDoppieVirgolette) && (c == '"') && doppieVirgoletteIndex!=i) {
if((i+1 < name.length())) {
char cc = name.charAt(i+1);
if((cc == ']')) {
startDoppieVirgolette = false;
doppieVirgoletteIndex=i;
}
}
}
if(start && c == '.') {
sbFormat.append('_');
}
else {
sbFormat.append(c);
}
}
String newName = sbFormat.toString();
// Devo convertire i punti dentro le tonde che potrebbero far parte delle chiavi
sbFormat = new StringBuilder();
start = false;
doppieVirgoletteIndex = -1;
startDoppieVirgolette = false;
for (int i = 0; i < newName.length(); i++) {
char c = newName.charAt(i);
if((!start) && (c == '(')) {
start = true;
if((i+1 < newName.length())) {
char cc = newName.charAt(i+1);
if((cc == '"')) {
startDoppieVirgolette=true;
doppieVirgoletteIndex=i+1;
}
}
}
if((start) && (c == ')')) {
if(!startDoppieVirgolette) {
start = false;
}
}
if((startDoppieVirgolette) && (c == '"') && doppieVirgoletteIndex!=i) {
if((i+1 < newName.length())) {
char cc = newName.charAt(i+1);
if((cc == ')')) {
startDoppieVirgolette = false;
doppieVirgoletteIndex=i;
}
}
}
if(start && c == '.') {
sbFormat.append('_');
}
else {
sbFormat.append(c);
}
}
newName = sbFormat.toString();
//System.out.println("OLD ["+name+"]");
//System.out.println("NEW ["+newName+"]");
nameContainsPoint = newName.contains(".");
if(nameContainsPoint){
fieldName = name.substring(0, newName.indexOf("."));
}
//System.out.println("fieldName ["+fieldName+"]");
}
String methodName = new String(fieldName);
//System.out.println("fieldName ["+fieldName+"]");
if(fieldName.endsWith("]") && fieldName.contains("[")){
try{
// fix [][]
//position = fieldName.substring(fieldName.indexOf("[")+1,fieldName.length()-1);
String tmp = new String(fieldName);
//System.out.println("DEBUG ["+tmp+"]");
while(tmp.endsWith("]") && tmp.contains("[")){
int firstOpen = tmp.indexOf("[")+1;
int lastOpen = tmp.indexOf("]", firstOpen);
String position = tmp.substring(firstOpen, lastOpen);
arrayMapPosition.add(position);
//System.out.println("DEBUG ADD ["+position+"]");
if(tmp.length()>(lastOpen+1)) {
tmp = tmp.substring(lastOpen+1,tmp.length());
}
else {
tmp="";
}
//System.out.println("DEBUG NUOVO VALORE ["+tmp+"]");
}
methodName = fieldName.substring(0, fieldName.indexOf("["));
}catch(Exception e){
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: position error in field ["+fieldName+"]: "+e.getMessage(),e);
}
}
//System.out.println("NAME ["+fieldName+"] position["+position+"]");
String getMethod = "get"+((methodName.charAt(0)+"").toUpperCase());
if(methodName.length()>1){
getMethod = getMethod + methodName.substring(1);
}
//System.out.println("getMethod ["+getMethod+"]");
List<String> parametersObject = null;
List<Class<?>> parametersClass = null;
try{
if(getMethod.contains("(") && getMethod.endsWith(")")) { // supporta 1 solo parametro stringa
int startParams = getMethod.indexOf("(");
String sP = getMethod.substring(startParams, getMethod.length());
if(sP.length()>2) {
sP = sP.substring(1, sP.length()-1);
}
//System.out.println("METODO getMethod["+getMethod+"] PARAMS["+sP+"] ");
if(sP.contains(",")) {
parametersObject = new ArrayList<>();
parametersClass = new ArrayList<Class<?>>();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < sP.length(); i++) {
String sAt = sP.charAt(i)+"";
if(sAt.equals(",")) {
String paramString = sb.toString();
//System.out.println("paramString '"+paramString+"'");
if(paramString!=null && paramString.length()>=2 && paramString.startsWith("\"") && paramString.endsWith("\"")) {
if(paramString.length()==2) {
paramString = ""; // stringa vuota
}
else {
paramString = paramString.substring(1);
paramString = paramString.substring(0,paramString.length()-1);
}
//System.out.println("paramString DOPO '"+paramString+"'");
}
parametersObject.add(paramString); // gli spazi possono essere voluti (non fare trim)
parametersClass.add(String.class);
sb = new StringBuilder();
}
else {
sb.append(sAt);
}
}
parametersObject.add(sb.toString()); // gli spazi possono essere voluti (non fare trim)
parametersClass.add(String.class);
}
else {
parametersObject = new ArrayList<>();
parametersClass = new ArrayList<Class<?>>();
String paramString = sP;
//System.out.println("paramString '"+paramString+"'");
if(paramString!=null && paramString.length()>=2 && paramString.startsWith("\"") && paramString.endsWith("\"")) {
if(paramString.length()==2) {
paramString = ""; // stringa vuota
}
else {
paramString = paramString.substring(1);
paramString = paramString.substring(0,paramString.length()-1);
}
//System.out.println("paramString DOPO '"+paramString+"'");
}
parametersObject.add(paramString); // gli spazi possono essere voluti (non fare trim)
parametersClass.add(String.class);
}
getMethod = getMethod.substring(0, startParams);
}
}catch(Throwable e){
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: method ["+o.getClass().getName()+"."+getMethod+"()] read parameter error; "+e.getMessage(),e);
}
Method m = null;
boolean withoutParams = false;
try{
if(parametersClass!=null && !parametersClass.isEmpty()) {
m = o.getClass().getMethod(getMethod, parametersClass.toArray(new Class[1]));
}
else {
withoutParams = true;
m = o.getClass().getMethod(getMethod);
}
}catch(Throwable e){
UtilsException utilsException = new UtilsException("Placeholder [{"+key+"}] resolution failed: method ["+o.getClass().getName()+"."+getMethod+"()] not found; "+e.getMessage(),e);
// Fix per metodi boolean 'is'
if(e instanceof java.lang.NoSuchMethodException && withoutParams) {
try{
String isMethod = getMethod.replaceFirst("get", "is");
m = o.getClass().getMethod(isMethod);
if(m!=null) {
utilsException = null;
}
}catch(Throwable eIgnore){
// rilancio eccezione originale
}
}
if(utilsException!=null && e instanceof java.lang.NoSuchMethodException && !withoutParams) {
// Fix per metodi boolean senza 'get' o 'is' che contengono parametri
try{
String originalMethod = methodName;
if(originalMethod.contains("(") && originalMethod.endsWith(")")) { // supporta 1 solo parametro stringa
int startParams = originalMethod.indexOf("(");
originalMethod = originalMethod.substring(0, startParams);
}
if(parametersClass!=null && !parametersClass.isEmpty()) {
m = o.getClass().getMethod(originalMethod, parametersClass.toArray(new Class[1]));
}
// non si dovrebbe entrare in questo caso essendoci l'if sopra con !withoutParams
// else {
// m = o.getClass().getMethod(originalMethod);
// }
if(m!=null) {
utilsException = null;
}
}catch(Throwable eIgnore){
// rilancio eccezione originale
}
}
if(utilsException!=null) {
throw utilsException;
}
}
String debugParameters = "";
Object ret = null;
try{
if(parametersObject!=null && !parametersObject.isEmpty()) {
StringBuilder sb = new StringBuilder();
for (String par : parametersObject) {
if(sb.length()>0) {
sb.append(",");
}
sb.append(par);
}
debugParameters=sb.toString();
ret = m.invoke(o, parametersObject.toArray(new Object[1]));
}
else {
ret = m.invoke(o);
}
}catch(Throwable e){
Throwable tInternal = Utilities.getInnerNotEmptyMessageException(e);
String msgErrore = tInternal!=null ? tInternal.getMessage() : e.getMessage();
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: invocation method ["+o.getClass().getName()+"."+getMethod+"("+debugParameters+")] failed; "+msgErrore,e);
}
if(ret!=null){
if(ret instanceof List<?> || ret instanceof Map<?,?> || ret instanceof Object[]){
if(arrayMapPosition==null || arrayMapPosition.isEmpty()){
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: method ["+o.getClass().getName()+"."+getMethod+"("+debugParameters+")] return "+ret.getClass().getName()+" object without position");
}
while(!arrayMapPosition.isEmpty()) {
String position = arrayMapPosition.remove(0);
//System.out.println("ARRAY ["+ret.getClass().getName()+"]");
if(ret instanceof List<?> || ret instanceof Object[]){
int index = -1;
try{
index = Integer.parseInt(position);
}catch(Exception e){
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: method ["+o.getClass().getName()+"."+getMethod+"("+debugParameters+")] return "+ret.getClass().getName()+" object, wrong position value (not integer?): "+e.getMessage());
}
if(ret instanceof List<?>){
List<?> list = (List<?>) ret;
if(list.size()<=index){
if(required) {
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: method ["+o.getClass().getName()+"."+getMethod+"("+debugParameters+")] return "+ret.getClass().getName()+" object, wrong position '"+index+"' (list size:"+list.size()+")");
}
else {
ret = null;
}
}
else {
ret = list.get(index);
}
}
else if(ret instanceof Object[]){
Object[] arrayObj = (Object[]) ret;
if(arrayObj.length<=index){
if(required) {
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: method ["+o.getClass().getName()+"."+getMethod+"("+debugParameters+")] return "+ret.getClass().getName()+" object, wrong position '"+index+"' (array size:"+arrayObj.length+")");
}
else {
ret = null;
}
}
else {
ret = arrayObj[index];
}
}
}
else if(ret instanceof Map<?,?>){
Map<?,?> map = (Map<?,?>) ret;
//if(map.containsKey(position)==false){
if(containsKey(map, position)==false) {
if(required) {
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: method ["+o.getClass().getName()+"."+getMethod+"("+debugParameters+")] return "+ret.getClass().getName()+" object, '"+position+"' not exists in map");
}
else {
ret = null;
}
}
else {
//ret = map.get(position);
ret = get(map, position);
}
}
}
}
}
if(nameContainsPoint && complexField){
if(ret==null){
if(required) {
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: method ["+o.getClass().getName()+"."+getMethod+"("+debugParameters+")] return null object");
}
else {
return null;
}
}
else{
return readValueInObject(key, ret, name.substring((fieldName+".").length(), name.length()), complexField, required);
}
}
else{
// finale
if(ret!=null){
String finalValue = null;
if(ret instanceof Date){
SimpleDateFormat dateformat = new SimpleDateFormat("yyyyMMdd_HHmmssSSS");
finalValue = dateformat.format((Date)ret);
}
else if(ret instanceof byte[]){
// // 1024 = 1K
// // Visualizzo al massimo 1K
// int max = 1 * 1024;
// return org.openspcoop2.utils.Utilities.convertToPrintableText((byte[])ret, max);
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: method ["+o.getClass().getName()+"."+getMethod+"("+debugParameters+")] return object with type ["+ret.getClass().getName()+"]");
}
else{
finalValue = ret.toString();
}
return finalValue;
}
else{
if(required) {
throw new UtilsException("Placeholder [{"+key+"}] resolution failed: method ["+o.getClass().getName()+"."+getMethod+"("+debugParameters+")] return null object");
}
else {
return null;
}
}
}
}
}