Author: musachy Date: Fri May 16 11:33:03 2008 New Revision: 657156 URL: http://svn.apache.org/viewvc?rev=657156&view=rev Log: Add configuration properties to disable class scanning, and to overwrite the action suffix (defaults to "Action")
Modified: struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/DefaultActionNameBuilder.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/SEOActionNameBuilder.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/DefaultActionNameBuilder.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/DefaultActionNameBuilder.java?rev=657156&r1=657155&r2=657156&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/DefaultActionNameBuilder.java (original) +++ struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/DefaultActionNameBuilder.java Fri May 16 11:33:03 2008 @@ -32,7 +32,7 @@ * </p> */ public class DefaultActionNameBuilder implements ActionNameBuilder { - private static final String ACTION = "Action"; + private String actionSuffix = "Action"; private boolean lowerCase; @Inject @@ -40,12 +40,23 @@ this.lowerCase = Boolean.parseBoolean(lowerCase); } + /** + * @param actionSuffix (Optional) Classes that end with these value will be mapped as actions + * (defaults to "Action") + */ + @Inject(value = "struts.convention.action.suffix", required = false) + public void setActionSuffix(String actionSuffix) { + if (!StringTools.isTrimmedEmpty(actionSuffix)) { + this.actionSuffix = actionSuffix; + } + } + public String build(String className) { String actionName = className; // Truncate Action suffix if found - if (actionName.endsWith(ACTION)) { - actionName = actionName.substring(0, actionName.length() - ACTION.length()); + if (actionName.endsWith(actionSuffix)) { + actionName = actionName.substring(0, actionName.length() - actionSuffix.length()); } // Force initial letter of action to lowercase, if desired 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=657156&r1=657155&r2=657156&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 Fri May 16 11:33:03 2008 @@ -68,6 +68,9 @@ private String[] actionPackages; private String[] excludePackages; private String[] packageLocators; + private boolean disableActionScanning = false; + private String actionSuffix = "Action"; + private boolean checkImplementsAction = true; /** * Constructs actions based on a list of packages. @@ -120,6 +123,26 @@ } /** + * @param actionPackages (Optional) Map classes that implement com.opensymphony.xwork2.Action + * as actions + */ + @Inject(value = "struts.convention.action.checkImplementsAction", required = false) + public void setCheckImplementsAction(String checkImplementsAction) { + this.checkImplementsAction = "true".equals(checkImplementsAction); + } + + /** + * @param actionSuffix (Optional) Classes that end with these value will be mapped as actions + * (defaults to "Action") + */ + @Inject(value = "struts.convention.action.suffix", required = false) + public void setActionSuffix(String actionSuffix) { + if (!StringTools.isTrimmedEmpty(actionSuffix)) { + this.actionSuffix = actionSuffix; + } + } + + /** * @param excludePackages (Optional) A list of packages that should be skipped when building * configuration. */ @@ -149,55 +172,61 @@ * [EMAIL PROTECTED] ResultMapBuilder} is used to create ResultConfig instances of the action. */ public void buildActionConfigs() { - if (actionPackages == null && packageLocators == null) { - throw new ConfigurationException("At least a list of action packages or action package locators " + - "must be given using one of the properties [struts.convention.action.packages] or " + - "[struts.convention.package.locators]"); - } + if (!disableActionScanning ) { + if (actionPackages == null && packageLocators == null) { + throw new ConfigurationException("At least a list of action packages or action package locators " + + "must be given using one of the properties [struts.convention.action.packages] or " + + "[struts.convention.package.locators]"); + } - if (LOG.isTraceEnabled()) { - LOG.trace("Loading action configurations"); + if (LOG.isTraceEnabled()) { + LOG.trace("Loading action configurations"); + if (actionPackages != null) { + LOG.trace("Actions being loaded from action packages " + Arrays.asList(actionPackages)); + } + if (packageLocators != null) { + LOG.trace("Actions being loaded using package locators " + Arrays.asList(packageLocators)); + } + if (excludePackages != null) { + LOG.trace("Excluding actions from packages " + Arrays.asList(excludePackages)); + } + } + + Set<Class<?>> classes = new HashSet<Class<?>>(); if (actionPackages != null) { - LOG.trace("Actions being loaded from action packages " + Arrays.asList(actionPackages)); + classes.addAll(findActionsInNamedPackages()); } + if (packageLocators != null) { - LOG.trace("Actions being loaded using package locators " + Arrays.asList(packageLocators)); + classes.addAll(findActionsUsingPackageLocators()); } - if (excludePackages != null) { - LOG.trace("Excluding actions from packages " + Arrays.asList(excludePackages)); - } - } - Set<Class<?>> classes = new HashSet<Class<?>>(); - if (actionPackages != null) { - classes.addAll(findActionsInNamedPackages()); - } - - if (packageLocators != null) { - classes.addAll(findActionsUsingPackageLocators()); + buildConfiguration(classes); } - - buildConfiguration(classes); } protected Set<Class<?>> findActionsInNamedPackages() { ClassClassLoaderResolver resolver = new ClassClassLoaderResolver(); - resolver.find(new ClassClassLoaderResolver.Test<Class<?>>() { - public boolean test(Class type) { - return com.opensymphony.xwork2.Action.class.isAssignableFrom(type) || - type.getSimpleName().endsWith("Action"); - } - }, true, actionPackages); + resolver.find(getClassLoaderResolverTest(), true, actionPackages); return resolver.getMatches(); } + 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 Set<Class<?>> findActionsUsingPackageLocators() { ClassClassLoaderResolver resolver = new ClassClassLoaderResolver(); resolver.findByLocators(new ClassClassLoaderResolver.Test<Class<?>>() { public boolean test(Class<?> type) { - return com.opensymphony.xwork2.Action.class.isAssignableFrom(type) || - type.getSimpleName().endsWith("Action"); + return (checkImplementsAction && com.opensymphony.xwork2.Action.class.isAssignableFrom(type)) || + type.getSimpleName().endsWith(actionSuffix); } }, true, excludePackages, packageLocators); @@ -556,4 +585,8 @@ } } } + + 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/SEOActionNameBuilder.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/SEOActionNameBuilder.java?rev=657156&r1=657155&r2=657156&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/SEOActionNameBuilder.java (original) +++ struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/SEOActionNameBuilder.java Fri May 16 11:33:03 2008 @@ -34,7 +34,7 @@ */ public class SEOActionNameBuilder implements ActionNameBuilder { private static final Logger LOG = LoggerFactory.getLogger(SEOActionNameBuilder.class); - private static final String ACTION = "Action"; + private String actionSuffix = "Action"; private boolean lowerCase; private String separator; @@ -45,12 +45,23 @@ this.separator = separator; } + /** + * @param actionSuffix (Optional) Classes that end with these value will be mapped as actions + * (defaults to "Action") + */ + @Inject(value = "struts.convention.action.suffix", required = false) + public void setActionSuffix(String actionSuffix) { + if (!StringTools.isTrimmedEmpty(actionSuffix)) { + this.actionSuffix = actionSuffix; + } + } + public String build(String className) { String actionName = className; // Truncate Action suffix if found - if (actionName.endsWith(ACTION)) { - actionName = actionName.substring(0, actionName.length() - ACTION.length()); + if (actionName.endsWith(actionSuffix)) { + actionName = actionName.substring(0, actionName.length() - actionSuffix.length()); } // Convert to underscores 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=657156&r1=657155&r2=657156&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 Fri May 16 11:33:03 2008 @@ -37,7 +37,9 @@ <bean type="com.opensymphony.xwork2.config.PackageProvider" class="org.apache.struts2.convention.ClasspathConfigurationProvider"/> - <constant name="struts.convention.result.path" value="/WEB-INF/content/"/> + <constant name="struts.convention.result.path" value="/WEB-INF/content/"/> + <constant name="struts.convention.action.suffix" value="Action"/> + <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"/> <constant name="struts.convention.action.name.separator" value="-"/>