You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by mu...@apache.org on 2008/06/02 15:55:52 UTC

svn commit: r662439 - in /struts/sandbox/trunk/struts2-convention-plugin: ./ src/main/java/org/apache/struts2/convention/ src/main/resources/ src/test/java/org/apache/struts2/convention/ src/test/java/org/apache/struts2/convention/actions/action/

Author: musachy
Date: Mon Jun  2 06:55:51 2008
New Revision: 662439

URL: http://svn.apache.org/viewvc?rev=662439&view=rev
Log: (empty)

Added:
    struts/sandbox/trunk/struts2-convention-plugin/src/main/resources/struts.properties
    struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/actions/action/TestBase.java   (with props)
    struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/actions/action/TestExtends.java   (with props)
Removed:
    struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/AbstractClassLoaderResolver.java
    struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/ClassClassLoaderResolver.java
    struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/URLClassLoaderResolver.java
Modified:
    struts/sandbox/trunk/struts2-convention-plugin/pom.xml
    struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java
    struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
    struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/StringTools.java
    struts/sandbox/trunk/struts2-convention-plugin/src/main/resources/struts-plugin.xml
    struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java

Modified: struts/sandbox/trunk/struts2-convention-plugin/pom.xml
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/pom.xml?rev=662439&r1=662438&r2=662439&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-convention-plugin/pom.xml (original)
+++ struts/sandbox/trunk/struts2-convention-plugin/pom.xml Mon Jun  2 06:55:51 2008
@@ -1,74 +1,72 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
- * $Id$
- *
- * 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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache.struts</groupId>
-        <artifactId>struts2-plugins</artifactId>
-        <version>2.1.3-SNAPSHOT</version>
-    </parent>
-    <groupId>org.apache.struts</groupId>
-    <artifactId>struts2-convention-plugin</artifactId>
-    <packaging>jar</packaging>
-    <name>Struts 2 Convention Plugin</name>
-
-    <scm>
-       <connection>scm:svn:http://svn.apache.org/repos/asf/struts/sandbox/trunk/struts2-convention-plugin</connection>
-       <developerConnection>scm:svn:https://svn.apache.org/repos/asf/struts/sandbox/trunk/struts2-convention-plugin</developerConnection>
-       <url>http://svn.apache.org/viewcvs.cgi/struts/sandbox/trunk/struts2-convention-plugin</url>
-    </scm>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.struts</groupId>
-            <artifactId>struts2-core</artifactId>
-            <version>2.1.1-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-            <version>3.8.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.easymock</groupId>
-            <artifactId>easymock</artifactId>
-            <version>2.3</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>servlet-api</artifactId>
-            <version>2.4</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>jsp-api</artifactId>
-            <version>2.0</version>
-            <scope>provided</scope>
-        </dependency>
-   </dependencies>
-</project>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * $Id$
+ *
+ * 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 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.struts</groupId>
+        <artifactId>struts2-plugins</artifactId>
+        <version>2.1.3-SNAPSHOT</version>
+    </parent>
+    <groupId>org.apache.struts</groupId>
+    <artifactId>struts2-convention-plugin</artifactId>
+    <packaging>jar</packaging>
+    <name>Struts 2 Convention Plugin</name>
+
+    <scm>
+       <connection>scm:svn:http://svn.apache.org/repos/asf/struts/sandbox/trunk/struts2-convention-plugin</connection>
+       <developerConnection>scm:svn:https://svn.apache.org/repos/asf/struts/sandbox/trunk/struts2-convention-plugin</developerConnection>
+       <url>http://svn.apache.org/viewcvs.cgi/struts/sandbox/trunk/struts2-convention-plugin</url>
+    </scm>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.struts</groupId>
+            <artifactId>struts2-core</artifactId>
+            <version>2.1.3-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+            <version>3.8.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymock</artifactId>
+            <version>2.3</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+            <version>2.4</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>jsp-api</artifactId>
+            <version>2.0</version>
+            <scope>provided</scope>
+        </dependency>
+	  </dependencies>
+</project>
\ No newline at end of file

