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


Reply via email to