diff --git a/agent/src/main/java/com/intergral/deep/agent/tracepoint/evaluator/AbstractEvaluator.java b/agent-api/src/main/java/com/intergral/deep/agent/api/plugin/AbstractEvaluator.java
similarity index 92%
rename from agent/src/main/java/com/intergral/deep/agent/tracepoint/evaluator/AbstractEvaluator.java
rename to agent-api/src/main/java/com/intergral/deep/agent/api/plugin/AbstractEvaluator.java
index e048dcf..f5b5030 100644
--- a/agent/src/main/java/com/intergral/deep/agent/tracepoint/evaluator/AbstractEvaluator.java
+++ b/agent-api/src/main/java/com/intergral/deep/agent/api/plugin/AbstractEvaluator.java
@@ -15,11 +15,13 @@
* along with this program. If not, see .
*/
-package com.intergral.deep.agent.tracepoint.evaluator;
+package com.intergral.deep.agent.api.plugin;
-import com.intergral.deep.agent.api.plugin.IEvaluator;
import java.util.Map;
+/**
+ * This allows for common handling for object to boolean expressions.
+ */
public abstract class AbstractEvaluator implements IEvaluator {
@Override
diff --git a/agent-api/src/main/java/com/intergral/deep/agent/api/plugin/LazyEvaluator.java b/agent-api/src/main/java/com/intergral/deep/agent/api/plugin/LazyEvaluator.java
new file mode 100644
index 0000000..c40c40d
--- /dev/null
+++ b/agent-api/src/main/java/com/intergral/deep/agent/api/plugin/LazyEvaluator.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2023 Intergral GmbH
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package com.intergral.deep.agent.api.plugin;
+
+import java.util.Map;
+
+/**
+ * This type allows the evaluator to be loaded only if it is needed. ie. if we have no watches or conditions there is no need for an
+ * evaluator.
+ */
+public class LazyEvaluator extends AbstractEvaluator {
+
+ private static final Exception NO_EVALUATOR_EXCEPTION = new RuntimeException(
+ "No evaluator available.");
+ private final IEvaluatorLoader loader;
+ private IEvaluator evaluator;
+
+ public LazyEvaluator(final IEvaluatorLoader loader) {
+ this.loader = loader;
+ }
+
+ private IEvaluator load() {
+ if (this.evaluator == null) {
+ try {
+ this.evaluator = this.loader.load();
+ } catch (Exception e) {
+ this.evaluator = new AbstractEvaluator() {
+ @Override
+ public Object evaluateExpression(final String expression, final Map values) throws Throwable {
+ throw NO_EVALUATOR_EXCEPTION;
+ }
+ };
+ }
+ }
+ return this.evaluator;
+ }
+
+ @Override
+ public Object evaluateExpression(final String expression, final Map values) throws Throwable {
+ return load().evaluateExpression(expression, values);
+ }
+
+ public interface IEvaluatorLoader {
+
+ IEvaluator load();
+ }
+}
diff --git a/agent/src/main/java/com/intergral/deep/agent/tracepoint/cf/CFEvaluator.java b/agent/src/main/java/com/intergral/deep/agent/tracepoint/cf/CFEvaluator.java
index e62496d..3834f4f 100644
--- a/agent/src/main/java/com/intergral/deep/agent/tracepoint/cf/CFEvaluator.java
+++ b/agent/src/main/java/com/intergral/deep/agent/tracepoint/cf/CFEvaluator.java
@@ -17,7 +17,7 @@
package com.intergral.deep.agent.tracepoint.cf;
-import com.intergral.deep.agent.tracepoint.evaluator.AbstractEvaluator;
+import com.intergral.deep.agent.api.plugin.AbstractEvaluator;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;
diff --git a/agent/src/main/java/com/intergral/deep/agent/tracepoint/evaluator/NashornReflectEvaluator.java b/agent/src/main/java/com/intergral/deep/agent/tracepoint/evaluator/NashornReflectEvaluator.java
index 58bc48a..66ad4e3 100644
--- a/agent/src/main/java/com/intergral/deep/agent/tracepoint/evaluator/NashornReflectEvaluator.java
+++ b/agent/src/main/java/com/intergral/deep/agent/tracepoint/evaluator/NashornReflectEvaluator.java
@@ -17,6 +17,7 @@
package com.intergral.deep.agent.tracepoint.evaluator;
+import com.intergral.deep.agent.api.plugin.AbstractEvaluator;
import com.intergral.deep.agent.api.plugin.IEvaluator;
import java.lang.reflect.Method;
import java.util.HashMap;
diff --git a/agent/src/main/java/com/intergral/deep/agent/tracepoint/handler/Callback.java b/agent/src/main/java/com/intergral/deep/agent/tracepoint/handler/Callback.java
index 26b2448..3b913d9 100644
--- a/agent/src/main/java/com/intergral/deep/agent/tracepoint/handler/Callback.java
+++ b/agent/src/main/java/com/intergral/deep/agent/tracepoint/handler/Callback.java
@@ -19,6 +19,7 @@
import com.intergral.deep.agent.Utils;
import com.intergral.deep.agent.api.plugin.IEvaluator;
+import com.intergral.deep.agent.api.plugin.LazyEvaluator;
import com.intergral.deep.agent.push.PushService;
import com.intergral.deep.agent.settings.Settings;
import com.intergral.deep.agent.tracepoint.TracepointConfigService;
@@ -88,7 +89,7 @@ public static void callBackCF(final List bpIds,
final int lineNo,
final Map variables) {
try {
- final IEvaluator evaluator = CFUtils.findCfEval(variables);
+ final IEvaluator evaluator = new LazyEvaluator(() -> CFUtils.findCfEval(variables));
commonCallback(bpIds, filename, lineNo, variables, evaluator, CFFrameProcessor::new);
} catch (Throwable t) {
LOGGER.debug("Unable to process tracepoint {}:{}", filename, lineNo, t);
@@ -109,7 +110,7 @@ public static void callBack(final List bpIds,
final int lineNo,
final Map variables) {
try {
- final IEvaluator evaluator = EvaluatorService.createEvaluator();
+ final IEvaluator evaluator = new LazyEvaluator(EvaluatorService::createEvaluator);
commonCallback(bpIds, filename, lineNo, variables, evaluator, FrameProcessor::new);
} catch (Throwable t) {
LOGGER.debug("Unable to process tracepoint {}:{}", filename, lineNo, t);