You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rf...@apache.org on 2008/02/09 03:11:51 UTC

svn commit: r620061 - in /incubator/tuscany/java/sca: itest/ modules/ modules/host-webapp-junit/ modules/host-webapp-junit/src/ modules/host-webapp-junit/src/main/ modules/host-webapp-junit/src/main/java/ modules/host-webapp-junit/src/main/java/org/ mo...

Author: rfeng
Date: Fri Feb  8 18:11:49 2008
New Revision: 620061

URL: http://svn.apache.org/viewvc?rev=620061&view=rev
Log:
Refactor the Servlet filter for JUnit into an independent module

Added:
    incubator/tuscany/java/sca/modules/host-webapp-junit/   (with props)
    incubator/tuscany/java/sca/modules/host-webapp-junit/DISCLAIMER
    incubator/tuscany/java/sca/modules/host-webapp-junit/LICENSE
    incubator/tuscany/java/sca/modules/host-webapp-junit/NOTICE
    incubator/tuscany/java/sca/modules/host-webapp-junit/pom.xml   (with props)
    incubator/tuscany/java/sca/modules/host-webapp-junit/src/
    incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/
    incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/
    incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/org/
    incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/org/apache/
    incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/org/apache/tuscany/
    incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/org/apache/tuscany/sca/
    incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/org/apache/tuscany/sca/host/
    incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/org/apache/tuscany/sca/host/webapp/
    incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/org/apache/tuscany/sca/host/webapp/junit/
    incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/org/apache/tuscany/sca/host/webapp/junit/JUnitServletFilter.java   (with props)
    incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/org/apache/tuscany/sca/host/webapp/junit/XMLFormatter.java   (with props)
Removed:
    incubator/tuscany/java/sca/modules/host-webapp/src/main/java/org/apache/tuscany/sca/host/webapp/junit/
Modified:
    incubator/tuscany/java/sca/itest/pom.xml
    incubator/tuscany/java/sca/modules/host-webapp/pom.xml
    incubator/tuscany/java/sca/modules/host-webapp/src/main/java/org/apache/tuscany/sca/host/webapp/TuscanyServletFilter.java
    incubator/tuscany/java/sca/modules/pom.xml
    incubator/tuscany/java/sca/tools/maven/maven-web-junit/src/main/java/org/apache/tuscany/tools/sca/web/junit/plugin/WebJUnitGeneratorMojo.java
    incubator/tuscany/java/sca/tools/maven/maven-web-junit/src/main/java/org/apache/tuscany/tools/sca/web/junit/plugin/WebJUnitMojo.java

Modified: incubator/tuscany/java/sca/itest/pom.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/pom.xml?rev=620061&r1=620060&r2=620061&view=diff
==============================================================================
--- incubator/tuscany/java/sca/itest/pom.xml (original)
+++ incubator/tuscany/java/sca/itest/pom.xml Fri Feb  8 18:11:49 2008
@@ -129,6 +129,12 @@
                     <scope>runtime</scope>
 	    	</dependency>
                 <dependency>
+	    	    <groupId>org.apache.tuscany.sca</groupId>
+	    	    <artifactId>tuscany-host-webapp-junit</artifactId>
+	    	    <version>1.2-incubating-SNAPSHOT</version>
+                    <scope>runtime</scope>
+	    	</dependency>
+                <dependency>
 	    	    <groupId>javax.servlet</groupId>
 	    	    <artifactId>servlet-api</artifactId>
 	    	    <version>2.3</version>
@@ -365,6 +371,7 @@
            <properties>
                <http.port>8085</http.port>
                <http.base>http://127.0.0.1:${http.port}</http.base>
+               <jetty.home>${env.JETTY_HOME}</jetty.home>
            </properties>
 
             <build>
@@ -416,6 +423,7 @@
                             <container>
                                 <containerId>jetty6x</containerId>
                                 <type>embedded</type>
+                                <home>${jetty.home}</home>
                                 <systemProperties>
                                     <org.apache.commons.logging.Log>
                                         org.apache.commons.logging.impl.SimpleLog
@@ -434,6 +442,7 @@
                                         <type>war</type>
                                     </deployable>
                                 </deployables>
+                                <home>${project.build.directory}/cargo-jetty</home>
                             </configuration>
                         </configuration>
                     </plugin>

Propchange: incubator/tuscany/java/sca/modules/host-webapp-junit/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Fri Feb  8 18:11:49 2008
@@ -0,0 +1,14 @@
+target
+*.iws
+*.ipr
+*.iml
+.project
+.classpath
+maven.log
+velocity.log*
+junit*.properties
+surefire*.properties
+.settings
+.deployables
+.wtpmodules
+