Modified: struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java?rev=662439&r1=662438&r2=662439&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java (original)
+++ struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java Mon Jun  2 06:55:51 2008
@@ -20,6 +20,7 @@
  */
 package org.apache.struts2.convention;
 
+import java.io.IOException;
 import java.net.URL;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -38,6 +39,8 @@
 import com.opensymphony.xwork2.config.entities.ResultConfig;
 import com.opensymphony.xwork2.config.entities.ResultTypeConfig;
 import com.opensymphony.xwork2.inject.Inject;
+import com.opensymphony.xwork2.util.finder.ResourceFinder;
+import com.opensymphony.xwork2.util.finder.Test;
 import com.opensymphony.xwork2.util.logging.Logger;
 import com.opensymphony.xwork2.util.logging.LoggerFactory;
 
@@ -230,27 +233,41 @@
                     actionName);
         }
 
-        URLClassLoaderResolver resolver = new URLClassLoaderResolver();
-        resolver.find(new URLClassLoaderResolver.NameTest() {
+        ResourceFinder finder = new ResourceFinder(classPathLocation);
+        try {
+            Map<String, URL> matches = finder.getResourcesMap("");
+            if (matches != null) {
+                Test<URL> resourceTest = getResourceTest(resultPath, actionName);
+                for (Map.Entry<String, URL> entry : matches.entrySet()) {
+                    if (resourceTest.test(entry.getValue())) {
+                        if (LOG.isTraceEnabled()) {
+                            LOG.trace("Processing URL [#0]", entry.getKey());
+                        }
+
+                        String urlStr = entry.getValue().toString();
+                        int index = urlStr.lastIndexOf(resultPrefix);
+                        String path = urlStr.substring(index);
+                        makeResults(actionClass, path, resultPrefix, results, packageConfig, resultsByExtension);
+                    }
+
+                }
+            }
+        } catch (IOException ex) {
+           if (LOG.isErrorEnabled())
+               LOG.error("Unable to scan directory [#0] for results", ex, classPathLocation);
+        }
+
+    }
+
+    private Test<URL> getResourceTest(final String resultPath, final String actionName) {
+        return new Test<URL>() {
             public boolean test(URL url) {
                 String urlStr = url.toString();
                 int index = urlStr.lastIndexOf(resultPath);
                 String path = urlStr.substring(index + resultPath.length());
                 return path.startsWith(actionName);
             }
-        }, false, classPathLocation);
-
-        Set<URL> matches = resolver.getMatches();
-        for (URL match : matches) {
-            if (LOG.isTraceEnabled()) {
-                LOG.trace("Processing URL [#0]", match.toString());
-            }
-
-            String urlStr = match.toString();
-            int index = urlStr.lastIndexOf(resultPrefix);
-            String path = urlStr.substring(index);
-            makeResults(actionClass, path, resultPrefix, results, packageConfig, resultsByExtension);
-        }
+        };
     }
 
     /**

Modified: struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java?rev=662439&r1=662438&r2=662439&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java (original)
+++ struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java Mon Jun  2 06:55:51 2008
@@ -20,6 +20,7 @@
  */
 package org.apache.struts2.convention;
 
+import java.io.IOException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
@@ -27,7 +28,6 @@
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -37,7 +37,6 @@
 import org.apache.struts2.convention.annotation.AnnotationTools;
 import org.apache.struts2.convention.annotation.ExceptionMapping;
 import org.apache.struts2.convention.annotation.ExceptionMappings;
-import org.apache.struts2.convention.annotation.InterceptorRef;
 import org.apache.struts2.convention.annotation.Namespace;
 import org.apache.struts2.convention.annotation.Namespaces;
 import org.apache.struts2.convention.annotation.ParentPackage;
@@ -50,9 +49,10 @@
 import com.opensymphony.xwork2.config.entities.InterceptorMapping;
 import com.opensymphony.xwork2.config.entities.PackageConfig;
 import com.opensymphony.xwork2.config.entities.ResultConfig;
-import com.opensymphony.xwork2.config.providers.InterceptorBuilder;
 import com.opensymphony.xwork2.inject.Inject;
