Author: markt Date: Wed Nov 24 17:28:55 2010 New Revision: 1038711 URL: http://svn.apache.org/viewvc?rev=1038711&view=rev Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=50201 Track changes that require an update to the default access log. It isn't perfect but should cover normal usage
Modified: tomcat/trunk/java/org/apache/catalina/core/StandardEngine.java Modified: tomcat/trunk/java/org/apache/catalina/core/StandardEngine.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardEngine.java?rev=1038711&r1=1038710&r2=1038711&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/StandardEngine.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/StandardEngine.java Wed Nov 24 17:28:55 2010 @@ -16,15 +16,22 @@ */ package org.apache.catalina.core; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.util.Locale; import org.apache.catalina.AccessLog; import org.apache.catalina.Container; +import org.apache.catalina.ContainerEvent; +import org.apache.catalina.ContainerListener; import org.apache.catalina.Context; import org.apache.catalina.Engine; import org.apache.catalina.Globals; import org.apache.catalina.Host; +import org.apache.catalina.Lifecycle; +import org.apache.catalina.LifecycleEvent; import org.apache.catalina.LifecycleException; +import org.apache.catalina.LifecycleListener; import org.apache.catalina.Realm; import org.apache.catalina.Service; import org.apache.catalina.connector.Request; @@ -321,12 +328,24 @@ public class StandardEngine extends Cont if (host != null && host.getState().isAvailable()) { defaultAccessLog = host.getAccessLog(); - if (defaultAccessLog == null) { + if (defaultAccessLog != null) { + AccessLogListener l = new AccessLogListener(this); + host.addPropertyChangeListener(l); + host.addContainerListener(l); + host.addLifecycleListener(l); + } else { // Try the ROOT context of default host Context context = (Context) host.findChild(""); if (context != null && context.getState().isAvailable()) { defaultAccessLog = context.getAccessLog(); + + if (defaultAccessLog != null) { + AccessLogListener l = + new AccessLogListener(this); + context.addPropertyChangeListener(l); + context.addLifecycleListener(l); + } } } } @@ -369,4 +388,62 @@ public class StandardEngine extends Cont // NOOP } } + + protected static final class AccessLogListener + implements PropertyChangeListener, LifecycleListener, + ContainerListener { + + private StandardEngine engine; + private volatile boolean disabled = false; + + public AccessLogListener(StandardEngine engine) { + this.engine = engine; + } + + @Override + public void lifecycleEvent(LifecycleEvent event) { + if (disabled) return; + + String type = event.getType(); + if (Lifecycle.AFTER_START_EVENT.equals(type) || + Lifecycle.BEFORE_STOP_EVENT.equals(type)) { + // Container is being started/stopped + // Force re-calculation but do not disable listener since it + // might be re-used + engine.defaultAccessLog = null; + } else if (Lifecycle.BEFORE_DESTROY_EVENT.endsWith(type)) { + // Container is being removed + // Force re-calculation and disable listener since it won't + // be re-used + engine.defaultAccessLog = null; + disabled = true; + } + } + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (disabled) return; + if ("defaultHost".equals(evt.getPropertyName())) { + // Force re-calculation and disable listener since it won't + // be re-used + engine.defaultAccessLog = null; + disabled = true; + } + } + + @Override + public void containerEvent(ContainerEvent event) { + // Only useful for hosts + if (disabled) return; + + if (Container.ADD_CHILD_EVENT.equals(event.getType())) { + Context context = (Context) event.getData(); + if ("".equals(context.getPath())) { + // New ROOT context in default host + // Force recalculation of default access log + engine.defaultAccessLog = null; + } + } + } + } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org