Added: incubator/tuscany/java/sca/modules/host-webapp-junit/DISCLAIMER
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/host-webapp-junit/DISCLAIMER?rev=620061&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/host-webapp-junit/DISCLAIMER (added)
+++ incubator/tuscany/java/sca/modules/host-webapp-junit/DISCLAIMER Fri Feb  8 18:11:49 2008
@@ -0,0 +1,8 @@
+Apache Tuscany is an effort undergoing incubation at The Apache Software
+Foundation (ASF), sponsored by the Apache Web Services PMC. Incubation is
+required of all newly accepted projects until a further review indicates that
+the infrastructure, communications, and decision making process have stabilized
+in a manner consistent with other successful ASF projects. While incubation
+status is not necessarily a reflection of the completeness or stability of the
+code, it does indicate that the project has yet to be fully endorsed by the ASF.
+

Added: incubator/tuscany/java/sca/modules/host-webapp-junit/LICENSE
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/host-webapp-junit/LICENSE?rev=620061&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/host-webapp-junit/LICENSE (added)
+++ incubator/tuscany/java/sca/modules/host-webapp-junit/LICENSE Fri Feb  8 18:11:49 2008
@@ -0,0 +1,205 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.
+
+
+

Added: incubator/tuscany/java/sca/modules/host-webapp-junit/NOTICE
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/host-webapp-junit/NOTICE?rev=620061&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/host-webapp-junit/NOTICE (added)
+++ incubator/tuscany/java/sca/modules/host-webapp-junit/NOTICE Fri Feb  8 18:11:49 2008
@@ -0,0 +1,6 @@
+${pom.name}
+Copyright (c) 2005 - 2008 The Apache Software Foundation
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+

Added: incubator/tuscany/java/sca/modules/host-webapp-junit/pom.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/host-webapp-junit/pom.xml?rev=620061&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/host-webapp-junit/pom.xml (added)
+++ incubator/tuscany/java/sca/modules/host-webapp-junit/pom.xml Fri Feb  8 18:11:49 2008
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    * 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.    
+-->
+<project>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.tuscany.sca</groupId>
+        <artifactId>tuscany-modules</artifactId>
+        <version>1.2-incubating-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>tuscany-host-webapp-junit</artifactId>
+    <name>Apache Tuscany SCA Webapp JUnit Host</name>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+            <version>2.4</version><!-- to keep compatible with older servlet containers -->
+            <scope>provided</scope>
+        </dependency>
+
+    </dependencies>
+</project>

