Skip to content

Commit c0706d0

Browse files
committed
Use the strategy of setting a temp variable to wrap current_path instead
1 parent 47b4258 commit c0706d0

26 files changed

Lines changed: 206 additions & 146 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ protected Triple<String, String, String> getPrefixTokenAndSuffix(
170170
.build()
171171
)
172172
);
173-
String suffixToPreserveState = getSuffixToPreserveState(variables[0], interpreter);
173+
String suffixToPreserveState = getSuffixToPreserveState(variables, interpreter);
174174
return Triple.of(
175175
prefixToPreserveState.toString(),
176176
joiner.toString(),

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ public String getEagerTagImage(TagToken tagToken, JinjavaInterpreter interpreter
3838
importingData
3939
);
4040

41-
final String newPathSetter;
42-
4341
Optional<String> maybeTemplateFile;
4442
try {
4543
maybeTemplateFile =
@@ -53,7 +51,6 @@ public String getEagerTagImage(TagToken tagToken, JinjavaInterpreter interpreter
5351
String templateFile = maybeTemplateFile.get();
5452
try {
5553
Node node = ImportTag.parseTemplateAsNode(interpreter, templateFile);
56-
newPathSetter = EagerImportingStrategyFactory.getSetTagForCurrentPath(interpreter);
5754

5855
JinjavaInterpreter child = interpreter
5956
.getConfig()
@@ -96,7 +93,11 @@ public String getEagerTagImage(TagToken tagToken, JinjavaInterpreter interpreter
9693
return "";
9794
}
9895
return EagerReconstructionUtils.wrapInTag(
99-
eagerImportingStrategy.getFinalOutput(newPathSetter, output, child),
96+
EagerReconstructionUtils.wrapPathAroundText(
97+
eagerImportingStrategy.getFinalOutput(output, child),
98+
templateFile,
99+
interpreter
100+
),
100101
DoTag.TAG_NAME,
101102
interpreter,
102103
true

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.google.common.annotations.Beta;
44
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
55
import com.hubspot.jinjava.lib.tag.IncludeTag;
6-
import com.hubspot.jinjava.lib.tag.eager.importing.EagerImportingStrategyFactory;
76
import com.hubspot.jinjava.loader.RelativePathResolver;
87
import com.hubspot.jinjava.tree.TagNode;
98
import com.hubspot.jinjava.util.EagerReconstructionUtils;
@@ -30,14 +29,16 @@ public String innerInterpret(TagNode tagNode, JinjavaInterpreter interpreter) {
3029
tagNode.getStartPosition()
3130
);
3231
templateFile = interpreter.resolveResourceLocation(templateFile);
33-
final String initialPathSetter =
34-
EagerImportingStrategyFactory.getSetTagForCurrentPath(interpreter);
3532
final String newPathSetter = EagerReconstructionUtils.buildBlockOrInlineSetTag(
3633
RelativePathResolver.CURRENT_PATH_CONTEXT_KEY,
3734
templateFile,
3835
interpreter
3936
);
40-
return newPathSetter + output + initialPathSetter;
37+
return EagerReconstructionUtils.wrapPathAroundText(
38+
output,
39+
templateFile,
40+
interpreter
41+
);
4142
}
4243
return output;
4344
}

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,7 @@ public Triple<String, String, String> getPrefixTokenAndSuffix(
101101
.build()
102102
)
103103
);
104-
String suffixToPreserveState = getSuffixToPreserveState(
105-
String.join(",", Arrays.asList(variables)),
106-
interpreter
107-
);
104+
String suffixToPreserveState = getSuffixToPreserveState(variables, interpreter);
108105
return Triple.of(
109106
prefixToPreserveState.toString(),
110107
joiner.toString(),

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

Lines changed: 53 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.util.Optional;
1414
import java.util.StringJoiner;
1515
import java.util.stream.Collectors;
16+
import java.util.stream.Stream;
1617
import org.apache.commons.lang3.tuple.Triple;
1718

1819
@Beta
@@ -155,39 +156,65 @@ protected PrefixToPreserveState getPrefixToPreserveState(
155156
}
156157

157158
public static String getSuffixToPreserveState(
158-
String variables,
159+
List<String> varList,
159160
JinjavaInterpreter interpreter
160161
) {
161-
if (variables.isEmpty()) {
162+
if (varList.isEmpty()) {
162163
return "";
163164
}
165+
return getSuffixToPreserveState(varList.stream(), interpreter);
166+
}
167+
168+
public static String getSuffixToPreserveState(
169+
String[] varList,
170+
JinjavaInterpreter interpreter
171+
) {
172+
if (varList.length == 0) {
173+
return "";
174+
}
175+
return getSuffixToPreserveState(Arrays.stream(varList), interpreter);
176+
}
177+
178+
private static String getSuffixToPreserveState(
179+
Stream<String> varStream,
180+
JinjavaInterpreter interpreter
181+
) {
164182
StringBuilder suffixToPreserveState = new StringBuilder();
165183
Optional<String> maybeTemporaryImportAlias =
166184
AliasedEagerImportingStrategy.getTemporaryImportAlias(interpreter.getContext());
167-
if (
168-
maybeTemporaryImportAlias.isPresent() &&
169-
!AliasedEagerImportingStrategy.isTemporaryImportAlias(variables) &&
170-
!interpreter.getContext().getComputedMetaContextVariables().contains(variables)
171-
) {
172-
if (!interpreter.getContext().containsKey(maybeTemporaryImportAlias.get())) {
173-
if (
174-
interpreter.retraceVariable(
175-
String.format(
176-
"%s.%s",
177-
interpreter.getContext().getImportResourceAlias().get(),
178-
variables
179-
),
180-
-1
181-
) !=
182-
null
183-
) {
184-
throw new DeferredValueException(
185-
"Cannot modify temporary import alias outside of import tag"
186-
);
187-
}
185+
if (maybeTemporaryImportAlias.isPresent()) {
186+
boolean stillInsideImportTag = interpreter
187+
.getContext()
188+
.containsKey(maybeTemporaryImportAlias.get());
189+
List<String> filteredVars = varStream
190+
.filter(var -> !AliasedEagerImportingStrategy.isTemporaryImportAlias(var))
191+
.filter(var ->
192+
!interpreter.getContext().getComputedMetaContextVariables().contains(var)
193+
)
194+
.peek(var -> {
195+
if (!stillInsideImportTag) {
196+
if (
197+
interpreter.retraceVariable(
198+
String.format(
199+
"%s.%s",
200+
interpreter.getContext().getImportResourceAlias().get(),
201+
var
202+
),
203+
-1
204+
) !=
205+
null
206+
) {
207+
throw new DeferredValueException(
208+
"Cannot modify temporary import alias outside of import tag"
209+
);
210+
}
211+
}
212+
})
213+
.collect(Collectors.toList());
214+
if (filteredVars.isEmpty()) {
215+
return "";
188216
}
189-
String updateString = getUpdateString(variables);
190-
217+
String updateString = getUpdateString(filteredVars);
191218
// Don't need to render because the temporary import alias's value is always deferred, and rendering will do nothing
192219
suffixToPreserveState.append(
193220
EagerReconstructionUtils.buildDoUpdateTag(
@@ -197,15 +224,10 @@ public static String getSuffixToPreserveState(
197224
)
198225
);
199226
}
200-
201227
return suffixToPreserveState.toString();
202228
}
203229

204-
private static String getUpdateString(String variables) {
205-
List<String> varList = Arrays
206-
.stream(variables.split(","))
207-
.map(String::trim)
208-
.collect(Collectors.toList());
230+
private static String getUpdateString(List<String> varList) {
209231
StringJoiner updateString = new StringJoiner(",");
210232
// Update the alias map to the value of the set variable.
211233
varList.forEach(var -> updateString.add(String.format("'%s': %s", var, var)));

src/main/java/com/hubspot/jinjava/lib/tag/eager/importing/AliasedEagerImportingStrategy.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -127,14 +127,9 @@ public void integrateChild(JinjavaInterpreter child) {
127127
}
128128

129129
@Override
130-
public String getFinalOutput(
131-
String newPathSetter,
132-
String output,
133-
JinjavaInterpreter child
134-
) {
130+
public String getFinalOutput(String output, JinjavaInterpreter child) {
135131
String temporaryImportAlias = getTemporaryImportAlias(fullImportAlias);
136132
return (
137-
newPathSetter +
138133
EagerReconstructionUtils.buildBlockOrInlineSetTag(
139134
temporaryImportAlias,
140135
Collections.emptyMap(),
@@ -153,8 +148,7 @@ public String getFinalOutput(
153148
ImmutableMap.of(currentImportAlias, temporaryImportAlias),
154149
importingData.getOriginalInterpreter(),
155150
true
156-
) +
157-
importingData.getInitialPathSetter()
151+
)
158152
);
159153
}
160154

src/main/java/com/hubspot/jinjava/lib/tag/eager/importing/EagerImportingStrategy.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public interface EagerImportingStrategy {
1212
void setup(JinjavaInterpreter child);
1313

1414
void integrateChild(JinjavaInterpreter child);
15-
String getFinalOutput(String newPathSetter, String output, JinjavaInterpreter child);
15+
String getFinalOutput(String output, JinjavaInterpreter child);
1616

1717
static String getSetTagForDeferredChildBindings(
1818
JinjavaInterpreter interpreter,

src/main/java/com/hubspot/jinjava/lib/tag/eager/importing/EagerImportingStrategyFactory.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,7 @@ public static EagerImportingStrategy create(ImportingData importingData) {
3030
public static String getSetTagForCurrentPath(JinjavaInterpreter interpreter) {
3131
return EagerReconstructionUtils.buildBlockOrInlineSetTag(
3232
RelativePathResolver.CURRENT_PATH_CONTEXT_KEY,
33-
interpreter
34-
.getContext()
35-
.getCurrentPathStack()
36-
.peek()
37-
.orElseGet(() ->
38-
(String) interpreter
39-
.getContext()
40-
.getOrDefault(RelativePathResolver.CURRENT_PATH_CONTEXT_KEY, "")
41-
),
33+
RelativePathResolver.getCurrentPathFromStackOrKey(interpreter),
4234
interpreter
4335
);
4436
}

src/main/java/com/hubspot/jinjava/lib/tag/eager/importing/FlatEagerImportingStrategy.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,7 @@ public void integrateChild(JinjavaInterpreter child) {
6363
}
6464

6565
@Override
66-
public String getFinalOutput(
67-
String newPathSetter,
68-
String output,
69-
JinjavaInterpreter child
70-
) {
66+
public String getFinalOutput(String output, JinjavaInterpreter child) {
7167
if (importingData.getOriginalInterpreter().getContext().isDeferredExecutionMode()) {
7268
Set<String> metaContextVariables = importingData
7369
.getOriginalInterpreter()
@@ -90,14 +86,12 @@ public String getFinalOutput(
9086
);
9187
}
9288
return (
93-
newPathSetter +
9489
EagerImportingStrategy.getSetTagForDeferredChildBindings(
9590
importingData.getOriginalInterpreter(),
9691
null,
9792
child.getContext().getSessionBindings()
9893
) +
99-
output +
100-
importingData.getInitialPathSetter()
94+
output
10195
);
10296
}
10397
}

src/main/java/com/hubspot/jinjava/loader/RelativePathResolver.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,7 @@ public class RelativePathResolver implements LocationResolver {
1111
@Override
1212
public String resolve(String path, JinjavaInterpreter interpreter) {
1313
if (path.startsWith("./") || path.startsWith("../")) {
14-
String parentPath = interpreter
15-
.getContext()
16-
.getCurrentPathStack()
17-
.peek()
18-
.orElseGet(() ->
19-
(String) interpreter.getContext().getOrDefault(CURRENT_PATH_CONTEXT_KEY, "")
20-
);
14+
String parentPath = getCurrentPathFromStackOrKey(interpreter);
2115

2216
Path templatePath = Paths.get(parentPath);
2317
Path folderPath = templatePath.getParent() != null
@@ -29,4 +23,14 @@ public String resolve(String path, JinjavaInterpreter interpreter) {
2923
}
3024
return path;
3125
}
26+
27+
public static String getCurrentPathFromStackOrKey(JinjavaInterpreter interpreter) {
28+
return interpreter
29+
.getContext()
30+
.getCurrentPathStack()
31+
.peek()
32+
.orElseGet(() ->
33+
(String) interpreter.getContext().getOrDefault(CURRENT_PATH_CONTEXT_KEY, "")
34+
);
35+
}
3236
}

0 commit comments

Comments
 (0)