Skip to content

Commit 92f9f0a

Browse files
committed
Add AutoCloseableWrapper to help avoid requiring explicit popping
1 parent 6bcb7cb commit 92f9f0a

4 files changed

Lines changed: 49 additions & 25 deletions

File tree

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.hubspot.jinjava.interpret;
2+
3+
import java.util.function.Consumer;
4+
5+
public class AutoCloseableWrapper<T> implements AutoCloseable {
6+
7+
private final T t;
8+
private final Consumer<T> closeConsumer;
9+
10+
public static <T> AutoCloseableWrapper<T> of(T t, Consumer<T> closeConsumer) {
11+
return new AutoCloseableWrapper<>(t, closeConsumer);
12+
}
13+
14+
protected AutoCloseableWrapper(T t, Consumer<T> closeConsumer) {
15+
this.t = t;
16+
this.closeConsumer = closeConsumer;
17+
}
18+
19+
public T get() {
20+
return t;
21+
}
22+
23+
@Override
24+
public void close() {
25+
closeConsumer.accept(t);
26+
}
27+
}

src/main/java/com/hubspot/jinjava/interpret/Context.java

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -878,25 +878,16 @@ public TemporaryValueClosable<Boolean> withUnwrapRawOverride() {
878878
return temporaryValueClosable;
879879
}
880880

881-
public static class TemporaryValueClosable<T> implements AutoCloseable {
882-
883-
private final T previousValue;
884-
private final Consumer<T> resetValueConsumer;
881+
public static class TemporaryValueClosable<T> extends AutoCloseableWrapper<T> {
885882

886883
private TemporaryValueClosable(T previousValue, Consumer<T> resetValueConsumer) {
887-
this.previousValue = previousValue;
888-
this.resetValueConsumer = resetValueConsumer;
884+
super(previousValue, resetValueConsumer);
889885
}
890886

891887
public static <T> TemporaryValueClosable<T> noOp() {
892888
return new NoOpTemporaryValueClosable<>();
893889
}
894890

895-
@Override
896-
public void close() {
897-
resetValueConsumer.accept(previousValue);
898-
}
899-
900891
private static class NoOpTemporaryValueClosable<T> extends TemporaryValueClosable<T> {
901892

902893
private NoOpTemporaryValueClosable() {

src/main/java/com/hubspot/jinjava/lib/tag/ImportTag.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.hubspot.jinjava.doc.annotations.JinjavaParam;
66
import com.hubspot.jinjava.doc.annotations.JinjavaSnippet;
77
import com.hubspot.jinjava.doc.annotations.JinjavaTextMateSnippet;
8+
import com.hubspot.jinjava.interpret.AutoCloseableWrapper;
89
import com.hubspot.jinjava.interpret.Context;
910
import com.hubspot.jinjava.interpret.DeferredValue;
1011
import com.hubspot.jinjava.interpret.DeferredValueException;
@@ -90,9 +91,9 @@ public String interpret(TagNode tagNode, JinjavaInterpreter interpreter) {
9091
return "";
9192
}
9293
String templateFile = maybeTemplateFile.get();
93-
try {
94-
Node node = parseTemplateAsNode(interpreter, templateFile);
95-
94+
try (
95+
AutoCloseableWrapper<Node> node = parseTemplateAsNode(interpreter, templateFile);
96+
) {
9697
JinjavaInterpreter child = interpreter
9798
.getConfig()
9899
.getInterpreterFactory()
@@ -102,7 +103,7 @@ public String interpret(TagNode tagNode, JinjavaInterpreter interpreter) {
102103
JinjavaInterpreter.pushCurrent(child);
103104

104105
try {
105-
child.render(node);
106+
child.render(node.get());
106107
} finally {
107108
JinjavaInterpreter.popCurrent();
108109
}
@@ -114,7 +115,7 @@ public String interpret(TagNode tagNode, JinjavaInterpreter interpreter) {
114115
// If the template depends on deferred values it should not be rendered and all defined variables and macros should be deferred too
115116
if (!child.getContext().getDeferredNodes().isEmpty()) {
116117
handleDeferredNodesDuringImport(
117-
node,
118+
node.get(),
118119
contextVar,
119120
childBindings,
120121
child,
@@ -137,7 +138,6 @@ public String interpret(TagNode tagNode, JinjavaInterpreter interpreter) {
137138
tagNode.getStartPosition()
138139
);
139140
} finally {
140-
interpreter.getContext().getCurrentPathStack().pop();
141141
interpreter.getContext().getImportPathStack().pop();
142142
}
143143
}
@@ -210,7 +210,7 @@ public static void handleDeferredNodesDuringImport(
210210
}
211211
}
212212

213-
public static Node parseTemplateAsNode(
213+
public static AutoCloseableWrapper<Node> parseTemplateAsNode(
214214
JinjavaInterpreter interpreter,
215215
String templateFile
216216
) throws IOException {
@@ -220,7 +220,10 @@ public static Node parseTemplateAsNode(
220220
.push(templateFile, interpreter.getLineNumber(), interpreter.getPosition());
221221

222222
String template = interpreter.getResource(templateFile);
223-
return interpreter.parse(template);
223+
return AutoCloseableWrapper.of(
224+
interpreter.parse(template),
225+
n -> interpreter.getContext().getCurrentPathStack().pop()
226+
);
224227
}
225228

226229
public static Optional<String> getTemplateFile(

src/main/java/com/hubspot/jinjava/lib/tag/eager/EagerImportTag.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.hubspot.jinjava.lib.tag.eager;
22

33
import com.google.common.annotations.Beta;
4+
import com.hubspot.jinjava.interpret.AutoCloseableWrapper;
45
import com.hubspot.jinjava.interpret.Context;
56
import com.hubspot.jinjava.interpret.DeferredValueException;
67
import com.hubspot.jinjava.interpret.InterpretException;
@@ -49,9 +50,12 @@ public String getEagerTagImage(TagToken tagToken, JinjavaInterpreter interpreter
4950
return "";
5051
}
5152
String templateFile = maybeTemplateFile.get();
52-
try {
53-
Node node = ImportTag.parseTemplateAsNode(interpreter, templateFile);
54-
53+
try (
54+
AutoCloseableWrapper<Node> node = ImportTag.parseTemplateAsNode(
55+
interpreter,
56+
templateFile
57+
)
58+
) {
5559
JinjavaInterpreter child = interpreter
5660
.getConfig()
5761
.getInterpreterFactory()
@@ -61,7 +65,7 @@ public String getEagerTagImage(TagToken tagToken, JinjavaInterpreter interpreter
6165
String output;
6266
try {
6367
eagerImportingStrategy.setup(child);
64-
output = child.render(node);
68+
output = child.render(node.get());
6569
} finally {
6670
JinjavaInterpreter.popCurrent();
6771
}
@@ -76,7 +80,7 @@ public String getEagerTagImage(TagToken tagToken, JinjavaInterpreter interpreter
7680
!child.getContext().getGlobalMacros().isEmpty())
7781
) {
7882
ImportTag.handleDeferredNodesDuringImport(
79-
node,
83+
node.get(),
8084
ImportTag.getContextVar(importingData.getHelpers()),
8185
childBindings,
8286
child,
@@ -110,7 +114,6 @@ public String getEagerTagImage(TagToken tagToken, JinjavaInterpreter interpreter
110114
tagToken.getStartPosition()
111115
);
112116
} finally {
113-
interpreter.getContext().getCurrentPathStack().pop();
114117
interpreter.getContext().getImportPathStack().pop();
115118
}
116119
}

0 commit comments

Comments
 (0)