diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java b/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java index e8a1381fb9..91fd5bce47 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java @@ -97,12 +97,9 @@ abstract class AbstractContext> extends AbstractScope imple AbstractContext(Configuration configuration, PreparedStatement stmt) { super(configuration); - this.stmt = stmt; - this.visitClauses = new ArrayDeque(); VisitListenerProvider[] providers = configuration.visitListenerProviders(); - boolean userInternalVisitListener = false /* [pro] xx @@ -113,8 +110,6 @@ abstract class AbstractContext> extends AbstractScope imple ; this.visitListeners = new VisitListener[providers.length + (userInternalVisitListener ? 1 : 0)]; - this.visitContext = new DefaultVisitContext(); - this.visitParts = new ArrayDeque(); for (int i = 0; i < providers.length; i++) this.visitListeners[i] = providers[i].provide(); @@ -123,6 +118,17 @@ abstract class AbstractContext> extends AbstractScope imple xx xxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx x xxx xxxxxxxxxxxxxxxxxxxxxxxx xx [/pro] */ + + if (this.visitListeners.length > 0) { + this.visitContext = new DefaultVisitContext(); + this.visitParts = new ArrayDeque(); + this.visitClauses = new ArrayDeque(); + } + else { + this.visitContext = null; + this.visitParts = null; + this.visitClauses = null; + } } // ------------------------------------------------------------------------ @@ -188,12 +194,11 @@ abstract class AbstractContext> extends AbstractScope imple @Override public final C start(Clause clause) { - if (clause != null) { + if (clause != null && visitClauses != null) { visitClauses.addLast(clause); - for (VisitListener listener : visitListeners) { + for (VisitListener listener : visitListeners) listener.clauseStart(visitContext); - } } return (C) this; @@ -201,10 +206,9 @@ abstract class AbstractContext> extends AbstractScope imple @Override public final C end(Clause clause) { - if (clause != null) { - for (VisitListener listener : visitListeners) { + if (clause != null && visitClauses != null) { + for (VisitListener listener : visitListeners) listener.clauseEnd(visitContext); - } if (visitClauses.removeLast() != clause) throw new IllegalStateException("Mismatch between visited clauses!"); @@ -214,22 +218,27 @@ abstract class AbstractContext> extends AbstractScope imple } private final QueryPart start(QueryPart part) { - visitParts.addLast(part); + if (visitParts != null) { + visitParts.addLast(part); - for (VisitListener listener : visitListeners) { - listener.visitStart(visitContext); + for (VisitListener listener : visitListeners) + listener.visitStart(visitContext); + + return visitParts.peekLast(); + } + else { + return part; } - - return visitParts.peekLast(); } private final void end(QueryPart part) { - for (VisitListener listener : visitListeners) { - listener.visitEnd(visitContext); - } + if (visitParts != null) { + for (VisitListener listener : visitListeners) + listener.visitEnd(visitContext); - if (visitParts.removeLast() != part) - throw new RuntimeException("Mismatch between visited query parts"); + if (visitParts.removeLast() != part) + throw new RuntimeException("Mismatch between visited query parts"); + } } /**