You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dj...@apache.org on 2007/06/25 19:33:40 UTC
svn commit: r550559 -
/geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/JettyFilterMapping.java
Author: djencks
Date: Mon Jun 25 10:33:39 2007
New Revision: 550559
URL: http://svn.apache.org/viewvc?view=rev&rev=550559
Log:
GERONIMO-3260 JettyFilterMapping should resppond to servlets being added and removed
Modified:
geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/JettyFilterMapping.java
Modified: geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/JettyFilterMapping.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/JettyFilterMapping.java?view=diff&rev=550559&r1=550558&r2=550559
==============================================================================
--- geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/JettyFilterMapping.java (original)
+++ geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/JettyFilterMapping.java Mon Jun 25 10:33:39 2007
@@ -16,17 +16,18 @@
*/
package org.apache.geronimo.jetty6;
-import java.io.Serializable;
-import java.util.Set;
import java.util.Collection;
-import java.util.Iterator;
+import java.util.Arrays;
import org.apache.geronimo.gbean.GBeanInfo;
import org.apache.geronimo.gbean.GBeanInfoBuilder;
-import org.apache.geronimo.gbean.GBeanLifecycle;
+import org.apache.geronimo.gbean.ReferenceCollection;
+import org.apache.geronimo.gbean.ReferenceCollectionEvent;
+import org.apache.geronimo.gbean.ReferenceCollectionListener;
import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
-import org.mortbay.jetty.servlet.FilterMapping;
import org.mortbay.jetty.Handler;
+import org.mortbay.jetty.servlet.FilterMapping;
+import org.mortbay.jetty.servlet.ServletHandler;
/**
* @version $Rev$ $Date$
@@ -39,7 +40,7 @@
private final boolean includeDispatch;
private final boolean errorDispatch;
private final JettyFilterHolder jettyFilterHolder;
- private final Collection jettyServletHolders;
+ private final Collection<JettyServletHolder> jettyServletHolders;
private final JettyFilterMapping previous;
private final JettyServletRegistration jettyServletRegistration;
@@ -57,15 +58,15 @@
}
public JettyFilterMapping(String[] urlPatterns,
- boolean requestDispatch,
- boolean forwardDispatch,
- boolean includeDispatch,
- boolean errorDispatch,
- JettyFilterHolder jettyFilterHolder,
- Collection jettyServletHolders,
- JettyFilterMapping previous,
- JettyServletRegistration jettyServletRegistration) {
- this.urlPatterns = urlPatterns;
+ boolean requestDispatch,
+ boolean forwardDispatch,
+ boolean includeDispatch,
+ boolean errorDispatch,
+ JettyFilterHolder jettyFilterHolder,
+ Collection<JettyServletHolder> jettyServletHolders,
+ JettyFilterMapping previous,
+ JettyServletRegistration jettyServletRegistration) {
+ this.urlPatterns = urlPatterns;
this.requestDispatch = requestDispatch;
this.forwardDispatch = forwardDispatch;
this.includeDispatch = includeDispatch;
@@ -81,7 +82,7 @@
String filterName = jettyFilterHolder.getFilterName();
int dispatches = 0;
if (requestDispatch) {
- dispatches |= Handler.REQUEST;
+ dispatches |= Handler.REQUEST;
}
if (forwardDispatch) {
dispatches |= Handler.FORWARD;
@@ -98,17 +99,43 @@
setDispatches(dispatches);
setPathSpecs(urlPatterns);
if (jettyServletHolders != null) {
- String[] servletNames = new String[jettyServletHolders.size()];
- int i = 0;
- for (Iterator iterator = jettyServletHolders.iterator(); iterator.hasNext();) {
- JettyServletHolder jettyServletHolder = (JettyServletHolder) iterator.next();
- servletNames[i++] = jettyServletHolder.getServletName();
+ resetServlets();
+ if (jettyServletHolders instanceof ReferenceCollection) {
+ ((ReferenceCollection) jettyServletHolders).addReferenceCollectionListener(new ReferenceCollectionListener() {
+
+ public void memberAdded(ReferenceCollectionEvent event) {
+ resetServlets();
+ resetJettyFilterMappings();
+ }
+
+ public void memberRemoved(ReferenceCollectionEvent event) {
+ resetServlets();
+ resetJettyFilterMappings();
+ }
+ });
}
- setServletNames(servletNames);
}
- (jettyServletRegistration.getServletHandler()).addFilterMapping(this);
+ jettyServletRegistration.getServletHandler().addFilterMapping(this);
+ }
+ }
+
+ private void resetJettyFilterMappings() {
+ //This causes jetty to recompute the filter to servlet mappings based on the
+ //current servlet names in the filter mappings. Pretty inefficient.
+ ServletHandler servletHandler = jettyServletRegistration.getServletHandler();
+ FilterMapping[] filterMappings = servletHandler.getFilterMappings();
+ FilterMapping[] copy = filterMappings.clone();
+ servletHandler.setFilterMappings(copy);
+ }
+
+ private void resetServlets() {
+ String[] servletNames = new String[jettyServletHolders.size()];
+ int i = 0;
+ for (JettyServletHolder jettyServletHolder : jettyServletHolders) {
+ servletNames[i++] = jettyServletHolder.getServletName();
}
+ setServletNames(servletNames);
}
public String[] getUrlPatterns() {
@@ -135,7 +162,7 @@
return jettyFilterHolder;
}
- public Collection getServlets() {
+ public Collection<JettyServletHolder> getServlets() {
return jettyServletHolders;
}
@@ -163,14 +190,14 @@
infoBuilder.addReference("JettyServletRegistration", JettyServletRegistration.class, NameFactory.WEB_MODULE);
infoBuilder.setConstructor(new String[]{"urlPatterns",
- "requestDispatch",
- "forwardDispatch",
- "includeDispatch",
- "errorDispatch",
- "Filter",
- "Servlets",
- "Previous",
- "JettyServletRegistration"});
+ "requestDispatch",
+ "forwardDispatch",
+ "includeDispatch",
+ "errorDispatch",
+ "Filter",
+ "Servlets",
+ "Previous",
+ "JettyServletRegistration"});
GBEAN_INFO = infoBuilder.getBeanInfo();
}