Author: mickw
Date: 2006-04-10 21:10:06 +0200 (Mon, 10 Apr 2006)
New Revision: 2760

Modified:
   
trunk/src/java/no/schibstedsok/front/searchportal/command/AbstractSearchCommand.java
   trunk/src/java/no/schibstedsok/front/searchportal/command/SearchCommand.java
   
trunk/src/java/no/schibstedsok/front/searchportal/executor/ParallelSearchCommandExecutor.java
   
trunk/src/java/no/schibstedsok/front/searchportal/executor/SearchTaskExecutorService.java
   
trunk/src/java/no/schibstedsok/front/searchportal/query/run/RunningQueryImpl.java
   
trunk/src/test/java/no/schibstedsok/front/searchportal/result/test/MockupSearchCommand.java
Log:
SEARCH-480


Modified: 
trunk/src/java/no/schibstedsok/front/searchportal/command/AbstractSearchCommand.java
===================================================================
--- 
trunk/src/java/no/schibstedsok/front/searchportal/command/AbstractSearchCommand.java
        2006-04-10 16:37:59 UTC (rev 2759)
+++ 
trunk/src/java/no/schibstedsok/front/searchportal/command/AbstractSearchCommand.java
        2006-04-10 19:10:06 UTC (rev 2760)
@@ -61,6 +61,8 @@
     private static final String ERR_PARSING = "Unable to create RunningQuery's 
query due to ParseException";
     private static final String ERR_TRANSFORMED_QUERY_USED
             = "Cannot use transformedTerms Map once deprecated 
