feature[ats_18K4T]: Add query tracing
diff --git a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/ds/Criteria.java b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/ds/Criteria.java
index 5f5d567..94bff31 100644
--- a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/ds/Criteria.java
+++ b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/ds/Criteria.java
@@ -21,4 +21,9 @@
    public void checkValid(QueryOptions options) throws OseeCoreException {
       // For subclasses to implement
    }
+
+   @Override
+   public String toString() {
+      return getClass().getSimpleName();
+   }
 }
diff --git a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/ds/CriteriaSet.java b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/ds/CriteriaSet.java
index fad82c5..90696af 100644
--- a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/ds/CriteriaSet.java
+++ b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/ds/CriteriaSet.java
@@ -63,4 +63,8 @@
       return getCriterias().iterator();
    }
 
+   @Override
+   public String toString() {
+      return "CriteriaSet [branch=" + branch + ", criterias=" + criterias + "]";
+   }
 }
diff --git a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/OrcsApiImpl.java b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/OrcsApiImpl.java
index 5811efb..b65ccda 100644
--- a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/OrcsApiImpl.java
+++ b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/OrcsApiImpl.java
@@ -79,7 +79,7 @@
             dataStoreTypeCache.getArtifactTypeCache(), cacheService.getBranchCache());
 
       criteriaFctry = new CriteriaFactory(getDataStoreTypeCache().getAttributeTypeCache());
