Refactor ServletHandler to add getMappedServlet method (#1519)

This commit is contained in:
Greg Wilkins 2017-05-01 16:38:55 +02:00 committed by GitHub
parent 90a90d6c76
commit 5493c9e596
5 changed files with 48 additions and 34 deletions

View File

@ -22,14 +22,11 @@ package org.eclipse.jetty.quickstart;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import java.io.File; import java.io.File;
import java.nio.file.Path;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.toolchain.test.FS; import org.eclipse.jetty.toolchain.test.FS;
import org.eclipse.jetty.toolchain.test.MavenTestingUtils; import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.webapp.WebAppContext;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -90,7 +87,7 @@ public class TestQuickStart
server.start(); server.start();
//verify that FooServlet is now mapped to / and not the DefaultServlet //verify that FooServlet is now mapped to / and not the DefaultServlet
ServletHolder sh = webapp.getServletHandler().getHolderEntry("/").getResource(); ServletHolder sh = webapp.getServletHandler().getMappedServlet("/").getResource();
assertNotNull(sh); assertNotNull(sh);
assertEquals("foo", sh.getName()); assertEquals("foo", sh.getName());
server.stop(); server.stop();

View File

@ -513,7 +513,7 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory, Welc
if ((_welcomeServlets || _welcomeExactServlets) && welcome_servlet==null) if ((_welcomeServlets || _welcomeExactServlets) && welcome_servlet==null)
{ {
MappedResource<ServletHolder> entry=_servletHandler.getHolderEntry(welcome_in_context); MappedResource<ServletHolder> entry=_servletHandler.getMappedServlet(welcome_in_context);
if (entry!=null && entry.getResource()!=_defaultHolder && if (entry!=null && entry.getResource()!=_defaultHolder &&
(_welcomeServlets || (_welcomeExactServlets && entry.getPathSpec().getDeclaration().equals(welcome_in_context)))) (_welcomeServlets || (_welcomeExactServlets && entry.getPathSpec().getDeclaration().equals(welcome_in_context))))
welcome_servlet=welcome_in_context; welcome_servlet=welcome_in_context;

View File

@ -32,7 +32,6 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.http.PathMap.MappedEntry;
import org.eclipse.jetty.http.pathmap.MappedResource; import org.eclipse.jetty.http.pathmap.MappedResource;
import org.eclipse.jetty.server.Dispatcher; import org.eclipse.jetty.server.Dispatcher;
import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Handler;
@ -66,6 +65,7 @@ import org.eclipse.jetty.util.log.Logger;
* @version $Id: Invoker.java 4780 2009-03-17 15:36:08Z jesse $ * @version $Id: Invoker.java 4780 2009-03-17 15:36:08Z jesse $
* *
*/ */
@SuppressWarnings("serial")
public class Invoker extends HttpServlet public class Invoker extends HttpServlet
{ {
private static final Logger LOG = Log.getLogger(Invoker.class); private static final Logger LOG = Log.getLogger(Invoker.class);
@ -168,11 +168,11 @@ public class Invoker extends HttpServlet
synchronized(_servletHandler) synchronized(_servletHandler)
{ {
// find the entry for the invoker (me) // find the entry for the invoker (me)
_invokerEntry=_servletHandler.getHolderEntry(servlet_path); _invokerEntry=_servletHandler.getMappedServlet(servlet_path);
// Check for existing mapping (avoid threaded race). // Check for existing mapping (avoid threaded race).
String path=URIUtil.addPaths(servlet_path,servlet); String path=URIUtil.addPaths(servlet_path,servlet);
MappedResource<ServletHolder> entry = _servletHandler.getHolderEntry(path); MappedResource<ServletHolder> entry = _servletHandler.getMappedServlet(path);
if (entry!=null && !entry.equals(_invokerEntry)) if (entry!=null && !entry.equals(_invokerEntry))
{ {

View File

@ -24,7 +24,6 @@ import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.ListIterator; import java.util.ListIterator;
import java.util.Map; import java.util.Map;
@ -53,8 +52,6 @@ import org.eclipse.jetty.http.pathmap.MappedResource;
import org.eclipse.jetty.http.pathmap.PathMappings; import org.eclipse.jetty.http.pathmap.PathMappings;
import org.eclipse.jetty.http.pathmap.PathSpec; import org.eclipse.jetty.http.pathmap.PathSpec;
import org.eclipse.jetty.http.pathmap.ServletPathSpec; import org.eclipse.jetty.http.pathmap.ServletPathSpec;
import org.eclipse.jetty.http.pathmap.PathSpec;
import org.eclipse.jetty.http.pathmap.ServletPathSpec;
import org.eclipse.jetty.security.IdentityService; import org.eclipse.jetty.security.IdentityService;
import org.eclipse.jetty.security.SecurityHandler; import org.eclipse.jetty.security.SecurityHandler;
import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Request;
@ -361,14 +358,16 @@ public class ServletHandler extends ScopedHandler
/** /**
* ServletHolder matching path. * ServletHolder matching path.
* *
* @param pathInContext Path within _context. * @param target Path within _context or servlet name
* @return PathMap Entries pathspec to ServletHolder * @return PathMap Entries pathspec to ServletHolder
* @deprecated Use {@link #getMappedServlet(String)}
*/ */
public MappedResource<ServletHolder> getHolderEntry(String pathInContext) @Deprecated
public MappedResource<ServletHolder> getHolderEntry(String target)
{ {
if (_servletPathMap==null) if (target.startsWith("/"))
return null; return getMappedServlet(target);
return _servletPathMap.getMatch(pathInContext); return null;
} }
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
@ -438,16 +437,14 @@ public class ServletHandler extends ScopedHandler
ServletHolder servlet_holder=null; ServletHolder servlet_holder=null;
UserIdentity.Scope old_scope=null; UserIdentity.Scope old_scope=null;
// find the servlet MappedResource<ServletHolder> mapping=getMappedServlet(target);
if (target.startsWith("/")) if (mapping!=null)
{ {
// Look for the servlet by path servlet_holder = mapping.getResource();
MappedResource<ServletHolder> entry=getHolderEntry(target);
if (entry!=null) if (mapping.getPathSpec()!=null)
{ {
PathSpec pathSpec = entry.getPathSpec(); PathSpec pathSpec = mapping.getPathSpec();
servlet_holder=entry.getResource();
String servlet_path=pathSpec.getPathMatch(target); String servlet_path=pathSpec.getPathMatch(target);
String path_info=pathSpec.getPathInfo(target); String path_info=pathSpec.getPathInfo(target);
@ -463,12 +460,7 @@ public class ServletHandler extends ScopedHandler
} }
} }
} }
else
{
// look for a servlet by name!
servlet_holder= _servletNameMap.get(target);
}
if (LOG.isDebugEnabled()) if (LOG.isDebugEnabled())
LOG.debug("servlet {}|{}|{} -> {}",baseRequest.getContextPath(),baseRequest.getServletPath(),baseRequest.getPathInfo(),servlet_holder); LOG.debug("servlet {}|{}|{} -> {}",baseRequest.getContextPath(),baseRequest.getServletPath(),baseRequest.getPathInfo(),servlet_holder);
@ -549,7 +541,33 @@ public class ServletHandler extends ScopedHandler
baseRequest.setHandled(true); baseRequest.setHandled(true);
} }
} }
/* ------------------------------------------------------------ */
/**
* ServletHolder matching path.
*
* @param target Path within _context or servlet name
* @return MappedResource to the ServletHolder. Named servlets have a null PathSpec
*/
public MappedResource<ServletHolder> getMappedServlet(String target)
{
if (target.startsWith("/"))
{
if (_servletPathMap==null)
return null;
return _servletPathMap.getMatch(target);
}
if (_servletNameMap==null)
return null;
ServletHolder holder = _servletNameMap.get(target);
if (holder==null)
return null;
return new MappedResource<>(null,holder);
}
/* ------------------------------------------------------------ */
protected FilterChain getFilterChain(Request baseRequest, String pathInContext, ServletHolder servletHolder) protected FilterChain getFilterChain(Request baseRequest, String pathInContext, ServletHolder servletHolder)
{ {
String key=pathInContext==null?servletHolder.getName():pathInContext; String key=pathInContext==null?servletHolder.getName():pathInContext;
@ -703,8 +721,6 @@ public class ServletHandler extends ScopedHandler
return _startWithUnavailable; return _startWithUnavailable;
} }
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
/** Initialize filters and load-on-startup servlets. /** Initialize filters and load-on-startup servlets.
* @throws Exception if unable to initialize * @throws Exception if unable to initialize
@ -1765,6 +1781,7 @@ public class ServletHandler extends ScopedHandler
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
@SuppressWarnings("serial")
public static class Default404Servlet extends HttpServlet public static class Default404Servlet extends HttpServlet
{ {
@Override @Override

View File

@ -267,7 +267,7 @@ public class ServletHandlerTest
handler.updateMappings(); handler.updateMappings();
MappedResource<ServletHolder> entry=handler.getHolderEntry("/foo/*"); MappedResource<ServletHolder> entry=handler.getMappedServlet("/foo/*");
assertNotNull(entry); assertNotNull(entry);
assertEquals("s1", entry.getResource().getName()); assertEquals("s1", entry.getResource().getName());
} }
@ -312,7 +312,7 @@ public class ServletHandlerTest
handler.addServletMapping(sm2); handler.addServletMapping(sm2);
handler.updateMappings(); handler.updateMappings();
MappedResource<ServletHolder> entry=handler.getHolderEntry("/foo/*"); MappedResource<ServletHolder> entry=handler.getMappedServlet("/foo/*");
assertNotNull(entry); assertNotNull(entry);
assertEquals("s2", entry.getResource().getName()); assertEquals("s2", entry.getResource().getName());
} }