From f1dd77982a2f0d56b2bded5573a9251ace5097a5 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Wed, 21 Nov 2012 20:49:18 +0000 Subject: [PATCH] RouterConsole compile fixes for Jetty 7. Convert LocaleWebAppHandler from extending WebAppContext to extending HandlerWrapper, since handle() is now final in WebAppContext. Untested. --- apps/routerconsole/java/build.xml | 8 +- .../i2p/router/web/ConfigClientsHandler.java | 2 +- .../router/web/ConsolePasswordManager.java | 2 +- .../i2p/router/web/LocaleWebAppHandler.java | 54 ++++++++---- .../src/net/i2p/router/web/LogsHelper.java | 2 +- .../src/net/i2p/router/web/PluginStarter.java | 2 +- .../i2p/router/web/RouterConsoleRunner.java | 88 ++++++++++--------- .../i2p/router/web/WebAppConfiguration.java | 31 ++++--- .../src/net/i2p/router/web/WebAppStarter.java | 12 +-- apps/routerconsole/jsp/error.jsp | 6 +- apps/routerconsole/jsp/error500.jsp | 10 +-- 11 files changed, 130 insertions(+), 87 deletions(-) diff --git a/apps/routerconsole/java/build.xml b/apps/routerconsole/java/build.xml index e9eb2a74d8..7e6f01a1fb 100644 --- a/apps/routerconsole/java/build.xml +++ b/apps/routerconsole/java/build.xml @@ -60,9 +60,13 @@ <pathelement location="../../../core/java/build/i2p.jar" /> <pathelement location="../../../router/java/build/router.jar" /> <pathelement location="../../jetty/jettylib/org.mortbay.jetty.jar" /> + <pathelement location="../../jetty/jettylib/jetty-http.jar" /> + <pathelement location="../../jetty/jettylib/jetty-io.jar" /> + <pathelement location="../../jetty/jettylib/jetty-security.jar" /> + <pathelement location="../../jetty/jettylib/jetty-servlet.jar" /> + <pathelement location="../../jetty/jettylib/jetty-servlets.jar" /> <pathelement location="../../jetty/jettylib/jetty-util.jar" /> - <pathelement location="../../jetty/jettylib/jetty-sslengine.jar" /> - <pathelement location="../../jetty/jettylib/jetty-java5-threadpool.jar" /> + <pathelement location="../../jetty/jettylib/jetty-webapp.jar" /> <pathelement location="../../jetty/jettylib/javax.servlet.jar" /> <pathelement location="../../jetty/jettylib/jsp-api.jar" /> <pathelement location="../../jetty/jettylib/jetty-i2p.jar" /> diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java index 851b7ab0b9..761694fb15 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java @@ -17,7 +17,7 @@ import net.i2p.router.startup.LoadClientAppsJob; import net.i2p.router.update.ConsoleUpdateManager; import static net.i2p.update.UpdateType.*; -import org.mortbay.jetty.handler.ContextHandlerCollection; +import org.eclipse.jetty.server.handler.ContextHandlerCollection; /** * Saves changes to clients.config or webapps.config diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConsolePasswordManager.java b/apps/routerconsole/java/src/net/i2p/router/web/ConsolePasswordManager.java index 681d6bcb3d..2036d24594 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConsolePasswordManager.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConsolePasswordManager.java @@ -12,7 +12,7 @@ import net.i2p.router.Router; import net.i2p.router.RouterContext; import net.i2p.router.util.RouterPasswordManager; -//import org.mortbay.jetty.security.UnixCrypt; +//import org.eclipse.jetty.util.security.UnixCrypt; /** * Manage both plaintext and salted/hashed password storage in diff --git a/apps/routerconsole/java/src/net/i2p/router/web/LocaleWebAppHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/LocaleWebAppHandler.java index bbc27ed3e5..74ce11a197 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/LocaleWebAppHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/LocaleWebAppHandler.java @@ -1,5 +1,6 @@ package net.i2p.router.web; +import java.io.File; import java.io.IOException; import java.util.Locale; import java.util.Map; @@ -10,7 +11,11 @@ import javax.servlet.http.HttpServletResponse; import net.i2p.I2PAppContext; -import org.mortbay.jetty.webapp.WebAppContext; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.handler.HandlerWrapper; +import org.eclipse.jetty.server.session.SessionHandler; +import org.eclipse.jetty.servlet.ServletHandler; +import org.eclipse.jetty.webapp.WebAppContext; /** * Convert foo.jsp to foo_xx.jsp for language xx. @@ -21,14 +26,22 @@ import org.mortbay.jetty.webapp.WebAppContext; * * @author zzz */ -public class LocaleWebAppHandler extends WebAppContext +public class LocaleWebAppHandler extends HandlerWrapper { private final I2PAppContext _context; + private final WebAppContext _wac; - public LocaleWebAppHandler(I2PAppContext ctx, String path, String warPath) { - super(warPath, path); + public LocaleWebAppHandler(I2PAppContext ctx, String path, String warPath, + File tmpdir, ServletHandler servletHandler) { + super(); _context = ctx; + _wac = new WebAppContext(warPath, path); setInitParams(WebAppStarter.INIT_PARAMS); + _wac.setTempDirectory(tmpdir); + _wac.setExtractWAR(false); + _wac.setSessionHandler(new SessionHandler()); + _wac.setServletHandler(servletHandler); + setHandler(_wac); } /** @@ -37,19 +50,12 @@ public class LocaleWebAppHandler extends WebAppContext * or as specified in the routerconsole.lang property. * Unless language == "en". */ - @Override public void handle(String pathInContext, + Request baseRequest, HttpServletRequest httpRequest, - HttpServletResponse httpResponse, - int dispatch) + HttpServletResponse httpResponse) throws IOException, ServletException { - // Handle OPTIONS (nothing to override) - if ("OPTIONS".equals(httpRequest.getMethod())) - { - handleOptions(httpRequest, httpResponse); - return; - } // transparent rewriting if (pathInContext.equals("/") || pathInContext.equals("/index.html")) { @@ -77,7 +83,7 @@ public class LocaleWebAppHandler extends WebAppContext if (lang != null && lang.length() > 0 && !lang.equals("en")) { String testPath = pathInContext.substring(0, len - 4) + '_' + lang + ".jsp"; // Do we have a servlet for the new path that isn't the catchall *.jsp? - Map.Entry servlet = getServletHandler().getHolderEntry(testPath); + Map.Entry servlet = _wac.getServletHandler().getHolderEntry(testPath); if (servlet != null) { String servletPath = (String) servlet.getKey(); if (servletPath != null && !servletPath.startsWith("*")) { @@ -90,7 +96,7 @@ public class LocaleWebAppHandler extends WebAppContext } } //System.err.println("New path: " + newPath); - super.handle(newPath, httpRequest, httpResponse, dispatch); + super.handle(newPath, baseRequest, httpRequest, httpResponse); //System.err.println("Was handled? " + httpRequest.isHandled()); } @@ -112,10 +118,28 @@ public class LocaleWebAppHandler extends WebAppContext * Not an override * @since 0.8 */ +/**** not in Jetty 7 public void handleOptions(HttpServletRequest request, HttpServletResponse response) throws IOException { response.sendError(405); } +****/ + + /** + * Mysteriously removed from Jetty 7 + */ + private void setInitParams(Map params) { + setInitParams(_wac, params); + } + + /** + * @since Jetty 7 + */ + public static void setInitParams(WebAppContext context, Map<?,?> params) { + for (Map.Entry e : params.entrySet()) { + context.setInitParameter((String)e.getKey(), (String)e.getValue()); + } + } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java index 27cea16d99..6e92ff9d84 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java @@ -7,7 +7,7 @@ import net.i2p.I2PAppContext; import net.i2p.util.FileUtil; import net.i2p.util.VersionComparator; -import org.mortbay.jetty.Server; +import org.eclipse.jetty.server.Server; import org.tanukisoftware.wrapper.WrapperManager; public class LogsHelper extends HelperBase { diff --git a/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java b/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java index 7ec9b7895e..7074ca116c 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java @@ -34,7 +34,7 @@ import net.i2p.util.Log; import net.i2p.util.Translate; import net.i2p.util.VersionComparator; -import org.mortbay.jetty.handler.ContextHandlerCollection; +import org.eclipse.jetty.server.handler.ContextHandlerCollection; /** diff --git a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java index d96fe03c12..95c894668c 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java @@ -42,30 +42,33 @@ import net.i2p.util.ShellCommand; import net.i2p.util.SystemVersion; import net.i2p.util.VersionComparator; -import org.mortbay.jetty.AbstractConnector; -import org.mortbay.jetty.Connector; -import org.mortbay.jetty.NCSARequestLog; -import org.mortbay.jetty.Server; -import org.mortbay.jetty.bio.SocketConnector; -import org.mortbay.jetty.handler.ContextHandlerCollection; -import org.mortbay.jetty.handler.DefaultHandler; -import org.mortbay.jetty.handler.HandlerCollection; -import org.mortbay.jetty.handler.RequestLogHandler; -import org.mortbay.jetty.nio.SelectChannelConnector; -import org.mortbay.jetty.security.Credential.MD5; -import org.mortbay.jetty.security.DigestAuthenticator; -import org.mortbay.jetty.security.HashUserRealm; -import org.mortbay.jetty.security.Constraint; -import org.mortbay.jetty.security.ConstraintMapping; -import org.mortbay.jetty.security.SecurityHandler; -import org.mortbay.jetty.security.SslSocketConnector; -import org.mortbay.jetty.security.SslSelectChannelConnector; -import org.mortbay.jetty.servlet.ServletHandler; -import org.mortbay.jetty.servlet.ServletHolder; -import org.mortbay.jetty.servlet.SessionHandler; -import org.mortbay.jetty.webapp.WebAppContext; -import org.mortbay.thread.QueuedThreadPool; -import org.mortbay.thread.concurrent.ThreadPool; +import org.eclipse.jetty.security.HashLoginService; +import org.eclipse.jetty.security.ConstraintMapping; +import org.eclipse.jetty.security.ConstraintSecurityHandler; +import org.eclipse.jetty.security.SecurityHandler; +import org.eclipse.jetty.security.authentication.DigestAuthenticator; +import org.eclipse.jetty.server.AbstractConnector; +import org.eclipse.jetty.server.Connector; +import org.eclipse.jetty.server.NCSARequestLog; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.bio.SocketConnector; +import org.eclipse.jetty.server.handler.ContextHandlerCollection; +import org.eclipse.jetty.server.handler.DefaultHandler; +import org.eclipse.jetty.server.handler.HandlerCollection; +import org.eclipse.jetty.server.handler.HandlerWrapper; +import org.eclipse.jetty.server.handler.RequestLogHandler; +import org.eclipse.jetty.server.nio.SelectChannelConnector; +import org.eclipse.jetty.server.ssl.SslSocketConnector; +import org.eclipse.jetty.server.ssl.SslSelectChannelConnector; +import org.eclipse.jetty.servlet.ServletHandler; +import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.webapp.WebAppContext; +import org.eclipse.jetty.util.security.Constraint; +import org.eclipse.jetty.util.security.Credential; +import org.eclipse.jetty.util.security.Credential.MD5; +import org.eclipse.jetty.util.thread.ExecutorThreadPool; +import org.eclipse.jetty.util.thread.QueuedThreadPool; +import org.eclipse.jetty.util.thread.ThreadPool; /** * Start the router console. @@ -306,7 +309,8 @@ public class RouterConsoleRunner implements RouterApp { try { ThreadPool ctp = new CustomThreadPoolExecutor(); - ctp.prestartAllCoreThreads(); + // Gone in Jetty 7 + //ctp.prestartAllCoreThreads(); _server.setThreadPool(ctp); } catch (Throwable t) { // class not found... @@ -319,7 +323,9 @@ public class RouterConsoleRunner implements RouterApp { HandlerCollection hColl = new HandlerCollection(); ContextHandlerCollection chColl = new ContextHandlerCollection(); - _server.addHandler(hColl); + // gone in Jetty 7 + //_server.addHandler(hColl); + _server.setHandler(hColl); hColl.addHandler(chColl); hColl.addHandler(new DefaultHandler()); @@ -355,7 +361,7 @@ public class RouterConsoleRunner implements RouterApp { if (!_webAppsDir.endsWith("/")) _webAppsDir += '/'; - WebAppContext rootWebApp = null; + HandlerWrapper rootWebApp = null; ServletHandler rootServletHandler = null; List<Connector> connectors = new ArrayList(4); try { @@ -511,17 +517,14 @@ public class RouterConsoleRunner implements RouterApp { return; } - rootWebApp = new LocaleWebAppHandler(_context, - "/", _webAppsDir + ROUTERCONSOLE + ".war"); File tmpdir = new SecureDirectory(workDir, ROUTERCONSOLE + "-" + (_listenPort != null ? _listenPort : _sslListenPort)); tmpdir.mkdir(); - rootWebApp.setTempDirectory(tmpdir); - rootWebApp.setExtractWAR(false); - rootWebApp.setSessionHandler(new SessionHandler()); rootServletHandler = new ServletHandler(); - rootWebApp.setServletHandler(rootServletHandler); - initialize(_context, rootWebApp); + rootWebApp = new LocaleWebAppHandler(_context, + "/", _webAppsDir + ROUTERCONSOLE + ".war", + tmpdir, rootServletHandler); + initialize(_context, (WebAppContext)(rootWebApp.getHandler())); chColl.addHandler(rootWebApp); } catch (Exception ioe) { @@ -731,7 +734,7 @@ public class RouterConsoleRunner implements RouterApp { * Add all users and passwords. */ static void initialize(RouterContext ctx, WebAppContext context) { - SecurityHandler sec = new SecurityHandler(); + ConstraintSecurityHandler sec = new ConstraintSecurityHandler(); List<ConstraintMapping> constraints = new ArrayList(4); ConsolePasswordManager mgr = new ConsolePasswordManager(ctx); boolean enable = ctx.getBooleanProperty(PROP_PW_ENABLE); @@ -741,14 +744,13 @@ public class RouterConsoleRunner implements RouterApp { enable = false; ctx.router().saveConfig(PROP_CONSOLE_PW, "false"); } else { - HashUserRealm realm = new HashUserRealm(JETTY_REALM); - sec.setUserRealm(realm); + HashLoginService realm = new HashLoginService(JETTY_REALM); + sec.setLoginService(realm); sec.setAuthenticator(authenticator); for (Map.Entry<String, String> e : userpw.entrySet()) { String user = e.getKey(); String pw = e.getValue(); - realm.put(user, MD5.__TYPE + pw); - realm.addUserToRole(user, JETTY_ROLE); + realm.putUser(user, Credential.getCredential(MD5.__TYPE + pw), new String[] {JETTY_ROLE}); Constraint constraint = new Constraint(user, JETTY_ROLE); constraint.setAuthenticate(true); ConstraintMapping cm = new ConstraintMapping(); @@ -847,11 +849,13 @@ public class RouterConsoleRunner implements RouterApp { * Just to set the name and set Daemon * @since Jetty 6 */ - private static class CustomThreadPoolExecutor extends ThreadPool { + private static class CustomThreadPoolExecutor extends ExecutorThreadPool { public CustomThreadPoolExecutor() { super(MIN_THREADS, MAX_THREADS, MAX_IDLE_TIME, TimeUnit.MILLISECONDS, - new SynchronousQueue(), new CustomThreadFactory(), - new ThreadPoolExecutor.CallerRunsPolicy()); + new SynchronousQueue() /** , following args not available in Jetty 7 + new CustomThreadFactory(), + new ThreadPoolExecutor.CallerRunsPolicy() **/ + ); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/WebAppConfiguration.java b/apps/routerconsole/java/src/net/i2p/router/web/WebAppConfiguration.java index 74c744170b..5d2403c28b 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/WebAppConfiguration.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/WebAppConfiguration.java @@ -10,9 +10,9 @@ import java.util.StringTokenizer; import net.i2p.I2PAppContext; -import org.mortbay.jetty.webapp.Configuration; -import org.mortbay.jetty.webapp.WebAppClassLoader; -import org.mortbay.jetty.webapp.WebAppContext; +import org.eclipse.jetty.webapp.Configuration; +import org.eclipse.jetty.webapp.WebAppClassLoader; +import org.eclipse.jetty.webapp.WebAppContext; /** @@ -133,14 +133,25 @@ public class WebAppConfiguration implements Configuration { return rv; } - public void configureDefaults() {} - public void configureWebApp() {} + /** @since Jetty 7 */ + public void deconfigure(WebAppContext context) {} - /** @since Jetty 6 */ - public void deconfigureWebApp() {} - - /** @since Jetty 6 */ - public void configureClassLoader() throws Exception { + /** @since Jetty 7 */ + public void configure(WebAppContext context) throws Exception { configureClassPath(); } + + /** @since Jetty 7 */ + public void cloneConfigure(WebAppContext template, WebAppContext context) { + throw new UnsupportedOperationException(); + } + + /** @since Jetty 7 */ + public void destroy(WebAppContext context) {} + + /** @since Jetty 7 */ + public void preConfigure(WebAppContext context) {} + + /** @since Jetty 7 */ + public void postConfigure(WebAppContext context) {} } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/WebAppStarter.java b/apps/routerconsole/java/src/net/i2p/router/web/WebAppStarter.java index a7506d65fb..e27799cfbb 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/WebAppStarter.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/WebAppStarter.java @@ -10,11 +10,11 @@ import net.i2p.router.RouterContext; import net.i2p.util.FileUtil; import net.i2p.util.SecureDirectory; -import org.mortbay.jetty.Handler; -import org.mortbay.jetty.Server; -import org.mortbay.jetty.webapp.WebAppContext; -import org.mortbay.jetty.handler.ContextHandler; -import org.mortbay.jetty.handler.ContextHandlerCollection; +import org.eclipse.jetty.server.Handler; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.handler.ContextHandler; +import org.eclipse.jetty.server.handler.ContextHandlerCollection; +import org.eclipse.jetty.webapp.WebAppContext; /** @@ -56,7 +56,7 @@ public class WebAppStarter { File tmpdir = new SecureDirectory(ctx.getTempDir(), "jetty-work-" + appName + ctx.random().nextInt()); WebAppContext wac = addWebApp(ctx, server, appName, warPath, tmpdir); //_log.debug("Loading war from: " + warPath); - wac.setInitParams(INIT_PARAMS); + LocaleWebAppHandler.setInitParams(wac, INIT_PARAMS); wac.start(); } diff --git a/apps/routerconsole/jsp/error.jsp b/apps/routerconsole/jsp/error.jsp index 7d5552fd58..22b2e16fa1 100644 --- a/apps/routerconsole/jsp/error.jsp +++ b/apps/routerconsole/jsp/error.jsp @@ -4,9 +4,9 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <% // Let's make this easy... - final Integer ERROR_CODE = (Integer) request.getAttribute(org.mortbay.jetty.servlet.ServletHandler.__J_S_ERROR_STATUS_CODE); - final String ERROR_URI = (String) request.getAttribute(org.mortbay.jetty.servlet.ServletHandler.__J_S_ERROR_REQUEST_URI); - final String ERROR_MESSAGE = (String) request.getAttribute(org.mortbay.jetty.servlet.ServletHandler.__J_S_ERROR_MESSAGE); + final Integer ERROR_CODE = (Integer) request.getAttribute(org.eclipse.jetty.server.Dispatcher.ERROR_STATUS_CODE); + final String ERROR_URI = (String) request.getAttribute(org.eclipse.jetty.server.Dispatcher.ERROR_REQUEST_URI); + final String ERROR_MESSAGE = (String) request.getAttribute(org.eclipse.jetty.server.Dispatcher.ERROR_MESSAGE); if (ERROR_CODE != null && ERROR_MESSAGE != null) { // this is deprecated but we don't want sendError() response.setStatus(ERROR_CODE.intValue(), ERROR_MESSAGE); diff --git a/apps/routerconsole/jsp/error500.jsp b/apps/routerconsole/jsp/error500.jsp index 5939ea4711..66ef4f414f 100644 --- a/apps/routerconsole/jsp/error500.jsp +++ b/apps/routerconsole/jsp/error500.jsp @@ -3,11 +3,11 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <% // Let's make this easy... - final Integer ERROR_CODE = (Integer) request.getAttribute(org.mortbay.jetty.servlet.ServletHandler.__J_S_ERROR_STATUS_CODE); - final String ERROR_URI = (String) request.getAttribute(org.mortbay.jetty.servlet.ServletHandler.__J_S_ERROR_REQUEST_URI); - final String ERROR_MESSAGE = (String) request.getAttribute(org.mortbay.jetty.servlet.ServletHandler.__J_S_ERROR_MESSAGE); - final Class ERROR_CLASS = (Class)request.getAttribute(org.mortbay.jetty.servlet.ServletHandler.__J_S_ERROR_EXCEPTION_TYPE); - final Throwable ERROR_THROWABLE = (Throwable)request.getAttribute(org.mortbay.jetty.servlet.ServletHandler.__J_S_ERROR_EXCEPTION); + final Integer ERROR_CODE = (Integer) request.getAttribute(org.eclipse.jetty.server.Dispatcher.ERROR_STATUS_CODE); + final String ERROR_URI = (String) request.getAttribute(org.eclipse.jetty.server.Dispatcher.ERROR_REQUEST_URI); + final String ERROR_MESSAGE = (String) request.getAttribute(org.eclipse.jetty.server.Dispatcher.ERROR_MESSAGE); + final Class ERROR_CLASS = (Class)request.getAttribute(org.eclipse.jetty.server.Dispatcher.ERROR_EXCEPTION_TYPE); + final Throwable ERROR_THROWABLE = (Throwable)request.getAttribute(org.eclipse.jetty.server.Dispatcher.ERROR_EXCEPTION); if (ERROR_CODE != null && ERROR_MESSAGE != null) { // this is deprecated but we don't want sendError() response.setStatus(ERROR_CODE.intValue(), ERROR_MESSAGE); -- GitLab