Skip to content

Commit 491ef93

Browse files
authored
Revert "Filter upgrades to support kw params"
1 parent f106bca commit 491ef93

21 files changed

+316
-347
lines changed

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

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -89,16 +89,10 @@ protected Byte coerceToByte(Object value) {
8989

9090
@Override
9191
protected String coerceToString(Object value) {
92-
if (value instanceof DummyObject || value == null) {
92+
if (value instanceof DummyObject) {
9393
return "";
9494
}
95-
96-
// super() behavior breaks equality between enums and strings so removed here.
97-
if (value instanceof String) {
98-
return (String) value;
99-
}
100-
101-
return value.toString();
95+
return super.coerceToString(value);
10296
}
10397

10498
@Override

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

Lines changed: 34 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import com.google.common.collect.ImmutableMap;
2020
import com.hubspot.jinjava.doc.annotations.JinjavaDoc;
2121
import com.hubspot.jinjava.doc.annotations.JinjavaParam;
22-
import com.hubspot.jinjava.el.TruthyTypeConverter;
2322
import com.hubspot.jinjava.interpret.InvalidInputException;
2423
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
2524
import java.math.BigDecimal;
@@ -28,9 +27,12 @@
2827
import java.util.Collections;
2928
import java.util.HashMap;
3029
import java.util.Map;
30+
import java.util.Objects;
3131
import java.util.Optional;
3232
import java.util.concurrent.ConcurrentHashMap;
33+
import org.apache.commons.lang3.BooleanUtils;
3334
import org.apache.commons.lang3.StringUtils;
35+
import org.apache.commons.lang3.math.NumberUtils;
3436

3537
/***
3638
* Filter base that uses Filter Jinjavadoc to construct named argument parameters.
@@ -39,10 +41,9 @@
3941
* @see JinjavaDoc
4042
* @see JinjavaParam
4143
*/
42-
public abstract class AbstractFilter implements Filter, AdvancedFilter {
44+
public abstract class AbstractFilter implements Filter {
4345
private static final Map<Class, Map<String, JinjavaParam>> NAMED_ARGUMENTS_CACHE = new ConcurrentHashMap<>();
4446
private static final Map<Class, Map<String, Object>> DEFAULT_VALUES_CACHE = new ConcurrentHashMap<>();
45-
protected static final TruthyTypeConverter TYPE_CONVERTER = new TruthyTypeConverter();
4647

4748
private final Map<String, JinjavaParam> namedArguments;
4849
private final Map<String, Object> defaultValues;
@@ -123,40 +124,46 @@ protected Object parseArg(
123124
JinjavaParam jinjavaParamMetadata,
124125
Object value
125126
) {
126-
if (jinjavaParamMetadata.type() == null || value == null) {
127+
if (
128+
jinjavaParamMetadata.type() == null ||
129+
value == null ||
130+
Arrays.asList("object", "dict", "sequence").contains(jinjavaParamMetadata.type())
131+
) {
127132
return value;
128133
}
134+
String valueString = Objects.toString(value, null);
129135
switch (jinjavaParamMetadata.type().toLowerCase()) {
130136
case "boolean":
131-
return TYPE_CONVERTER.convert(value, Boolean.class);
137+
return value instanceof Boolean
138+
? (Boolean) value
139+
: BooleanUtils.toBooleanObject(valueString);
132140
case "int":
133-
return TYPE_CONVERTER.convert(value, Integer.class);
141+
return value instanceof Integer
142+
? (Integer) value
143+
: NumberUtils.toInt(valueString);
134144
case "long":
135-
return TYPE_CONVERTER.convert(value, Long.class);
145+
return value instanceof Long ? (Long) value : NumberUtils.toLong(valueString);
136146
case "float":
137-
return TYPE_CONVERTER.convert(value, Float.class);
147+
return value instanceof Float ? (Float) value : NumberUtils.toFloat(valueString);
138148
case "double":
139-
return TYPE_CONVERTER.convert(value, Double.class);
149+
return value instanceof Double
150+
? (Double) value
151+
: NumberUtils.toDouble(valueString);
140152
case "number":
141-
return TYPE_CONVERTER.convert(value, BigDecimal.class);
153+
return value instanceof Number ? (Number) value : new BigDecimal(valueString);
142154
case "string":
143-
return TYPE_CONVERTER.convert(value, String.class);
144-
case "object":
145-
case "dict":
146-
case "sequence":
147-
return value;
155+
return valueString;
148156
default:
149-
String errorMessage = String.format(
150-
"Argument named '%s' with value '%s' cannot be parsed for filter '%s'",
151-
jinjavaParamMetadata.value(),
152-
value,
153-
getName()
157+
throw new InvalidInputException(
158+
interpreter,
159+
"INVALID_ARG_NAME",
160+
String.format(
161+
"Argument named '%s' with value '%s' cannot be parsed for filter %s",
162+
jinjavaParamMetadata.value(),
163+
value,
164+
getName()
165+
)
154166
);
155-
if (interpreter != null) { //Filter runtime vs init
156-
throw new InvalidInputException(interpreter, "INVALID_ARG_NAME", errorMessage);
157-
} else {
158-
throw new IllegalArgumentException(errorMessage);
159-
}
160167
}
161168
}
162169

@@ -165,13 +172,7 @@ public void validateArgs(
165172
Map<String, Object> parsedArgs
166173
) {
167174
for (JinjavaParam jinjavaParam : namedArguments.values()) {
168-
if (
169-
jinjavaParam.required() &&
170-
(
171-
!parsedArgs.containsKey(jinjavaParam.value()) ||
172-
parsedArgs.get(jinjavaParam.value()) == null
173-
)
174-
) {
175+
if (jinjavaParam.required() && !parsedArgs.containsKey(jinjavaParam.value())) {
175176
throw new InvalidInputException(
176177
interpreter,
177178
"MISSING_REQUIRED_ARG",
@@ -206,10 +207,6 @@ public String getIndexedArgumentName(int position) {
206207
.orElse(null);
207208
}
208209

209-
public Object getDefaultValue(String argName) {
210-
return defaultValues.get(argName);
211-
}
212-
213210
public Map<String, JinjavaParam> initNamedArguments() {
214211
JinjavaDoc jinjavaDoc = this.getClass().getAnnotation(JinjavaDoc.class);
215212

@@ -245,10 +242,7 @@ public Map<String, Object> initDefaultValues() {
245242
.stream()
246243
.filter(e -> StringUtils.isNotEmpty(e.getValue().defaultValue()))
247244
.collect(
248-
ImmutableMap.toImmutableMap(
249-
Map.Entry::getKey,
250-
e -> parseArg(null, e.getValue(), e.getValue().defaultValue())
251-
)
245+
ImmutableMap.toImmutableMap(Map.Entry::getKey, e -> e.getValue().defaultValue())
252246
);
253247
}
254248
}

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

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
77
import com.hubspot.jinjava.lib.fn.Functions;
88
import com.hubspot.jinjava.objects.date.StrftimeFormatter;
9-
import java.util.Map;
109

1110
@JinjavaDoc(
1211
value = "Formats a date object",
@@ -18,19 +17,19 @@
1817
),
1918
params = {
2019
@JinjavaParam(
21-
value = DateTimeFormatFilter.FORMAT_PARAM,
20+
value = "format",
2221
defaultValue = StrftimeFormatter.DEFAULT_DATE_FORMAT,
2322
desc = "The format of the date determined by the directives added to this parameter"
2423
),
2524
@JinjavaParam(
26-
value = DateTimeFormatFilter.TIMEZONE_PARAM,
27-
defaultValue = "UTC",
25+
value = "timezone",
26+
defaultValue = "utc",
2827
desc = "Time zone of output date"
2928
),
3029
@JinjavaParam(
31-
value = DateTimeFormatFilter.LOCALE_PARAM,
30+
value = "locale",
3231
type = "string",
33-
defaultValue = "en-US",
32+
defaultValue = "us",
3433
desc = "The language code to use when formatting the datetime"
3534
)
3635
},
@@ -41,29 +40,19 @@
4140
)
4241
}
4342
)
44-
public class DateTimeFormatFilter extends AbstractFilter implements Filter {
45-
public static final String FORMAT_PARAM = "format";
46-
public static final String TIMEZONE_PARAM = "timezone";
47-
public static final String LOCALE_PARAM = "locale";
43+
public class DateTimeFormatFilter implements Filter {
4844

4945
@Override
5046
public String getName() {
5147
return "datetimeformat";
5248
}
5349

5450
@Override
55-
public Object filter(
56-
Object var,
57-
JinjavaInterpreter interpreter,
58-
Map<String, Object> parsedArgs
59-
) {
60-
String format = (String) parsedArgs.get(FORMAT_PARAM);
61-
String timezone = (String) parsedArgs.get(TIMEZONE_PARAM);
62-
String locale = (String) parsedArgs.get(LOCALE_PARAM);
63-
if (format == null && timezone == null && locale == null) {
64-
return Functions.dateTimeFormat(var);
51+
public Object filter(Object var, JinjavaInterpreter interpreter, String... args) {
52+
if (args.length > 0) {
53+
return Functions.dateTimeFormat(var, args);
6554
} else {
66-
return Functions.dateTimeFormat(var, format, timezone, locale);
55+
return Functions.dateTimeFormat(var);
6756
}
6857
}
6958
}

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

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,19 @@
1212
import com.hubspot.jinjava.util.ForLoop;
1313
import com.hubspot.jinjava.util.LengthLimitingStringBuilder;
1414
import com.hubspot.jinjava.util.ObjectIterator;
15-
import java.util.Map;
1615
import java.util.Objects;
1716

1817
@JinjavaDoc(
1918
value = "Return a string which is the concatenation of the strings in the sequence.",
2019
input = @JinjavaParam(value = "value", desc = "The values to join", required = true),
2120
params = {
2221
@JinjavaParam(
23-
value = JoinFilter.SEPARATOR_PARAM,
22+
value = "d",
2423
desc = "The separator string used to join the items",
2524
defaultValue = "(empty String)"
2625
),
2726
@JinjavaParam(
28-
value = JoinFilter.ATTRIBUTE_PARAM,
27+
value = "attr",
2928
desc = "Optional dict object attribute to use in joining"
3029
)
3130
},
@@ -38,28 +37,28 @@
3837
)
3938
}
4039
)
41-
public class JoinFilter extends AbstractFilter implements Filter {
42-
public static final String SEPARATOR_PARAM = "d";
43-
public static final String ATTRIBUTE_PARAM = "attribute";
40+
public class JoinFilter implements Filter {
4441

4542
@Override
4643
public String getName() {
4744
return "join";
4845
}
4946

5047
@Override
51-
public Object filter(
52-
Object var,
53-
JinjavaInterpreter interpreter,
54-
Map<String, Object> parsedArgs
55-
) {
48+
public Object filter(Object var, JinjavaInterpreter interpreter, String... args) {
5649
LengthLimitingStringBuilder stringBuilder = new LengthLimitingStringBuilder(
5750
interpreter.getConfig().getMaxStringLength()
5851
);
5952

60-
String separator = (String) parsedArgs.get(SEPARATOR_PARAM);
53+
String separator = "";
54+
if (args.length > 0) {
55+
separator = args[0];
56+
}
6157

62-
String attr = (String) parsedArgs.get(ATTRIBUTE_PARAM);
58+
String attr = null;
59+
if (args.length > 1) {
60+
attr = args[1];
61+
}
6362

6463
ForLoop loop = ObjectIterator.getLoop(var);
6564
boolean first = true;

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

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import com.hubspot.jinjava.interpret.InvalidInputException;
1111
import com.hubspot.jinjava.interpret.InvalidReason;
1212
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
13-
import java.util.Map;
13+
import com.hubspot.jinjava.interpret.TemplateSyntaxException;
1414

1515
@JinjavaDoc(
1616
value = "Return a copy of the value with all occurrences of a matched regular expression (Java RE2 syntax) " +
@@ -23,12 +23,12 @@
2323
),
2424
params = {
2525
@JinjavaParam(
26-
value = RegexReplaceFilter.REGEX_KEY,
26+
value = "regex",
2727
desc = "The regular expression that you want to match and replace",
2828
required = true
2929
),
3030
@JinjavaParam(
31-
value = RegexReplaceFilter.REPLACE_WITH,
31+
value = "new",
3232
desc = "The new string that you replace the matched substring",
3333
required = true
3434
)
@@ -40,29 +40,39 @@
4040
)
4141
}
4242
)
43-
public class RegexReplaceFilter extends AbstractFilter {
44-
public static final String REGEX_KEY = "regex";
45-
public static final String REPLACE_WITH = "new";
43+
public class RegexReplaceFilter implements Filter {
4644

4745
@Override
4846
public String getName() {
4947
return "regex_replace";
5048
}
5149

5250
@Override
53-
public Object filter(
54-
Object var,
55-
JinjavaInterpreter interpreter,
56-
Map<String, Object> parsedArgs
57-
) {
51+
public Object filter(Object var, JinjavaInterpreter interpreter, String... args) {
52+
if (args.length < 2) {
53+
throw new TemplateSyntaxException(
54+
interpreter,
55+
getName(),
56+
"requires 2 arguments (regex string, replacement string)"
57+
);
58+
}
59+
60+
if (args[0] == null || args[1] == null) {
61+
throw new TemplateSyntaxException(
62+
interpreter,
63+
getName(),
64+
"requires both a valid regex and new params (not null)"
65+
);
66+
}
67+
5868
if (var == null) {
5969
return null;
6070
}
6171

6272
if (var instanceof String) {
6373
String s = (String) var;
64-
String toReplace = (String) parsedArgs.get(REGEX_KEY);
65-
String replaceWith = (String) parsedArgs.get(REPLACE_WITH);
74+
String toReplace = args[0];
75+
String replaceWith = args[1];
6676

6777
try {
6878
Pattern p = Pattern.compile(toReplace);

0 commit comments

Comments
 (0)