From 7edd825baaa6cfa62ae2d3832c0874ee7408f50b Mon Sep 17 00:00:00 2001 From: James Brook Date: Wed, 21 Nov 2012 17:36:24 +0100 Subject: [PATCH] Feature branch for adding a listener to the method that times all SQL expressions. As well as logging we can now optionally do something else, e.g. notify an external monitoring system of slow SQL expressions. --- .../extensions/eof/ERXEOAccessUtilities.java | 77 +++++-------------- .../eof/listener/ERXEOExecutionListener.java | 7 ++ .../ERXEOExecutionListenerDumbImpl.java | 7 ++ 3 files changed, 32 insertions(+), 59 deletions(-) create mode 100644 Frameworks/Core/ERExtensions/Sources/er/extensions/eof/listener/ERXEOExecutionListener.java create mode 100644 Frameworks/Core/ERExtensions/Sources/er/extensions/eof/listener/ERXEOExecutionListenerDumbImpl.java diff --git a/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXEOAccessUtilities.java b/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXEOAccessUtilities.java index 9971e665891..c018069d7df 100644 --- a/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXEOAccessUtilities.java +++ b/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXEOAccessUtilities.java @@ -6,71 +6,23 @@ // package er.extensions.eof; -import java.util.Collection; -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashSet; -import java.util.Set; - -import org.apache.log4j.Level; -import org.apache.log4j.Logger; - import com.webobjects.appserver.WOSession; -import com.webobjects.eoaccess.EOAdaptorChannel; -import com.webobjects.eoaccess.EOAdaptorOperation; -import com.webobjects.eoaccess.EOAttribute; -import com.webobjects.eoaccess.EODatabase; -import com.webobjects.eoaccess.EODatabaseChannel; -import com.webobjects.eoaccess.EODatabaseContext; -import com.webobjects.eoaccess.EODatabaseOperation; -import com.webobjects.eoaccess.EOEntity; -import com.webobjects.eoaccess.EOEntityClassDescription; -import com.webobjects.eoaccess.EOGeneralAdaptorException; -import com.webobjects.eoaccess.EOJoin; -import com.webobjects.eoaccess.EOModel; -import com.webobjects.eoaccess.EOModelGroup; -import com.webobjects.eoaccess.EOObjectNotAvailableException; -import com.webobjects.eoaccess.EOProperty; -import com.webobjects.eoaccess.EORelationship; -import com.webobjects.eoaccess.EOSQLExpression; -import com.webobjects.eoaccess.EOSQLExpressionFactory; -import com.webobjects.eoaccess.EOUtilities; -import com.webobjects.eocontrol.EOAndQualifier; -import com.webobjects.eocontrol.EOClassDescription; -import com.webobjects.eocontrol.EOEditingContext; -import com.webobjects.eocontrol.EOEnterpriseObject; -import com.webobjects.eocontrol.EOFaultHandler; -import com.webobjects.eocontrol.EOFetchSpecification; -import com.webobjects.eocontrol.EOGlobalID; -import com.webobjects.eocontrol.EOKeyGlobalID; -import com.webobjects.eocontrol.EOKeyValueQualifier; -import com.webobjects.eocontrol.EOObjectStoreCoordinator; -import com.webobjects.eocontrol.EOQualifier; -import com.webobjects.eocontrol.EOSortOrdering; -import com.webobjects.foundation.NSArray; -import com.webobjects.foundation.NSData; -import com.webobjects.foundation.NSDictionary; -import com.webobjects.foundation.NSForwardException; -import com.webobjects.foundation.NSKeyValueCoding; -import com.webobjects.foundation.NSLog; -import com.webobjects.foundation.NSMutableArray; -import com.webobjects.foundation.NSMutableDictionary; -import com.webobjects.foundation.NSMutableSet; -import com.webobjects.foundation.NSSet; -import com.webobjects.foundation._NSDelegate; +import com.webobjects.eoaccess.*; +import com.webobjects.eocontrol.*; +import com.webobjects.foundation.*; import com.webobjects.jdbcadaptor.JDBCPlugIn; - import er.extensions.appserver.ERXSession; -import er.extensions.foundation.ERXArrayUtilities; -import er.extensions.foundation.ERXDictionaryUtilities; -import er.extensions.foundation.ERXProperties; -import er.extensions.foundation.ERXStringUtilities; -import er.extensions.foundation.ERXThreadStorage; -import er.extensions.foundation.ERXUtilities; -import er.extensions.foundation.ERXValueUtilities; +import er.extensions.eof.listener.ERXEOExecutionListener; +import er.extensions.eof.listener.ERXEOExecutionListenerDumbImpl; +import er.extensions.foundation.*; import er.extensions.jdbc.ERXSQLHelper; import er.extensions.statistics.ERXStats; import er.extensions.statistics.ERXStats.Group; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; + +import java.util.*; +import java.util.concurrent.atomic.AtomicReference; /** * Collection of EOAccess related utilities. @@ -84,6 +36,12 @@ public class ERXEOAccessUtilities { /** SQL logger */ private static Logger sqlLoggingLogger = null; + private static final AtomicReference listener = new AtomicReference(new ERXEOExecutionListenerDumbImpl()); + + public static void setListener(ERXEOExecutionListener aListener) { + listener.set(aListener); + } + /** * Finds an entity that is contained in a string. This is used a lot in * DirectToWeb. Example: "ListAllStudios"=>Studio @@ -1272,6 +1230,7 @@ public static void logExpression(EOAdaptorChannel channel, EOSQLExpression expre statement = statement.replaceAll("((t0|T0)\\.[a-zA-Z0-9_]+\\,\\s*)*(t0|T0)\\.[a-zA-Z0-9_\\.]+\\s+FROM\\s+", "t0.* FROM "); ERXStats.addDurationForKey(millisecondsNeeded, Group.SQL, entityName + ": " +statement); } + listener.get().log(millisecondsNeeded, entityName); if (needsLog) { String logString = createLogString(channel, expression, millisecondsNeeded); if (logString.length() > maxLength) { diff --git a/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/listener/ERXEOExecutionListener.java b/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/listener/ERXEOExecutionListener.java new file mode 100644 index 00000000000..ec06212b952 --- /dev/null +++ b/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/listener/ERXEOExecutionListener.java @@ -0,0 +1,7 @@ +package er.extensions.eof.listener; + +public interface ERXEOExecutionListener { + + public void log(long requestTime, String entityName); + +} diff --git a/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/listener/ERXEOExecutionListenerDumbImpl.java b/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/listener/ERXEOExecutionListenerDumbImpl.java new file mode 100644 index 00000000000..03d399d2ed9 --- /dev/null +++ b/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/listener/ERXEOExecutionListenerDumbImpl.java @@ -0,0 +1,7 @@ +package er.extensions.eof.listener; + +public class ERXEOExecutionListenerDumbImpl implements ERXEOExecutionListener { + public void log(long requestTime, String entityName) { + //Do nothing here + } +}