Author: fschumacher Date: Mon Jan 12 15:29:47 2015 New Revision: 1651120 URL: http://svn.apache.org/r1651120 Log: Don't add orderedLibs attribute if it is null. ReplicatedContext will fail otherwise.
Avoid NPE on shutdown of ReplicatedContext. Added: tomcat/trunk/test/org/apache/catalina/ha/ tomcat/trunk/test/org/apache/catalina/ha/context/ tomcat/trunk/test/org/apache/catalina/ha/context/TestReplicatedContext.java Modified: tomcat/trunk/java/org/apache/catalina/ha/context/ReplicatedContext.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/catalina/ha/context/ReplicatedContext.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/context/ReplicatedContext.java?rev=1651120&r1=1651119&r2=1651120&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/ha/context/ReplicatedContext.java (original) +++ tomcat/trunk/java/org/apache/catalina/ha/context/ReplicatedContext.java Mon Jan 12 15:29:47 2015 @@ -83,13 +83,15 @@ public class ReplicatedContext extends S @Override protected synchronized void stopInternal() throws LifecycleException { + Map<String, Object> map = ((ReplApplContext) this.context) + .getAttributeMap(); + super.stopInternal(); - Map<String,Object> map = - ((ReplApplContext)this.context).getAttributeMap(); if (map instanceof ReplicatedMap) { - ((ReplicatedMap<?,?>)map).breakdown(); + ((ReplicatedMap<?, ?>) map).breakdown(); } + } @@ -160,6 +162,13 @@ public class ReplicatedContext extends S @Override public void setAttribute(String name, Object value) { + if (name == null) { + throw new IllegalArgumentException(sm.getString("applicationContext.setAttribute.namenull")); + } + if (value == null) { + removeAttribute(name); + return; + } if ( (!getParent().getState().isAvailable()) || "org.apache.jasper.runtime.JspApplicationContextImpl".equals(name) ){ tomcatAttributes.put(name,value); } else Added: tomcat/trunk/test/org/apache/catalina/ha/context/TestReplicatedContext.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/ha/context/TestReplicatedContext.java?rev=1651120&view=auto ============================================================================== --- tomcat/trunk/test/org/apache/catalina/ha/context/TestReplicatedContext.java (added) +++ tomcat/trunk/test/org/apache/catalina/ha/context/TestReplicatedContext.java Mon Jan 12 15:29:47 2015 @@ -0,0 +1,56 @@ +package org.apache.catalina.ha.context; + +import java.io.File; +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.catalina.Context; +import org.apache.catalina.Host; +import org.apache.catalina.LifecycleException; +import org.apache.catalina.core.StandardHost; +import org.apache.catalina.startup.Tomcat; +import org.apache.catalina.startup.TomcatBaseTest; +import org.apache.tomcat.util.buf.ByteChunk; +import org.junit.Assert; +import org.junit.Test; + +public class TestReplicatedContext extends TomcatBaseTest { + + @Test + public void testBug57425() throws LifecycleException, IOException, ServletException { + Tomcat tomcat = getTomcatInstance(); + Host host = tomcat.getHost(); + if (host instanceof StandardHost) { + ((StandardHost) host).setContextClass(ReplicatedContext.class.getName()); + } + + File root = new File("test/webapp"); + Context context = tomcat.addWebapp(host, "", "", root.getAbsolutePath()); + + Tomcat.addServlet(context, "test", new AccessContextServlet()); + context.addServletMapping("/access", "test"); + + tomcat.start(); + + ByteChunk result = getUrl("http://localhost:" + getPort() + "/access"); + + Assert.assertEquals("OK", result.toString()); + + } + + private static class AccessContextServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + getServletContext().setAttribute("NULL", null); + resp.getWriter().print("OK"); + } + } +} Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1651120&r1=1651119&r2=1651120&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Mon Jan 12 15:29:47 2015 @@ -62,6 +62,9 @@ </subsection> <subsection name="Catalina"> <changelog> + <fix> + <bug>57425</bug> Don't add attributes with null value or name to the replicated context. (fschumacher) + </fix> <add> <bug>57431</bug> Enable usage of custom class for context creation when using embedded tomcat. (fschumacher) </add> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org