Propchange: incubator/tuscany/java/sca/modules/host-webapp-junit/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/host-webapp-junit/pom.xml
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/org/apache/tuscany/sca/host/webapp/junit/JUnitServletFilter.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/org/apache/tuscany/sca/host/webapp/junit/JUnitServletFilter.java?rev=620061&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/org/apache/tuscany/sca/host/webapp/junit/JUnitServletFilter.java (added)
+++ incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/org/apache/tuscany/sca/host/webapp/junit/JUnitServletFilter.java Fri Feb  8 18:11:49 2008
@@ -0,0 +1,260 @@
+/*
+ * 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.tuscany.sca.host.webapp.junit;
+
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintStream;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.jar.JarEntry;
+import java.util.jar.JarInputStream;
+import java.util.regex.Pattern;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import junit.framework.JUnit4TestAdapter;
+import junit.framework.TestResult;
+import junit.textui.TestRunner;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class JUnitServletFilter implements Filter {
+    private static final String JUNIT_TESTS_PATTERN = "junit.tests.pattern";
+    private static final String JUNIT_TESTS_PATH = "junit.tests.path";
+    private static final String JUNIT_ENABLED = "junit.enabled";
+    private static final String TESTCASE_PATTERN = ".*TestCase";
+    private static final String TESTS_JAR = "/WEB-INF/test-lib/junit-tests.jar";
+
+    private FilterConfig config;
+    private boolean junitEnabled = true;
+    private Set<String> allTestCases;
+    private ClassLoader testClassLoader;
+
+    private Set<String> findTestCases(String testJarPath) throws IOException {
+        Pattern pattern = getTestCasePattern();
+        if (testJarPath.endsWith(".jar")) {
+            return findTestCasesInJar(testJarPath, pattern);
+        } else {
+            return findTestCasesInDir(testJarPath, pattern);
+        }
+    }
+
+    /**
+     * Search test cases in a JAR
+     * @param testJarPath
+     * @param pattern
+     * @return
+     * @throws IOException
+     */
+    private Set<String> findTestCasesInJar(String testJarPath, Pattern pattern) throws IOException {
+        InputStream in = config.getServletContext().getResourceAsStream(testJarPath);
+        Set<String> tests = new HashSet<String>();
+        if (in != null) {
+            JarInputStream jar = new JarInputStream(in);
+            try {
+                JarEntry entry = null;
+
+                while ((entry = jar.getNextJarEntry()) != null) {
+                    String name = entry.getName();
+
+                    if (name.endsWith(".class")) {
+                        String className = name.substring(0, name.length() - 6).replace('/', '.');
+                        if (pattern.matcher(className).matches()) {
+                            tests.add(className);
+                        }
+                    }
+                }
+            } catch (EOFException e) {
+            } finally {
+                if (jar != null) {
+                    try {
+                        jar.close();
+                    } catch (IOException e) {
+                    }
+                }
+            }
+
+        }
+        return tests;
+    }
+
+    private Pattern getTestCasePattern() {
+        String filter = config.getInitParameter(JUNIT_TESTS_PATTERN);
+        if (filter == null) {
+            filter = TESTCASE_PATTERN;
+        }
+        Pattern pattern = Pattern.compile(filter);
+        return pattern;
+    }
+
+    public void destroy() {
+    }
+
+    private void init() throws IOException {
+        testClassLoader = Thread.currentThread().getContextClassLoader();
+        allTestCases = new HashSet<String>();
+        String testsPath = config.getInitParameter(JUNIT_TESTS_PATH);
+        if (testsPath == null) {
+            testsPath = TESTS_JAR;
+        }
+        URL url = config.getServletContext().getResource(testsPath);
+        if (url != null) {
+            allTestCases = findTestCases(testsPath);
+            if (!(testsPath.startsWith("/WEB-INF/lib/") || testsPath.startsWith("/WEB-INF/classes/"))) {
+                // Create a new classloader to load the test jar
+                testClassLoader = new URLClassLoader(new URL[] {url}, testClassLoader);
+            }
+        }
+    }
+
+    /**
+     * Search test cases in a directory
+     * @param classesPath
+     * @param pattern
+     * @return
+     */
+    private Set<String> findTestCasesInDir(String classesPath, Pattern pattern) {
+        ServletContext context = config.getServletContext();
+        Set<String> tests = new HashSet<String>();
+        String dir = classesPath;
+        findResources(context, pattern, tests, classesPath, dir);
+        return tests;
+    }
+
+    private void findResources(ServletContext context, Pattern pattern, Set<String> tests, String root, String dir) {
+        Set<String> paths = context.getResourcePaths(dir);
+        if (paths != null) {
+            for (String name : paths) {
+                if (name.endsWith("/")) {
+                    findResources(context, pattern, tests, root, name);
+                }
+                if (name.endsWith(".class")) {
+                    String className = name.substring(root.length(), name.length() - 6).replace('/', '.');
+                    if (pattern.matcher(className).matches()) {
+                        tests.add(className);
+                    }
+                }
+            }
+        }
+    }
+
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
+        ServletException {
+
+        if(!junitEnabled) {
+            chain.doFilter(request, response);
+            return;
+        }
+        
+        HttpServletRequest req = (HttpServletRequest)request;
+        String path = req.getServletPath();
+        
+        if(!"/junit".equals(path)) {
+            chain.doFilter(request, response);
+            return;
+        }
+
+        String query = req.getQueryString();
+        PrintStream ps = new PrintStream(response.getOutputStream());
+
+        Set<String> testCases = null;
+        // ClassLoader cl = Thread.currentThread().getContextClassLoader();
+        if (query == null || "ALL".equals(query)) {
+            testCases = this.allTestCases;
+        } else {
+            String[] tests = query.split(",");
+            testCases = new HashSet<String>(Arrays.asList(tests));
+        }
+
+        int errors = 0;
+        int failures = 0;
+        int runs = 0;
+        response.setContentType("application/xml");
+        ps.println("<?xml version=\"1.0\" encoding=\"" + "UTF-8" + "\"?>");
+        ps.println("<" + XMLFormatter.TESTSUITES + ">");
+        for (String testClass : testCases) {
+            Class<?> test = null;
+            try {
+                test = Class.forName(testClass, false, testClassLoader);
+            } catch (ClassNotFoundException e) {
+                String st = XMLFormatter.exceptionToString(e);
+                st = XMLFormatter.escape(st);
+                ps.println(st);
+                // ps.close();
+                throw new ServletException(e);
+            }
+            final XMLFormatter formatter = new XMLFormatter();
+            TestRunner runner = new TestRunner() {
+                protected TestResult createTestResult() {
+                    TestResult result = new TestResult();
+                    result.addListener(formatter);
+                    return result;
+                }
+            };
+            long startTime = System.currentTimeMillis();
+            TestResult result = runner.doRun(new JUnit4TestAdapter(test));
+            runs += result.runCount();
+            failures += result.failureCount();
+            errors += result.errorCount();
+            long endTime = System.currentTimeMillis();
+            formatter.setTotalDuration(endTime - startTime);
+            ps.println(formatter.toXML(result));
+        }
+        ps.println("</" + XMLFormatter.TESTSUITES + ">");
+        ((HttpServletResponse)response).addIntHeader("junit.errors", errors);
+        ((HttpServletResponse)response).addIntHeader("junit.failures", failures);
+        ((HttpServletResponse)response).addIntHeader("junit.runs", runs);
+        // ps.close();    
+    }
+
+    public void init(FilterConfig config) throws ServletException {
+        this.config = config;
+        // Check if the /junit path should be allowed
+        String param = config.getInitParameter(JUNIT_ENABLED);
+        if (param != null && param.trim().equals("false")) {
+            junitEnabled = false;
+            return;
+        }
+        try {
+            init();
+        } catch (IOException e) {
+            throw new ServletException(e);
+        }
+    }
+
+    public boolean isJunitEnabled() {
+        return junitEnabled;
+    }
+
+}

