You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by gs...@apache.org on 2013/08/05 12:51:50 UTC

svn commit: r1510425 [4/4] - in /lucene/dev/branches/solr_guice_restlet/solr: core/ core/src/java/org/apache/solr/ core/src/java/org/apache/solr/core/ core/src/java/org/apache/solr/request/ core/src/java/org/apache/solr/rest/ core/src/java/org/apache/s...

Added: lucene/dev/branches/solr_guice_restlet/solr/core/src/java/org/apache/solr/servlet/SolrGuiceServletConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr_guice_restlet/solr/core/src/java/org/apache/solr/servlet/SolrGuiceServletConfig.java?rev=1510425&view=auto
==============================================================================
--- lucene/dev/branches/solr_guice_restlet/solr/core/src/java/org/apache/solr/servlet/SolrGuiceServletConfig.java (added)
+++ lucene/dev/branches/solr_guice_restlet/solr/core/src/java/org/apache/solr/servlet/SolrGuiceServletConfig.java Mon Aug  5 10:51:48 2013
@@ -0,0 +1,136 @@
+package org.apache.solr.servlet;
+
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.multibindings.Multibinder;
+import com.google.inject.servlet.GuiceServletContextListener;
+import com.google.inject.servlet.ServletModule;
+import org.apache.solr.common.SolrException;
+import org.apache.solr.core.CoreContainer;
+import org.apache.solr.core.CoreContainerAPIModule;
+import org.apache.solr.core.SolrConfig;
+import org.apache.solr.request.SolrQueryRequestDecoder;
+import org.apache.solr.rest.APIModule;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.WeakHashMap;
+
+/**
+ *
+ *
+ **/
+public class SolrGuiceServletConfig extends GuiceServletContextListener {
+  private transient static Logger log = LoggerFactory.getLogger(GuiceServletContextListener.class);
+
+  // TODO: figure out how to not have this as a static ?
+  //private static final LWEModule module = new LWEModule();
+  @Inject protected Injector injector;
+  protected final Map<SolrConfig, SolrRequestParsers> parsers = new WeakHashMap<SolrConfig, SolrRequestParsers>();
+
+
+  /*static {
+
+    try {
+      injector = Guice.createInjector(module, new LWEServletModule());
+      module.init(injector);
+    } catch (Throwable t) {
+      final String msg = "Error initializing Guice injector" + t.getMessage();
+      log.error(msg, t);
+      throw new RuntimeException(msg, t);
+    }
+  }
+*/
+  public SolrGuiceServletConfig() {
+
+  }
+
+  @Override
+  public void contextInitialized(final ServletContextEvent servletContextEvent) {
+    final ServletContext context = servletContextEvent.getServletContext();
+    final Set<AbstractModule> modules = new HashSet<>();
+    final Set<APIModule> apiModules = new HashSet<>();
+    //TODO: find all the Modules on the classpath automatically
+    final String moduleNames = context.getInitParameter("api-modules");
+    if (moduleNames != null) {
+      String[] splits = moduleNames.split(",");
+      if (splits != null) {
+        for (String moduleName : splits) {
+          try {
+            Class<? extends APIModule> theModule = Class.forName(moduleName).asSubclass(APIModule.class);
+            APIModule mod = theModule.newInstance();
+            modules.add(mod);
+            apiModules.add(mod);
+          } catch (Exception e) {
+            log.error("Exception", e);
+            throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unable to load: " + moduleName, e);
+          }
+        }
+      }
+    } else {
+      log.warn("No APIModules specified");
+    }
+    //Always add the CoreContainerAPI
+    CoreContainerAPIModule ccam = new CoreContainerAPIModule();
+    modules.add(ccam);
+    apiModules.add(ccam);
+
+    AbstractModule module = new AbstractModule() {
+      @Override
+      protected void configure() {
+        Multibinder<APIModule> apiBinder = Multibinder.newSetBinder(binder(), APIModule.class);
+        for (APIModule apiModule : apiModules) {
+          apiBinder.addBinding().toInstance(apiModule);
+        }
+      }
+    };
+    modules.add(module);
+    ServletModule servletModule = new ServletModule() {
+      @Override
+      protected void configureServlets() {
+        //TODO: get rid of this
+        //Legacy
+        //TODO: make request scoped and go away from Servlet?
+        serve("/zookeeper*").with(ZookeeperInfoServlet.class);
+        //serve("/admin*").with();
+        //TODO: do we really need this
+        //serve("/admin.html").with(LoadAdminUiServlet.class);
+        //TODO: inject existing request handlers?  Or just get rid of them?  Or auto-redirect them?
+
+        //Injectable, RESTlet, etc.
+        Map<String, String> initParams = new HashMap<>();
+        initParams.put("org.restlet.component", "embedded");
+
+        serve("/*").with(InjectableServlet.class, initParams);
+      }
+    };
+    modules.add(new HttpServletModule(parsers));
+    modules.add(servletModule);
+    injector = Guice.createInjector(modules);
+  }
+
+
+  @Override
+  public void contextDestroyed(ServletContextEvent servletContextEvent) {
+    CoreContainer cores = injector.getInstance(CoreContainer.class);
+    if (cores != null) {
+      cores.shutdown();
+    }
+  }
+
+  @Override
+  protected Injector getInjector() {
+    return injector;
+  }
+
+
+}
\ No newline at end of file

