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/ -->