Skip to content

Commit 05fc3ce

Browse files
authored
Merge branch 'master' into use-is-resolvable-instead
2 parents 3703851 + d7dc652 commit 05fc3ce

10 files changed

Lines changed: 100 additions & 39 deletions

File tree

pom.xml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,13 @@
1010

1111
<groupId>com.hubspot.jinjava</groupId>
1212
<artifactId>jinjava</artifactId>
13-
<version>2.8.3-SNAPSHOT</version>
13+
<version>2.8.4-SNAPSHOT</version>
1414

1515
<name>${project.groupId}:${project.artifactId}</name>
1616
<description>Jinja templating engine implemented in Java</description>
1717

1818
<properties>
1919
<project.build.targetJdk>17</project.build.targetJdk>
20-
<hubspot.build.moved.after>1770136059427</hubspot.build.moved.after>
2120

2221
<dep.plugin.jacoco.version>0.8.3</dep.plugin.jacoco.version>
2322
<dep.plugin.javadoc.version>3.0.1</dep.plugin.javadoc.version>

src/main/java/com/hubspot/jinjava/el/NoInvokeELResolver.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.hubspot.jinjava.el;
22

3-
import com.hubspot.jinjava.el.ext.DeferredParsingException;
3+
import com.hubspot.jinjava.interpret.DeferredValueException;
44
import java.beans.FeatureDescriptor;
55
import java.util.Iterator;
66
import javax.el.ELContext;
@@ -49,7 +49,7 @@ public boolean isReadOnly(ELContext elContext, Object base, Object property) {
4949

5050
@Override
5151
public void setValue(ELContext elContext, Object base, Object property, Object value) {
52-
throw new DeferredParsingException("NoInvokeELResolver");
52+
throw new DeferredValueException("NoInvokeELResolver");
5353
}
5454

5555
@Override
@@ -60,6 +60,6 @@ public Object invoke(
6060
Class<?>[] paramTypes,
6161
Object[] params
6262
) {
63-
throw new DeferredParsingException("NoInvokeELResolver");
63+
throw new DeferredValueException("NoInvokeELResolver");
6464
}
6565
}