Propchange: incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/org/apache/tuscany/sca/host/webapp/junit/JUnitServletFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/org/apache/tuscany/sca/host/webapp/junit/JUnitServletFilter.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/org/apache/tuscany/sca/host/webapp/junit/XMLFormatter.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/org/apache/tuscany/sca/host/webapp/junit/XMLFormatter.java?rev=620061&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/org/apache/tuscany/sca/host/webapp/junit/XMLFormatter.java (added)
+++ incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/org/apache/tuscany/sca/host/webapp/junit/XMLFormatter.java Fri Feb  8 18:11:49 2008
@@ -0,0 +1,442 @@
+/* 
+ * ========================================================================
+ * 
+ * Copyright 2001-2005 The Apache Software Foundation.
+ *
+ * Licensed 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.tuscany.sca.host.webapp.junit;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.text.NumberFormat;
+import java.util.Locale;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+import junit.framework.TestFailure;
+import junit.framework.TestListener;
+import junit.framework.TestResult;
+
+/**
+ * Format the test results in XML.
+ *
+ * @version $Id: XMLFormatter.java 239169 2005-05-05 09:21:54Z vmassol $
+ */
+public class XMLFormatter implements TestListener {
+    /**
+     * Errors attribute for testsuite elements
+     */
+    public static final String ATTR_ERRORS = "errors";
+
+    /**
+     * Failures attribute for testsuite elements
+     */
+    public static final String ATTR_FAILURES = "failures";
+
+    /**
+     * Message attribute for failure elements (message of the exception)
+     */
+    public static final String ATTR_MESSAGE = "message";
+
+    /**
+     * Name attribute for property, testcase and testsuite elements
+     */
+    public static final String ATTR_NAME = "name";
+
+    /**
+     * Tests attribute for testsuite elements (number of tests executed)
+     */
+    public static final String ATTR_TESTS = "tests";
+
+    /**
+     * Time attribute for testcase and testsuite elements
+     */
+    public static final String ATTR_TIME = "time";
+
+    /**
+     * Type attribute for failure and error elements
+     */
+    public static final String ATTR_TYPE = "type";
+
+    /**
+     * Default stack filter patterns.
+     */
+    private static final String[] DEFAULT_STACK_FILTER_PATTERNS =
+        new String[] {"junit.framework.TestCase", "junit.framework.TestResult", "junit.framework.TestSuite",
+                      "junit.framework.Assert.", // don't filter AssertionFailure
+                      "java.lang.reflect.Method.invoke("};
+
+    /**
+     * The error element (for a test case)
+     */
+    public static final String ERROR = "error";
+
+    /**
+     * The failure element (for a test case)
+     */
+    public static final String FAILURE = "failure";
+
+    /**
+     * A single testcase element
+     */
+    public static final String TESTCASE = "testcase";
+
+    /**
+     * A single test suite results.
+     */
+    public static final String TESTSUITE = "testsuite";
+
+    /**
+     * Root element for all test suites.
+     */
+    public static final String TESTSUITES = "testsuites";
+
+    /**
+     * Returns the stack trace of an exception as String.
+     * 
+     * @param theThrowable the exception from which to extract the stack trace
+     *        as a String
+     * @return the exception stack trace as a String
+     */
+    public static String exceptionToString(Throwable theThrowable) {
+        return exceptionToString(theThrowable, null);
+    }
+
+    /**
+     * Returns the stack trace of an exception as String, optionally filtering
+     * out line from the stack trac
+     * 
+     * @param theThrowable the exception from which to extract the stack trace
+     *        as a String
+     * @param theFilterPatterns Array containing a list of patterns to filter 
+     *        out from the stack trace
+     * @return the exception stack trace as a String
+     */
+    public static String exceptionToString(Throwable theThrowable, String[] theFilterPatterns) {
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter(sw);
+    
+        theThrowable.printStackTrace(pw);
+        String stackTrace = sw.toString();
+        return filterStackTrace(stackTrace, theFilterPatterns);
+    }
+
+    /**
+     * 
+     * 
+     * @param theLine The line to check
+     * @param theFilterPatterns The patterns to filter out
+     * @return boolean Whether the specified line should be filtered from the
+     *         stack trace
+     */
+    public static boolean filterLine(String theLine, String[] theFilterPatterns) {
+        for (int i = 0; i < theFilterPatterns.length; i++) {
+            if (theLine.indexOf(theFilterPatterns[i]) > 0) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 
+     * 
+     * @param theStackTrace The original, unfiltered stack trace
+     * @param theFilterPatterns The patterns to filter out
+     * @return The filtered stack trace
+     */
+    static String filterStackTrace(String theStackTrace, String[] theFilterPatterns) {
+        if ((theFilterPatterns == null) || (theFilterPatterns.length == 0) || (theStackTrace == null)) {
+            return theStackTrace;
+        }
+    
+        StringWriter stringWriter = new StringWriter();
+        PrintWriter printWriter = new PrintWriter(stringWriter);
+        StringReader stringReader = new StringReader(theStackTrace);
+        BufferedReader bufferedReader = new BufferedReader(stringReader);
+    
+        String line;
+        try {
+            while ((line = bufferedReader.readLine()) != null) {
+                if (!filterLine(line, theFilterPatterns)) {
+                    printWriter.println(line);
+                }
+            }
+        } catch (IOException e) {
+            return theStackTrace;
+        }
+        return stringWriter.toString();
+    }
+
+    /**
+     * Replaces a character in a string by a substring.
+     *
+     * @param theBaseString the base string in which to perform replacements
+     * @param theChar the char to look for
+     * @param theNewString the string with which to replace the char
+     * @return the string with replacements done or null if the input string
+     *          was null
+     */
+    public static String replace(String theBaseString, char theChar, String theNewString) {
+        if (theBaseString == null) {
+            return null;
+        }
+    
+        int pos = theBaseString.indexOf(theChar);
+        if (pos < 0) {
+            return theBaseString;
+        }
+    
+        int lastPos = 0;
+        StringBuffer result = new StringBuffer();
+        while (pos > -1) {
+            result.append(theBaseString.substring(lastPos, pos));
+            result.append(theNewString);
+    
+            lastPos = pos + 1;
+            pos = theBaseString.indexOf(theChar, lastPos);
+        }
+    
+        if (lastPos < theBaseString.length()) {
+            result.append(theBaseString.substring(lastPos));
+        }
+    
+        return result.toString();
+    }
+
+    /**
+     * Escapes reserved XML characters.
+     *
+     * @param theString the string to escape
+     * @return the escaped string
+     */
+    public static String escape(String theString) {
+        String newString;
+
+        // It is important to replace the "&" first as the other replacements
+        // also introduces "&" chars ...
+        newString = replace(theString, '&', "&amp;");
+
+        newString = replace(newString, '<', "&lt;");
+        newString = replace(newString, '>', "&gt;");
+        newString = replace(newString, '\"', "&quot;");
+
+        return newString;
+    }
+
+    /**
+     * XML string containing executed test case results
+     */
+    private StringBuffer currentTestCaseResults = new StringBuffer();
+
+    /**
+     * Current test failure (XML string) : failure or error.
+     */
+    private String currentTestFailure;
+
+    /**
+     * Time current test was started
+     */
+    private long currentTestStartTime;
+
+    /**
+     * The number format used to convert durations into strings. Don't use the
+     * default locale for that, because the resulting string needs to use 
+     * dotted decimal notation for an XSLT transformation to work correctly.
+     */
+    private NumberFormat durationFormat = NumberFormat.getInstance(Locale.US);
+
+    /**
+     * The name of the test suite class.
+     */
+    private String suiteClassName;
+
+    /**
+     * Duration it took to execute all the tests.
+     */
+    private long totalDuration;
+
+    /**
+     * Event called by the base test runner when the test fails with an error.
+     *
+     * @param theTest the test object that failed
+     * @param theThrowable the exception that was thrown
+     */
+    public void addError(Test theTest, Throwable theThrowable) {
+        TestFailure failure = new TestFailure(theTest, theThrowable);
+        StringBuffer xml = new StringBuffer();
+
+        xml.append("<" + XMLFormatter.ERROR
+            + " "
+            + XMLFormatter.ATTR_MESSAGE
+            + "=\""
+            + escape(failure.thrownException().getMessage())
+            + "\" "
+            + XMLFormatter.ATTR_TYPE
+            + "=\""
+            + failure.thrownException().getClass().getName()
+            + "\">");
+        xml.append(escape(XMLFormatter.exceptionToString(failure.thrownException(), DEFAULT_STACK_FILTER_PATTERNS)));
+        xml.append("</" + XMLFormatter.ERROR + ">");
+
+        this.currentTestFailure = xml.toString();
+    }
+
+    /**
+     * Event called by the base test runner when the test fails with a failure.
+     *
+     * @param theTest the test object that failed
+     * @param theError the exception that was thrown
+     */
+    public void addFailure(Test theTest, AssertionFailedError theError) {
+        TestFailure failure = new TestFailure(theTest, theError);
+        StringBuffer xml = new StringBuffer();
+
+        xml.append("<" + XMLFormatter.FAILURE
+            + " "
+            + XMLFormatter.ATTR_MESSAGE
+            + "=\""
+            + escape(failure.thrownException().getMessage())
+            + "\" "
+            + XMLFormatter.ATTR_TYPE
+            + "=\""
+            + failure.thrownException().getClass().getName()
+            + "\">");
+        xml.append(escape(XMLFormatter.exceptionToString(failure.thrownException(), DEFAULT_STACK_FILTER_PATTERNS)));
+        xml.append("</" + XMLFormatter.FAILURE + ">");
+
+        this.currentTestFailure = xml.toString();
+    }
+
+    /**
+     * Event called by the base test runner when the test ends.
+     *
+     * @param theTest the test object being executed
+     */
+    public void endTest(Test theTest) {
+        StringBuffer xml = new StringBuffer();
+        String duration = getDurationAsString(System.currentTimeMillis() - this.currentTestStartTime);
+
+        xml.append("<" + XMLFormatter.TESTCASE + " " + XMLFormatter.ATTR_NAME + "=\"" + theTest + "\" " + XMLFormatter.ATTR_TIME + "=\"" + duration + "\">");
+
+        if (this.currentTestFailure != null) {
+            xml.append(this.currentTestFailure);
+        }
+
+        xml.append("</" + XMLFormatter.TESTCASE + ">");
+
+        this.currentTestCaseResults.append(xml.toString());
+    }
+
+    /**
+     * Comvert a duration expressed as a long into a string.
+     *
+     * @param theDuration the duration to convert to string
+     * @return the total duration as a string
+     */
+    private String getDurationAsString(long theDuration) {
+        return durationFormat.format((double)theDuration / 1000);
+    }
+
+    /**
+     * @return the suite class name
+     */
+    public String getSuiteClassName() {
+        return this.suiteClassName;
+    }
+
+    /**
+     * @return the total duration as a string
+     */
+    public String getTotalDurationAsString() {
+        return getDurationAsString(this.totalDuration);
+    }
+
+    /**
+     * Sets the suite class name that was executed.
+     *
+     * @param theSuiteClassName the suite class name
+     */
+    public void setSuiteClassName(String theSuiteClassName) {
+        this.suiteClassName = theSuiteClassName;
+    }
+
+    /**
+     * Sets the duration it took to execute all the tests.
+     *
+     * @param theDuration the time it took
+     */
+    public void setTotalDuration(long theDuration) {
+        this.totalDuration = theDuration;
+    }
+
+    /**
+     * Event called by the base test runner when the test starts.
+     *
+     * @param theTest the test object being executed
+     */
+    public void startTest(Test theTest) {
+        this.currentTestStartTime = System.currentTimeMillis();
+        this.currentTestFailure = null;
+    }
+
+    /**
+     * Formats the test result as an XML string.
+     *
+     * @param theResult the test result object
+     * @return the XML string representation of the test results
+     */
+    public String toXML(TestResult theResult) {
+        StringBuffer xml = new StringBuffer();
+
+        // xml.append("<?xml version=\"1.0\" encoding=\"" + getEncoding() + "\"?>");
+
+        // xml.append("<" + TESTSUITES + ">");
+
+        xml.append("<" + XMLFormatter.TESTSUITE
+            + " "
+            + XMLFormatter.ATTR_NAME
+            + "=\""
+            + getSuiteClassName()
+            + "\" "
+            + XMLFormatter.ATTR_TESTS
+            + "=\""
+            + theResult.runCount()
+            + "\" "
+            + XMLFormatter.ATTR_FAILURES
+            + "=\""
+            + theResult.failureCount()
+            + "\" "
+            + XMLFormatter.ATTR_ERRORS
+            + "=\""
+            + theResult.errorCount()
+            + "\" "
+            + XMLFormatter.ATTR_TIME
+            + "=\""
+            + getTotalDurationAsString()
+            + "\">");
+
+        xml.append(this.currentTestCaseResults.toString());
+
+        xml.append("</" + XMLFormatter.TESTSUITE + ">");
+        // xml.append("</" + TESTSUITES + ">");
+
+        return xml.toString();
+    }
+}

Propchange: incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/org/apache/tuscany/sca/host/webapp/junit/XMLFormatter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/host-webapp-junit/src/main/java/org/apache/tuscany/sca/host/webapp/junit/XMLFormatter.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/modules/host-webapp/pom.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/host-webapp/pom.xml?rev=620061&r1=620060&r2=620061&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/host-webapp/pom.xml (original)
+++ incubator/tuscany/java/sca/modules/host-webapp/pom.xml Fri Feb  8 18:11:49 2008
@@ -49,12 +49,6 @@
         </dependency>
 
         <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>4.2</version>
-        </dependency>
-
-        <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>servlet-api</artifactId>
             <version>2.4</version> <!-- to keep compatible with older servlet containers --> 

Modified: incubator/tuscany/java/sca/modules/host-webapp/src/main/java/org/apache/tuscany/sca/host/webapp/TuscanyServletFilter.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/host-webapp/src/main/java/org/apache/tuscany/sca/host/webapp/TuscanyServletFilter.java?rev=620061&r1=620060&r2=620061&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/host-webapp/src/main/java/org/apache/tuscany/sca/host/webapp/TuscanyServletFilter.java (original)
+++ incubator/tuscany/java/sca/modules/host-webapp/src/main/java/org/apache/tuscany/sca/host/webapp/TuscanyServletFilter.java Fri Feb  8 18:11:49 2008
@@ -32,8 +32,6 @@
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 
-import org.apache.tuscany.sca.host.webapp.junit.WebTestRunner;
-
 /**
  * A servlet filter that forwards service requests to the servlets registered with
  * the Tuscany ServletHost.
@@ -43,16 +41,8 @@
     //private static final Logger logger = Logger.getLogger(WebAppServletHost.class.getName());
 
     private WebAppServletHost servletHost;
-    private WebTestRunner testRunner;
 
     public void init(final FilterConfig config) throws ServletException {
-        try {
-            testRunner = new WebTestRunner();
-            testRunner.init(config);
-        } catch (NoClassDefFoundError e) {
-            // Ignore the error
-        }
-
         // TODO: must be a better way to get this than using a static
         servletHost = WebAppServletHost.getInstance();
 
@@ -77,9 +67,6 @@
     }
 
     public void destroy() {
-        if (testRunner != null) {
-            testRunner.destroy();
-        }
         WebAppServletHost.getInstance().destroy();
     }
 
@@ -94,15 +81,6 @@
         }
         if (path == null) {
             path = "/";
-        }
-
-        if (testRunner != null && testRunner.isJunitEnabled()) {
-            // This request is to run the test cases
-            // The path is /junit or /junit?<testCaseClassName>
-            if (path.equals("/junit")) {
-                testRunner.doFilter(request, response, chain);
-                return;
-            }
         }
 
         // Get a request dispatcher for the servlet mapped to that path

Modified: incubator/tuscany/java/sca/modules/pom.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/pom.xml?rev=620061&r1=620060&r2=620061&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/pom.xml (original)
+++ incubator/tuscany/java/sca/modules/pom.xml Fri Feb  8 18:11:49 2008
@@ -86,6 +86,7 @@
                 <module>host-http</module>
                 <module>host-rmi</module>
                 <module>host-webapp</module>
+                <module>host-webapp-junit</module>
                 <module>host-jetty</module>
                 <module>host-jms</module>
                 <module>host-jms-activemq</module>

Modified: incubator/tuscany/java/sca/tools/maven/maven-web-junit/src/main/java/org/apache/tuscany/tools/sca/web/junit/plugin/WebJUnitGeneratorMojo.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/tools/maven/maven-web-junit/src/main/java/org/apache/tuscany/tools/sca/web/junit/plugin/WebJUnitGeneratorMojo.java?rev=620061&r1=620060&r2=620061&view=diff
==============================================================================
--- incubator/tuscany/java/sca/tools/maven/maven-web-junit/src/main/java/org/apache/tuscany/tools/sca/web/junit/plugin/WebJUnitGeneratorMojo.java (original)
+++ incubator/tuscany/java/sca/tools/maven/maven-web-junit/src/main/java/org/apache/tuscany/tools/sca/web/junit/plugin/WebJUnitGeneratorMojo.java Fri Feb  8 18:11:49 2008
@@ -76,15 +76,23 @@
             + "\n       <filter>"
             + "\n           <filter-name>tuscany</filter-name>"
             + "\n           <filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class>"
+            + "\n       </filter>"
+            + "\n       <filter-mapping>"
+            + "\n           <filter-name>tuscany</filter-name>"
+            + "\n           <url-pattern>/*</url-pattern>"
+            + "\n       </filter-mapping>"
+            + "\n       <filter>"
+            + "\n           <filter-name>junit</filter-name>"
+            + "\n           <filter-class>org.apache.tuscany.sca.host.webapp.junit.JUnitServletFilter</filter-class>"
             + "\n           <init-param>"
             + "\n               <param-name>junit.tests.path</param-name>"
             + "\n               <param-value>${junit.tests.path}</param-value>"
             + "\n           </init-param>"
             + "\n       </filter>"
             + "\n       <filter-mapping>"
-            + "\n           <filter-name>tuscany</filter-name>"
-            + "\n           <url-pattern>/*</url-pattern>"
-            + "\n       </filter-mapping>"
+            + "\n           <filter-name>junit</filter-name>"
+            + "\n           <url-pattern>/junit</url-pattern>"
+            + "\n       </filter-mapping>"            
             + "\n</web-app>\n";
 
     /**
@@ -115,7 +123,7 @@
         base.mkdirs();
         File webxml = new File(base, "web.xml");
         getLog().info("Generating " + webxml.toString());
-        
+
         String name = project.getName();
         if (name == null) {
             name = project.getGroupId() + "-" + project.getArtifactId();
@@ -151,6 +159,10 @@
                 throw new MojoExecutionException(e.getMessage(), e);
             }
         }
+
+        // Workaround: maven-war-plugin doesn't like non-existing folders
+        // create target/test-classes
+        new File(project.getBasedir(), "target" + File.separator + "test-classes").mkdirs();
 
     }
 

Modified: incubator/tuscany/java/sca/tools/maven/maven-web-junit/src/main/java/org/apache/tuscany/tools/sca/web/junit/plugin/WebJUnitMojo.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/tools/maven/maven-web-junit/src/main/java/org/apache/tuscany/tools/sca/web/junit/plugin/WebJUnitMojo.java?rev=620061&r1=620060&r2=620061&view=diff
==============================================================================
--- incubator/tuscany/java/sca/tools/maven/maven-web-junit/src/main/java/org/apache/tuscany/tools/sca/web/junit/plugin/WebJUnitMojo.java (original)
+++ incubator/tuscany/java/sca/tools/maven/maven-web-junit/src/main/java/org/apache/tuscany/tools/sca/web/junit/plugin/WebJUnitMojo.java Fri Feb  8 18:11:49 2008
@@ -70,6 +70,12 @@
      */
     private int timeout = 300000; // 5 minutes
 
+    /**
+     * To avoid throwing exceptions because we want the stop container plugin to be executed
+     * @parameter
+     */
+    private boolean ignoreErrors = true;
+
     public void execute() throws MojoExecutionException {
         if (project.getPackaging().equals("pom")) {
             return;
@@ -110,7 +116,9 @@
 
             StatusLine status = response.getStatusLine();
             if (status.getStatusCode() != HttpStatus.SC_OK) {
-                // throw new MojoExecutionException(response.getStatusLine().getReasonPhrase());
+                if (!ignoreErrors) {
+                    throw new MojoExecutionException(status.getStatusCode() + ": " + status.getReasonPhrase());
+                }
                 getLog().error(status.getStatusCode() + ": " + status.getReasonPhrase());
                 return;
             }
@@ -164,11 +172,15 @@
 
             }
         } catch (Exception e) {
-            // throw new MojoExecutionException(e.getMessage(), e);
+            if (!ignoreErrors) {
+                throw new MojoExecutionException(e.getMessage(), e);
+            }
             getLog().error(e);
         }
         if (errors != 0 || failures != 0) {
-            // throw new MojoExecutionException(xml);
+            if (!ignoreErrors) {
+                throw new MojoExecutionException(xml);
+            }
             getLog().error(xml);
         }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org