Author: lukaszlenart Date: Wed Oct 23 12:36:22 2013 New Revision: 1535002 URL: http://svn.apache.org/r1535002 Log: WW-4232 Implements new DeprecationInterceptor and adds it to basicStack and defaultStack
Added: struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/DeprecationInterceptor.java Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/template/TemplateEngineManager.java struts/struts2/trunk/core/src/main/resources/struts-default.xml Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java?rev=1535002&r1=1535001&r2=1535002&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java Wed Oct 23 12:36:22 2013 @@ -277,4 +277,6 @@ public final class StrutsConstants { /** enables access to actions in other namespaces than current with action: prefix **/ public static final String STRUTS_MAPPER_ACTION_PREFIX_CROSSNAMESPACES = "struts.mapper.action.prefix.crossNamespaces"; + public static final String DEFAULT_TEMPLATE_TYPE_CONFIG_KEY = "struts.ui.templateSuffix"; + } Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/template/TemplateEngineManager.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/template/TemplateEngineManager.java?rev=1535002&r1=1535001&r2=1535002&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/template/TemplateEngineManager.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/template/TemplateEngineManager.java Wed Oct 23 12:36:22 2013 @@ -21,20 +21,20 @@ package org.apache.struts2.components.template; +import com.opensymphony.xwork2.config.ConfigurationException; +import com.opensymphony.xwork2.inject.Container; +import com.opensymphony.xwork2.inject.Inject; +import org.apache.struts2.StrutsConstants; + import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; -import com.opensymphony.xwork2.config.ConfigurationException; -import com.opensymphony.xwork2.inject.Container; -import com.opensymphony.xwork2.inject.Inject; - /** * The TemplateEngineManager will return a template engine for the template */ public class TemplateEngineManager { - public static final String DEFAULT_TEMPLATE_TYPE_CONFIG_KEY = "struts.ui.templateSuffix"; /** The default template extenstion is <code>ftl</code>. */ public static final String DEFAULT_TEMPLATE_TYPE = "ftl"; @@ -44,7 +44,7 @@ public class TemplateEngineManager { Container container; String defaultTemplateType; - @Inject(DEFAULT_TEMPLATE_TYPE_CONFIG_KEY) + @Inject(StrutsConstants.DEFAULT_TEMPLATE_TYPE_CONFIG_KEY) public void setDefaultTemplateType(String type) { this.defaultTemplateType = type; } Added: struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/DeprecationInterceptor.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/DeprecationInterceptor.java?rev=1535002&view=auto ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/DeprecationInterceptor.java (added) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/DeprecationInterceptor.java Wed Oct 23 12:36:22 2013 @@ -0,0 +1,105 @@ +package org.apache.struts2.interceptor; + +import com.opensymphony.xwork2.ActionInvocation; +import com.opensymphony.xwork2.XWorkConstants; +import com.opensymphony.xwork2.inject.Container; +import com.opensymphony.xwork2.inject.Inject; +import com.opensymphony.xwork2.interceptor.AbstractInterceptor; +import com.opensymphony.xwork2.util.logging.Logger; +import com.opensymphony.xwork2.util.logging.LoggerFactory; +import org.apache.struts2.StrutsConstants; + +import java.lang.reflect.Field; +import java.util.HashSet; +import java.util.Set; + +/** + * <!-- START SNIPPET: description --> + * In devMode checks if application uses deprecated or unknown constants and displays warning + * when logging level is set to DEBUG + * <!-- END SNIPPET: description --> + * + * <!-- START SNIPPET: parameters --> + * no special parameters yet + * <!-- END SNIPPET: parameters --> + */ +public class DeprecationInterceptor extends AbstractInterceptor { + + private static final Logger LOG = LoggerFactory.getLogger(DeprecationInterceptor.class); + + private Container container; + private boolean devMode; + + @Override + public String intercept(ActionInvocation invocation) throws Exception { + if (devMode) { + String message = validate(); + if (message != null) { + LOG.debug(message); + } + } + return invocation.invoke(); + } + + /** + * Validates constants. Validation goes on only if devMode is set. + * + * @throws Exception + */ + private String validate() throws Exception { + Set<String> constants = new HashSet<String>(); + + readConstants(constants, StrutsConstants.class); + readConstants(constants, XWorkConstants.class); + + Set<String> applicationConstants = container.getInstanceNames(String.class); + String message = null; + if (!constants.containsAll(applicationConstants)) { + Set<String> deprecated = new HashSet<String>(applicationConstants); + deprecated.removeAll(constants); + message = prepareMessage(deprecated); + } + return message; + } + + private void readConstants(Set<String> constants, Class clazz) throws IllegalAccessException { + for (Field field : clazz.getDeclaredFields()) { + if (String.class.equals(field.getType())) { + constants.add((String) field.get(clazz)); + } + } + } + + /** + * Prepares message to display + * + * @param deprecated A set with deprecated/unknown constants + */ + private String prepareMessage(Set<String> deprecated) { + StringBuilder sb = new StringBuilder("\n"); + sb.append("*******************************************************************************\n"); + sb.append("** **\n"); + sb.append("** WARNING **\n"); + sb.append("** YOU USE DEPRECATED / UNKNOWN CONSTANTS **\n"); + sb.append("** **\n"); + + for (String dep : deprecated) { + sb.append(String.format("** -> %-69s **\n", dep)); + } + + sb.append("*******************************************************************************\n"); + + return sb.toString(); + } + + @Inject(StrutsConstants.STRUTS_DEVMODE) + public void setDevMode(String state) { + this.devMode = "true".equals(state); + } + + @Inject + public void setContainer(Container container) { + this.container = container; + } + +} Modified: struts/struts2/trunk/core/src/main/resources/struts-default.xml URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/struts-default.xml?rev=1535002&r1=1535001&r2=1535002&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/resources/struts-default.xml (original) +++ struts/struts2/trunk/core/src/main/resources/struts-default.xml Wed Oct 23 12:36:22 2013 @@ -187,6 +187,7 @@ <interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor" /> <interceptor name="annotationWorkflow" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor" /> <interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor" /> + <interceptor name="deprecation" class="org.apache.struts2.interceptor.DeprecationInterceptor" /> <!-- Basic stack --> <interceptor-stack name="basicStack"> @@ -200,6 +201,7 @@ <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param> </interceptor-ref> <interceptor-ref name="conversionError"/> + <interceptor-ref name="deprecation"/> </interceptor-stack> <!-- Sample validation and workflow stack --> @@ -309,6 +311,7 @@ <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="debugging"/> + <interceptor-ref name="deprecation"/> </interceptor-stack> <!-- The completeStack is here for backwards compatibility for