Skip to content

Commit d6fbcc3

Browse files
committed
improve log message on attach / detach failures #1558
1 parent 96eb351 commit d6fbcc3

File tree

1 file changed

+27
-23
lines changed

1 file changed

+27
-23
lines changed

karate-core/src/main/java/com/intuit/karate/core/ScenarioEngine.java

+27-23
Original file line numberDiff line numberDiff line change
@@ -1055,7 +1055,7 @@ private void attachVariables(Set<Object> seen) {
10551055
try {
10561056
vars.put(k, new Variable(o));
10571057
} catch (Exception e) {
1058-
logger.debug("[*** attach variables ***] failed to attach graal value: {} - {}", k, e.getMessage());
1058+
logger.debug("[*** attach variables ***] ignoring non-json value: '{}' - {}", k, e.getMessage());
10591059
}
10601060
}
10611061
JS.put(k, o);
@@ -1066,7 +1066,7 @@ protected Map<String, Variable> detachVariables() {
10661066
Set<Object> seen = Collections.newSetFromMap(new IdentityHashMap());
10671067
Map<String, Variable> detached = new HashMap(vars.size());
10681068
vars.forEach((k, v) -> {
1069-
Object o = recurseAndDetachAndDeepClone(v.getValue(), seen);
1069+
Object o = recurseAndDetachAndDeepClone(k, v.getValue(), seen);
10701070
detached.put(k, new Variable(o));
10711071
});
10721072
return detached;
@@ -1080,19 +1080,15 @@ protected void recurseAndAttach(String name, Object o) {
10801080

10811081
private Object recurseAndAttach(String name, Object o, Set<Object> seen) {
10821082
if (o instanceof Value) {
1083-
Value value = Value.asValue(o);
10841083
try {
1085-
if (value.canExecute()) {
1086-
if (value.isMetaObject()) { // js function
1087-
return attach(value);
1088-
} else { // java function
1089-
return value;
1090-
}
1091-
} else { // anything else, including java-type references
1084+
Value value = Value.asValue(o);
1085+
if (value.canExecute() && value.isMetaObject()) { // js function
1086+
return attach(value);
1087+
} else { // anything else, including java functions and java-type references
10921088
return value;
10931089
}
10941090
} catch (Exception e) {
1095-
logger.warn("[*** attach ***] failed to attach js value: {} - {}", name, e.getMessage());
1091+
logger.warn("[*** attach ***] ignoring non-json value: '{}' - {}", name, e.getMessage());
10961092
return null;
10971093
}
10981094
} else if (o instanceof JsFunction) {
@@ -1130,15 +1126,15 @@ private Object recurseAndAttach(String name, Object o, Set<Object> seen) {
11301126
// called only by result processing of callonce / callSingle
11311127
protected Object recurseAndAttachAndDeepClone(Object o) {
11321128
Set<Object> seen = Collections.newSetFromMap(new IdentityHashMap());
1133-
return recurseAndAttachAndDeepClone(o, seen);
1129+
return recurseAndAttachAndDeepClone("", o, seen);
11341130
}
11351131

1136-
private Object recurseAndAttachAndDeepClone(Object o, Set<Object> seen) {
1132+
private Object recurseAndAttachAndDeepClone(String name, Object o, Set<Object> seen) {
11371133
if (o instanceof Value) {
11381134
try {
11391135
return Value.asValue(o);
11401136
} catch (Exception e) {
1141-
logger.warn("[*** attach deep ***] failed to attach graal value: {}", e.getMessage());
1137+
logger.warn("[*** attach deep ***] ignoring non-json value: '{}' - {}", name, e.getMessage());
11421138
return null;
11431139
}
11441140
}
@@ -1148,8 +1144,12 @@ private Object recurseAndAttachAndDeepClone(Object o, Set<Object> seen) {
11481144
} else if (o instanceof List) {
11491145
if (seen.add(o)) {
11501146
List list = (List) o;
1151-
List copy = new ArrayList(list.size());
1152-
list.forEach(v -> copy.add(recurseAndAttachAndDeepClone(v, seen)));
1147+
int count = list.size();
1148+
List copy = new ArrayList(count);
1149+
for (int i = 0; i < count; i++) {
1150+
Object child = list.get(i);
1151+
copy.add(recurseAndAttachAndDeepClone(name + "[" + i + "]", child, seen));
1152+
}
11531153
return copy;
11541154
} else {
11551155
return o;
@@ -1158,7 +1158,7 @@ private Object recurseAndAttachAndDeepClone(Object o, Set<Object> seen) {
11581158
if (seen.add(o)) {
11591159
Map<String, Object> map = (Map) o;
11601160
Map<String, Object> copy = new LinkedHashMap(map.size());
1161-
map.forEach((k, v) -> copy.put(k, recurseAndAttachAndDeepClone(v, seen)));
1161+
map.forEach((k, v) -> copy.put(k, recurseAndAttachAndDeepClone(name + "." + k, v, seen)));
11621162
return copy;
11631163
} else {
11641164
return o;
@@ -1171,10 +1171,10 @@ private Object recurseAndAttachAndDeepClone(Object o, Set<Object> seen) {
11711171
// only for callonce and callSingle
11721172
protected Object recurseAndDetachAndDeepClone(Object o) {
11731173
Set<Object> seen = Collections.newSetFromMap(new IdentityHashMap());
1174-
return recurseAndDetachAndDeepClone(o, seen);
1174+
return recurseAndDetachAndDeepClone("", o, seen);
11751175
}
11761176

1177-
private Object recurseAndDetachAndDeepClone(Object o, Set<Object> seen) {
1177+
private Object recurseAndDetachAndDeepClone(String name, Object o, Set<Object> seen) {
11781178
if (o instanceof Value) {
11791179
Value value = (Value) o;
11801180
try {
@@ -1189,15 +1189,19 @@ private Object recurseAndDetachAndDeepClone(Object o, Set<Object> seen) {
11891189
o = JsValue.toJava(value);
11901190
}
11911191
} catch (Exception e) {
1192-
logger.warn("[*** detach deep ***] unsupported value in callonce / callSingle: {}", e.getMessage());
1192+
logger.warn("[*** detach deep ***] ignoring non-json value in callonce / callSingle: '{}' - {}", e.getMessage());
11931193
return null;
11941194
}
11951195
}
11961196
if (o instanceof List) {
11971197
if (seen.add(o)) {
11981198
List list = (List) o;
1199+
int count = list.size();
11991200
List copy = new ArrayList(list.size());
1200-
list.forEach(v -> copy.add(recurseAndDetachAndDeepClone(v, seen)));
1201+
for (int i = 0; i < count; i++) {
1202+
Object child = list.get(i);
1203+
copy.add(recurseAndDetachAndDeepClone(name + "[" + i + "]", child, seen));
1204+
}
12011205
return copy;
12021206
} else {
12031207
return o;
@@ -1206,7 +1210,7 @@ private Object recurseAndDetachAndDeepClone(Object o, Set<Object> seen) {
12061210
if (seen.add(o)) {
12071211
Map<String, Object> map = (Map) o;
12081212
Map<String, Object> copy = new LinkedHashMap(map.size());
1209-
map.forEach((k, v) -> copy.put(k, recurseAndDetachAndDeepClone(v, seen)));
1213+
map.forEach((k, v) -> copy.put(k, recurseAndDetachAndDeepClone(name + "." + k, v, seen)));
12101214
return copy;
12111215
} else {
12121216
return o;
@@ -1301,7 +1305,7 @@ public void setVariables(Map<String, Object> map) {
13011305
try {
13021306
setVariable(k, v);
13031307
} catch (Exception e) {
1304-
logger.warn("[*** set variables ***] skipping invalid graal value: {} - {}", k, e.getMessage());
1308+
logger.warn("[*** set variables ***] ignoring non-json value: {} - {}", k, e.getMessage());
13051309
}
13061310
});
13071311
}

0 commit comments

Comments
 (0)