-import com.opensymphony.xwork2.util.DomHelper;
+import com.opensymphony.xwork2.util.finder.ClassFinder;
+import com.opensymphony.xwork2.util.finder.Test;
+import com.opensymphony.xwork2.util.finder.UrlSet;
 import com.opensymphony.xwork2.util.logging.Logger;
 import com.opensymphony.xwork2.util.logging.LoggerFactory;
 
@@ -73,6 +73,8 @@
     private String[] actionPackages;
     private String[] excludePackages;
     private String[] packageLocators;
+    private String[] excludeJars;
+    private boolean disableJarScanning = true;
     private boolean disableActionScanning = false;
     private boolean disablePackageLocatorsScanning = false;
     private String actionSuffix = "Action";
@@ -127,6 +129,23 @@
     }
 
     /**
+     * @param exlcudeJars Comma separated list of regular expressions of jars to be exluded.
+     *                    Ignored if "struts.convention.action.disableJarScanning" is true
+     */
+    @Inject(value = "struts.convention.action.excludeJars", required = false)
+    public void setExcludeJars(String excludeJars) {
+        this.excludeJars = excludeJars.split("\\s*[,]\\s*");;
+    }
+
+    /**
+     * @param disableJarScanning Disable scanning jar files for actions
+     */
+    @Inject(value = "struts.convention.action.disableJarScanning", required = false)
+    public void setDisableJarScanning(String disableJarScanning) {
+        this.disableJarScanning = "true".equals(disableJarScanning);
+    }
+
+    /**
      * @param disableActionScanning If set to true, only the named packages will be scanned
      */
     @Inject(value = "struts.convention.package.locators.disable", required = false)
@@ -225,48 +244,112 @@
                 }
             }
 