Modified: lucene/dev/branches/solr_guice_restlet/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr_guice_restlet/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java?rev=1510425&r1=1510424&r2=1510425&view=diff
==============================================================================
--- lucene/dev/branches/solr_guice_restlet/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java (original)
+++ lucene/dev/branches/solr_guice_restlet/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java Mon Aug  5 10:51:48 2013
@@ -58,7 +58,7 @@ import org.apache.solr.core.SolrCore;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.request.SolrQueryRequestBase;
 
-
+//TODO: change to be Guice injected, probably can get rid of this container class all together and just take in multibinding of SolrRequestParser
 public class SolrRequestParsers 
 {
   final Logger log = LoggerFactory.getLogger(SolrRequestParsers.class);

Modified: lucene/dev/branches/solr_guice_restlet/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr_guice_restlet/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java?rev=1510425&r1=1510424&r2=1510425&view=diff
==============================================================================
--- lucene/dev/branches/solr_guice_restlet/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java (original)
+++ lucene/dev/branches/solr_guice_restlet/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java Mon Aug  5 10:51:48 2013
@@ -30,6 +30,7 @@ import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import com.google.inject.Singleton;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.IOUtils;
 import org.noggit.CharArr;
@@ -51,13 +52,15 @@ import org.slf4j.LoggerFactory;
  *
  * @since solr 4.0
  */
+
+@Singleton
 public final class ZookeeperInfoServlet extends HttpServlet {
   static final Logger log = LoggerFactory.getLogger(ZookeeperInfoServlet.class);
   
   @Override
   public void init() {
   }
-
+  //TODO: why not just override service?
   @Override
   public void doGet(HttpServletRequest request,
                     HttpServletResponse response)

Added: lucene/dev/branches/solr_guice_restlet/solr/core/src/test/org/apache/solr/servlet/SolrGuiceServletConfigTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr_guice_restlet/solr/core/src/test/org/apache/solr/servlet/SolrGuiceServletConfigTest.java?rev=1510425&view=auto
==============================================================================
--- lucene/dev/branches/solr_guice_restlet/solr/core/src/test/org/apache/solr/servlet/SolrGuiceServletConfigTest.java (added)
+++ lucene/dev/branches/solr_guice_restlet/solr/core/src/test/org/apache/solr/servlet/SolrGuiceServletConfigTest.java Mon Aug  5 10:51:48 2013
@@ -0,0 +1,12 @@
+package org.apache.solr.servlet;
+
+
+import org.apache.solr.SolrTestCaseJ4;
+
+/**
+ *
+ *
+ **/
+public class SolrGuiceServletConfigTest extends SolrTestCaseJ4 {//do we need all of this?
+
+}

Modified: lucene/dev/branches/solr_guice_restlet/solr/webapp/web/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr_guice_restlet/solr/webapp/web/WEB-INF/web.xml?rev=1510425&r1=1510424&r2=1510425&view=diff
==============================================================================
--- lucene/dev/branches/solr_guice_restlet/solr/webapp/web/WEB-INF/web.xml (original)
+++ lucene/dev/branches/solr_guice_restlet/solr/webapp/web/WEB-INF/web.xml Mon Aug  5 10:51:48 2013
@@ -22,7 +22,10 @@
          metadata-complete="true"
 >
 
-
+  <context-param>
+    <param-name>api-modules</param-name>
+    <param-value>org.apache.solr.rest.schema.SchemaAPIModule,org.apache.solr.rest.ping.PingAPIModule</param-value>
+  </context-param>
   <!-- Uncomment if you are trying to use a Resin version before 3.0.19.
     Their XML implementation isn't entirely compatible with Xerces.
     Below are the implementations to use with Sun's JVM.
@@ -33,6 +36,10 @@
   <system-property javax.xml.parsers.SAXParserFactory=
              "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl"/>
    -->
+  <listener>
+    <listener-class>org.apache.solr.servlet.SolrGuiceServletConfig</listener-class>
+  </listener>
+
 
   <!-- People who want to hardcode their "Solr Home" directly into the
        WAR File can set the JNDI property here...
@@ -72,8 +79,18 @@
     -->
   </filter>
 
+   <!-- Servlets and Filters are configured by Guice - see com.lucid.servlet.LWEServletModule -->
+  <filter>
+    <filter-name>guiceFilter</filter-name>
+    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
+  </filter>
+  <!-- TODO: don't do /rest here, this is just a short term stop gap until we can properly kill SolrDispatchFilter -->
   <filter-mapping>
-    <!--
+    <filter-name>guiceFilter</filter-name>
+    <url-pattern>/*</url-pattern>
+  </filter-mapping>
+
+      <!--
       NOTE: When using multicore, /admin JSP URLs with a core specified
       such as /solr/coreName/admin/stats.jsp get forwarded by a
       RequestDispatcher to /solr/admin/stats.jsp with the specified core
@@ -83,91 +100,33 @@
       configured to also filter on forwards.  Do not configure
       this dispatcher as <dispatcher>FORWARD</dispatcher>.
     -->
+
+<!--
+  <filter-mapping>
     <filter-name>SolrRequestFilter</filter-name>
     <url-pattern>/*</url-pattern>
   </filter-mapping>
-
-  <servlet>
-    <servlet-name>Zookeeper</servlet-name>
-    <servlet-class>org.apache.solr.servlet.ZookeeperInfoServlet</servlet-class>
-  </servlet>
+-->
   
   <servlet>
     <servlet-name>LoadAdminUI</servlet-name>
     <servlet-class>org.apache.solr.servlet.LoadAdminUiServlet</servlet-class>
   </servlet>
   
-  <!-- Remove in Solr 5.0 -->
-  <!-- This sends SC_MOVED_PERMANENTLY (301) for resources that changed in 4.0 -->
-  <servlet>
-    <servlet-name>RedirectOldAdminUI</servlet-name>
-    <servlet-class>org.apache.solr.servlet.RedirectServlet</servlet-class>
-    <init-param>
-      <param-name>destination</param-name>
-      <param-value>${context}/#/</param-value>
-    </init-param>
-  </servlet>
-  
-  <servlet>
-    <servlet-name>RedirectOldZookeeper</servlet-name>
-    <servlet-class>org.apache.solr.servlet.RedirectServlet</servlet-class>
-    <init-param>
-      <param-name>destination</param-name>
-      <param-value>${context}/zookeeper</param-value>
-    </init-param>
-  </servlet>
-  
-  <servlet>
-    <servlet-name>RedirectLogging</servlet-name>
-    <servlet-class>org.apache.solr.servlet.RedirectServlet</servlet-class>
-    <init-param>
-      <param-name>destination</param-name>
-      <param-value>${context}/#/~logging</param-value>
-    </init-param>
-  </servlet>
 
-  <servlet>
+  <!--<servlet>
     <servlet-name>SolrRestApi</servlet-name>
     <servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
     <init-param>
       <param-name>org.restlet.application</param-name>
       <param-value>org.apache.solr.rest.SolrRestApi</param-value>
     </init-param>
-  </servlet>
+  </servlet>-->
   
-  <servlet-mapping>
-    <servlet-name>RedirectOldAdminUI</servlet-name>
-    <url-pattern>/admin/</url-pattern>
-  </servlet-mapping>
-  <servlet-mapping>
-    <servlet-name>RedirectOldAdminUI</servlet-name>
-    <url-pattern>/admin</url-pattern>
-  </servlet-mapping>
-  <servlet-mapping>
-    <servlet-name>RedirectOldZookeeper</servlet-name>
-    <url-pattern>/zookeeper.jsp</url-pattern>
-  </servlet-mapping>
-  <servlet-mapping>
-    <servlet-name>RedirectLogging</servlet-name>
-    <url-pattern>/logging</url-pattern>
-  </servlet-mapping>
 
   <!-- Servlet Mapping -->
-  <servlet-mapping>
-    <servlet-name>Zookeeper</servlet-name>
-    <url-pattern>/zookeeper</url-pattern>
-  </servlet-mapping>
-  
-  <servlet-mapping>
-    <servlet-name>LoadAdminUI</servlet-name>
-    <url-pattern>/admin.html</url-pattern>
-  </servlet-mapping>
+  <!-- Put any of your custom servlet mapping here, otherwise see the SolrGuiceServletConfig for how this is done automatically in Solr when in Servlet mode -->
 
-  <servlet-mapping>
-    <servlet-name>SolrRestApi</servlet-name>
-    <url-pattern>/schema/*</url-pattern>
-  </servlet-mapping>
-  
   <mime-mapping>
     <extension>.xsl</extension>
     <!-- per http://www.w3.org/TR/2006/PR-xslt20-20061121/ -->