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; } }