src/main/java/com/hubspot/jinjava/el/ext/DeferredParsingException.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,6 @@ public class DeferredParsingException extends DeferredValueException {
88
private final Object sourceNode;
99
private final IdentifierPreservationStrategy identifierPreservationStrategy;
1010

11-
public DeferredParsingException(String message) {
12-
super(message);
13-
this.deferredEvalResult = message;
14-
this.sourceNode = null;
15-
this.identifierPreservationStrategy = IdentifierPreservationStrategy.RESOLVING;
16-
}
17-
1811
public DeferredParsingException(Object sourceNode, String deferredEvalResult) {
1912
super(
2013
String.format(
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.hubspot.jinjava.el.ext.eager;
2+
3+
import com.hubspot.jinjava.objects.serialization.PyishBlockSetSerializable;
4+
import java.util.Objects;
5+
6+
public class RenderFlatTempVariable implements PyishBlockSetSerializable {
7+
8+
private static final String CONTEXT_KEY_PREFIX = "__render_%d_temp_variable__";
9+
private final String deferredResult;
10+
11+
public RenderFlatTempVariable(String deferredResult) {
12+
this.deferredResult = deferredResult;
13+
}
14+
15+
public static String getVarName(String result) {
16+
return String.format(CONTEXT_KEY_PREFIX, Math.abs(result.hashCode() >> 1));
17+
}
18+
19+
@Override
20+
public String getBlockSetBody() {
21+
return deferredResult;
22+
}
23+
24+
@Override
25+
public boolean equals(Object o) {
26+
if (this == o) {
27+
return true;
28+
}
29+
if (o == null || getClass() != o.getClass()) {
30+
return false;
31+
}
32+
RenderFlatTempVariable that = (RenderFlatTempVariable) o;
33+
return deferredResult.equals(that.deferredResult);
34+
}
35+
36+
@Override
37+
public int hashCode() {
38+
return Objects.hash(deferredResult);
39+
}
40+
}

src/main/java/com/hubspot/jinjava/lib/filter/RenderFilter.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.hubspot.jinjava.doc.annotations.JinjavaDoc;
55
import com.hubspot.jinjava.doc.annotations.JinjavaParam;
66
import com.hubspot.jinjava.doc.annotations.JinjavaSnippet;
7+
import com.hubspot.jinjava.el.ext.DeferredInvocationResolutionException;
8+
import com.hubspot.jinjava.el.ext.eager.RenderFlatTempVariable;
79
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
810
import java.util.Objects;
911
import org.apache.commons.lang3.math.NumberUtils;
@@ -26,16 +28,29 @@ public String getName() {
2628

2729
@Override
2830
public Object filter(Object var, JinjavaInterpreter interpreter, String... args) {
31+
int numDeferredTokensStart = interpreter.getContext().getDeferredTokens().size();
32+
String result;
2933
if (args.length > 0) {
3034
String firstArg = args[0];
31-
return interpreter.renderFlat(
32-
Objects.toString(var),
33-
NumberUtils.toLong(
34-
firstArg,
35-
JinjavaConfig.newBuilder().build().getMaxOutputSize()
36-
)
37-
);
35+
result =
36+
interpreter.renderFlat(
37+
Objects.toString(var),
38+
NumberUtils.toLong(
39+
firstArg,
40+
JinjavaConfig.newBuilder().build().getMaxOutputSize()
41+
)
42+
);
43+
} else {
44+
result = interpreter.renderFlat(Objects.toString(var));
3845
}
39-
return interpreter.renderFlat(Objects.toString(var));
46+
if (interpreter.getContext().getDeferredTokens().size() > numDeferredTokensStart) {
47+
String tempVarName = RenderFlatTempVariable.getVarName(result);
48+
interpreter
49+
.getContext()
50+
.getParent()
51+
.put(tempVarName, new RenderFlatTempVariable(result));
52+
throw new DeferredInvocationResolutionException(tempVarName);
53+
}
54+
return result;
4055
}
4156
}

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

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import com.hubspot.jinjava.doc.annotations.JinjavaParam;
2222
import com.hubspot.jinjava.doc.annotations.JinjavaSnippet;
2323
import com.hubspot.jinjava.doc.annotations.JinjavaTextMateSnippet;
24-
import com.hubspot.jinjava.el.ext.DeferredParsingException;
2524
import com.hubspot.jinjava.interpret.DeferredValue;
2625
import com.hubspot.jinjava.interpret.DeferredValueException;
2726
import com.hubspot.jinjava.interpret.InterpretException;
@@ -143,15 +142,10 @@ public String interpretUnchecked(TagNode tagNode, JinjavaInterpreter interpreter
143142
List<String> loopVars = loopVarsAndExpression.getLeft();
144143
String loopExpression = loopVarsAndExpression.getRight();
145144

146-
Object collection;
147-
try {
148-
collection =
149-
interpreter.resolveELExpression(loopExpression, tagNode.getLineNumber());
150-
} catch (DeferredParsingException e) {
151-
throw new DeferredParsingException(
152-
String.format("%s in %s", String.join(", ", loopVars), e.getDeferredEvalResult())
153-
);
154-
}
145+
Object collection = interpreter.resolveELExpression(
146+
loopExpression,
147+
tagNode.getLineNumber()
148+
);
155149
return renderForCollection(tagNode, interpreter, loopVars, collection);
156150
}
157151

src/main/java/com/hubspot/jinjava/random/DeferredRandomNumberGenerator.java

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

3-
import com.hubspot.jinjava.el.ext.DeferredParsingException;
3+
import com.hubspot.jinjava.interpret.DeferredValueException;
44
import java.util.Random;
55
import java.util.stream.DoubleStream;
66
import java.util.stream.IntStream;
@@ -15,42 +15,42 @@ public class DeferredRandomNumberGenerator extends Random {
1515

1616
@Override
1717
protected int next(int bits) {
18-
throw new DeferredParsingException(EXCEPTION_MESSAGE);
18+
throw new DeferredValueException(EXCEPTION_MESSAGE);
1919
}
2020

2121
@Override
2222
public int nextInt() {
23-
throw new DeferredParsingException(EXCEPTION_MESSAGE);
23+
throw new DeferredValueException(EXCEPTION_MESSAGE);
2424
}
2525

2626
@Override
2727
public int nextInt(int bound) {
28-
throw new DeferredParsingException(EXCEPTION_MESSAGE);
28+
throw new DeferredValueException(EXCEPTION_MESSAGE);
2929
}
3030

3131
@Override
3232
public long nextLong() {
33-
throw new DeferredParsingException(EXCEPTION_MESSAGE);
33+
throw new DeferredValueException(EXCEPTION_MESSAGE);
3434
}
3535

3636
@Override
3737
public boolean nextBoolean() {
38-
throw new DeferredParsingException(EXCEPTION_MESSAGE);
38+
throw new DeferredValueException(EXCEPTION_MESSAGE);
3939
}
4040

4141
@Override
4242
public float nextFloat() {
43-
throw new DeferredParsingException(EXCEPTION_MESSAGE);
43+
throw new DeferredValueException(EXCEPTION_MESSAGE);
4444
}
4545

4646
@Override
4747
public double nextDouble() {
48-
throw new DeferredParsingException(EXCEPTION_MESSAGE);
48+
throw new DeferredValueException(EXCEPTION_MESSAGE);
4949
}
5050

5151
@Override
5252
public synchronized double nextGaussian() {
53-
throw new DeferredParsingException(EXCEPTION_MESSAGE);
53+
throw new DeferredValueException(EXCEPTION_MESSAGE);
5454
}
5555

5656
@Override

src/test/java/com/hubspot/jinjava/EagerTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1747,4 +1747,11 @@ public void itDoesNotStackOverflowTryingToBuildHashcode() {
17471747
"does-not-stack-overflow-trying-to-build-hashcode/test"
17481748
);
17491749
}
1750+
1751+
@Test
1752+
public void itHandlesDeferredValueInRenderFilter() {
1753+
expectedTemplateInterpreter.assertExpectedOutput(
1754+
"handles-deferred-value-in-render-filter/test"
1755+
);
1756+
}
17501757
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{% set __render_524436216_temp_variable__ %}\
2+
Hi {{ filter:escape.filter(deferred, ____int3rpr3t3r____) }}\
3+
{% endset %}\
4+
{{ filter:escape_jinjava.filter(__render_524436216_temp_variable__, ____int3rpr3t3r____) }}
5+
6+
{% set __render_524436216_temp_variable__ %}\
7+
Hi {{ filter:escape.filter(deferred, ____int3rpr3t3r____) }}\
8+
{% endset %}\
9+
{{ __render_524436216_temp_variable__ }}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{% set foo = "Hi {{ deferred|escape }}" %}
2+
{{ foo|render|escape_jinjava }}
3+
4+
{{ foo|render }}

0 commit comments

Comments
 (0)