JETTY-1523 It is imposible to map servlet to "/" using WebApplicationInitializer
This commit is contained in:
parent
f1d413fe03
commit
96fe2d6c3f
|
@ -154,17 +154,53 @@ public class WebServletAnnotation extends DiscoveredAnnotation
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//check the url-patterns, if there annotation has a new one, add it
|
//check the url-patterns
|
||||||
ServletMapping[] mappings = _context.getServletHandler().getServletMappings();
|
|
||||||
|
|
||||||
//ServletSpec 3.0 p81 If a servlet already has url mappings from a
|
//ServletSpec 3.0 p81 If a servlet already has url mappings from a
|
||||||
//descriptor the annotation is ignored
|
//webxml or fragment descriptor the annotation is ignored. However, we want to be able to
|
||||||
if (mappings == null && metaData.getOriginDescriptor(servletName+".servlet.mappings") != null)
|
//replace mappings that were given in webdefault.xml
|
||||||
|
boolean mappingsExist = false;
|
||||||
|
boolean anyNonDefaults = false;
|
||||||
|
ServletMapping[] allMappings = _context.getServletHandler().getServletMappings();
|
||||||
|
if (allMappings != null)
|
||||||
{
|
{
|
||||||
ServletMapping mapping = new ServletMapping();
|
for (ServletMapping m:allMappings)
|
||||||
mapping.setServletName(servletName);
|
{
|
||||||
mapping.setPathSpecs(LazyList.toStringArray(urlPatternList));
|
if (m.getServletName() != null && servletName.equals(m.getServletName()))
|
||||||
_context.getServletHandler().addServletMapping(mapping);
|
{
|
||||||
|
mappingsExist = true;
|
||||||
|
if (!m.isDefault())
|
||||||
|
{
|
||||||
|
anyNonDefaults = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (anyNonDefaults)
|
||||||
|
return; //if any mappings already set by a descriptor that is not webdefault.xml, we're done
|
||||||
|
|
||||||
|
boolean clash = false;
|
||||||
|
if (mappingsExist)
|
||||||
|
{
|
||||||
|
for (String p:urlPatternList)
|
||||||
|
{
|
||||||
|
ServletMapping m = _context.getServletHandler().getServletMapping(p);
|
||||||
|
if (m != null && !m.isDefault())
|
||||||
|
{
|
||||||
|
//trying to override a servlet-mapping that was added not by webdefault.xml
|
||||||
|
clash = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mappingsExist || !clash)
|
||||||
|
{
|
||||||
|
ServletMapping m = new ServletMapping();
|
||||||
|
m.setServletName(servletName);
|
||||||
|
m.setPathSpecs(LazyList.toStringArray(urlPatternList));
|
||||||
|
_context.getServletHandler().addServletMapping(m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -281,6 +281,7 @@ public class ServletHandler extends ScopedHandler
|
||||||
*/
|
*/
|
||||||
public ServletMapping getServletMapping(String pattern)
|
public ServletMapping getServletMapping(String pattern)
|
||||||
{
|
{
|
||||||
|
ServletMapping theMapping = null;
|
||||||
if (_servletMappings!=null)
|
if (_servletMappings!=null)
|
||||||
{
|
{
|
||||||
for (ServletMapping m:_servletMappings)
|
for (ServletMapping m:_servletMappings)
|
||||||
|
@ -291,12 +292,12 @@ public class ServletHandler extends ScopedHandler
|
||||||
for (String path:paths)
|
for (String path:paths)
|
||||||
{
|
{
|
||||||
if (pattern.equals(path))
|
if (pattern.equals(path))
|
||||||
return m;
|
theMapping = m;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return theMapping;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
|
|
|
@ -705,17 +705,24 @@ public class ServletHolder extends Holder<Servlet> implements UserIdentity.Scope
|
||||||
Set<String> clash=null;
|
Set<String> clash=null;
|
||||||
for (String pattern : urlPatterns)
|
for (String pattern : urlPatterns)
|
||||||
{
|
{
|
||||||
if (_servletHandler.getServletMapping(pattern)!=null)
|
ServletMapping mapping = _servletHandler.getServletMapping(pattern);
|
||||||
|
if (mapping!=null)
|
||||||
|
{
|
||||||
|
//if the servlet mapping was from a default descriptor, then allow it to be overridden
|
||||||
|
if (!mapping.isDefault())
|
||||||
{
|
{
|
||||||
if (clash==null)
|
if (clash==null)
|
||||||
clash=new HashSet<String>();
|
clash=new HashSet<String>();
|
||||||
clash.add(pattern);
|
clash.add(pattern);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//if there were any clashes amongst the urls, return them
|
||||||
if (clash!=null)
|
if (clash!=null)
|
||||||
return clash;
|
return clash;
|
||||||
|
|
||||||
|
//otherwise apply all of them
|
||||||
ServletMapping mapping = new ServletMapping();
|
ServletMapping mapping = new ServletMapping();
|
||||||
mapping.setServletName(ServletHolder.this.getName());
|
mapping.setServletName(ServletHolder.this.getName());
|
||||||
mapping.setPathSpecs(urlPatterns);
|
mapping.setPathSpecs(urlPatterns);
|
||||||
|
|
|
@ -21,6 +21,8 @@ public class ServletMapping
|
||||||
{
|
{
|
||||||
private String[] _pathSpecs;
|
private String[] _pathSpecs;
|
||||||
private String _servletName;
|
private String _servletName;
|
||||||
|
private boolean _default;
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
public ServletMapping()
|
public ServletMapping()
|
||||||
|
@ -73,6 +75,25 @@ public class ServletMapping
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isDefault()
|
||||||
|
{
|
||||||
|
return _default;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/**
|
||||||
|
* @param default1
|
||||||
|
*/
|
||||||
|
public void setDefault(boolean fromDefault)
|
||||||
|
{
|
||||||
|
_default = fromDefault;
|
||||||
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
public String toString()
|
public String toString()
|
||||||
{
|
{
|
||||||
|
|
|
@ -621,7 +621,8 @@ public class StandardDescriptorProcessor extends IterativeDescriptorProcessor
|
||||||
{
|
{
|
||||||
//no servlet mappings
|
//no servlet mappings
|
||||||
context.getMetaData().setOrigin(servlet_name+".servlet.mappings", descriptor);
|
context.getMetaData().setOrigin(servlet_name+".servlet.mappings", descriptor);
|
||||||
addServletMapping(servlet_name, node, context);
|
ServletMapping mapping = addServletMapping(servlet_name, node, context);
|
||||||
|
mapping.setDefault(context.getMetaData().getOrigin(servlet_name+".servlet.mappings") == Origin.WebDefaults);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case WebXml:
|
case WebXml:
|
||||||
|
@ -1164,7 +1165,7 @@ public class StandardDescriptorProcessor extends IterativeDescriptorProcessor
|
||||||
* @param node
|
* @param node
|
||||||
* @param context
|
* @param context
|
||||||
*/
|
*/
|
||||||
protected void addServletMapping (String servletName, XmlParser.Node node, WebAppContext context)
|
protected ServletMapping addServletMapping (String servletName, XmlParser.Node node, WebAppContext context)
|
||||||
{
|
{
|
||||||
ServletMapping mapping = new ServletMapping();
|
ServletMapping mapping = new ServletMapping();
|
||||||
mapping.setServletName(servletName);
|
mapping.setServletName(servletName);
|
||||||
|
@ -1179,6 +1180,7 @@ public class StandardDescriptorProcessor extends IterativeDescriptorProcessor
|
||||||
}
|
}
|
||||||
mapping.setPathSpecs((String[]) paths.toArray(new String[paths.size()]));
|
mapping.setPathSpecs((String[]) paths.toArray(new String[paths.size()]));
|
||||||
context.getServletHandler().addServletMapping(mapping);
|
context.getServletHandler().addServletMapping(mapping);
|
||||||
|
return mapping;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue