You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by mu...@apache.org on 2009/07/30 00:44:29 UTC
svn commit: r799110 [1/7] - in /struts/sandbox/trunk/struts2-json-plugin: ./
src/main/java/org/apache/struts2/json/
src/main/java/org/apache/struts2/json/annotations/
src/main/java/org/apache/struts2/json/rpc/
src/main/java/org/apache/struts2/json/smd/...
Author: musachy
Date: Wed Jul 29 22:44:26 2009
New Revision: 799110
URL: http://svn.apache.org/viewvc?rev=799110&view=rev
Log:
add license headers and svn keywords
Modified:
struts/sandbox/trunk/struts2-json-plugin/ (props changed)
struts/sandbox/trunk/struts2-json-plugin/pom.xml (props changed)
struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONCleaner.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONException.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONInterceptor.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONPopulator.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONReader.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONResult.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONUtil.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONWriter.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/SerializationParams.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/annotations/JSON.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/annotations/SMD.java (props changed)
struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/annotations/SMDMethod.java (props changed)
struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/annotations/SMDMethodParameter.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/rpc/RPCError.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/rpc/RPCErrorCode.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/rpc/RPCResponse.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/smd/SMD.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/smd/SMDMethod.java (props changed)
struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/smd/SMDMethodParameter.java (props changed)
struts/sandbox/trunk/struts2-json-plugin/src/main/resources/JsonPlugin.tld (props changed)
struts/sandbox/trunk/struts2-json-plugin/src/main/resources/struts-plugin.xml (props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/java/org/apache/struts2/json/AnEnum.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/java/org/apache/struts2/json/AnEnumBean.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/java/org/apache/struts2/json/Bean.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/java/org/apache/struts2/json/JSONEnumTest.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/java/org/apache/struts2/json/JSONInterceptorTest.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/java/org/apache/struts2/json/JSONPopulatorTest.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/java/org/apache/struts2/json/JSONResultTest.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/java/org/apache/struts2/json/JSONUtilTest.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/java/org/apache/struts2/json/OtherBean.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/java/org/apache/struts2/json/SMDActionTest1.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/java/org/apache/struts2/json/SMDActionTest2.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/java/org/apache/struts2/json/SMDMethodInterfaceTest.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/java/org/apache/struts2/json/SimpleValue.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/java/org/apache/struts2/json/TestAction.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/java/org/apache/struts2/json/TestAction2.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/java/org/apache/struts2/json/TestAction3.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/java/org/apache/struts2/json/TestAction4.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/java/org/apache/struts2/json/TestUtils.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/java/org/apache/struts2/json/WrapperClassBean.java (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/bad-1.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/bad-2.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/bad-3.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/bad-4.txt (props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/bad-5.txt (props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/bad-to-the-bone.txt (props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/json-1.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/json-10.txt (props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/json-2-enum.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/json-2.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/json-3.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/json-4.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/json-5.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/json-6.txt (props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/json-7.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/json-8.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/json-9.txt (props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/json.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/jsonp-1.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/nulls-1.txt (props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/prefix-1.txt (props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/smd-1.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/smd-10.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/smd-11.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/smd-12.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/smd-13.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/smd-14.txt (props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/smd-15.txt (props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/smd-2.txt (props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/smd-3.txt (props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/smd-4.txt (props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/smd-5.txt (props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/smd-6.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/smd-7.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/smd-8.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/smd-9.txt (contents, props changed)
struts/sandbox/trunk/struts2-json-plugin/src/test/resources/org/apache/struts2/json/smd.txt (props changed)
Propchange: struts/sandbox/trunk/struts2-json-plugin/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Wed Jul 29 22:44:26 2009
@@ -0,0 +1 @@
+target
Propchange: struts/sandbox/trunk/struts2-json-plugin/pom.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: struts/sandbox/trunk/struts2-json-plugin/pom.xml
------------------------------------------------------------------------------
svn:keywords = Id
Modified: struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONCleaner.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONCleaner.java?rev=799110&r1=799109&r2=799110&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONCleaner.java (original)
+++ struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONCleaner.java Wed Jul 29 22:44:26 2009
@@ -1,44 +1,64 @@
-package org.apache.struts2.json;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Isolate the process of cleaning JSON data from the Interceptor class itself.
- */
-public abstract class JSONCleaner {
-
- public Object clean(String ognlPrefix, Object data) throws JSONException {
- if (data == null)
- return null;
- else if (data instanceof List)
- return cleanList(ognlPrefix, data);
- else if (data instanceof Map)
- return cleanMap(ognlPrefix, data);
- else
- return cleanValue(ognlPrefix, data);
- }
-
- protected Object cleanList(String ognlPrefix, Object data) throws JSONException {
- List list = (List) data;
- int count = list.size();
- for (int i = 0; i < count; i++) {
- list.set(i, clean(ognlPrefix + "[" + i + "]", list.get(i)));
- }
- return list;
- }
-
- protected Object cleanMap(String ognlPrefix, Object data) throws JSONException {
- Map map = (Map) data;
- Iterator iter = map.entrySet().iterator();
- while (iter.hasNext()) {
- Map.Entry e = (Map.Entry) iter.next();
- e.setValue(clean((ognlPrefix.length() > 0 ? ognlPrefix + "." : "") + e.getKey(), e.getValue()));
- }
- return map;
- }
-
- protected abstract Object cleanValue(String ognlName, Object data) throws JSONException;
-
-}
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.struts2.json;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Isolate the process of cleaning JSON data from the Interceptor class itself.
+ */
+public abstract class JSONCleaner {
+
+ public Object clean(String ognlPrefix, Object data) throws JSONException {
+ if (data == null)
+ return null;
+ else if (data instanceof List)
+ return cleanList(ognlPrefix, data);
+ else if (data instanceof Map)
+ return cleanMap(ognlPrefix, data);
+ else
+ return cleanValue(ognlPrefix, data);
+ }
+
+ protected Object cleanList(String ognlPrefix, Object data) throws JSONException {
+ List list = (List) data;
+ int count = list.size();
+ for (int i = 0; i < count; i++) {
+ list.set(i, clean(ognlPrefix + "[" + i + "]", list.get(i)));
+ }
+ return list;
+ }
+
+ protected Object cleanMap(String ognlPrefix, Object data) throws JSONException {
+ Map map = (Map) data;
+ Iterator iter = map.entrySet().iterator();
+ while (iter.hasNext()) {
+ Map.Entry e = (Map.Entry) iter.next();
+ e.setValue(clean((ognlPrefix.length() > 0 ? ognlPrefix + "." : "") + e.getKey(), e.getValue()));
+ }
+ return map;
+ }
+
+ protected abstract Object cleanValue(String ognlName, Object data) throws JSONException;
+
+}
Propchange: struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONCleaner.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONCleaner.java
------------------------------------------------------------------------------
svn:keywords = Id
Modified: struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONException.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONException.java?rev=799110&r1=799109&r2=799110&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONException.java (original)
+++ struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONException.java Wed Jul 29 22:44:26 2009
@@ -1,38 +1,38 @@
-/*
- * $Id$
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.struts2.json;
-
-/**
- * Wrap exceptions throwed by the JSON serializer
- */
-public class JSONException extends Exception {
- public JSONException(String message) {
- super(message);
- }
-
- public JSONException(Throwable cause) {
- super(cause);
- }
-
- public JSONException(String message, Throwable cause) {
- super(message, cause);
- }
-}
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.struts2.json;
+
+/**
+ * Wrap exceptions throwed by the JSON serializer
+ */
+public class JSONException extends Exception {
+ public JSONException(String message) {
+ super(message);
+ }
+
+ public JSONException(Throwable cause) {
+ super(cause);
+ }
+
+ public JSONException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
Propchange: struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONException.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONException.java
------------------------------------------------------------------------------
svn:keywords = Id
Modified: struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONInterceptor.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONInterceptor.java?rev=799110&r1=799109&r2=799110&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONInterceptor.java (original)
+++ struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONInterceptor.java Wed Jul 29 22:44:26 2009
@@ -1,460 +1,480 @@
-package org.apache.struts2.json;
-
-import java.beans.IntrospectionException;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.struts2.ServletActionContext;
-import org.apache.struts2.StrutsConstants;
-import org.apache.struts2.json.annotations.SMDMethod;
-import org.apache.struts2.json.rpc.RPCError;
-import org.apache.struts2.json.rpc.RPCErrorCode;
-import org.apache.struts2.json.rpc.RPCResponse;
-
-import com.opensymphony.xwork2.Action;
-import com.opensymphony.xwork2.ActionInvocation;
-import com.opensymphony.xwork2.inject.Inject;
-import com.opensymphony.xwork2.interceptor.Interceptor;
-import com.opensymphony.xwork2.util.ValueStack;
-import com.opensymphony.xwork2.util.logging.Logger;
-import com.opensymphony.xwork2.util.logging.LoggerFactory;
-
-/**
- * Populates an action from a JSON string
- */
-public class JSONInterceptor implements Interceptor {
- private static final long serialVersionUID = 4950170304212158803L;
- private static final Logger LOG = LoggerFactory.getLogger(JSONInterceptor.class);
- private boolean enableSMD = false;
- private boolean enableGZIP = false;
- private boolean wrapWithComments;
- private boolean prefix;
- private String defaultEncoding = "ISO-8859-1";
- private boolean ignoreHierarchy = true;
- private String root;
- private List<Pattern> excludeProperties;
- private List<Pattern> includeProperties;
- private boolean ignoreSMDMethodInterfaces = true;
- private JSONPopulator populator = new JSONPopulator();
- private JSONCleaner dataCleaner = null;
- private boolean debug = false;
- private boolean noCache = false;
- private boolean excludeNullProperties;
- private String callbackParameter;
- private String contentType;
-
- public void destroy() {
- }
-
- public void init() {
- }
-
- @SuppressWarnings("unchecked")
- public String intercept(ActionInvocation invocation) throws Exception {
- HttpServletRequest request = ServletActionContext.getRequest();
- HttpServletResponse response = ServletActionContext.getResponse();
- String contentType = request.getHeader("content-type");
- if (contentType != null) {
- int iSemicolonIdx;
- if ((iSemicolonIdx = contentType.indexOf(";")) != -1)
- contentType = contentType.substring(0, iSemicolonIdx);
- }
-
- Object rootObject;
- if (this.root != null) {
- ValueStack stack = invocation.getStack();
- rootObject = stack.findValue(this.root);
-
- if (rootObject == null) {
- throw new RuntimeException("Invalid root expression: '" + this.root + "'.");
- }
- } else {
- rootObject = invocation.getAction();
- }
-
- if ((contentType != null) && contentType.equalsIgnoreCase("application/json")) {
- // load JSON object
- Object obj = JSONUtil.deserialize(request.getReader());
-
- if (obj instanceof Map) {
- Map json = (Map) obj;
-
- // clean up the values
- if (dataCleaner != null)
- dataCleaner.clean("", json);
-
- // populate fields
- populator.populateObject(rootObject, json);
- } else {
- LOG.error("Unable to deserialize JSON object from request");
- throw new JSONException("Unable to deserialize JSON object from request");
- }
- } else if ((contentType != null) && contentType.equalsIgnoreCase("application/json-rpc")) {
- Object result;
- if (this.enableSMD) {
- // load JSON object
- Object obj = JSONUtil.deserialize(request.getReader());
-
- if (obj instanceof Map) {
- Map smd = (Map) obj;
-
- // invoke method
- try {
- result = this.invoke(rootObject, smd);
- } catch (Exception e) {
- RPCResponse rpcResponse = new RPCResponse();
- rpcResponse.setId(smd.get("id").toString());
- rpcResponse.setError(new RPCError(e, RPCErrorCode.EXCEPTION, debug));
-
- result = rpcResponse;
- }
- } else {
- String message = "SMD request was not in the right format. See http://json-rpc.org";
-
- RPCResponse rpcResponse = new RPCResponse();
- rpcResponse.setError(new RPCError(message, RPCErrorCode.INVALID_PROCEDURE_CALL));
- result = rpcResponse;
- }
-
- String json = JSONUtil.serialize(result, excludeProperties, includeProperties,
- ignoreHierarchy, excludeNullProperties);
- json = addCallbackIfApplicable(request, json);
- JSONUtil.writeJSONToResponse(new SerializationParams(response, this.defaultEncoding,
- this.wrapWithComments, json, true, false, noCache, -1, -1, prefix, contentType));
-
- return Action.NONE;
- } else {
- String message = "Request with content type of 'application/json-rpc' was received but SMD is "
- + "not enabled for this interceptor. Set 'enableSMD' to true to enable it";
-
- RPCResponse rpcResponse = new RPCResponse();
- rpcResponse.setError(new RPCError(message, RPCErrorCode.SMD_DISABLED));
- result = rpcResponse;
- }
-
- String json = JSONUtil.serialize(result, excludeProperties, includeProperties, ignoreHierarchy,
- excludeNullProperties);
- json = addCallbackIfApplicable(request, json);
- boolean writeGzip = enableGZIP && JSONUtil.isGzipInRequest(request);
- JSONUtil.writeJSONToResponse(new SerializationParams(response, this.defaultEncoding,
- this.wrapWithComments, json, true, writeGzip, noCache, -1, -1, prefix, contentType));
-
- return Action.NONE;
- } else {
- if (LOG.isDebugEnabled()) {
- LOG
- .debug("Content type must be 'application/json' or 'application/json-rpc'. Ignoring request with content type "
- + contentType);
- }
- }
-
- return invocation.invoke();
- }
-
- @SuppressWarnings("unchecked")
- public RPCResponse invoke(Object object, Map data) throws IllegalArgumentException,
- IllegalAccessException, InvocationTargetException, JSONException, InstantiationException,
- NoSuchMethodException, IntrospectionException {
-
- RPCResponse response = new RPCResponse();
-
- // validate id
- Object id = data.get("id");
- if (id == null) {
- String message = "'id' is required for JSON RPC";
- response.setError(new RPCError(message, RPCErrorCode.METHOD_NOT_FOUND));
- return response;
- }
- // could be a numeric value
- response.setId(id.toString());
-
- // the map is going to have: 'params', 'method' and 'id' (what is the id
- // for?)
- Class clazz = object.getClass();
-
- // parameters
- List parameters = (List) data.get("params");
- int parameterCount = parameters != null ? parameters.size() : 0;
-
- // method
- String methodName = (String) data.get("method");
- if (methodName == null) {
- String message = "'method' is required for JSON RPC";
- response.setError(new RPCError(message, RPCErrorCode.MISSING_METHOD));
- return response;
- }
-
- Method method = this.getMethod(clazz, methodName, parameterCount);
- if (method == null) {
- String message = "Method " + methodName + " could not be found in action class.";
- response.setError(new RPCError(message, RPCErrorCode.METHOD_NOT_FOUND));
- return response;
- }
-
- // parameters
- if (parameterCount > 0) {
- Class[] parameterTypes = method.getParameterTypes();
- Type[] genericTypes = method.getGenericParameterTypes();
- List invocationParameters = new ArrayList();
-
- // validate size
- if (parameterTypes.length != parameterCount) {
- // size mismatch
- String message = "Parameter count in request, " + parameterCount
- + " do not match expected parameter count for " + methodName + ", "
- + parameterTypes.length;
-
- response.setError(new RPCError(message, RPCErrorCode.PARAMETERS_MISMATCH));
- return response;
- }
-
- // convert parameters
- for (int i = 0; i < parameters.size(); i++) {
- Object parameter = parameters.get(i);
- Class paramType = parameterTypes[i];
- Type genericType = genericTypes[i];
-
- // clean up the values
- if (dataCleaner != null)
- parameter = dataCleaner.clean("[" + i + "]", parameter);
-
- Object converted = populator.convert(paramType, genericType, parameter, method);
- invocationParameters.add(converted);
- }
-
- response.setResult(method.invoke(object, invocationParameters.toArray()));
- } else {
- response.setResult(method.invoke(object, new Object[0]));
- }
-
- return response;
- }
-
- @SuppressWarnings("unchecked")
- private Method getMethod(Class clazz, String name, int parameterCount) {
- Method[] smdMethods = JSONUtil.listSMDMethods(clazz, ignoreSMDMethodInterfaces);
-
- for (Method method : smdMethods) {
- if (checkSMDMethodSignature(method, name, parameterCount)) {
- return method;
- }
- }
- return null;
- }
-
- /**
- * Look for a method in clazz carrying the SMDMethod annotation with
- * matching name and parametersCount
- *
- * @return true if matches name and parameterCount
- */
- private boolean checkSMDMethodSignature(Method method, String name, int parameterCount) {
-
- SMDMethod smdMethodAnntotation = method.getAnnotation(SMDMethod.class);
- if (smdMethodAnntotation != null) {
- String alias = smdMethodAnntotation.name();
- boolean paramsMatch = method.getParameterTypes().length == parameterCount;
- if (((alias.length() == 0) && method.getName().equals(name) && paramsMatch)
- || (alias.equals(name) && paramsMatch)) {
- return true;
- }
- }
-
- return false;
- }
-
- protected String addCallbackIfApplicable(HttpServletRequest request, String json) {
- if ((callbackParameter != null) && (callbackParameter.length() > 0)) {
- String callbackName = request.getParameter(callbackParameter);
- if ((callbackName != null) && (callbackName.length() > 0))
- json = callbackName + "(" + json + ")";
- }
- return json;
- }
-
- public boolean isEnableSMD() {
- return this.enableSMD;
- }
-
- public void setEnableSMD(boolean enableSMD) {
- this.enableSMD = enableSMD;
- }
-
- /**
- * Ignore annotations on methods in interfaces You may need to set to this
- * true if your action is a proxy/enhanced as annotations are not inherited
- */
- public void setIgnoreSMDMethodInterfaces(boolean ignoreSMDMethodInterfaces) {
- this.ignoreSMDMethodInterfaces = ignoreSMDMethodInterfaces;
- }
-
- /**
- * Wrap generated JSON with comments. Only used if SMD is enabled.
- *
- * @param wrapWithComments
- */
- public void setWrapWithComments(boolean wrapWithComments) {
- this.wrapWithComments = wrapWithComments;
- }
-
- @Inject(StrutsConstants.STRUTS_I18N_ENCODING)
- public void setDefaultEncoding(String val) {
- this.defaultEncoding = val;
- }
-
- /**
- * Ignore properties defined on base classes of the root object.
- *
- * @param ignoreHierarchy
- */
- public void setIgnoreHierarchy(boolean ignoreHierarchy) {
- this.ignoreHierarchy = ignoreHierarchy;
- }
-
- /**
- * Sets the root object to be deserialized, defaults to the Action
- *
- * @param root
- * OGNL expression of root object to be serialized
- */
- public void setRoot(String root) {
- this.root = root;
- }
-
- /**
- * Sets the JSONPopulator to be used
- *
- * @param populator
- * JSONPopulator
- */
- public void setJSONPopulator(JSONPopulator populator) {
- this.populator = populator;
- }
-
- /**
- * Sets the JSONCleaner to be used
- *
- * @param dataCleaner
- * JSONCleaner
- */
- public void setJSONCleaner(JSONCleaner dataCleaner) {
- this.dataCleaner = dataCleaner;
- }
-
- /**
- * Turns debugging on or off
- *
- * @param debug
- * true or false
- */
- public boolean getDebug() {
- return this.debug;
- }
-
- public void setDebug(boolean debug) {
- this.debug = debug;
- }
-
- /**
- * Sets a comma-delimited list of regular expressions to match properties
- * that should be excluded from the JSON output.
- *
- * @param commaDelim
- * A comma-delimited list of regular expressions
- */
- public void setExcludeProperties(String commaDelim) {
- List<String> excludePatterns = JSONUtil.asList(commaDelim);
- if (excludePatterns != null) {
- this.excludeProperties = new ArrayList<Pattern>(excludePatterns.size());
- for (String pattern : excludePatterns) {
- this.excludeProperties.add(Pattern.compile(pattern));
- }
- }
- }
-
- /**
- * Sets a comma-delimited list of regular expressions to match properties
- * that should be included from the JSON output.
- *
- * @param commaDelim
- * A comma-delimited list of regular expressions
- */
- public void setIncludeProperties(String commaDelim) {
- List<String> includePatterns = JSONUtil.asList(commaDelim);
- if (includePatterns != null) {
- this.includeProperties = new ArrayList<Pattern>(includePatterns.size());
- for (String pattern : includePatterns) {
- this.includeProperties.add(Pattern.compile(pattern));
- }
- }
- }
-
- public boolean isEnableGZIP() {
- return enableGZIP;
- }
-
- /**
- * Setting this property to "true" will compress the output.
- *
- * @param enableGZIP
- * Enable compressed output
- */
- public void setEnableGZIP(boolean enableGZIP) {
- this.enableGZIP = enableGZIP;
- }
-
- public boolean isNoCache() {
- return noCache;
- }
-
- /**
- * Add headers to response to prevent the browser from caching the response
- *
- * @param noCache
- */
- public void setNoCache(boolean noCache) {
- this.noCache = noCache;
- }
-
- public boolean isExcludeNullProperties() {
- return excludeNullProperties;
- }
-
- /**
- * Do not serialize properties with a null value
- *
- * @param excludeNullProperties
- */
- public void setExcludeNullProperties(boolean excludeNullProperties) {
- this.excludeNullProperties = excludeNullProperties;
- }
-
- public void setCallbackParameter(String callbackParameter) {
- this.callbackParameter = callbackParameter;
- }
-
- public String getCallbackParameter() {
- return callbackParameter;
- }
-
- /**
- * Add "{} && " to generated JSON
- *
- * @param prefix
- */
- public void setPrefix(boolean prefix) {
- this.prefix = prefix;
- }
-
- public void setContentType(String contentType) {
- this.contentType = contentType;
- }
-}
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.struts2.json;
+
+import java.beans.IntrospectionException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts2.ServletActionContext;
+import org.apache.struts2.StrutsConstants;
+import org.apache.struts2.json.annotations.SMDMethod;
+import org.apache.struts2.json.rpc.RPCError;
+import org.apache.struts2.json.rpc.RPCErrorCode;
+import org.apache.struts2.json.rpc.RPCResponse;
+
+import com.opensymphony.xwork2.Action;
+import com.opensymphony.xwork2.ActionInvocation;
+import com.opensymphony.xwork2.inject.Inject;
+import com.opensymphony.xwork2.interceptor.Interceptor;
+import com.opensymphony.xwork2.util.ValueStack;
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
+
+/**
+ * Populates an action from a JSON string
+ */
+public class JSONInterceptor implements Interceptor {
+ private static final long serialVersionUID = 4950170304212158803L;
+ private static final Logger LOG = LoggerFactory.getLogger(JSONInterceptor.class);
+ private boolean enableSMD = false;
+ private boolean enableGZIP = false;
+ private boolean wrapWithComments;
+ private boolean prefix;
+ private String defaultEncoding = "ISO-8859-1";
+ private boolean ignoreHierarchy = true;
+ private String root;
+ private List<Pattern> excludeProperties;
+ private List<Pattern> includeProperties;
+ private boolean ignoreSMDMethodInterfaces = true;
+ private JSONPopulator populator = new JSONPopulator();
+ private JSONCleaner dataCleaner = null;
+ private boolean debug = false;
+ private boolean noCache = false;
+ private boolean excludeNullProperties;
+ private String callbackParameter;
+ private String contentType;
+
+ public void destroy() {
+ }
+
+ public void init() {
+ }
+
+ @SuppressWarnings("unchecked")
+ public String intercept(ActionInvocation invocation) throws Exception {
+ HttpServletRequest request = ServletActionContext.getRequest();
+ HttpServletResponse response = ServletActionContext.getResponse();
+ String contentType = request.getHeader("content-type");
+ if (contentType != null) {
+ int iSemicolonIdx;
+ if ((iSemicolonIdx = contentType.indexOf(";")) != -1)
+ contentType = contentType.substring(0, iSemicolonIdx);
+ }
+
+ Object rootObject;
+ if (this.root != null) {
+ ValueStack stack = invocation.getStack();
+ rootObject = stack.findValue(this.root);
+
+ if (rootObject == null) {
+ throw new RuntimeException("Invalid root expression: '" + this.root + "'.");
+ }
+ } else {
+ rootObject = invocation.getAction();
+ }
+
+ if ((contentType != null) && contentType.equalsIgnoreCase("application/json")) {
+ // load JSON object
+ Object obj = JSONUtil.deserialize(request.getReader());
+
+ if (obj instanceof Map) {
+ Map json = (Map) obj;
+
+ // clean up the values
+ if (dataCleaner != null)
+ dataCleaner.clean("", json);
+
+ // populate fields
+ populator.populateObject(rootObject, json);
+ } else {
+ LOG.error("Unable to deserialize JSON object from request");
+ throw new JSONException("Unable to deserialize JSON object from request");
+ }
+ } else if ((contentType != null) && contentType.equalsIgnoreCase("application/json-rpc")) {
+ Object result;
+ if (this.enableSMD) {
+ // load JSON object
+ Object obj = JSONUtil.deserialize(request.getReader());
+
+ if (obj instanceof Map) {
+ Map smd = (Map) obj;
+
+ // invoke method
+ try {
+ result = this.invoke(rootObject, smd);
+ } catch (Exception e) {
+ RPCResponse rpcResponse = new RPCResponse();
+ rpcResponse.setId(smd.get("id").toString());
+ rpcResponse.setError(new RPCError(e, RPCErrorCode.EXCEPTION, debug));
+
+ result = rpcResponse;
+ }
+ } else {
+ String message = "SMD request was not in the right format. See http://json-rpc.org";
+
+ RPCResponse rpcResponse = new RPCResponse();
+ rpcResponse.setError(new RPCError(message, RPCErrorCode.INVALID_PROCEDURE_CALL));
+ result = rpcResponse;
+ }
+
+ String json = JSONUtil.serialize(result, excludeProperties, includeProperties,
+ ignoreHierarchy, excludeNullProperties);
+ json = addCallbackIfApplicable(request, json);
+ JSONUtil.writeJSONToResponse(new SerializationParams(response, this.defaultEncoding,
+ this.wrapWithComments, json, true, false, noCache, -1, -1, prefix, contentType));
+
+ return Action.NONE;
+ } else {
+ String message = "Request with content type of 'application/json-rpc' was received but SMD is "
+ + "not enabled for this interceptor. Set 'enableSMD' to true to enable it";
+
+ RPCResponse rpcResponse = new RPCResponse();
+ rpcResponse.setError(new RPCError(message, RPCErrorCode.SMD_DISABLED));
+ result = rpcResponse;
+ }
+
+ String json = JSONUtil.serialize(result, excludeProperties, includeProperties, ignoreHierarchy,
+ excludeNullProperties);
+ json = addCallbackIfApplicable(request, json);
+ boolean writeGzip = enableGZIP && JSONUtil.isGzipInRequest(request);
+ JSONUtil.writeJSONToResponse(new SerializationParams(response, this.defaultEncoding,
+ this.wrapWithComments, json, true, writeGzip, noCache, -1, -1, prefix, contentType));
+
+ return Action.NONE;
+ } else {
+ if (LOG.isDebugEnabled()) {
+ LOG
+ .debug("Content type must be 'application/json' or 'application/json-rpc'. Ignoring request with content type "
+ + contentType);
+ }
+ }
+
+ return invocation.invoke();
+ }
+
+ @SuppressWarnings("unchecked")
+ public RPCResponse invoke(Object object, Map data) throws IllegalArgumentException,
+ IllegalAccessException, InvocationTargetException, JSONException, InstantiationException,
+ NoSuchMethodException, IntrospectionException {
+
+ RPCResponse response = new RPCResponse();
+
+ // validate id
+ Object id = data.get("id");
+ if (id == null) {
+ String message = "'id' is required for JSON RPC";
+ response.setError(new RPCError(message, RPCErrorCode.METHOD_NOT_FOUND));
+ return response;
+ }
+ // could be a numeric value
+ response.setId(id.toString());
+
+ // the map is going to have: 'params', 'method' and 'id' (what is the id
+ // for?)
+ Class clazz = object.getClass();
+
+ // parameters
+ List parameters = (List) data.get("params");
+ int parameterCount = parameters != null ? parameters.size() : 0;
+
+ // method
+ String methodName = (String) data.get("method");
+ if (methodName == null) {
+ String message = "'method' is required for JSON RPC";
+ response.setError(new RPCError(message, RPCErrorCode.MISSING_METHOD));
+ return response;
+ }
+
+ Method method = this.getMethod(clazz, methodName, parameterCount);
+ if (method == null) {
+ String message = "Method " + methodName + " could not be found in action class.";
+ response.setError(new RPCError(message, RPCErrorCode.METHOD_NOT_FOUND));
+ return response;
+ }
+
+ // parameters
+ if (parameterCount > 0) {
+ Class[] parameterTypes = method.getParameterTypes();
+ Type[] genericTypes = method.getGenericParameterTypes();
+ List invocationParameters = new ArrayList();
+
+ // validate size
+ if (parameterTypes.length != parameterCount) {
+ // size mismatch
+ String message = "Parameter count in request, " + parameterCount
+ + " do not match expected parameter count for " + methodName + ", "
+ + parameterTypes.length;
+
+ response.setError(new RPCError(message, RPCErrorCode.PARAMETERS_MISMATCH));
+ return response;
+ }
+
+ // convert parameters
+ for (int i = 0; i < parameters.size(); i++) {
+ Object parameter = parameters.get(i);
+ Class paramType = parameterTypes[i];
+ Type genericType = genericTypes[i];
+
+ // clean up the values
+ if (dataCleaner != null)
+ parameter = dataCleaner.clean("[" + i + "]", parameter);
+
+ Object converted = populator.convert(paramType, genericType, parameter, method);
+ invocationParameters.add(converted);
+ }
+
+ response.setResult(method.invoke(object, invocationParameters.toArray()));
+ } else {
+ response.setResult(method.invoke(object, new Object[0]));
+ }
+
+ return response;
+ }
+
+ @SuppressWarnings("unchecked")
+ private Method getMethod(Class clazz, String name, int parameterCount) {
+ Method[] smdMethods = JSONUtil.listSMDMethods(clazz, ignoreSMDMethodInterfaces);
+
+ for (Method method : smdMethods) {
+ if (checkSMDMethodSignature(method, name, parameterCount)) {
+ return method;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Look for a method in clazz carrying the SMDMethod annotation with
+ * matching name and parametersCount
+ *
+ * @return true if matches name and parameterCount
+ */
+ private boolean checkSMDMethodSignature(Method method, String name, int parameterCount) {
+
+ SMDMethod smdMethodAnntotation = method.getAnnotation(SMDMethod.class);
+ if (smdMethodAnntotation != null) {
+ String alias = smdMethodAnntotation.name();
+ boolean paramsMatch = method.getParameterTypes().length == parameterCount;
+ if (((alias.length() == 0) && method.getName().equals(name) && paramsMatch)
+ || (alias.equals(name) && paramsMatch)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ protected String addCallbackIfApplicable(HttpServletRequest request, String json) {
+ if ((callbackParameter != null) && (callbackParameter.length() > 0)) {
+ String callbackName = request.getParameter(callbackParameter);
+ if ((callbackName != null) && (callbackName.length() > 0))
+ json = callbackName + "(" + json + ")";
+ }
+ return json;
+ }
+
+ public boolean isEnableSMD() {
+ return this.enableSMD;
+ }
+
+ public void setEnableSMD(boolean enableSMD) {
+ this.enableSMD = enableSMD;
+ }
+
+ /**
+ * Ignore annotations on methods in interfaces You may need to set to this
+ * true if your action is a proxy/enhanced as annotations are not inherited
+ */
+ public void setIgnoreSMDMethodInterfaces(boolean ignoreSMDMethodInterfaces) {
+ this.ignoreSMDMethodInterfaces = ignoreSMDMethodInterfaces;
+ }
+
+ /**
+ * Wrap generated JSON with comments. Only used if SMD is enabled.
+ *
+ * @param wrapWithComments
+ */
+ public void setWrapWithComments(boolean wrapWithComments) {
+ this.wrapWithComments = wrapWithComments;
+ }
+
+ @Inject(StrutsConstants.STRUTS_I18N_ENCODING)
+ public void setDefaultEncoding(String val) {
+ this.defaultEncoding = val;
+ }
+
+ /**
+ * Ignore properties defined on base classes of the root object.
+ *
+ * @param ignoreHierarchy
+ */
+ public void setIgnoreHierarchy(boolean ignoreHierarchy) {
+ this.ignoreHierarchy = ignoreHierarchy;
+ }
+
+ /**
+ * Sets the root object to be deserialized, defaults to the Action
+ *
+ * @param root
+ * OGNL expression of root object to be serialized
+ */
+ public void setRoot(String root) {
+ this.root = root;
+ }
+
+ /**
+ * Sets the JSONPopulator to be used
+ *
+ * @param populator
+ * JSONPopulator
+ */
+ public void setJSONPopulator(JSONPopulator populator) {
+ this.populator = populator;
+ }
+
+ /**
+ * Sets the JSONCleaner to be used
+ *
+ * @param dataCleaner
+ * JSONCleaner
+ */
+ public void setJSONCleaner(JSONCleaner dataCleaner) {
+ this.dataCleaner = dataCleaner;
+ }
+
+ /**
+ * Turns debugging on or off
+ *
+ * @param debug
+ * true or false
+ */
+ public boolean getDebug() {
+ return this.debug;
+ }
+
+ public void setDebug(boolean debug) {
+ this.debug = debug;
+ }
+
+ /**
+ * Sets a comma-delimited list of regular expressions to match properties
+ * that should be excluded from the JSON output.
+ *
+ * @param commaDelim
+ * A comma-delimited list of regular expressions
+ */
+ public void setExcludeProperties(String commaDelim) {
+ List<String> excludePatterns = JSONUtil.asList(commaDelim);
+ if (excludePatterns != null) {
+ this.excludeProperties = new ArrayList<Pattern>(excludePatterns.size());
+ for (String pattern : excludePatterns) {
+ this.excludeProperties.add(Pattern.compile(pattern));
+ }
+ }
+ }
+
+ /**
+ * Sets a comma-delimited list of regular expressions to match properties
+ * that should be included from the JSON output.
+ *
+ * @param commaDelim
+ * A comma-delimited list of regular expressions
+ */
+ public void setIncludeProperties(String commaDelim) {
+ List<String> includePatterns = JSONUtil.asList(commaDelim);
+ if (includePatterns != null) {
+ this.includeProperties = new ArrayList<Pattern>(includePatterns.size());
+ for (String pattern : includePatterns) {
+ this.includeProperties.add(Pattern.compile(pattern));
+ }
+ }
+ }
+
+ public boolean isEnableGZIP() {
+ return enableGZIP;
+ }
+
+ /**
+ * Setting this property to "true" will compress the output.
+ *
+ * @param enableGZIP
+ * Enable compressed output
+ */
+ public void setEnableGZIP(boolean enableGZIP) {
+ this.enableGZIP = enableGZIP;
+ }
+
+ public boolean isNoCache() {
+ return noCache;
+ }
+
+ /**
+ * Add headers to response to prevent the browser from caching the response
+ *
+ * @param noCache
+ */
+ public void setNoCache(boolean noCache) {
+ this.noCache = noCache;
+ }
+
+ public boolean isExcludeNullProperties() {
+ return excludeNullProperties;
+ }
+
+ /**
+ * Do not serialize properties with a null value
+ *
+ * @param excludeNullProperties
+ */
+ public void setExcludeNullProperties(boolean excludeNullProperties) {
+ this.excludeNullProperties = excludeNullProperties;
+ }
+
+ public void setCallbackParameter(String callbackParameter) {
+ this.callbackParameter = callbackParameter;
+ }
+
+ public String getCallbackParameter() {
+ return callbackParameter;
+ }
+
+ /**
+ * Add "{} && " to generated JSON
+ *
+ * @param prefix
+ */
+ public void setPrefix(boolean prefix) {
+ this.prefix = prefix;
+ }
+
+ public void setContentType(String contentType) {
+ this.contentType = contentType;
+ }
+}
Propchange: struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONInterceptor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: struts/sandbox/trunk/struts2-json-plugin/src/main/java/org/apache/struts2/json/JSONInterceptor.java
------------------------------------------------------------------------------
svn:keywords = Id