getTransformedQuery as been used";
+    private static final String ERR_HANDLING_CANCELLATION
+            = "Cancellation (and now handling of) occurred to ";
 
     static{
         System.setProperty("sun.net.client.defaultConnectTimeout", "3000");
@@ -74,6 +76,7 @@
     private final Map<Clause,String> transformedTerms = new 
LinkedHashMap<Clause,String>();
     private String transformedQuery;
     private Map parameters;
+    private volatile boolean completed = false;
 
 
    // Constructors --------------------------------------------------
@@ -142,126 +145,44 @@
      * @return
      */
     public SearchResult call() {
+
         MDC.put(Site.NAME_KEY, context.getSite().getName());
 
         final String thread = Thread.currentThread().getName();
         if (getSearchConfiguration().getStatisticsName() != null) {
             Thread.currentThread().setName(thread + " [" + 
getSearchConfiguration().getStatisticsName() + "]");
         }  else  {
-            Thread.currentThread().setName(thread+" 
["+getClass().getSimpleName()+"]");
+            Thread.currentThread().setName(thread + " [" + 
getClass().getSimpleName() + "]");
         }
         try  {
 
-
             LOG.trace("call()");
-            final boolean useParameterAsQuery = 
getSearchConfiguration().getUseParameterAsQuery() != null;
-            final String queryToUse = useParameterAsQuery
-                    ? 
getSingleParameter(getSearchConfiguration().getUseParameterAsQuery())
-                    : context.getQuery().getQueryString();
 
-
-
-            if (useParameterAsQuery) {
-                // OOBS. It's not the query we are looking for but a string 
held
-                // in a different parameter.
-                transformedQuery = queryToUse;
-                final Query query = createQuery(queryToUse);
-                transformedTerms.clear();
-                // re-initialise map with new query's terms.
-                final Visitor mapInitialisor = new 
MapInitialisor(transformedTerms);
-                mapInitialisor.visit(query.getRootClause());
-                applyQueryTransformers(query, 
getSearchConfiguration().getQueryTransformers());
-            }  else  {
-                applyQueryTransformers(context.getQuery(), 
getSearchConfiguration().getQueryTransformers());
-            }
-
-            StopWatch watch = null;
-
-            if (LOG.isDebugEnabled()) {
-                watch = new StopWatch();
-                watch.start();
-            }
-
-            //TODO: Hide this in QueryRule.execute(some parameters)
-            boolean executeQuery = queryToUse.length() > 0;
-
-            if (parameters.get("contentsource") != null) {
-                LOG.debug("call: Got contentsource, executeQuery=true");
-
-                executeQuery = true;
-            }
-
-            executeQuery |= filter != null && filter.length() > 0;
-
-            LOG.debug("executeQuery==" + executeQuery + " ; queryToUse:" + 
queryToUse + "; filter:" + filter + ";");
-            
-            final SearchResult result = executeQuery ? execute() : new 
BasicSearchResult(this);
-
-            if (LOG.isDebugEnabled()) {
-                watch.stop();
-
-                LOG.debug("Hits is " + getSearchConfiguration().getName() + 
":" + result.getHitCount());
-                LOG.debug("Search " + getSearchConfiguration().getName() + " 
took " + watch);
-            }
-            
-            STATISTICS_LOG.info(
-                    "<search-command name=\"" + 
getSearchConfiguration().getStatisticsName() + "\">"
-                        + "<query>" + context.getQuery().getQueryString() + 
"</query>"
-                        + "<search-name>"
-                        + getClass().getSimpleName()
-                        + "</search-name>"
-                        + "<hits>" + result.getHitCount() + "</hits>"
-                    + "</search-command>");
-
-            for (final Iterator handlerIterator = 
getSearchConfiguration().getResultHandlers().iterator(); 
handlerIterator.hasNext();) {
-                final ResultHandler resultHandler = (ResultHandler) 
handlerIterator.next();
-                final ResultHandler.Context resultHandlerContext = new 
ResultHandler.Context() {
-                    // <editor-fold defaultstate="collapsed" desc=" 
ResultHandler.Context ">
-                    public SearchResult getSearchResult() {
-                        return result;
-                    }
-
-                    public Site getSite() {
-                        return context.getSite();
-                    }
-
-                    public PropertiesLoader newPropertiesLoader(final String 
resource, final Properties properties) {
-                        return context.newPropertiesLoader(resource, 
properties);
-                    }
-
-                    public XStreamLoader newXStreamLoader(final String 
resource, final XStream xstream) {
-                        return context.newXStreamLoader(resource, xstream);
-                    }
-
-                    public DocumentLoader newDocumentLoader(final String 
resource, final DocumentBuilder builder) {
-                        return context.newDocumentLoader(resource, builder);
-                    }
-
-                    public Query getQuery() {
-                        return context.getQuery();
-                    }
-                    /** @deprecated implementations should be using the 
QueryContext instead! */
-                    public String getQueryString() {
-                        return context.getRunningQuery().getQueryString();
-                    }
-
-                    public void addSource(final Modifier modifier) {
-                        context.getRunningQuery().addSource(modifier);
-                    }
-                    // </editor-fold>
-                };
-                resultHandler.handleResult(resultHandlerContext, parameters);
-            }
+            final String queryToUse = performQueryTransformation();
+            final SearchResult result = performExecution(queryToUse);
+            performResultHandling(result);
             return result;
 
         }  finally  {
             // restore thread name
             Thread.currentThread().setName(thread);
+            completed = true;
         }
     }
 
-   // AbstractReflectionVisitor overrides 
----------------------------------------------
+    public void handleCancellation(){
 
+        if( !completed ){
+            LOG.error(ERR_HANDLING_CANCELLATION
+                    + getSearchConfiguration().getName()
+                    + " [" + getClass().getSimpleName() + "]");
+
+            performResultHandling(new BasicSearchResult(this));
+        }
+    }
+
+    // AbstractReflectionVisitor overrides 
----------------------------------------------
+
     private final StringBuffer sb = new StringBuffer();
 
     protected void visitImpl(final LeafClause clause) {
@@ -310,6 +231,96 @@
 
    // Protected -----------------------------------------------------
 
+
+    protected final String performQueryTransformation(){
+
+        final boolean useParameterAsQuery = 
getSearchConfiguration().getUseParameterAsQuery() != null;
+        final String queryToUse = useParameterAsQuery
+                ? 
getSingleParameter(getSearchConfiguration().getUseParameterAsQuery())
+                : context.getQuery().getQueryString();
+
+        if (useParameterAsQuery) {
+            // OOBS. It's not the query we are looking for but a string held
+            // in a different parameter.
+            transformedQuery = queryToUse;
+            final Query query = createQuery(queryToUse);
+            transformedTerms.clear();
+            // re-initialise map with new query's terms.
+            final Visitor mapInitialisor = new 
MapInitialisor(transformedTerms);
+            mapInitialisor.visit(query.getRootClause());
+            applyQueryTransformers(query, 
getSearchConfiguration().getQueryTransformers());
+        }  else  {
+            applyQueryTransformers(context.getQuery(), 
getSearchConfiguration().getQueryTransformers());
+        }
+        return queryToUse;
+    }
+
+    protected final SearchResult performExecution(final String queryToUse){
+
+        StopWatch watch = null;
+        if (LOG.isDebugEnabled()) {
+            watch = new StopWatch();
+            watch.start();
+        }
+        try{
+
+            //TODO: Hide this in QueryRule.execute(some parameters)
+            boolean executeQuery = queryToUse.length() > 0;
+            if (parameters.get("contentsource") != null) {
+                LOG.debug("call: Got contentsource, executeQuery=true");
+                executeQuery = true;
+            }
+
+            executeQuery |= filter != null && filter.length() > 0;
+            LOG.debug("executeQuery==" + executeQuery + " ; queryToUse:" + 
queryToUse + "; filter:" + filter + ";");
+
+            final SearchResult result = executeQuery ? execute() : new 
BasicSearchResult(this);
+
+            STATISTICS_LOG.info(
+                    "<search-command name=\"" + 
getSearchConfiguration().getStatisticsName() + "\">"
+                        + "<query>" + context.getQuery().getQueryString() + 
"</query>"
+                        + "<search-name>"
+                        + getClass().getSimpleName()
+                        + "</search-name>"
+                        + "<hits>" + result.getHitCount() + "</hits>"
+                    + "</search-command>");
+            LOG.debug("Hits is " + getSearchConfiguration().getName() + ":" + 
result.getHitCount());
+
+            return result;
+
+        }finally{
+            if (LOG.isDebugEnabled()) {
+                watch.stop();
+                LOG.debug("Search " + getSearchConfiguration().getName() + " 
took " + watch);
+            }
+        }
+    }
+
+    protected final void performResultHandling(final SearchResult result){
+
+        for (ResultHandler resultHandler : 
getSearchConfiguration().getResultHandlers()) {
+
+            final ResultHandler.Context resultHandlerContext = 
ContextWrapper.wrap(
+                    ResultHandler.Context.class,
+                    new BaseContext(){// <editor-fold defaultstate="collapsed" 
desc=" ResultHandler.Context ">
+                        public SearchResult getSearchResult() {
+                            return result;
+                        }
+                        /** @deprecated implementations should be using the 
QueryContext instead! */
+                        public String getQueryString() {
+                            return context.getRunningQuery().getQueryString();
+                        }
+                        public void addSource(final Modifier modifier) {
+                            context.getRunningQuery().addSource(modifier);
+                        }
+                    },// </editor-fold>
+                    context
+            );
+            resultHandler.handleResult(resultHandlerContext, parameters);
+        }
+    }
+
+    
     /**
      * Returns the offset in the result set. If paging is enabled for the
      * current search configuration the offset to the current page will be

Modified: 
trunk/src/java/no/schibstedsok/front/searchportal/command/SearchCommand.java
===================================================================
--- 
trunk/src/java/no/schibstedsok/front/searchportal/command/SearchCommand.java    
    2006-04-10 16:37:59 UTC (rev 2759)
+++ 
trunk/src/java/no/schibstedsok/front/searchportal/command/SearchCommand.java    
    2006-04-10 19:10:06 UTC (rev 2760)
@@ -41,4 +41,7 @@
      * @return The query.
      */
     RunningQuery getRunningQuery();
+
+    /** Allows the SearchCommand to clean itself after a long night out when 
s/he didn't get home in time. **/
+    void handleCancellation();
 }

Modified: 
trunk/src/java/no/schibstedsok/front/searchportal/executor/ParallelSearchCommandExecutor.java
===================================================================
--- 
trunk/src/java/no/schibstedsok/front/searchportal/executor/ParallelSearchCommandExecutor.java
       2006-04-10 16:37:59 UTC (rev 2759)
+++ 
trunk/src/java/no/schibstedsok/front/searchportal/executor/ParallelSearchCommandExecutor.java
       2006-04-10 19:10:06 UTC (rev 2760)
@@ -24,9 +24,9 @@
 
     private static final int INSPECTOR_PERIOD = 300000;
 
-    private transient static ExecutorService executor = new 
SearchTaskExecutorService();
-    private transient static Log LOG = 
LogFactory.getLog(ParallelSearchCommandExecutor.class);
-    private transient static ThreadPoolInspector inspector = new 
ThreadPoolInspector((ThreadPoolExecutor) executor, INSPECTOR_PERIOD);
+    private transient static final SearchTaskExecutorService executor = new 
SearchTaskExecutorService();
+    private transient static final Log LOG = 
LogFactory.getLog(ParallelSearchCommandExecutor.class);
+    private transient static final ThreadPoolInspector inspector = new 
ThreadPoolInspector( executor, INSPECTOR_PERIOD);
 
     /**
      * Creates a new parallel executor.

Modified: 
trunk/src/java/no/schibstedsok/front/searchportal/executor/SearchTaskExecutorService.java
===================================================================
--- 
trunk/src/java/no/schibstedsok/front/searchportal/executor/SearchTaskExecutorService.java
   2006-04-10 16:37:59 UTC (rev 2759)
+++ 
trunk/src/java/no/schibstedsok/front/searchportal/executor/SearchTaskExecutorService.java
   2006-04-10 19:10:06 UTC (rev 2760)
@@ -31,4 +31,5 @@
 
         return new SearchTask( command );
     }
+
 }

Modified: 
trunk/src/java/no/schibstedsok/front/searchportal/query/run/RunningQueryImpl.java
===================================================================
--- 
trunk/src/java/no/schibstedsok/front/searchportal/query/run/RunningQueryImpl.java
   2006-04-10 16:37:59 UTC (rev 2759)
+++ 
trunk/src/java/no/schibstedsok/front/searchportal/query/run/RunningQueryImpl.java
   2006-04-10 19:10:06 UTC (rev 2760)
@@ -254,9 +254,13 @@
             // TODO This loop-(task.isDone()) code should become individual 
listeners to each executor to minimise time
             //  spent in task.isDone()
             boolean hitsToShow = false;
+
+            for(Callable<SearchResult> command : commands){
+                ((SearchCommand)command).handleCancellation();
+            }
             
             for (Future<SearchResult> task : results) {
-                
+
                 if (task.isDone() && !task.isCancelled()) {
 
                     final SearchResult searchResult = task.get();

Modified: 
trunk/src/test/java/no/schibstedsok/front/searchportal/result/test/MockupSearchCommand.java
===================================================================
--- 
trunk/src/test/java/no/schibstedsok/front/searchportal/result/test/MockupSearchCommand.java
 2006-04-10 16:37:59 UTC (rev 2759)
+++ 
trunk/src/test/java/no/schibstedsok/front/searchportal/result/test/MockupSearchCommand.java
 2006-04-10 19:10:06 UTC (rev 2760)
@@ -76,4 +76,7 @@
     public SearchResult call() throws Exception {
         return null;
     }
+
+    public void handleCancellation() {
+    }
 }

_______________________________________________
Kernel-commits mailing list
[email protected]
http://sesat.no/mailman/listinfo/kernel-commits

Reply via email to