39
39
import org .slf4j .LoggerFactory ;
40
40
41
41
import java .util .ArrayList ;
42
+ import java .util .Collections ;
42
43
import java .util .HashMap ;
43
44
import java .util .LinkedHashMap ;
44
45
import java .util .LinkedList ;
@@ -62,15 +63,19 @@ public class RecordTransformer { // checkstyle-disable-line ClassFanOutComplexit
62
63
private static final Logger LOG = LoggerFactory .getLogger (RecordTransformer .class );
63
64
64
65
private final List <Consumer <Record >> consumers = new LinkedList <>();
65
- private final List <Map <String , String >> vars = new ArrayList <>();
66
+ private final List <Map <String , String >> vars = new ArrayList <>(Collections . nCopies ( Vars . values (). length , null ) );
66
67
private final Metafix metafix ;
67
68
private final RecordTransformer parent ;
68
69
69
70
private Supplier <String > currentMessageSupplier ;
70
71
72
+ private enum Vars {
73
+ GLOBAL , STATIC , DYNAMIC
74
+ }
75
+
71
76
/*package-private*/ RecordTransformer (final Metafix metafix , final Fix fix ) {
72
77
this (metafix , fix .getElements (), null );
73
- addVars ( metafix .getVars ());
78
+ setVars ( Vars . GLOBAL , metafix .getVars ());
74
79
}
75
80
76
81
private RecordTransformer (final Metafix metafix , final List <Expression > expressions , final RecordTransformer parent ) {
@@ -103,19 +108,14 @@ private RecordTransformer childTransformer(final List<Expression> expressions) {
103
108
return new RecordTransformer (metafix , expressions , this );
104
109
}
105
110
106
- public void addVars (final Map <String , String > additionalVars ) {
107
- vars .add (additionalVars );
108
- }
109
-
110
- public void transform (final Record record , final Map <String , String > additionalVars ) {
111
- final int index = vars .size ();
112
- addVars (additionalVars );
111
+ public void transform (final Record record , final Map <String , String > dynamicVars ) {
112
+ final Map <String , String > oldDynamicVars = setVars (Vars .DYNAMIC , dynamicVars );
113
113
114
114
try {
115
115
transform (record );
116
116
}
117
117
finally {
118
- vars . remove ( index );
118
+ setVars ( Vars . DYNAMIC , oldDynamicVars );
119
119
}
120
120
}
121
121
@@ -269,9 +269,17 @@ private String executionExceptionMessage(final EObject object, final Resource re
269
269
resource .getURI (), node .getStartLine (), NodeModelUtils .getTokenText (node ));
270
270
}
271
271
272
+ /*package-private*/ void setVars (final Map <String , String > staticVars ) {
273
+ setVars (Vars .STATIC , staticVars );
274
+ }
275
+
276
+ private Map <String , String > setVars (final Vars type , final Map <String , String > newVars ) {
277
+ return vars .set (type .ordinal (), newVars );
278
+ }
279
+
272
280
private Map <String , String > getVars () {
273
281
final Map <String , String > mergedVars = parent != null ? parent .getVars () : new HashMap <>();
274
- vars .forEach (mergedVars ::putAll );
282
+ vars .stream (). filter ( v -> v != null ). forEach (mergedVars ::putAll );
275
283
return mergedVars ;
276
284
}
277
285
0 commit comments