You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2013/09/30 09:44:55 UTC

svn commit: r1527471 - in /tomee/tomee/trunk: arquillian/arquillian-tomee-common/ arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/ arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/em...

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