Author: rmannibucau Date: Mon Sep 30 07:44:54 2013 New Revision: 1527471 URL: http://svn.apache.org/r1527471 Log: TOMEE-1051 using a filter for arquillian to avoid issues when mapping an app filter to /*
Added: tomee/tomee/trunk/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/ArquillianFilterRunner.java tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/filter/ tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/filter/AllFilterTest.java tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/filter/MyFilter.java Modified: tomee/tomee/trunk/arquillian/arquillian-tomee-common/pom.xml tomee/tomee/trunk/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/Setup.java tomee/tomee/trunk/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEContainer.java tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/main/java/org/apache/tomee/arquillian/remote/RemoteTomEEContainer.java tomee/tomee/trunk/arquillian/arquillian-tomee-webapp-remote/src/main/java/org/apache/tomee/arquillian/webapp/TomEEWebappContainer.java tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java Modified: tomee/tomee/trunk/arquillian/arquillian-tomee-common/pom.xml URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-tomee-common/pom.xml?rev=1527471&r1=1527470&r2=1527471&view=diff ============================================================================== --- tomee/tomee/trunk/arquillian/arquillian-tomee-common/pom.xml (original) +++ tomee/tomee/trunk/arquillian/arquillian-tomee-common/pom.xml Mon Sep 30 07:44:54 2013 @@ -31,6 +31,12 @@ <dependencies> <dependency> + <groupId>org.apache.geronimo.specs</groupId> + <artifactId>geronimo-servlet_2.5_spec</artifactId> + <version>1.2</version> + <scope>test</scope> + </dependency> + <dependency> <groupId>org.apache.openejb</groupId> <artifactId>arquillian-common</artifactId> <version>${project.version}</version> Added: tomee/tomee/trunk/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/ArquillianFilterRunner.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/ArquillianFilterRunner.java?rev=1527471&view=auto ============================================================================== --- tomee/tomee/trunk/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/ArquillianFilterRunner.java (added) +++ tomee/tomee/trunk/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/ArquillianFilterRunner.java Mon Sep 30 07:44:54 2013 @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.openejb.arquillian.common; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServlet; +import java.io.IOException; + +// this filter simply allows us to invoke arquillian servlet directly +// instead of needing to pass through the servlet filters +// +// it allows us to work out of the box with framework using a dispatcher (filter) on /* +// it is commonn with tapestry, spring, wicket, .... +// +// We can't rely on scanning (@WebFilter) since we can't enrich the app because we need it for client tests too and +// we need it to be added first +// +// @WebFilter(urlPatterns = "/ArquillianServletRunner", filterName = "org.apache.openejb.arquillian.common.ArquillianFilterRunner") +public class ArquillianFilterRunner implements Filter { + private static final String ARQUILLIAN_SERVLET_RUNNER = "org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner"; + + private HttpServlet deletage = null; + + @Override + public void init(final FilterConfig filterConfig) throws ServletException { + try { + deletage = HttpServlet.class.cast(Thread.currentThread().getContextClassLoader().loadClass(ARQUILLIAN_SERVLET_RUNNER).newInstance()); + deletage.init(); + } catch (final Exception e) { + // no-op: can happen if the servlet is not present, that's a normal case + } + } + + @Override + public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException { + if (deletage != null) { + deletage.service(servletRequest, servletResponse); + } + } + + @Override + public void destroy() { + if (deletage != null) { + deletage.destroy(); + } + } +} Modified: tomee/tomee/trunk/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/Setup.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/Setup.java?rev=1527471&r1=1527470&r2=1527471&view=diff ============================================================================== --- tomee/tomee/trunk/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/Setup.java (original) +++ tomee/tomee/trunk/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/Setup.java Mon Sep 30 07:44:54 2013 @@ -311,7 +311,7 @@ public class Setup { public static void installArquillianBeanDiscoverer(final File home) { final File destination = new File(home, TOMEE_BEAN_DISCOVERER_JAR); ShrinkWrap.create(JavaArchive.class, destination.getName()) - .addClasses(BeanDicovererInstaller.class, TestClassDiscoverer.class) + .addClasses(BeanDicovererInstaller.class, TestClassDiscoverer.class, ArquillianFilterRunner.class) .addAsManifestResource(new StringAsset(BeanDicovererInstaller.class.getName()), ArchivePaths.create("org.apache.openejb.extension")) .as(ZipExporter.class).exportTo(destination, false); } Modified: tomee/tomee/trunk/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java?rev=1527471&r1=1527470&r2=1527471&view=diff ============================================================================== --- tomee/tomee/trunk/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java (original) +++ tomee/tomee/trunk/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java Mon Sep 30 07:44:54 2013 @@ -49,10 +49,8 @@ import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; -import java.net.URL; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Properties; @@ -121,7 +119,7 @@ public abstract class TomEEContainer<Con } final ObjectMap map = new ObjectMap(configuration); - for (Map.Entry<String, Object> entry : map.entrySet()) { + for (final Map.Entry<String, Object> entry : map.entrySet()) { if (!entry.getKey().toLowerCase().endsWith("port")) continue; try { Object value = entry.getValue(); @@ -271,8 +269,7 @@ public abstract class TomEEContainer<Con String arquillianServlet; // Avoids "inconvertible types" error in windows build - final Object object = archive; - if (object instanceof WebArchive) { + if (archive instanceof WebArchive) { arquillianServlet = "/" + getArchiveNameWithoutExtension(archive); } else { arquillianServlet = "/arquillian-protocol"; Modified: tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEContainer.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEContainer.java?rev=1527471&r1=1527470&r2=1527471&view=diff ============================================================================== --- tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEContainer.java (original) +++ tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEContainer.java Mon Sep 30 07:44:54 2013 @@ -16,6 +16,7 @@ */ package org.apache.openejb.arquillian.embedded; +import org.apache.openejb.arquillian.common.ArquillianFilterRunner; import org.apache.openejb.arquillian.common.Files; import org.apache.openejb.arquillian.common.TestClassDiscoverer; import org.apache.openejb.arquillian.common.TomEEContainer; @@ -96,7 +97,9 @@ public class EmbeddedTomEEContainer exte try { this.container.start(); SystemInstance.get().setComponent(AdditionalBeanDiscoverer.class, new TestClassDiscoverer()); - } catch (Exception e) { + // this property is not mandatory by default but depending the protocol it can be relevant so adding it by default + SystemInstance.get().setProperty("org.apache.openejb.servlet.filters", ArquillianFilterRunner.class.getName() + "=/ArquillianServletRunner"); + } catch (final Exception e) { e.printStackTrace(); throw new LifecycleException("Something went wrong", e); } @@ -106,7 +109,7 @@ public class EmbeddedTomEEContainer exte public void stop() throws LifecycleException { try { this.container.stop(); - } catch (Exception e) { + } catch (final Exception e) { throw new LifecycleException("Unable to stop server", e); } } @@ -139,7 +142,7 @@ public class EmbeddedTomEEContainer exte startCdiContexts(name); // ensure tests can use request/session scopes even if we don't have a request return new ProtocolMetaData().addContext(httpContext); - } catch (Exception e) { + } catch (final Exception e) { e.printStackTrace(); throw new DeploymentException("Unable to deploy", e); } Modified: tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/main/java/org/apache/tomee/arquillian/remote/RemoteTomEEContainer.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/main/java/org/apache/tomee/arquillian/remote/RemoteTomEEContainer.java?rev=1527471&r1=1527470&r2=1527471&view=diff ============================================================================== --- tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/main/java/org/apache/tomee/arquillian/remote/RemoteTomEEContainer.java (original) +++ tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/main/java/org/apache/tomee/arquillian/remote/RemoteTomEEContainer.java Mon Sep 30 07:44:54 2013 @@ -16,6 +16,7 @@ */ package org.apache.tomee.arquillian.remote; +import org.apache.openejb.arquillian.common.ArquillianFilterRunner; import org.apache.openejb.arquillian.common.ArquillianUtil; import org.apache.openejb.arquillian.common.Files; import org.apache.openejb.arquillian.common.IO; @@ -26,6 +27,7 @@ import org.apache.openejb.config.RemoteS import org.apache.tomee.util.InstallationEnrichers; import org.apache.tomee.util.SimpleTomEEFormatter; import org.jboss.arquillian.container.spi.client.container.LifecycleException; +import org.jboss.arquillian.protocol.servlet.ServletMethodExecutor; import org.jboss.shrinkwrap.api.Archive; import javax.naming.NamingException; @@ -34,7 +36,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -43,13 +44,11 @@ import java.util.TreeMap; import java.util.logging.Level; import java.util.logging.Logger; -/* - * TODO: delete old embedded adapter, move the tests and set those up - */ public class RemoteTomEEContainer extends TomEEContainer<RemoteTomEEConfiguration> { - private static final Logger logger = Logger.getLogger(RemoteTomEEContainer.class.getName()); + private static final String ARQUILLIAN_FILTER = "-Dorg.apache.openejb.servlet.filters=" + ArquillianFilterRunner.class.getName() + "=" + ServletMethodExecutor.ARQUILLIAN_SERVLET_MAPPING; + private RemoteServer container; private boolean shutdown = false; private File tomeeHome; @@ -99,7 +98,7 @@ public class RemoteTomEEContainer extend deploy(archive); } } - } catch (Exception e) { + } catch (final Exception e) { logger.log(Level.SEVERE, "Unable to start remote container", e); throw new LifecycleException("Unable to start remote container:" + e.getMessage(), e); } finally { @@ -113,12 +112,14 @@ public class RemoteTomEEContainer extend private List<String> args() { String opts = configuration.getCatalina_opts(); - if (opts == null || (opts = opts.trim()).isEmpty()) { - return Arrays.asList("-Dorg.apache.catalina.STRICT_SERVLET_COMPLIANCE=false"); + if (opts != null) { + opts = opts.trim(); + } + if (opts == null || opts.isEmpty()) { + return Arrays.asList("-Dorg.apache.catalina.STRICT_SERVLET_COMPLIANCE=false", ARQUILLIAN_FILTER); } final List<String> splitOnSpace = new ArrayList<String>(); - opts = opts.replace("\n", " ").trim(); final Iterator<String> it = new ArgsIterator(opts); while (it.hasNext()) { @@ -128,6 +129,7 @@ public class RemoteTomEEContainer extend if (!splitOnSpace.contains("-Dorg.apache.catalina.STRICT_SERVLET_COMPLIANCE=true")) { splitOnSpace.add("-Dorg.apache.catalina.STRICT_SERVLET_COMPLIANCE=false"); } + splitOnSpace.add(ARQUILLIAN_FILTER); return splitOnSpace; } Added: tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/filter/AllFilterTest.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/filter/AllFilterTest.java?rev=1527471&view=auto ============================================================================== --- tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/filter/AllFilterTest.java (added) +++ tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/filter/AllFilterTest.java Mon Sep 30 07:44:54 2013 @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.openejb.arquillian.tests.filter; + +import org.apache.openejb.loader.IO; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.shrinkwrap.api.Archive; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.StringAsset; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.jboss.shrinkwrap.descriptor.api.Descriptors; +import org.jboss.shrinkwrap.descriptor.api.webapp25.WebAppDescriptor; +import org.jboss.shrinkwrap.descriptor.api.webapp25.WebAppVersionType; +import org.junit.Test; +import org.junit.runner.RunWith; + +import javax.management.MBeanServer; +import javax.management.ObjectName; +import java.io.IOException; +import java.lang.management.ManagementFactory; +import java.net.URL; + +import static org.junit.Assert.assertEquals; + +@RunWith(Arquillian.class) +public class AllFilterTest { + @Deployment + public static Archive<?> war() throws Exception { + final String port = findPort(); + System.setProperty(AllFilterTest.class.getName() + ".port", port); // for embedded case + + return ShrinkWrap.create(WebArchive.class, "filter.war") + .addClass(MyFilter.class) + .addAsWebInfResource(new StringAsset(port), "classes/port.conf") // for remote case + .addAsWebInfResource(new StringAsset(Descriptors.create(WebAppDescriptor.class) + .version(WebAppVersionType._2_5) + .metadataComplete(true) + .createFilter() + .filterName("My") + .filterClass(MyFilter.class.getName()) + .up() + .createFilterMapping() + .filterName("My") + .urlPattern("/*") + .up() + .exportAsString()), "web.xml"); + } + + @Test // needs to be executed on server side otherwise all is done with local executor and test obviously works + public void requestShouldWorkEvenIfFilterInterceptsAllIncludingTheArquillianServlet() throws IOException { + assertEquals("No problemo!", IO.slurp(new URL("http://localhost:" + httpPort() + "/filter/"))); + } + + private static String httpPort() throws IOException { + final String property = System.getProperty(AllFilterTest.class.getName() + ".port"); + if (property != null) { + return property; + } // else remote + return org.apache.openejb.loader.IO.slurp(Thread.currentThread().getContextClassLoader().getResourceAsStream("port.conf")); + } + + private static String findPort() throws Exception { + final String opts = System.getProperty("java.opts"); + if (opts != null) { + return opts.substring(opts.indexOf("tomee.httpPort=") + "tomee.httpPort=".length()); + } // else embedded + final MBeanServer server = ManagementFactory.getPlatformMBeanServer(); + final ObjectName on = server.queryMBeans(new ObjectName("Tomcat:type=ProtocolHandler,port=*"), null).iterator().next().getObjectName(); + return "" + server.getAttribute(on, "port"); + } +} Added: tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/filter/MyFilter.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/filter/MyFilter.java?rev=1527471&view=auto ============================================================================== --- tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/filter/MyFilter.java (added) +++ tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/filter/MyFilter.java Mon Sep 30 07:44:54 2013 @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.openejb.arquillian.tests.filter; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import java.io.IOException; + +public class MyFilter implements Filter { + @Override + public void init(final FilterConfig filterConfig) throws ServletException { + // no-op + } + + @Override + public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException { + response.getWriter().write("No problemo!"); + // don't use chain so we can't access arquillian servlet + } + + @Override + public void destroy() { + // no-op + } +} Modified: tomee/tomee/trunk/arquillian/arquillian-tomee-webapp-remote/src/main/java/org/apache/tomee/arquillian/webapp/TomEEWebappContainer.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-tomee-webapp-remote/src/main/java/org/apache/tomee/arquillian/webapp/TomEEWebappContainer.java?rev=1527471&r1=1527470&r2=1527471&view=diff ============================================================================== --- tomee/tomee/trunk/arquillian/arquillian-tomee-webapp-remote/src/main/java/org/apache/tomee/arquillian/webapp/TomEEWebappContainer.java (original) +++ tomee/tomee/trunk/arquillian/arquillian-tomee-webapp-remote/src/main/java/org/apache/tomee/arquillian/webapp/TomEEWebappContainer.java Mon Sep 30 07:44:54 2013 @@ -16,6 +16,7 @@ */ package org.apache.tomee.arquillian.webapp; +import org.apache.openejb.arquillian.common.ArquillianFilterRunner; import org.apache.openejb.arquillian.common.Files; import org.apache.openejb.arquillian.common.IO; import org.apache.openejb.arquillian.common.Setup; @@ -25,12 +26,14 @@ import org.apache.openejb.config.RemoteS import org.apache.tomee.installer.Installer; import org.apache.tomee.installer.Paths; import org.jboss.arquillian.container.spi.client.container.LifecycleException; +import org.jboss.arquillian.protocol.servlet.ServletMethodExecutor; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; +import java.util.Arrays; import java.util.Map; import java.util.TreeMap; import java.util.logging.Level; @@ -160,7 +163,7 @@ public class TomEEWebappContainer extend } container = new RemoteServer(); - container.start(); + container.start(Arrays.asList("-Dorg.apache.openejb.servlet.filters=" + ArquillianFilterRunner.class.getName() + "=" + ServletMethodExecutor.ARQUILLIAN_SERVLET_MAPPING), "start", true); } catch (Exception e) { throw new LifecycleException("Unable to start remote container", e); } Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1527471&r1=1527470&r2=1527471&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java Mon Sep 30 07:44:54 2013 @@ -41,6 +41,8 @@ import org.apache.catalina.deploy.Contex import org.apache.catalina.deploy.ContextResource; import org.apache.catalina.deploy.ContextResourceLink; import org.apache.catalina.deploy.ContextTransaction; +import org.apache.catalina.deploy.FilterDef; +import org.apache.catalina.deploy.FilterMap; import org.apache.catalina.deploy.NamingResources; import org.apache.catalina.deploy.ResourceBase; import org.apache.catalina.ha.CatalinaCluster; @@ -937,6 +939,26 @@ public class TomcatWebAppBuilder impleme } } initContextLoader(standardContext); + + // used to add custom filters first - our arquillian integration uses it for instance + // needs to be done now (= before start event) because of addFilterMapBefore() usage + final String filters = SystemInstance.get().getProperty("org.apache.openejb.servlet.filters"); + if (filters != null) { + final String[] names = filters.split(","); + for (final String name : names) { + final String[] clazzMapping = name.split("="); + + final FilterDef filterDef = new FilterDef(); + filterDef.setFilterClass(clazzMapping[0]); + filterDef.setFilterName(clazzMapping[0]); + standardContext.addFilterDef(filterDef); + + final FilterMap filterMap = new FilterMap(); + filterMap.setFilterName(clazzMapping[0]); + filterMap.addURLPattern(clazzMapping[1]); + standardContext.addFilterMapBefore(filterMap); + } + } } private void initContextLoader(final StandardContext standardContext) { @@ -1527,7 +1549,7 @@ public class TomcatWebAppBuilder impleme } } - + // owb integration filters final WebBeansContext webBeansContext = getWebBeansContext(contextInfo); if (webBeansContext != null) { // it is important to have a begin and a end listener