-            Set<Class<?>> classes = new HashSet<Class<?>>();
-            if (actionPackages != null) {
-                classes.addAll(findActionsInNamedPackages());
-            }
+            Set<Class> classes = findActions();
+            buildConfiguration(classes);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    protected Set<Class> findActions() {
+        Set<Class> classes = new HashSet<Class>();
+        try {
+            if (actionPackages != null || (packageLocators != null && !disablePackageLocatorsScanning)) {
+                ClassFinder finder = new ClassFinder(getClassLoader(), buildUrlSet().getUrls(), true);
+
+                // named packages
+                if (actionPackages != null) {
+                    for (String packageName : actionPackages) {
+                        Test<ClassFinder.ClassInfo> test = getPackageFinderTest(packageName);
+                        classes.addAll(finder.findClasses(test));
+                    }
+                }
 
-            if (packageLocators != null && !disablePackageLocatorsScanning) {
-                classes.addAll(findActionsUsingPackageLocators());
+                //package locators
+                if (packageLocators != null && !disablePackageLocatorsScanning) {
+                    for (String packageLocator : packageLocators) {
+                        Test<ClassFinder.ClassInfo> test = getPackageLocatorTest(packageLocator);
+                        classes.addAll(finder.findClasses(test));
+                    }
+                }
             }
+        } catch (Exception ex) {
+            if (LOG.isErrorEnabled())
+                LOG.error("Unable to scan named packages", ex);
+        }
 
-            buildConfiguration(classes);
+        return classes;
+    }
+
+    private UrlSet buildUrlSet() throws IOException {
+        UrlSet urlSet = new UrlSet(getClassLoader());
+
+        urlSet = urlSet.exclude(ClassLoader.getSystemClassLoader().getParent());
+        urlSet = urlSet.excludeJavaExtDirs();
+        urlSet = urlSet.excludeJavaEndorsedDirs();
+        urlSet = urlSet.excludeJavaHome();
+        urlSet = urlSet.excludePaths(System.getProperty("sun.boot.class.path", ""));
+        urlSet = urlSet.exclude(".*/JavaVM.framework/.*");
+
+        if (disableJarScanning) {
+            urlSet = urlSet.exclude(".*?jar(!/)?");
+        } else if (excludeJars != null) {
+            for (String pattern : excludeJars) {
+                urlSet = urlSet.exclude(pattern.trim());
+            }
         }
+
+        return urlSet;
     }
 
-    protected Set<Class<?>> findActionsInNamedPackages() {
-        ClassClassLoaderResolver resolver = new ClassClassLoaderResolver();
-        resolver.find(getClassLoaderResolverTest(), true, actionPackages);
-
-        return resolver.getMatches();
+    private ClassLoader getClassLoader() {
+        return Thread.currentThread().getContextClassLoader();
     }
 
-    protected ClassClassLoaderResolver.Test<Class<?>> getClassLoaderResolverTest() {
-        return new ClassClassLoaderResolver.Test<Class<?>>() {
-            public boolean test(Class type) {
-                return (checkImplementsAction && com.opensymphony.xwork2.Action.class.isAssignableFrom(type)) ||
-                    type.getSimpleName().endsWith(actionSuffix);
+    protected Test<ClassFinder.ClassInfo> getPackageFinderTest(final String packageName) {
+        // so "my.package" does not match "my.package2.test"
+        final String strictPackageName = packageName + ".";
+        return new Test<ClassFinder.ClassInfo>() {
+            public boolean test(ClassFinder.ClassInfo classInfo) {
+                String classPackageName = classInfo.getPackageName();
+                boolean inPackage = classPackageName.equals(packageName) || classPackageName.startsWith(strictPackageName);
+                boolean nameMatches = classInfo.getName().endsWith(actionSuffix);
+
+                try {
+                    return inPackage && (nameMatches ||  (checkImplementsAction && com.opensymphony.xwork2.Action.class.isAssignableFrom(classInfo.get())));
+                } catch (ClassNotFoundException ex) {
+                    if (LOG.isErrorEnabled())
+                        LOG.error("Unable to load class [#0]", ex, classInfo.getName());
+                    return false;
+                }
             }
         };
     }
 
-    protected Set<Class<?>> findActionsUsingPackageLocators() {
-        ClassClassLoaderResolver resolver = new ClassClassLoaderResolver();
-        resolver.findByLocators(new ClassClassLoaderResolver.Test<Class<?>>() {
-            public boolean test(Class<?> type) {
-                return (checkImplementsAction && com.opensymphony.xwork2.Action.class.isAssignableFrom(type)) ||
-                    type.getSimpleName().endsWith(actionSuffix);
+    protected Test<ClassFinder.ClassInfo> getPackageLocatorTest(final String packageLocator) {
+        return new Test<ClassFinder.ClassInfo>() {
+            public boolean test(ClassFinder.ClassInfo classInfo) {
+                String packageName = classInfo.getPackageName();
+                if (packageName.length() > 0) {
+                    String[] splitted = packageName.split("\\.");
+
+                    boolean packageMatches = StringTools.contains(splitted, packageLocator, false);
+                    boolean nameMatches = classInfo.getName().endsWith(actionSuffix);
+
+                    try {
+                        return packageMatches && (nameMatches ||  (checkImplementsAction && com.opensymphony.xwork2.Action.class.isAssignableFrom(classInfo.get())));
+                    } catch (ClassNotFoundException ex) {
+                        if (LOG.isErrorEnabled())
+                            LOG.error("Unable to load class [#0]", ex, classInfo.getName());
+                        return false;
+                    }
+                } else
+                    return false;
             }
-        }, true, excludePackages, packageLocators);
-
-        return resolver.getMatches();
+        };
     }
 
-    protected void buildConfiguration(Set<Class<?>> classes) {
+    @SuppressWarnings("unchecked")
+    protected void buildConfiguration(Set<Class> classes) {
         Map<String, PackageConfig.Builder> packageConfigs = new HashMap<String, PackageConfig.Builder>();
 
         for (Class<?> actionClass : classes) {

Modified: struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/StringTools.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/StringTools.java?rev=662439&r1=662438&r2=662439&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/StringTools.java (original)
+++ struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/StringTools.java Mon Jun  2 06:55:51 2008
@@ -44,6 +44,17 @@
         return str;
     }
 
+    public static boolean contains(String[] strings, String value, boolean ignoreCase) {
+        if (strings != null) {
+            for (String string :  strings) {
+                if (string.equals(value) || (ignoreCase && string.equalsIgnoreCase(value)))
+                    return true;
+            }
+        }
+
+        return false;
+    }
+
     public static String upToLastToken(String str, String s) {
         int index = str.lastIndexOf(s);
         if (index >= 0) {

Modified: struts/sandbox/trunk/struts2-convention-plugin/src/main/resources/struts-plugin.xml
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/src/main/resources/struts-plugin.xml?rev=662439&r1=662438&r2=662439&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-convention-plugin/src/main/resources/struts-plugin.xml (original)
+++ struts/sandbox/trunk/struts2-convention-plugin/src/main/resources/struts-plugin.xml Mon Jun  2 06:55:51 2008
@@ -40,6 +40,7 @@
   <constant name="struts.convention.result.path" value="/WEB-INF/content/"/>
   <constant name="struts.convention.action.suffix" value="Action"/>
   <constant name="struts.convention.action.disableScanning" value="false"/>
+  <constant name="struts.convention.action.disableJarScanning" value="true"/>
   <constant name="struts.convention.action.mapAllMatches" value="false"/>
   <constant name="struts.convention.action.checkImplementsAction" value="true"/>
   <constant name="struts.convention.default.parent.package" value="convention-default"/>
@@ -50,7 +51,7 @@
   <constant name="struts.convention.exclude.packages" value="org.apache.struts.*,org.apache.struts2.*,org.springframework.web.struts.*,org.springframework.web.struts2.*,org.hibernate.*"/>
   <constant name="struts.convention.relative.result.types" value="dispatcher,velocity,freemarker"/>
   <constant name="struts.convention.redirect.to.slash" value="true"/>
-  <constant name="struts.mapper.alwaysSelectFullNamespace" value="true"/>
+  <constant name="struts.mapper.alwaysSelectFullNamespace" value="true"/>
 
   <package name="convention-default" extends="struts-default">
   </package>

Added: struts/sandbox/trunk/struts2-convention-plugin/src/main/resources/struts.properties
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/src/main/resources/struts.properties?rev=662439&view=auto
==============================================================================
--- struts/sandbox/trunk/struts2-convention-plugin/src/main/resources/struts.properties (added)
+++ struts/sandbox/trunk/struts2-convention-plugin/src/main/resources/struts.properties Mon Jun  2 06:55:51 2008
@@ -0,0 +1,18 @@
+struts.convention.action.excludeJars = .*/activemq-(core|ra)-[\\d.]+.jar(!/)?, \
+            .*/catalina.*?jar(!/)?, \
+            .*/tomcat.*?jar(!/)?, \
+            .*/junit-[\\d.]+.jar(!/)?, \
+            .*/log4j-[\\d.]+.jar(!/)?, \
+            .*/xwork-[\\d.]+.jar(!/)?, \
+            .*/ognl-[\\d.]+.jar(!/)?, \
+            .*/aopalliance-[\\d.]+.jar(!/)?, \
+            .*/jstl-[\\d.]+.jar(!/)?, \
+            .*/dwr-[\\d.]+.jar(!/)?, \
+            .*/freemarker-[\\d.]+.jar(!/)?, \
+            .*/servlet-api-[\\d.]+.jar(!/)?, \
+            .*/sitemesh-[\\d.]+.jar(!/)?, \
+            .*/commons-(beanutils|el|digester|fileupload|codec|chain|logging|cli|pool|lang|collections|dbcp)-[\\d.]+.jar(!/)?, \
+            .*/spring-(beans|context|core|mock|web|jdbc)-[\\d.]+.jar(!/)?, \
+            .*/velocity-[\\d.]+.jar(!/)?, \
+            .*/velocity-(dep|tools)-[\\d.]+.jar(!/)?, \
+            .*/struts2-(config-browser-plugin|core|dojo-plugin|dwr-plugin|jsf-plugin|sitemesh-plugin|spring-plugin|struts1-plugin|tiles-plugin)-[\\d.]+.jar(!/)?
\ No newline at end of file

Modified: struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java?rev=662439&r1=662438&r2=662439&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java (original)
+++ struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java Mon Jun  2 06:55:51 2008
@@ -41,6 +41,7 @@
 import org.apache.struts2.convention.actions.action.ActionNamesAction;
 import org.apache.struts2.convention.actions.action.SingleActionNameAction;
 import org.apache.struts2.convention.actions.action.TestAction;
+import org.apache.struts2.convention.actions.action.TestExtends;
 import org.apache.struts2.convention.actions.exception.ExceptionsActionLevelAction;
 import org.apache.struts2.convention.actions.exception.ExceptionsMethodLevelAction;
 import org.apache.struts2.convention.actions.interceptor.ActionLevelInterceptor2Action;
@@ -172,6 +173,7 @@
         expect(resultMapBuilder.build(ActionNamesAction.class, getAnnotation(ActionNamesAction.class, "run", Actions.class).value()[1], "actions2", actionPkg)).andReturn(results);
         expect(resultMapBuilder.build(SingleActionNameAction.class, getAnnotation(SingleActionNameAction.class, "run", Action.class), "action", actionPkg)).andReturn(results);
         expect(resultMapBuilder.build(TestAction.class, null, "test", actionPkg)).andReturn(results);
+        expect(resultMapBuilder.build(TestExtends.class, null, "test-extends", actionPkg)).andReturn(results);
 
         /* org.apache.struts2.convention.actions.idx */
         /* org.apache.struts2.convention.actions.idx.idx2 */
@@ -257,6 +259,7 @@
         interceptorBuilder.setConfiguration(configuration);
         PackageBasedActionConfigBuilder builder = new PackageBasedActionConfigBuilder(configuration,
             actionNameBuilder, resultMapBuilder, interceptorBuilder ,of, "false", "struts-default");
+        builder.setDisableJarScanning("true");
         if (actionPackages != null) {
             builder.setActionPackages(actionPackages);
         }
@@ -272,13 +275,14 @@
         /* org.apache.struts2.convention.actions.action */
         PackageConfig pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.action#struts-default#/action");
         assertNotNull(pkgConfig);
-        assertEquals(6, pkgConfig.getActionConfigs().size());
+        assertEquals(7, pkgConfig.getActionConfigs().size());
         verifyActionConfig(pkgConfig, "action1", ActionNameAction.class, "run1", pkgConfig.getName());
         verifyActionConfig(pkgConfig, "action2", ActionNameAction.class, "run2", pkgConfig.getName());
         verifyActionConfig(pkgConfig, "actions1", ActionNamesAction.class, "run", pkgConfig.getName());
         verifyActionConfig(pkgConfig, "actions2", ActionNamesAction.class, "run", pkgConfig.getName());
         verifyActionConfig(pkgConfig, "action", SingleActionNameAction.class, "run", pkgConfig.getName());
         verifyActionConfig(pkgConfig, "test", TestAction.class, "execute", pkgConfig.getName());
+        verifyActionConfig(pkgConfig, "test-extends", TestExtends.class, "execute", pkgConfig.getName());
 
         /* org.apache.struts2.convention.actions.namespace3 */
         //action on namespace1 (action level)

Added: struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/actions/action/TestBase.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/actions/action/TestBase.java?rev=662439&view=auto
==============================================================================
--- struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/actions/action/TestBase.java (added)
+++ struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/actions/action/TestBase.java Mon Jun  2 06:55:51 2008
@@ -0,0 +1,27 @@
+/*
+ * $Id$
+ *
+ * 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.struts2.convention.actions.action;
+
+import com.opensymphony.xwork2.ActionSupport;
+
+public abstract class TestBase extends ActionSupport {
+
+}

Propchange: struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/actions/action/TestBase.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/actions/action/TestExtends.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/actions/action/TestExtends.java?rev=662439&view=auto
==============================================================================
--- struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/actions/action/TestExtends.java (added)
+++ struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/actions/action/TestExtends.java Mon Jun  2 06:55:51 2008
@@ -0,0 +1,25 @@
+/*
+ * $Id$
+ *
+ * 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.struts2.convention.actions.action;
+
+public class TestExtends extends TestBase {
+
+}

Propchange: struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/actions/action/TestExtends.java
------------------------------------------------------------------------------
    svn:keywords = Id