Repository: struts Updated Branches: refs/heads/master b532ad06b -> 46b0ef632
WW-4516: Allow JSON plug-in to skip bean cache when devMode is enabled. Project: http://git-wip-us.apache.org/repos/asf/struts/repo Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/30df43f1 Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/30df43f1 Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/30df43f1 Branch: refs/heads/master Commit: 30df43f1fa01ecbbc021d47cadb3cd759bdba8f9 Parents: 356b5c5 Author: Naros <[email protected]> Authored: Sat Jun 20 13:19:29 2015 -0500 Committer: Naros <[email protected]> Committed: Sat Jun 20 13:19:29 2015 -0500 ---------------------------------------------------------------------- .../org/apache/struts2/json/JSONResult.java | 47 +++--- .../java/org/apache/struts2/json/JSONUtil.java | 145 +++++++++++++++++-- .../org/apache/struts2/json/JSONWriter.java | 5 + 3 files changed, 168 insertions(+), 29 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/struts/blob/30df43f1/plugins/json/src/main/java/org/apache/struts2/json/JSONResult.java ---------------------------------------------------------------------- diff --git a/plugins/json/src/main/java/org/apache/struts2/json/JSONResult.java b/plugins/json/src/main/java/org/apache/struts2/json/JSONResult.java index dfa0d6c..2da3210 100644 --- a/plugins/json/src/main/java/org/apache/struts2/json/JSONResult.java +++ b/plugins/json/src/main/java/org/apache/struts2/json/JSONResult.java @@ -20,12 +20,16 @@ */ package org.apache.struts2.json; -import com.opensymphony.xwork2.ActionContext; -import com.opensymphony.xwork2.ActionInvocation; -import com.opensymphony.xwork2.Result; -import com.opensymphony.xwork2.inject.Inject; -import com.opensymphony.xwork2.util.ValueStack; -import com.opensymphony.xwork2.util.WildcardUtil; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -33,13 +37,12 @@ import org.apache.struts2.StrutsConstants; import org.apache.struts2.StrutsStatics; import org.apache.struts2.json.smd.SMDGenerator; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.regex.Pattern; +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.ActionInvocation; +import com.opensymphony.xwork2.Result; +import com.opensymphony.xwork2.inject.Inject; +import com.opensymphony.xwork2.util.ValueStack; +import com.opensymphony.xwork2.util.WildcardUtil; /** * <!-- START SNIPPET: description --> <p/> This result serializes an action @@ -84,6 +87,7 @@ public class JSONResult implements Result { private boolean ignoreInterfaces = true; private boolean enumAsBean = JSONWriter.ENUM_AS_BEAN_DEFAULT; private boolean noCache = false; + private boolean cacheBeanInfo = true; private boolean excludeNullProperties = false; private String defaultDateFormat = null; private int statusCode; @@ -92,12 +96,18 @@ public class JSONResult implements Result { private String contentType; private String wrapPrefix; private String wrapSuffix; - + private boolean debugMode = false; + @Inject(StrutsConstants.STRUTS_I18N_ENCODING) public void setDefaultEncoding(String val) { this.defaultEncoding = val; } - + + @Inject(StrutsConstants.STRUTS_DEVMODE) + public void setDebugMode(String val) { + this.debugMode = BooleanUtils.toBoolean(val); + } + /** * Gets a list of regular expressions of properties to exclude from the JSON * output. @@ -171,7 +181,10 @@ public class JSONResult implements Result { ActionContext actionContext = invocation.getInvocationContext(); HttpServletRequest request = (HttpServletRequest) actionContext.get(StrutsStatics.HTTP_REQUEST); HttpServletResponse response = (HttpServletResponse) actionContext.get(StrutsStatics.HTTP_RESPONSE); - + + // only permit caching bean information when struts devMode = false + cacheBeanInfo = !debugMode; + try { Object rootObject; rootObject = readRootObject(invocation); @@ -202,7 +215,7 @@ public class JSONResult implements Result { protected String createJSONString(HttpServletRequest request, Object rootObject) throws JSONException { String json = JSONUtil.serialize(rootObject, excludeProperties, includeProperties, ignoreHierarchy, - enumAsBean, excludeNullProperties, defaultDateFormat); + enumAsBean, excludeNullProperties, defaultDateFormat, cacheBeanInfo); json = addCallbackIfApplicable(request, json); return json; } http://git-wip-us.apache.org/repos/asf/struts/blob/30df43f1/plugins/json/src/main/java/org/apache/struts2/json/JSONUtil.java ---------------------------------------------------------------------- diff --git a/plugins/json/src/main/java/org/apache/struts2/json/JSONUtil.java b/plugins/json/src/main/java/org/apache/struts2/json/JSONUtil.java index 0ee024e..bde7298 100644 --- a/plugins/json/src/main/java/org/apache/struts2/json/JSONUtil.java +++ b/plugins/json/src/main/java/org/apache/struts2/json/JSONUtil.java @@ -20,20 +20,34 @@ */ package org.apache.struts2.json; -import com.opensymphony.xwork2.util.TextParseUtil; -import com.opensymphony.xwork2.util.WildcardUtil; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.io.Reader; +import java.io.Writer; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Pattern; +import java.util.zip.GZIPOutputStream; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.struts2.json.annotations.SMDMethod; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.*; -import java.lang.reflect.Method; -import java.util.*; -import java.util.regex.Pattern; -import java.util.zip.GZIPOutputStream; +import com.opensymphony.xwork2.util.TextParseUtil; +import com.opensymphony.xwork2.util.WildcardUtil; /** * Wrapper for JSONWriter with some utility methods. @@ -43,7 +57,8 @@ public class JSONUtil { public final static String RFC3339_FORMAT = "yyyy-MM-dd'T'HH:mm:ss"; private static final Logger LOG = LogManager.getLogger(JSONUtil.class); - + private static final boolean CACHE_BEAN_INFO_DEFAULT = true; + /** * Serializes an object into JSON. * @@ -53,7 +68,22 @@ public class JSONUtil { * @throws JSONException */ public static String serialize(Object object) throws JSONException { + return serialize(object, CACHE_BEAN_INFO_DEFAULT); + } + + /** + * Serializes an object into JSON. + * + * @param object + * to be serialized + * @param cacheBeanInfo + * Specifies whether to cache bean info in the JSONWriter + * @return JSON string + * @throws JSONException + */ + public static String serialize(Object object, boolean cacheBeanInfo) throws JSONException { JSONWriter writer = new JSONWriter(); + writer.setCacheBeanInfo(cacheBeanInfo); return writer.write(object); } @@ -74,8 +104,33 @@ public class JSONUtil { public static String serialize(Object object, Collection<Pattern> excludeProperties, Collection<Pattern> includeProperties, boolean ignoreHierarchy, boolean excludeNullProperties) throws JSONException { + return serialize(object, excludeProperties, includeProperties, + ignoreHierarchy, excludeNullProperties, CACHE_BEAN_INFO_DEFAULT); + } + + /** + * Serializes an object into JSON, excluding any properties matching any of + * the regular expressions in the given collection. + * + * @param object + * to be serialized + * @param excludeProperties + * Patterns matching properties to exclude + * @param ignoreHierarchy + * whether to ignore properties defined on base classes of the + * root object + * @param cacheBeanInfo + * Specifies whether to cache bean info in the JSONWriter + * @return JSON string + * @throws JSONException + */ + public static String serialize(Object object, Collection<Pattern> excludeProperties, + Collection<Pattern> includeProperties, boolean ignoreHierarchy, boolean excludeNullProperties, + boolean cacheBeanInfo) + throws JSONException { JSONWriter writer = new JSONWriter(); writer.setIgnoreHierarchy(ignoreHierarchy); + writer.setCacheBeanInfo(cacheBeanInfo); return writer.write(object, excludeProperties, includeProperties, excludeNullProperties); } @@ -100,10 +155,38 @@ public class JSONUtil { public static String serialize(Object object, Collection<Pattern> excludeProperties, Collection<Pattern> includeProperties, boolean ignoreHierarchy, boolean enumAsBean, boolean excludeNullProperties, String defaultDateFormat) throws JSONException { + return serialize(object, excludeProperties, includeProperties, ignoreHierarchy, enumAsBean, + excludeNullProperties, defaultDateFormat, CACHE_BEAN_INFO_DEFAULT); + } + + /** + * Serializes an object into JSON, excluding any properties matching any of + * the regular expressions in the given collection. + * + * @param object + * to be serialized + * @param excludeProperties + * Patterns matching properties to exclude + * @param ignoreHierarchy + * whether to ignore properties defined on base classes of the + * root object + * @param enumAsBean + * whether to serialized enums a Bean or name=value pair + * @param defaultDateFormat + * date format used to serialize dates + * @param cacheBeanInfo + * Specifies whether to cache bean info in the JSONWriter + * @return JSON string + * @throws JSONException + */ + public static String serialize(Object object, Collection<Pattern> excludeProperties, + Collection<Pattern> includeProperties, boolean ignoreHierarchy, boolean enumAsBean, + boolean excludeNullProperties, String defaultDateFormat, boolean cacheBeanInfo) throws JSONException { JSONWriter writer = new JSONWriter(); writer.setIgnoreHierarchy(ignoreHierarchy); writer.setEnumAsBean(enumAsBean); writer.setDateFormatter(defaultDateFormat); + writer.setCacheBeanInfo(cacheBeanInfo); return writer.write(object, excludeProperties, includeProperties, excludeNullProperties); } @@ -118,7 +201,23 @@ public class JSONUtil { * @throws JSONException */ public static void serialize(Writer writer, Object object) throws IOException, JSONException { - writer.write(serialize(object)); + serialize(writer, object, CACHE_BEAN_INFO_DEFAULT); + } + + /** + * Serializes an object into JSON to the given writer. + * + * @param writer + * Writer to serialize the object to + * @param object + * object to be serialized + * @param cacheBeanInfo + * Specifies whether to cache bean info in the JSONWriter + * @throws IOException + * @throws JSONException + */ + public static void serialize(Writer writer, Object object, boolean cacheBeanInfo) throws IOException, JSONException { + writer.write(serialize(object, cacheBeanInfo)); } /** @@ -138,7 +237,29 @@ public class JSONUtil { public static void serialize(Writer writer, Object object, Collection<Pattern> excludeProperties, Collection<Pattern> includeProperties, boolean excludeNullProperties) throws IOException, JSONException { - writer.write(serialize(object, excludeProperties, includeProperties, true, excludeNullProperties)); + serialize(writer, object, excludeProperties, includeProperties, excludeNullProperties, CACHE_BEAN_INFO_DEFAULT); + } + + /** + * Serializes an object into JSON to the given writer, excluding any + * properties matching any of the regular expressions in the given + * collection. + * + * @param writer + * Writer to serialize the object to + * @param object + * object to be serialized + * @param excludeProperties + * Patterns matching properties to ignore + * @param cacheBeanInfo + * Specifies whether to cache bean info in the JSONWriter + * @throws IOException + * @throws JSONException + */ + public static void serialize(Writer writer, Object object, Collection<Pattern> excludeProperties, + Collection<Pattern> includeProperties, boolean excludeNullProperties, boolean cacheBeanInfo) + throws IOException, JSONException { + writer.write(serialize(object, excludeProperties, includeProperties, true, excludeNullProperties, cacheBeanInfo)); } /** http://git-wip-us.apache.org/repos/asf/struts/blob/30df43f1/plugins/json/src/main/java/org/apache/struts2/json/JSONWriter.java ---------------------------------------------------------------------- diff --git a/plugins/json/src/main/java/org/apache/struts2/json/JSONWriter.java b/plugins/json/src/main/java/org/apache/struts2/json/JSONWriter.java index 1545084..c3b8889 100644 --- a/plugins/json/src/main/java/org/apache/struts2/json/JSONWriter.java +++ b/plugins/json/src/main/java/org/apache/struts2/json/JSONWriter.java @@ -74,6 +74,7 @@ public class JSONWriter { private DateFormat formatter; private boolean enumAsBean = ENUM_AS_BEAN_DEFAULT; private boolean excludeNullProperties; + private boolean cacheBeanInfo = true; /** * @param object Object to be serialized into JSON @@ -620,6 +621,10 @@ public class JSONWriter { this.formatter = new SimpleDateFormat(defaultDateFormat); } } + + public void setCacheBeanInfo(boolean cacheBeanInfo) { + this.cacheBeanInfo = cacheBeanInfo; + } protected static class JSONAnnotationFinder { private boolean serialize = true;
