Skip to content

Commit ebee07e

Browse files
jpbempelnayeem-kamal
authored andcommitted
Add URI in string primitives (#9285)
To be able to use substring and string predicates on URI variables Signed-off-by: Nayeem Kamal <[email protected]>
1 parent f0fc78e commit ebee07e

File tree

6 files changed

+72
-11
lines changed

6 files changed

+72
-11
lines changed

dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/util/WellKnownClasses.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ public class WellKnownClasses {
107107
"java.time.LocalDate",
108108
"java.time.LocalDateTime",
109109
"java.util.UUID",
110+
"java.net.URI",
110111
"java.io.File",
111112
"sun.nio.fs.UnixPath",
112113
"sun.nio.fs.WindowsPath"));

dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/SubStringExpression.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,29 @@ public SubStringExpression(ValueExpression<?> source, int startIndex, int endInd
2020
@Override
2121
public Value<String> evaluate(ValueReferenceResolver valueRefResolver) {
2222
Value<?> sourceValue = source != null ? source.evaluate(valueRefResolver) : Value.nullValue();
23+
if (sourceValue.isUndefined()) {
24+
throw new EvaluationException(
25+
"Cannot evaluate the expression for undefined value", PrettyPrintVisitor.print(this));
26+
}
27+
if (sourceValue.isNull()) {
28+
throw new EvaluationException(
29+
"Cannot evaluate the expression for null value", PrettyPrintVisitor.print(this));
30+
}
2331
if (sourceValue.getValue() instanceof String) {
2432
String sourceStr = (String) sourceValue.getValue();
25-
try {
26-
return (Value<String>) Value.of(sourceStr.substring(startIndex, endIndex));
27-
} catch (StringIndexOutOfBoundsException ex) {
28-
throw new EvaluationException(ex.getMessage(), PrettyPrintVisitor.print(this), ex);
29-
}
33+
return internalEvaluate(sourceStr);
3034
}
3135
return Value.undefined();
3236
}
3337

38+
private Value<String> internalEvaluate(String sourceStr) {
39+
try {
40+
return (Value<String>) Value.of(sourceStr.substring(startIndex, endIndex));
41+
} catch (StringIndexOutOfBoundsException ex) {
42+
throw new EvaluationException(ex.getMessage(), PrettyPrintVisitor.print(this), ex);
43+
}
44+
}
45+
3446
@Override
3547
public <R> R accept(Visitor<R> visitor) {
3648
return visitor.visit(this);

dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/EndsWithExpressionTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@
1212
import com.datadog.debugger.el.values.StringValue;
1313
import datadog.trace.bootstrap.debugger.el.ValueReferenceResolver;
1414
import datadog.trace.bootstrap.debugger.el.Values;
15+
import java.net.URI;
1516
import org.junit.jupiter.api.Test;
1617

1718
class EndsWithExpressionTest {
1819
private final ValueReferenceResolver resolver = RefResolverHelper.createResolver(this);
20+
// used to ref lookup
21+
URI uri = URI.create("https://www.datadoghq.com");
1922

2023
@Test
2124
void nullExpression() {
@@ -46,4 +49,11 @@ void stringExpression() {
4649
assertFalse(expression.evaluate(resolver));
4750
assertEquals("endsWith(\"abc\", \"ab\")", print(expression));
4851
}
52+
53+
@Test
54+
void stringPrimitives() {
55+
EndsWithExpression expression = new EndsWithExpression(DSL.ref("uri"), new StringValue(".com"));
56+
assertTrue(expression.evaluate(resolver));
57+
assertEquals("endsWith(uri, \".com\")", print(expression));
58+
}
4959
}

dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/MatchesExpressionTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@
99
import com.datadog.debugger.el.values.StringValue;
1010
import datadog.trace.bootstrap.debugger.el.ValueReferenceResolver;
1111
import datadog.trace.bootstrap.debugger.el.Values;
12+
import java.net.URI;
1213
import org.junit.jupiter.api.Test;
1314

1415
class MatchesExpressionTest {
1516
private final ValueReferenceResolver resolver = RefResolverHelper.createResolver(this);
17+
// used to ref lookup
18+
URI uri = URI.create("https://www.datadoghq.com");
1619

1720
@Test
1821
void nullExpression() {
@@ -49,4 +52,12 @@ void stringExpression() {
4952
assertFalse(expression.evaluate(resolver));
5053
assertEquals("matches(\"abc\", \"[def]+\")", print(expression));
5154
}
55+
56+
@Test
57+
void stringPrimitives() {
58+
MatchesExpression expression =
59+
new MatchesExpression(DSL.ref("uri"), new StringValue("^https?://w{3}\\.datadoghq\\.com$"));
60+
assertTrue(expression.evaluate(resolver));
61+
assertEquals("matches(uri, \"^https?://w{3}\\.datadoghq\\.com$\")", print(expression));
62+
}
5263
}

dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/StartsWithExpressionTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@
99
import com.datadog.debugger.el.values.StringValue;
1010
import datadog.trace.bootstrap.debugger.el.ValueReferenceResolver;
1111
import datadog.trace.bootstrap.debugger.el.Values;
12+
import java.net.URI;
1213
import org.junit.jupiter.api.Test;
1314

1415
class StartsWithExpressionTest {
1516
private final ValueReferenceResolver resolver = RefResolverHelper.createResolver(this);
17+
// used to ref lookup
18+
URI uri = URI.create("https://www.datadoghq.com");
1619

1720
@Test
1821
void nullExpression() {
@@ -44,4 +47,12 @@ void stringExpression() {
4447
assertFalse(expression.evaluate(resolver));
4548
assertEquals("startsWith(\"abc\", \"bc\")", print(expression));
4649
}
50+
51+
@Test
52+
void stringPrimitives() {
53+
StartsWithExpression expression =
54+
new StartsWithExpression(DSL.ref("uri"), new StringValue("https"));
55+
assertTrue(expression.evaluate(resolver));
56+
assertEquals("startsWith(uri, \"https\")", print(expression));
57+
}
4758
}

dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/SubStringExpressionTest.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,40 @@
33
import static com.datadog.debugger.el.PrettyPrintVisitor.print;
44
import static org.junit.jupiter.api.Assertions.assertEquals;
55
import static org.junit.jupiter.api.Assertions.assertThrows;
6-
import static org.junit.jupiter.api.Assertions.assertTrue;
76

87
import com.datadog.debugger.el.DSL;
98
import com.datadog.debugger.el.EvaluationException;
109
import com.datadog.debugger.el.RefResolverHelper;
1110
import datadog.trace.bootstrap.debugger.el.ValueReferenceResolver;
1211
import datadog.trace.bootstrap.debugger.el.Values;
12+
import java.net.URI;
1313
import org.junit.jupiter.api.Test;
1414

1515
public class SubStringExpressionTest {
1616
private final ValueReferenceResolver resolver = RefResolverHelper.createResolver(this);
17+
// used to ref lookup
18+
URI uri = URI.create("https://www.datadoghq.com");
19+
Object nullValue = null;
1720

1821
@Test
1922
void nullExpression() {
20-
SubStringExpression expression = new SubStringExpression(null, 0, 0);
21-
assertTrue(expression.evaluate(resolver).isUndefined());
22-
assertEquals("substring(null, 0, 0)", print(expression));
23+
SubStringExpression expression1 = new SubStringExpression(null, 0, 0);
24+
EvaluationException evaluationException =
25+
assertThrows(EvaluationException.class, () -> expression1.evaluate(resolver));
26+
assertEquals("substring(null, 0, 0)", evaluationException.getExpr());
27+
SubStringExpression expression2 = new SubStringExpression(DSL.ref("nullValue"), 0, 0);
28+
evaluationException =
29+
assertThrows(EvaluationException.class, () -> expression2.evaluate(resolver));
30+
assertEquals("substring(nullValue, 0, 0)", evaluationException.getExpr());
2331
}
2432

2533
@Test
2634
void undefinedExpression() {
2735
SubStringExpression expression =
2836
new SubStringExpression(DSL.value(Values.UNDEFINED_OBJECT), 0, 0);
29-
assertTrue(expression.evaluate(resolver).isUndefined());
30-
assertEquals("substring(UNDEFINED, 0, 0)", print(expression));
37+
EvaluationException evaluationException =
38+
assertThrows(EvaluationException.class, () -> expression.evaluate(resolver));
39+
assertEquals("substring(UNDEFINED, 0, 0)", evaluationException.getExpr());
3140
}
3241

3342
@Test
@@ -44,4 +53,11 @@ void stringOutOfBoundsExpression() {
4453
assertThrows(EvaluationException.class, () -> expression.evaluate(resolver));
4554
assertEquals("substring(\"abc\", 0, 10)", evaluationException.getExpr());
4655
}
56+
57+
@Test
58+
void stringPrimitives() {
59+
SubStringExpression expression = new SubStringExpression(DSL.ref("uri"), 0, 5);
60+
assertEquals("https", expression.evaluate(resolver).getValue());
61+
assertEquals("substring(uri, 0, 5)", print(expression));
62+
}
4763
}

0 commit comments

Comments
 (0)