From c521615a5a3784080a314448a818f790c1d8f517 Mon Sep 17 00:00:00 2001 From: Jochen Berger Date: Thu, 18 Feb 2016 11:00:35 +0100 Subject: [PATCH] speed up the abort of an evaluation. It's quite expensive to create an exception and fill its stack. As we don't care about the stack anyway, we don't fill it, also we cache a single exception instance --- .../jsonpath/internal/EvaluationAbortException.java | 9 +++++++++ .../jsonpath/internal/path/EvaluationContextImpl.java | 4 +++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/EvaluationAbortException.java b/json-path/src/main/java/com/jayway/jsonpath/internal/EvaluationAbortException.java index 19a93dfb..16c60e3b 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/EvaluationAbortException.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/EvaluationAbortException.java @@ -1,4 +1,13 @@ package com.jayway.jsonpath.internal; public class EvaluationAbortException extends RuntimeException { + + private static final long serialVersionUID = 4419305302960432348L; + + // this is just a marker exception to abort evaluation, we don't care about + // the stack + @Override + public Throwable fillInStackTrace() { + return this; + } } diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/path/EvaluationContextImpl.java b/json-path/src/main/java/com/jayway/jsonpath/internal/path/EvaluationContextImpl.java index 119f2e92..3814419e 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/path/EvaluationContextImpl.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/path/EvaluationContextImpl.java @@ -38,6 +38,8 @@ import static com.jayway.jsonpath.internal.Utils.notNull; */ public class EvaluationContextImpl implements EvaluationContext { + private static final EvaluationAbortException ABORT_EVALUATION = new EvaluationAbortException(); + private final Configuration configuration; private final Object valueResult; private final Object pathResult; @@ -84,7 +86,7 @@ public class EvaluationContextImpl implements EvaluationContext { for (EvaluationListener listener : configuration().getEvaluationListeners()) { EvaluationListener.EvaluationContinuation continuation = listener.resultFound(new FoundResultImpl(idx, path, model)); if(EvaluationListener.EvaluationContinuation.ABORT == continuation){ - throw new EvaluationAbortException(); + throw ABORT_EVALUATION; } } }