Author: musachy Date: Thu Jun 5 06:29:25 2008 New Revision: 663603 URL: http://svn.apache.org/viewvc?rev=663603&view=rev Log: WW-2667 REST should not extend Codebehind
Removed: struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/ControllerClasspathPackageProvider.java Modified: struts/struts2/trunk/plugins/codebehind/src/main/java/ (props changed) struts/struts2/trunk/plugins/codebehind/src/main/java/org/apache/struts2/config/ClasspathPackageProvider.java struts/struts2/trunk/plugins/codebehind/src/main/resources/struts-plugin.xml struts/struts2/trunk/plugins/rest/pom.xml struts/struts2/trunk/plugins/rest/src/main/resources/struts-plugin.xml Propchange: struts/struts2/trunk/plugins/codebehind/src/main/java/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Thu Jun 5 06:29:25 2008 @@ -0,0 +1 @@ +META-INF Modified: struts/struts2/trunk/plugins/codebehind/src/main/java/org/apache/struts2/config/ClasspathPackageProvider.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/codebehind/src/main/java/org/apache/struts2/config/ClasspathPackageProvider.java?rev=663603&r1=663602&r2=663603&view=diff ============================================================================== --- struts/struts2/trunk/plugins/codebehind/src/main/java/org/apache/struts2/config/ClasspathPackageProvider.java (original) +++ struts/struts2/trunk/plugins/codebehind/src/main/java/org/apache/struts2/config/ClasspathPackageProvider.java Thu Jun 5 06:29:25 2008 @@ -84,7 +84,7 @@ * to use in place of "struts-default". */ protected static final String DEFAULT_PARENT_PACKAGE = "struts.configuration.classpath.defaultParentPackage"; - + /** * A setting to disable action scanning. */ @@ -109,10 +109,25 @@ */ private boolean forceLowerCase = true; + protected static final String CLASS_SUFFIX = "struts.codebehind.classSuffix"; /** * Default suffix that can be used to indicate POJO "Action" classes. */ - private static final String ACTION = "Action"; + protected String classSuffix = "Action"; + + protected static final String CHECK_IMPLEMENTS_ACTION = "struts.codebehind.checkImplementsAction"; + + /** + * When testing a class, check that it implements Action + */ + protected boolean checkImplementsAction = true; + + protected static final String CHECK_ANNOTATION = "struts.codebehind.checkAnnotation"; + + /** + * When testing a class, check that it has an @Action annotation + */ + protected boolean checkAnnotation = true; /** * Helper class to scan class path for server pages. @@ -126,7 +141,7 @@ * @see #needsReload */ private boolean initialized = false; - + private boolean disableActionScanning = false; private PackageLoader packageLoader; @@ -165,12 +180,12 @@ return ClassLoaderUtil.getResource(path, getClass()); } } - + @Inject("actionPackages") public void setActionPackages(String packages) { this.actionPackages = packages; } - + public void setServletContext(ServletContext ctx) { this.servletContext = ctx; } @@ -184,7 +199,27 @@ public void setDisableActionScanning(String disableActionScanning) { this.disableActionScanning = "true".equals(disableActionScanning); } - + + /** + * Check that the class implements Action + * + * @param checkImplementsAction True to check + */ + @Inject(value=CHECK_IMPLEMENTS_ACTION, required=false) + public void setCheckImplementsAction(String checkImplementsAction) { + this.checkImplementsAction = "true".equals(checkImplementsAction); + } + + /** + * Check that the class has an @Action annotation + * + * @param checkImplementsAction True to check + */ + @Inject(value=CHECK_ANNOTATION, required=false) + public void setCheckAnnotation(String checkAnnotation) { + this.checkAnnotation = "true".equals(checkAnnotation); + } + /** * Register a default parent package for the actions. * @@ -214,10 +249,20 @@ public void setDefaultPagePrefix(String defaultPagePrefix) { this.defaultPagePrefix = defaultPagePrefix; } - + + /** + * Default suffix that can be used to indicate POJO "Action" classes. + * + * @param defaultPagePrefix the defaultPagePrefix to set + */ + @Inject(value=CLASS_SUFFIX, required=false) + public void setClassSuffix(String classSuffix) { + this.classSuffix = classSuffix; + } + /** * Whether to use a lowercase letter as the initial letter of an action. - * + * * @param force If false, actions will retain the initial uppercase letter from the Action class. * (<code>view.action</code> (true) versus <code>View.action</code> (false)). */ @@ -268,16 +313,16 @@ // Match Action implementations and classes ending with "Action" public boolean matches(Class type) { // TODO: should also find annotated classes - return (Action.class.isAssignableFrom(type) || + return ((checkImplementsAction && Action.class.isAssignableFrom(type)) || type.getSimpleName().endsWith(getClassSuffix()) || - type.getAnnotation(org.apache.struts2.config.Action.class) != null); + (checkAnnotation && type.getAnnotation(org.apache.struts2.config.Action.class) != null)); } }; } - + protected String getClassSuffix() { - return ACTION; + return classSuffix; } /** @@ -295,8 +340,8 @@ String actionPackage = cls.getPackage().getName(); String actionNamespace = null; String actionName = null; - - org.apache.struts2.config.Action actionAnn = + + org.apache.struts2.config.Action actionAnn = (org.apache.struts2.config.Action) cls.getAnnotation(org.apache.struts2.config.Action.class); if (actionAnn != null) { actionName = actionAnn.name(); @@ -312,7 +357,7 @@ LOG.debug("ClasspathPackageProvider: Processing class "+name); } name = name.substring(pkg.length() + 1); - + actionNamespace = ""; actionName = name; int pos = name.lastIndexOf('.'); @@ -360,6 +405,7 @@ } } + ResultTypeConfig defaultResultType = packageLoader.getDefaultResultType(pkgConfig); ActionConfig actionConfig = new ActionConfig.Builder(actionPackage, actionName, cls.getName()) .addResultConfigs(new ResultMap<String,ResultConfig>(cls, actionName, defaultResultType)) @@ -388,10 +434,10 @@ parent = loadPackageConfig(actionNamespace, actionPackage, null); actionNamespace = ns.value(); actionPackage = actionClass.getName(); - - // See if the namespace has been overridden by the @Action annotation + + // See if the namespace has been overridden by the @Action annotation } else { - org.apache.struts2.config.Action actionAnn = + org.apache.struts2.config.Action actionAnn = (org.apache.struts2.config.Action) actionClass.getAnnotation(org.apache.struts2.config.Action.class); if (actionAnn != null && !actionAnn.DEFAULT_NAMESPACE.equals(actionAnn.namespace())) { // we pass null as the namespace in case the parent package hasn't been loaded yet @@ -401,7 +447,7 @@ } } - + PackageConfig.Builder pkgConfig = packageLoader.getPackage(actionPackage); if (pkgConfig == null) { pkgConfig = new PackageConfig.Builder(actionPackage); @@ -429,7 +475,7 @@ } System.out.println("class:"+actionClass+" parent:"+parent+" current:"+(pkgConfig != null ? pkgConfig.getName() : "")); - + return pkgConfig; } Modified: struts/struts2/trunk/plugins/codebehind/src/main/resources/struts-plugin.xml URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/codebehind/src/main/resources/struts-plugin.xml?rev=663603&r1=663602&r2=663603&view=diff ============================================================================== --- struts/struts2/trunk/plugins/codebehind/src/main/resources/struts-plugin.xml (original) +++ struts/struts2/trunk/plugins/codebehind/src/main/resources/struts-plugin.xml Thu Jun 5 06:29:25 2008 @@ -34,5 +34,5 @@ <constant name="struts.mapper.alwaysSelectFullNamespace" value="true" /> <package name="codebehind-default" extends="struts-default"> - </package> + </package> </struts> Modified: struts/struts2/trunk/plugins/rest/pom.xml URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/rest/pom.xml?rev=663603&r1=663602&r2=663603&view=diff ============================================================================== --- struts/struts2/trunk/plugins/rest/pom.xml (original) +++ struts/struts2/trunk/plugins/rest/pom.xml Thu Jun 5 06:29:25 2008 @@ -35,11 +35,6 @@ <dependencies> <dependency> - <groupId>org.apache.struts</groupId> - <artifactId>struts2-codebehind-plugin</artifactId> - <version>${pom.version}</version> - </dependency> - <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream</artifactId> <version>1.2.2</version> Modified: struts/struts2/trunk/plugins/rest/src/main/resources/struts-plugin.xml URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/rest/src/main/resources/struts-plugin.xml?rev=663603&r1=663602&r2=663603&view=diff ============================================================================== --- struts/struts2/trunk/plugins/rest/src/main/resources/struts-plugin.xml (original) +++ struts/struts2/trunk/plugins/rest/src/main/resources/struts-plugin.xml Thu Jun 5 06:29:25 2008 @@ -24,13 +24,11 @@ <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> - + <struts> <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="rest" class="org.apache.struts2.rest.RestActionProxyFactory" /> <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="rest" class="org.apache.struts2.rest.RestActionMapper" /> - - <bean type="com.opensymphony.xwork2.config.PackageProvider" name="rest" class="org.apache.struts2.rest.ControllerClasspathPackageProvider" /> <bean class="org.apache.struts2.rest.ContentTypeHandlerManager" /> @@ -43,13 +41,14 @@ <constant name="struts.mapper.class" value="rest" /> <constant name="struts.mapper.idParameterName" value="id" /> <constant name="struts.action.extension" value="xhtml,,xml,json" /> - + <!-- Disable the scanning by the codebehind plugin to prevent duplicates --> - <constant name="struts.configuration.classpath.disableActionScanning" value="true" /> - - <constant name="struts.configuration.rest.disableControllerScanning" value="false" /> + <constant name="struts.codebehind.classSuffix" value="Controller"/> + <constant name="struts.codebehind.action.checkImplementsAction" value="false"/> + <constant name="struts.codebehind.action.checkAnnotation" value="false"/> + <constant name="struts.configuration.classpath.defaultParentPackage" value="rest-default" /> - + <package name="rest-default" extends="struts-default"> <result-types> <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"> @@ -108,7 +107,7 @@ <param name="excludeMethods">input,back,cancel,browse,index,show,edit,editNew</param> </interceptor-ref> </interceptor-stack> - + </interceptors> <default-interceptor-ref name="restDefaultStack"/>