-      callableQueryFactory = new CallableQueryFactory(queryEngine, objectLoader);
+      callableQueryFactory = new CallableQueryFactory(logger, queryEngine, objectLoader);
    }
 
    public void stop() {
diff --git a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/search/CallableQueryFactory.java b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/search/CallableQueryFactory.java
index bc07207..f7ebabc 100644
--- a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/search/CallableQueryFactory.java
+++ b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/search/CallableQueryFactory.java
@@ -12,6 +12,7 @@
 
 import org.eclipse.osee.executor.admin.CancellableCallable;
 import org.eclipse.osee.framework.core.enums.LoadLevel;
+import org.eclipse.osee.logger.Log;
 import org.eclipse.osee.orcs.core.ds.CriteriaSet;
 import org.eclipse.osee.orcs.core.ds.QueryEngine;
 import org.eclipse.osee.orcs.core.ds.QueryOptions;
@@ -30,25 +31,28 @@
  */
 public class CallableQueryFactory {
 
+   private final Log logger;
    private final QueryEngine queryEngine;
    private final OrcsObjectLoader objectLoader;
 
-   public CallableQueryFactory(QueryEngine queryEngine, OrcsObjectLoader objectLoader) {
+   public CallableQueryFactory(Log logger, QueryEngine queryEngine, OrcsObjectLoader objectLoader) {
       super();
+      this.logger = logger;
       this.queryEngine = queryEngine;
       this.objectLoader = objectLoader;
    }
 
    public CancellableCallable<Integer> createCount(SessionContext sessionContext, CriteriaSet criteriaSet, QueryOptions options) {
-      return new SearchCountCallable(queryEngine, objectLoader, sessionContext, LoadLevel.ATTRIBUTE, criteriaSet,
-         options);
+      return new SearchCountCallable(logger, queryEngine, objectLoader, sessionContext, LoadLevel.ATTRIBUTE,
+         criteriaSet, options);
    }
 
    public CancellableCallable<ResultSet<ReadableArtifact>> createSearch(SessionContext sessionContext, CriteriaSet criteriaSet, QueryOptions options) {
-      return new SearchCallable(queryEngine, objectLoader, sessionContext, LoadLevel.FULL, criteriaSet, options);
+      return new SearchCallable(logger, queryEngine, objectLoader, sessionContext, LoadLevel.FULL, criteriaSet, options);
    }
 
    public CancellableCallable<ResultSet<Match<ReadableArtifact, ReadableAttribute<?>>>> createSearchWithMatches(SessionContext sessionContext, CriteriaSet criteriaSet, QueryOptions options) {
-      return new SearchMatchesCallable(queryEngine, objectLoader, sessionContext, LoadLevel.FULL, criteriaSet, options);
+      return new SearchMatchesCallable(logger, queryEngine, objectLoader, sessionContext, LoadLevel.FULL, criteriaSet,
+         options);
    }
 }
diff --git a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/search/callable/AbstractSearchCallable.java b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/search/callable/AbstractSearchCallable.java
new file mode 100644
index 0000000..0525431
--- /dev/null
+++ b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/search/callable/AbstractSearchCallable.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.orcs.core.internal.search.callable;
+
+import org.eclipse.osee.executor.admin.CancellableCallable;
+import org.eclipse.osee.framework.core.enums.LoadLevel;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.logger.Log;
+import org.eclipse.osee.orcs.core.ds.CriteriaSet;
+import org.eclipse.osee.orcs.core.ds.QueryEngine;
+import org.eclipse.osee.orcs.core.ds.QueryOptions;
+import org.eclipse.osee.orcs.core.internal.OrcsObjectLoader;
+import org.eclipse.osee.orcs.core.internal.SessionContext;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class AbstractSearchCallable<T> extends CancellableCallable<T> {
+
+   protected final Log logger;
+   protected final QueryEngine queryEngine;
+   protected final OrcsObjectLoader objectLoader;
+
+   protected final SessionContext sessionContext;
+   protected final LoadLevel loadLevel;
+   protected final CriteriaSet criteriaSet;
+   protected final QueryOptions options;
+
+   public AbstractSearchCallable(Log logger, QueryEngine queryEngine, OrcsObjectLoader objectLoader, SessionContext sessionContext, LoadLevel loadLevel, CriteriaSet criteriaSet, QueryOptions options) {
+      super();
+      this.logger = logger;
+      this.queryEngine = queryEngine;
+      this.objectLoader = objectLoader;
+      this.sessionContext = sessionContext;
+      this.loadLevel = loadLevel;
+      this.criteriaSet = criteriaSet;
+      this.options = options;
+   }
+
+   @Override
+   public final T call() throws Exception {
+      long startTime = 0;
+      if (logger.isDebugEnabled()) {
+         startTime = System.currentTimeMillis();
+      }
+
+      T result = innerCall();
+
+      if (logger.isDebugEnabled()) {
+         logger.debug("Search [%s] completed in [%s]\n\tCriteria - [%s]\n\tOptions  - [%s]",
+            getClass().getSimpleName(), Lib.getElapseString(startTime), criteriaSet, options);
+      }
+      return result;
+   }
+
+   protected abstract T innerCall() throws Exception;
+}
diff --git a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/search/callable/SearchCallable.java b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/search/callable/SearchCallable.java
index 5b1b98e..d4996f7 100644
--- a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/search/callable/SearchCallable.java
+++ b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/search/callable/SearchCallable.java
@@ -12,8 +12,8 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import org.eclipse.osee.executor.admin.CancellableCallable;
 import org.eclipse.osee.framework.core.enums.LoadLevel;
+import org.eclipse.osee.logger.Log;
 import org.eclipse.osee.orcs.core.ds.CriteriaSet;
 import org.eclipse.osee.orcs.core.ds.LoadOptions;
 import org.eclipse.osee.orcs.core.ds.QueryContext;
@@ -31,27 +31,14 @@
 /**
  * @author Roberto E. Escobar
  */
-public class SearchCallable extends CancellableCallable<ResultSet<ReadableArtifact>> {
-   private final QueryEngine queryEngine;
-   private final OrcsObjectLoader objectLoader;
+public class SearchCallable extends AbstractSearchCallable<ResultSet<ReadableArtifact>> {
 
-   private final SessionContext sessionContext;
-   private final LoadLevel loadLevel;
-   private final CriteriaSet criteriaSet;
-   private final QueryOptions options;
-
-   public SearchCallable(QueryEngine queryEngine, OrcsObjectLoader objectLoader, SessionContext sessionContext, LoadLevel loadLevel, CriteriaSet criteriaSet, QueryOptions options) {
-      super();
-      this.queryEngine = queryEngine;
-      this.objectLoader = objectLoader;
-      this.sessionContext = sessionContext;
-      this.loadLevel = loadLevel;
-      this.criteriaSet = criteriaSet;
-      this.options = options;
+   public SearchCallable(Log logger, QueryEngine queryEngine, OrcsObjectLoader objectLoader, SessionContext sessionContext, LoadLevel loadLevel, CriteriaSet criteriaSet, QueryOptions options) {
+      super(logger, queryEngine, objectLoader, sessionContext, loadLevel, criteriaSet, options);
    }
 
    @Override
-   public ResultSet<ReadableArtifact> call() throws Exception {
+   protected ResultSet<ReadableArtifact> innerCall() throws Exception {
       QueryContext queryContext = queryEngine.create(sessionContext.getSessionId(), criteriaSet, options);
       LoadOptions loadOptions = new LoadOptions(options.isHistorical(), options.areDeletedIncluded(), loadLevel);
       checkForCancelled();
diff --git a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/search/callable/SearchCountCallable.java b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/search/callable/SearchCountCallable.java
index afc895f..fe771cd 100644
--- a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/search/callable/SearchCountCallable.java
+++ b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/search/callable/SearchCountCallable.java
@@ -12,8 +12,8 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import org.eclipse.osee.executor.admin.CancellableCallable;
 import org.eclipse.osee.framework.core.enums.LoadLevel;
+import org.eclipse.osee.logger.Log;
 import org.eclipse.osee.orcs.core.ds.CriteriaSet;
 import org.eclipse.osee.orcs.core.ds.LoadOptions;
 import org.eclipse.osee.orcs.core.ds.QueryContext;
@@ -30,27 +30,14 @@
 /**
  * @author Roberto E. Escobar
  */
-public class SearchCountCallable extends CancellableCallable<Integer> {
-   private final QueryEngine queryEngine;
-   private final OrcsObjectLoader objectLoader;
+public class SearchCountCallable extends AbstractSearchCallable<Integer> {
 
-   private final SessionContext sessionContext;
-   private final LoadLevel loadLevel;
-   private final CriteriaSet criteriaSet;
-   private final QueryOptions options;
-
-   public SearchCountCallable(QueryEngine queryEngine, OrcsObjectLoader objectLoader, SessionContext sessionContext, LoadLevel loadLevel, CriteriaSet criteriaSet, QueryOptions options) {
-      super();
-      this.queryEngine = queryEngine;
-      this.objectLoader = objectLoader;
-      this.sessionContext = sessionContext;
-      this.loadLevel = loadLevel;
-      this.criteriaSet = criteriaSet;
-      this.options = options;
+   public SearchCountCallable(Log logger, QueryEngine queryEngine, OrcsObjectLoader objectLoader, SessionContext sessionContext, LoadLevel loadLevel, CriteriaSet criteriaSet, QueryOptions options) {
+      super(logger, queryEngine, objectLoader, sessionContext, loadLevel, criteriaSet, options);
    }
 
    @Override
-   public Integer call() throws Exception {
+   protected Integer innerCall() throws Exception {
       int count = -1;
       if (criteriaSet.hasCriteriaType(CriteriaAttributeKeyword.class)) {
          QueryContext queryContext = queryEngine.create(sessionContext.getSessionId(), criteriaSet, options);
diff --git a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/search/callable/SearchMatchesCallable.java b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/search/callable/SearchMatchesCallable.java
index d271173..183b01a 100644
--- a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/search/callable/SearchMatchesCallable.java
+++ b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/search/callable/SearchMatchesCallable.java
@@ -14,8 +14,8 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import org.eclipse.osee.executor.admin.CancellableCallable;
 import org.eclipse.osee.framework.core.enums.LoadLevel;
+import org.eclipse.osee.logger.Log;
 import org.eclipse.osee.orcs.core.ds.CriteriaSet;
 import org.eclipse.osee.orcs.core.ds.LoadOptions;
 import org.eclipse.osee.orcs.core.ds.QueryContext;
@@ -33,27 +33,14 @@
 /**
  * @author Roberto E. Escobar
  */
-public class SearchMatchesCallable extends CancellableCallable<ResultSet<Match<ReadableArtifact, ReadableAttribute<?>>>> {
-   private final QueryEngine queryEngine;
-   private final OrcsObjectLoader objectLoader;
+public class SearchMatchesCallable extends AbstractSearchCallable<ResultSet<Match<ReadableArtifact, ReadableAttribute<?>>>> {
 
-   private final SessionContext sessionContext;
-   private final LoadLevel loadLevel;
-   private final CriteriaSet criteriaSet;
-   private final QueryOptions options;
-
-   public SearchMatchesCallable(QueryEngine queryEngine, OrcsObjectLoader objectLoader, SessionContext sessionContext, LoadLevel loadLevel, CriteriaSet criteriaSet, QueryOptions options) {
-      super();
-      this.queryEngine = queryEngine;
-      this.objectLoader = objectLoader;
-      this.sessionContext = sessionContext;
-      this.loadLevel = loadLevel;
-      this.criteriaSet = criteriaSet;
-      this.options = options;
+   public SearchMatchesCallable(Log logger, QueryEngine queryEngine, OrcsObjectLoader objectLoader, SessionContext sessionContext, LoadLevel loadLevel, CriteriaSet criteriaSet, QueryOptions options) {
+      super(logger, queryEngine, objectLoader, sessionContext, loadLevel, criteriaSet, options);
    }
 
    @Override
-   public ResultSet<Match<ReadableArtifact, ReadableAttribute<?>>> call() throws Exception {
+   protected ResultSet<Match<ReadableArtifact, ReadableAttribute<?>>> innerCall() throws Exception {
       QueryContext queryContext = queryEngine.create(sessionContext.getSessionId(), criteriaSet, options);
       LoadOptions loadOptions = new LoadOptions(options.isHistorical(), options.areDeletedIncluded(), loadLevel);
       checkForCancelled();