Add CloseHook support.  This fixes the problem for the search component, but not for the query parser plugin.  Part of CONNECTORS-333.

git-svn-id: https://svn.apache.org/repos/asf/incubator/lcf/integration/solr-4.x/trunk@1226451 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/mcf/src/java/org/apache/solr/mcf/ManifoldCFQParserPlugin.java b/mcf/src/java/org/apache/solr/mcf/ManifoldCFQParserPlugin.java
index 222bbea..7680204 100644
--- a/mcf/src/java/org/apache/solr/mcf/ManifoldCFQParserPlugin.java
+++ b/mcf/src/java/org/apache/solr/mcf/ManifoldCFQParserPlugin.java
@@ -35,6 +35,9 @@
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.handler.component.ResponseBuilder;
 import org.apache.solr.handler.component.SearchComponent;
+import org.apache.solr.core.CloseHook;
+import org.apache.solr.util.plugin.SolrCoreAware;
+import org.apache.solr.core.SolrCore;
 import org.apache.commons.httpclient.*;
 import org.apache.commons.httpclient.methods.*;
 import org.apache.commons.httpclient.params.*;
@@ -74,26 +77,12 @@
   String fieldAllowShare = null;
   String fieldDenyShare = null;
   int socketTimeOut;
-  MultiThreadedHttpConnectionManager httpConnectionManager;
-  HttpClient client;
+  MultiThreadedHttpConnectionManager httpConnectionManager = null;
+  HttpClient client = null;
   
   public ManifoldCFQParserPlugin()
   {
     super();
-    HttpConnectionManagerParams params = new HttpConnectionManagerParams();
-    params.setTcpNoDelay(true);
-    params.setStaleCheckingEnabled(false);
-    httpConnectionManager = new MultiThreadedHttpConnectionManager();
-    httpConnectionManager.setParams(params);
-    client = new HttpClient(httpConnectionManager);
-  }
-
-  @Override
-  protected void finalize()
-    throws Throwable
-  {
-    super.finalize();
-    httpConnectionManager.shutdown();
   }
 
   @Override
@@ -114,6 +103,15 @@
     fieldDenyDocument = denyAttributePrefix+"document";
     fieldAllowShare = allowAttributePrefix+"share";
     fieldDenyShare = denyAttributePrefix+"share";
+
+    // Initialize the connection pool
+    HttpConnectionManagerParams params = new HttpConnectionManagerParams();
+    params.setTcpNoDelay(true);
+    params.setStaleCheckingEnabled(false);
+    httpConnectionManager = new MultiThreadedHttpConnectionManager();
+    httpConnectionManager.setParams(params);
+    // MHL to set the pool size
+    client = new HttpClient(httpConnectionManager);
   }
 
   @Override
@@ -122,6 +120,11 @@
     return new ManifoldCFQueryParser(qstr,localParams,params,req);
   }
 
+  public void inform(SolrCore core)
+  {
+    core.addCloseHook(new CloseHandler());
+  }
+  
   protected class ManifoldCFQueryParser extends QParser
   {
     public ManifoldCFQueryParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req)
@@ -307,5 +310,32 @@
       }
     }
   }
-  
+
+  /** CloseHook implementation.
+  */
+  protected class CloseHandler extends CloseHook
+  {
+    public CloseHandler()
+    {
+    }
+    
+    @Override
+    public void preClose(SolrCore core)
+    {
+    }
+    
+    @Override
+    public void postClose(SolrCore core)
+    {
+      // Close the connection pool
+      if (httpConnectionManager != null)
+      {
+        httpConnectionManager.shutdown();
+        httpConnectionManager = null;
+        client = null;
+      }
+    }
+    
+  }
+
 }
\ No newline at end of file
diff --git a/mcf/src/java/org/apache/solr/mcf/ManifoldCFSearchComponent.java b/mcf/src/java/org/apache/solr/mcf/ManifoldCFSearchComponent.java
index 78e38b7..1156512 100644
--- a/mcf/src/java/org/apache/solr/mcf/ManifoldCFSearchComponent.java
+++ b/mcf/src/java/org/apache/solr/mcf/ManifoldCFSearchComponent.java
@@ -26,6 +26,9 @@
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.handler.component.ResponseBuilder;
 import org.apache.solr.handler.component.SearchComponent;
+import org.apache.solr.core.CloseHook;
+import org.apache.solr.util.plugin.SolrCoreAware;
+import org.apache.solr.core.SolrCore;
 import org.apache.commons.httpclient.*;
 import org.apache.commons.httpclient.methods.*;
 import org.apache.commons.httpclient.params.*;
@@ -39,7 +42,7 @@
 * SearchComponent plugin for ManifoldCF-specific document-level access control.
 * Configuration is under the SolrACLSecurity name.
 */
-public class ManifoldCFSearchComponent extends SearchComponent
+public class ManifoldCFSearchComponent extends SearchComponent implements SolrCoreAware
 {
   /** The component name */
   static final public String COMPONENT_NAME = "mcf";
@@ -66,26 +69,12 @@
   String fieldAllowShare = null;
   String fieldDenyShare = null;
   int socketTimeOut;
-  MultiThreadedHttpConnectionManager httpConnectionManager;
-  HttpClient client;
+  MultiThreadedHttpConnectionManager httpConnectionManager = null;
+  HttpClient client = null;
   
   public ManifoldCFSearchComponent()
   {
     super();
-    HttpConnectionManagerParams params = new HttpConnectionManagerParams();
-    params.setTcpNoDelay(true);
-    params.setStaleCheckingEnabled(false);
-    httpConnectionManager = new MultiThreadedHttpConnectionManager();
-    httpConnectionManager.setParams(params);
-    client = new HttpClient(httpConnectionManager);
-  }
-
-  @Override
-  protected void finalize()
-    throws Throwable
-  {
-    super.finalize();
-    httpConnectionManager.shutdown();
   }
 
   @Override
@@ -107,6 +96,16 @@
     fieldDenyDocument = denyAttributePrefix+"document";
     fieldAllowShare = allowAttributePrefix+"share";
     fieldDenyShare = denyAttributePrefix+"share";
+    
+    // Initialize the connection pool
+    HttpConnectionManagerParams params = new HttpConnectionManagerParams();
+    params.setTcpNoDelay(true);
+    params.setStaleCheckingEnabled(false);
+    httpConnectionManager = new MultiThreadedHttpConnectionManager();
+    httpConnectionManager.setParams(params);
+    // MHL to set the pool size
+    client = new HttpClient(httpConnectionManager);
+
   }
 
   @Override
@@ -263,7 +262,12 @@
   {
     return "$URL$";
   }
-	
+
+  public void inform(SolrCore core)
+  {
+    core.addCloseHook(new CloseHandler());
+  }
+  
   // Protected methods
   
   /** Get access tokens given a username */
@@ -333,4 +337,31 @@
     }
   }
   
+  /** CloseHook implementation.
+  */
+  protected class CloseHandler extends CloseHook
+  {
+    public CloseHandler()
+    {
+    }
+    
+    @Override
+    public void preClose(SolrCore core)
+    {
+    }
+    
+    @Override
+    public void postClose(SolrCore core)
+    {
+      // Close the connection pool
+      if (httpConnectionManager != null)
+      {
+        httpConnectionManager.shutdown();
+        httpConnectionManager = null;
+        client = null;
+      }
+    }
+    
+  }
+  
 }
\ No newline at end of file