Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/main/java/com/hubspot/jinjava/el/NoInvokeELResolver.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.hubspot.jinjava.el;

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

@Override
public void setValue(ELContext elContext, Object base, Object property, Object value) {
throw new DeferredParsingException("NoInvokeELResolver");
throw new DeferredValueException("NoInvokeELResolver");
}

@Override
Expand All @@ -60,6 +60,6 @@ public Object invoke(
Class<?>[] paramTypes,
Object[] params
) {
throw new DeferredParsingException("NoInvokeELResolver");
throw new DeferredValueException("NoInvokeELResolver");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,6 @@ public class DeferredParsingException extends DeferredValueException {
private final Object sourceNode;
private final IdentifierPreservationStrategy identifierPreservationStrategy;

public DeferredParsingException(String message) {
super(message);
this.deferredEvalResult = message;
this.sourceNode = null;
this.identifierPreservationStrategy = IdentifierPreservationStrategy.RESOLVING;
}

public DeferredParsingException(Object sourceNode, String deferredEvalResult) {
super(
String.format(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.hubspot.jinjava.el.ext.eager;

import com.hubspot.jinjava.objects.serialization.PyishBlockSetSerializable;
import java.util.Objects;

public class RenderFlatTempVariable implements PyishBlockSetSerializable {

private static final String CONTEXT_KEY_PREFIX = "__render_%d_temp_variable__";
private final String deferredResult;

public RenderFlatTempVariable(String deferredResult) {
this.deferredResult = deferredResult;
}

public static String getVarName(String result) {
return String.format(CONTEXT_KEY_PREFIX, Math.abs(result.hashCode() >> 1));
}

@Override
public String getBlockSetBody() {
return deferredResult;
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
RenderFlatTempVariable that = (RenderFlatTempVariable) o;
return deferredResult.equals(that.deferredResult);
}

@Override
public int hashCode() {
return Objects.hash(deferredResult);
}
}
31 changes: 23 additions & 8 deletions src/main/java/com/hubspot/jinjava/lib/filter/RenderFilter.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import com.hubspot.jinjava.doc.annotations.JinjavaDoc;
import com.hubspot.jinjava.doc.annotations.JinjavaParam;
import com.hubspot.jinjava.doc.annotations.JinjavaSnippet;
import com.hubspot.jinjava.el.ext.DeferredInvocationResolutionException;
import com.hubspot.jinjava.el.ext.eager.RenderFlatTempVariable;
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
import java.util.Objects;
import org.apache.commons.lang3.math.NumberUtils;
Expand All @@ -26,16 +28,29 @@ public String getName() {

@Override
public Object filter(Object var, JinjavaInterpreter interpreter, String... args) {
int numDeferredTokensStart = interpreter.getContext().getDeferredTokens().size();
String result;
if (args.length > 0) {
String firstArg = args[0];
return interpreter.renderFlat(
Objects.toString(var),
NumberUtils.toLong(
firstArg,
JinjavaConfig.newBuilder().build().getMaxOutputSize()
)
);
result =
interpreter.renderFlat(
Objects.toString(var),
NumberUtils.toLong(
firstArg,
JinjavaConfig.newBuilder().build().getMaxOutputSize()
)
);
} else {
result = interpreter.renderFlat(Objects.toString(var));
}
return interpreter.renderFlat(Objects.toString(var));
if (interpreter.getContext().getDeferredTokens().size() > numDeferredTokensStart) {
String tempVarName = RenderFlatTempVariable.getVarName(result);
interpreter
.getContext()
.getParent()
.put(tempVarName, new RenderFlatTempVariable(result));
throw new DeferredInvocationResolutionException(tempVarName);
}
return result;
}
}
14 changes: 4 additions & 10 deletions src/main/java/com/hubspot/jinjava/lib/tag/ForTag.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import com.hubspot.jinjava.doc.annotations.JinjavaParam;
import com.hubspot.jinjava.doc.annotations.JinjavaSnippet;
import com.hubspot.jinjava.doc.annotations.JinjavaTextMateSnippet;
import com.hubspot.jinjava.el.ext.DeferredParsingException;
import com.hubspot.jinjava.interpret.DeferredValue;
import com.hubspot.jinjava.interpret.DeferredValueException;
import com.hubspot.jinjava.interpret.InterpretException;
Expand Down Expand Up @@ -143,15 +142,10 @@ public String interpretUnchecked(TagNode tagNode, JinjavaInterpreter interpreter
List<String> loopVars = loopVarsAndExpression.getLeft();
String loopExpression = loopVarsAndExpression.getRight();

Object collection;
try {
collection =
interpreter.resolveELExpression(loopExpression, tagNode.getLineNumber());
} catch (DeferredParsingException e) {
throw new DeferredParsingException(
String.format("%s in %s", String.join(", ", loopVars), e.getDeferredEvalResult())
);
}
Object collection = interpreter.resolveELExpression(
loopExpression,
tagNode.getLineNumber()
);
return renderForCollection(tagNode, interpreter, loopVars, collection);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.hubspot.jinjava.random;

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

@Override
protected int next(int bits) {
throw new DeferredParsingException(EXCEPTION_MESSAGE);
throw new DeferredValueException(EXCEPTION_MESSAGE);
}

@Override
public int nextInt() {
throw new DeferredParsingException(EXCEPTION_MESSAGE);
throw new DeferredValueException(EXCEPTION_MESSAGE);
}

@Override
public int nextInt(int bound) {
throw new DeferredParsingException(EXCEPTION_MESSAGE);
throw new DeferredValueException(EXCEPTION_MESSAGE);
}

@Override
public long nextLong() {
throw new DeferredParsingException(EXCEPTION_MESSAGE);
throw new DeferredValueException(EXCEPTION_MESSAGE);
}

@Override
public boolean nextBoolean() {
throw new DeferredParsingException(EXCEPTION_MESSAGE);
throw new DeferredValueException(EXCEPTION_MESSAGE);
}

@Override
public float nextFloat() {
throw new DeferredParsingException(EXCEPTION_MESSAGE);
throw new DeferredValueException(EXCEPTION_MESSAGE);
}

@Override
public double nextDouble() {
throw new DeferredParsingException(EXCEPTION_MESSAGE);
throw new DeferredValueException(EXCEPTION_MESSAGE);
}

@Override
public synchronized double nextGaussian() {
throw new DeferredParsingException(EXCEPTION_MESSAGE);
throw new DeferredValueException(EXCEPTION_MESSAGE);
}

@Override
Expand Down
7 changes: 7 additions & 0 deletions src/test/java/com/hubspot/jinjava/EagerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -1669,4 +1669,11 @@ public void itHandlesDeferredContinueInForLoop() {
public void itReconstructsFromedMacro() {
expectedTemplateInterpreter.assertExpectedOutput("reconstructs-fromed-macro/test");
}

@Test
public void itHandlesDeferredValueInRenderFilter() {
expectedTemplateInterpreter.assertExpectedOutput(
"handles-deferred-value-in-render-filter/test"
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{% set __render_524436216_temp_variable__ %}\
Hi {{ filter:escape.filter(deferred, ____int3rpr3t3r____) }}\
{% endset %}\
{{ filter:escape_jinjava.filter(__render_524436216_temp_variable__, ____int3rpr3t3r____) }}

{% set __render_524436216_temp_variable__ %}\
Hi {{ filter:escape.filter(deferred, ____int3rpr3t3r____) }}\
{% endset %}\
{{ __render_524436216_temp_variable__ }}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{% set foo = "Hi {{ deferred|escape }}" %}
{{ foo|render|escape_jinjava }}

{{ foo|render }}