Author: musachy
Date: Mon May 19 10:55:00 2008
New Revision: 657889

URL: http://svn.apache.org/viewvc?rev=657889&view=rev
Log:
@Action can be applied to a class (used from REST plugin)
Add flags to control what is scanned (used from REST plugin)

Modified:
    
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/PackageBasedActionConfigBuilder.java
    
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/annotation/Action.java
    
struts/sandbox/trunk/struts2-convention-plugin/src/main/resources/struts-plugin.xml

Modified: 
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/AbstractClassLoaderResolver.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/AbstractClassLoaderResolver.java?rev=657889&r1=657888&r2=657889&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/AbstractClassLoaderResolver.java
 (original)
+++ 
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/AbstractClassLoaderResolver.java
 Mon May 19 10:55:00 2008
@@ -354,10 +354,15 @@
 
         File[] files = location.listFiles();
         for (File file : files) {
-            if (file.isDirectory() && recursive) {
-                loadResourcesInDirectory(test, recursive, baseURLSpec, 
dirName, parent + "/" + file.getName(), file);
-            } else if (!file.isDirectory()) {
-                addIfMatching(test, baseURLSpec, parent, file.getName());
+            try {
+                if (file.isDirectory() && recursive) {
+                    loadResourcesInDirectory(test, recursive, baseURLSpec, 
dirName, parent + "/" + file.getName(), file);
+                } else if (!file.isDirectory()) {
+                    addIfMatching(test, baseURLSpec, parent, file.getName());
+                }
+            } catch (Exception ex) {
+                if (LOG.isErrorEnabled())
+                    LOG.error("Unable to scan [#0] for resources", ex, 
file.toString());
             }
         }
     }
@@ -420,7 +425,9 @@
         }
 
         for (String exclusion : exclusions) {
-            if (exclusion.endsWith("/*") && 
name.startsWith(exclusion.substring(0, exclusion.length() - 2)) ||
+            String tmpName = name.endsWith("/") ? name : name + "/";
+            //adding "/" to the name, otherwise "org/apache/struts/*" will 
filter "org/apache/struts2" out
+            if (exclusion.endsWith("/*") && 
tmpName.startsWith(exclusion.substring(0, exclusion.length() - 1)) ||
                     name.equals(exclusion)) {
                return true;
             }

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=657889&r1=657888&r2=657889&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 May 19 10:55:00 2008
@@ -69,8 +69,10 @@
     private String[] excludePackages;
     private String[] packageLocators;
     private boolean disableActionScanning = false;
+    private boolean disableGlobalActionScanning = false;
     private String actionSuffix = "Action";
     private boolean checkImplementsAction = true;
+    private boolean mapAllMatches = false;
 
     /**
      * Constructs actions based on a list of packages.
@@ -112,6 +114,22 @@
     }
 
     /**
+     * @param disableActionScanning Disable scanning for actions
+     */
+    @Inject(value = "struts.convention.action.disableScanning", required = 
false)
+    public void setDisableActionScanning(String disableActionScanning) {
+        this.disableActionScanning = "true".equals(disableActionScanning);
+    }
+
+    /**
+     * @param disableActionScanning If set to true, only the named packages 
will be scanned
+     */
+    @Inject(value = "struts.convention.action.disableGlobalScanning", required 
= false)
+    public void setDisableGlobalActionScanning(String 
disableGlobalActionScanning) {
+        this.disableGlobalActionScanning = 
"true".equals(disableGlobalActionScanning);
+    }
+
+    /**
      * @param   actionPackages (Optional) An optional list of action packages 
that this should create
      *          configuration for.
      */
@@ -162,6 +180,16 @@
     }
 
     /**
+     * @param   packageLocators (Optional) Map actions that match the 
"*${Suffix}" pattern
+     *                          even if they don't have a default method. The 
mapping from
+     *                          the url to the action will be delegated the 
action mapper.
+     */
+    @Inject(value = "struts.convention.action.mapAllMatches", required = false)
+    public void setMapAllMatches(String mapAllMatches) {
+        this.mapAllMatches  = "true".equals(mapAllMatches);
+    }
+
+    /**
      * Builds the action configurations by loading all classes in the packages 
specified by the
      * property <b>struts.convention.action.packages</b> and then figuring out 
which classes implement Action
      * or have Action in their name. Next, if this class is in a Java package 
that hasn't been
@@ -197,7 +225,7 @@
                 classes.addAll(findActionsInNamedPackages());
             }
 
-            if (packageLocators != null) {
+            if (packageLocators != null && !disableGlobalActionScanning) {
                 classes.addAll(findActionsUsingPackageLocators());
             }
 
@@ -311,6 +339,13 @@
                     createActionConfig(pkgCfg, actionClass, defaultActionName, 
method, action);
                 }
             }
+
+            // some actions will not have any @Action or a default method, 
like the rest actions
+            // where the action mapper is the one that finds the right method 
at runtime
+            if (map.isEmpty() && mapAllMatches) {
+                Action actionAnnotation = 
actionClass.getAnnotation(Action.class);
+                createActionConfig(defaultPackageConfig, actionClass, 
defaultActionName, null, actionAnnotation);
+            }
         }
 
         buildIndexActions(packageConfigs);
@@ -325,7 +360,7 @@
     /**
      * Determines the namespace for the action based on the action class. If 
there is a [EMAIL PROTECTED] Namespace}
      * annotation on the class (including parent classes) or on the package 
that the class is in, than
-     * it is used. Otherwise, the Java package name that the class is in is 
used inconjunction with
+     * it is used. Otherwise, the Java package name that the class is in is 
used in conjunction with
      * either the <b>struts.convention.action.packages</b> or 
<b>struts.convention.package.locators</b>
      * configuration values. These are used to determine which part of the 
Java package name should
      * be converted into the namespace for the XWork PackageConfig.
@@ -585,8 +620,4 @@
             }
         }
     }
-
-    public void setDisableActionScanning(boolean disableActionScanning) {
-        this.disableActionScanning = disableActionScanning;
-    }
 }
\ No newline at end of file

Modified: 
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/annotation/Action.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/annotation/Action.java?rev=657889&r1=657888&r2=657889&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/annotation/Action.java
 (original)
+++ 
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/annotation/Action.java
 Mon May 19 10:55:00 2008
@@ -52,7 +52,7 @@
  * </pre>
  * <!-- END SNIPPET: javadoc -->
  */
[EMAIL PROTECTED](ElementType.METHOD)
[EMAIL PROTECTED]({ElementType.METHOD, ElementType.TYPE})
 @Retention(RetentionPolicy.RUNTIME)
 public @interface Action {
     String DEFAULT_VALUE = "DEFAULT_VALUE";

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=657889&r1=657888&r2=657889&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 May 19 10:55:00 2008
@@ -39,6 +39,8 @@
 
   <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.mapAllMatches" value="false"/>
   <constant name="struts.convention.action.checkImplementsAction" 
value="true"/>
   <constant name="struts.convention.default.parent.package" 
value="convention-default"/>
   <constant name="struts.convention.action.name.lowercase" value="true"/>


Reply via email to