Skip to content

Commit

Permalink
Add new class to consider temp variables for the purpose of preserving
Browse files Browse the repository at this point in the history
state to be meta context variables. Update var names to be consistent
and update usages
  • Loading branch information
jasmith-hs committed Sep 11, 2024
1 parent c0706d0 commit f9b6855
Show file tree
Hide file tree
Showing 27 changed files with 278 additions and 231 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.hubspot.jinjava.el.ext.IdentifierPreservationStrategy;
import com.hubspot.jinjava.interpret.DeferredValueException;
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
import com.hubspot.jinjava.interpret.MetaContextVariables;
import com.hubspot.jinjava.interpret.PartiallyDeferredValue;
import com.hubspot.jinjava.util.EagerExpressionResolver;
import de.odysseus.el.tree.Bindings;
Expand Down Expand Up @@ -125,11 +126,12 @@ static String reconstructNode(
if (astNode instanceof AstIdentifier) {
String name = ((AstIdentifier) astNode).getName();
if (
((JinjavaInterpreter) context
.getELResolver()
.getValue(context, null, ExtendedParser.INTERPRETER)).getContext()
.getComputedMetaContextVariables()
.contains(name)
MetaContextVariables.isMetaContextVariable(
name,
((JinjavaInterpreter) context
.getELResolver()
.getValue(context, null, ExtendedParser.INTERPRETER)).getContext()
)
) {
return name;
}
Expand Down
9 changes: 8 additions & 1 deletion src/main/java/com/hubspot/jinjava/interpret/Context.java
Original file line number Diff line number Diff line change
Expand Up @@ -337,14 +337,17 @@ public void addResolvedFunction(String function) {
}
}

/**
* @deprecated Use {@link MetaContextVariables#isMetaContextVariable(String, Context)}
*/
@Deprecated
@Beta
public Set<String> getMetaContextVariables() {
return metaContextVariables;
}

@Beta
public Set<String> getComputedMetaContextVariables() {
Set<String> getComputedMetaContextVariables() {
return Sets.difference(metaContextVariables, overriddenNonMetaContextVariables);
}

Expand All @@ -353,6 +356,10 @@ public void addMetaContextVariables(Collection<String> variables) {
metaContextVariables.addAll(variables);
}

Set<String> getNonMetaContextVariables() {
return overriddenNonMetaContextVariables;
}

@Beta
public void addNonMetaContextVariables(Collection<String> variables) {
overriddenNonMetaContextVariables.addAll(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.hubspot.jinjava.interpret;

import com.google.common.annotations.Beta;
import java.util.Objects;

@Beta
public class MetaContextVariables {

public static final String TEMPORARY_META_CONTEXT_PREFIX = "__temp_meta_";
private static final String TEMPORARY_IMPORT_ALIAS_PREFIX =
TEMPORARY_META_CONTEXT_PREFIX + "import_alias_";

private static final String TEMPORARY_IMPORT_ALIAS_FORMAT =
TEMPORARY_IMPORT_ALIAS_PREFIX + "%d__";
private static final String TEMP_CURRENT_PATH_PREFIX =
TEMPORARY_META_CONTEXT_PREFIX + "current_path_";
private static final String TEMP_CURRENT_PATH_FORMAT =
TEMP_CURRENT_PATH_PREFIX + "%d__";

public static boolean isMetaContextVariable(String varName, Context context) {
if (isTemporaryMetaContextVariable(varName)) {
return true;
}
return (
context.getMetaContextVariables().contains(varName) &&
!context.getNonMetaContextVariables().contains(varName)
);
}

private static boolean isTemporaryMetaContextVariable(String varName) {
return varName.startsWith(TEMPORARY_META_CONTEXT_PREFIX);
}

public static boolean isTemporaryImportAlias(String varName) {
// This is just faster than checking a regex
return varName.startsWith(TEMPORARY_IMPORT_ALIAS_PREFIX);
}

public static String getTemporaryImportAlias(String fullAlias) {
return String.format(
TEMPORARY_IMPORT_ALIAS_FORMAT,
Math.abs(Objects.hashCode(fullAlias))
);
}

public static String getTemporaryCurrentPathVarName(String newPath) {
return String.format(
TEMP_CURRENT_PATH_FORMAT,
Math.abs(Objects.hash(newPath, TEMPORARY_META_CONTEXT_PREFIX) >> 1)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.hubspot.jinjava.interpret.DeferredValue;
import com.hubspot.jinjava.interpret.DeferredValueShadow;
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
import com.hubspot.jinjava.interpret.MetaContextVariables;
import com.hubspot.jinjava.tree.parse.Token;
import com.hubspot.jinjava.tree.parse.TokenScannerSymbols;
import com.hubspot.jinjava.util.EagerExpressionResolver;
Expand Down Expand Up @@ -376,7 +377,7 @@ private static Collection<String> markDeferredWordsAndFindSources(
}
return !(val instanceof DeferredValue);
})
.filter(prop -> !context.getComputedMetaContextVariables().contains(prop))
.filter(prop -> !MetaContextVariables.isMetaContextVariable(prop, context))
.filter(prop -> {
DeferredValue deferredValue = convertToDeferredValue(context, prop);
context.put(prop, deferredValue);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import com.google.common.annotations.Beta;
import com.hubspot.jinjava.interpret.DeferredValueException;
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
import com.hubspot.jinjava.interpret.MetaContextVariables;
import com.hubspot.jinjava.lib.tag.SetTag;
import com.hubspot.jinjava.lib.tag.eager.importing.AliasedEagerImportingStrategy;
import com.hubspot.jinjava.tree.TagNode;
import com.hubspot.jinjava.util.EagerReconstructionUtils;
import com.hubspot.jinjava.util.PrefixToPreserveState;
Expand Down Expand Up @@ -180,16 +180,17 @@ private static String getSuffixToPreserveState(
JinjavaInterpreter interpreter
) {
StringBuilder suffixToPreserveState = new StringBuilder();
Optional<String> maybeTemporaryImportAlias =
AliasedEagerImportingStrategy.getTemporaryImportAlias(interpreter.getContext());
Optional<String> maybeTemporaryImportAlias = interpreter
.getContext()
.getImportResourceAlias()
.map(MetaContextVariables::getTemporaryImportAlias);
if (maybeTemporaryImportAlias.isPresent()) {
boolean stillInsideImportTag = interpreter
.getContext()
.containsKey(maybeTemporaryImportAlias.get());
List<String> filteredVars = varStream
.filter(var -> !AliasedEagerImportingStrategy.isTemporaryImportAlias(var))
.filter(var ->
!interpreter.getContext().getComputedMetaContextVariables().contains(var)
!MetaContextVariables.isMetaContextVariable(var, interpreter.getContext())
)
.peek(var -> {
if (!stillInsideImportTag) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.hubspot.jinjava.interpret.DeferredValueException;
import com.hubspot.jinjava.interpret.InterpretException;
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
import com.hubspot.jinjava.interpret.MetaContextVariables;
import com.hubspot.jinjava.lib.fn.MacroFunction;
import com.hubspot.jinjava.lib.tag.eager.DeferredToken;
import com.hubspot.jinjava.objects.collections.PyMap;
Expand All @@ -16,35 +17,12 @@
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.StringJoiner;
import java.util.stream.Stream;

public class AliasedEagerImportingStrategy implements EagerImportingStrategy {

private static final String TEMPORARY_IMPORT_ALIAS_PREFIX = "__temp_import_alias_";
private static final String TEMPORARY_IMPORT_ALIAS_FORMAT =
TEMPORARY_IMPORT_ALIAS_PREFIX + "%d__";

public static Optional<String> getTemporaryImportAlias(Context context) {
return context
.getImportResourceAlias()
.map(AliasedEagerImportingStrategy::getTemporaryImportAlias);
}

public static boolean isTemporaryImportAlias(String varName) {
// This is just faster than checking a regex
return varName.startsWith(TEMPORARY_IMPORT_ALIAS_PREFIX);
}

private static String getTemporaryImportAlias(String fullAlias) {
return String.format(
TEMPORARY_IMPORT_ALIAS_FORMAT,
Math.abs(Objects.hashCode(fullAlias))
);
}

private final ImportingData importingData;
private final String currentImportAlias;
private final String fullImportAlias;
Expand Down Expand Up @@ -95,7 +73,10 @@ public void setup(JinjavaInterpreter child) {
importingData
.getOriginalInterpreter()
.getContext()
.put(getTemporaryImportAlias(fullImportAlias), DeferredValue.instance());
.put(
MetaContextVariables.getTemporaryImportAlias(fullImportAlias),
DeferredValue.instance()
);
}

@Override
Expand All @@ -108,7 +89,9 @@ public void integrateChild(JinjavaInterpreter child) {
}
Map<String, Object> childBindings = child.getContext().getSessionBindings();
childBindings.putAll(child.getContext().getGlobalMacros());
String temporaryImportAlias = getTemporaryImportAlias(fullImportAlias);
String temporaryImportAlias = MetaContextVariables.getTemporaryImportAlias(
fullImportAlias
);
Map<String, Object> mapForCurrentContextAlias = getMapForCurrentContextAlias(
currentImportAlias,
child
Expand All @@ -128,7 +111,9 @@ public void integrateChild(JinjavaInterpreter child) {

@Override
public String getFinalOutput(String output, JinjavaInterpreter child) {
String temporaryImportAlias = getTemporaryImportAlias(fullImportAlias);
String temporaryImportAlias = MetaContextVariables.getTemporaryImportAlias(
fullImportAlias
);
return (
EagerReconstructionUtils.buildBlockOrInlineSetTag(
temporaryImportAlias,
Expand Down Expand Up @@ -237,7 +222,9 @@ private String getDoTagToPreserve(
JinjavaInterpreter child
) {
StringJoiner keyValueJoiner = new StringJoiner(",");
String temporaryImportAlias = getTemporaryImportAlias(fullImportAlias);
String temporaryImportAlias = MetaContextVariables.getTemporaryImportAlias(
fullImportAlias
);
Map<String, Object> currentAliasMap = getMapForCurrentContextAlias(
currentImportAlias,
child
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
import com.hubspot.jinjava.interpret.DeferredValue;
import com.hubspot.jinjava.interpret.DeferredValueException;
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
import com.hubspot.jinjava.interpret.MetaContextVariables;
import com.hubspot.jinjava.lib.fn.MacroFunction;
import com.hubspot.jinjava.lib.tag.ImportTag;
import com.hubspot.jinjava.util.EagerReconstructionUtils;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.stream.Collectors;

public class FlatEagerImportingStrategy implements EagerImportingStrategy {
Expand Down Expand Up @@ -65,11 +65,8 @@ public void integrateChild(JinjavaInterpreter child) {
@Override
public String getFinalOutput(String output, JinjavaInterpreter child) {
if (importingData.getOriginalInterpreter().getContext().isDeferredExecutionMode()) {
Set<String> metaContextVariables = importingData
.getOriginalInterpreter()
.getContext()
.getComputedMetaContextVariables();
// defer imported variables
Context context = importingData.getOriginalInterpreter().getContext();
EagerReconstructionUtils.buildSetTag(
child
.getContext()
Expand All @@ -79,7 +76,9 @@ public String getFinalOutput(String output, JinjavaInterpreter child) {
.filter(entry ->
!(entry.getValue() instanceof DeferredValue) && entry.getValue() != null
)
.filter(entry -> !metaContextVariables.contains(entry.getKey()))
.filter(entry ->
!MetaContextVariables.isMetaContextVariable(entry.getKey(), context)
)
.collect(Collectors.toMap(Entry::getKey, entry -> "")),
importingData.getOriginalInterpreter(),
true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.hubspot.jinjava.interpret.Context;
import com.hubspot.jinjava.interpret.DeferredValue;
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
import com.hubspot.jinjava.interpret.MetaContextVariables;
import com.hubspot.jinjava.interpret.PartiallyDeferredValue;
import com.hubspot.jinjava.lib.tag.SetTag;
import com.hubspot.jinjava.tree.ExpressionNode;
Expand Down Expand Up @@ -119,7 +120,7 @@ private static void markDeferredProperties(Context context, Set<String> props) {
props
.stream()
.filter(prop -> !(context.get(prop) instanceof DeferredValue))
.filter(prop -> !context.getComputedMetaContextVariables().contains(prop))
.filter(prop -> !MetaContextVariables.isMetaContextVariable(prop, context))
.forEach(prop -> {
Object value = context.get(prop);
if (value != null) {
Expand Down
Loading

0 comments on commit f9b6855

Please sign in to comment.