001package org.apache.turbine.services.jsonrpc; 002 003import java.io.CharArrayWriter; 004 005import javax.servlet.http.HttpServletRequest; 006 007import org.apache.commons.logging.Log; 008import org.apache.commons.logging.LogFactory; 009import org.jabsorb.JSONRPCBridge; 010import org.jabsorb.JSONRPCResult; 011import org.json.JSONArray; 012import org.json.JSONException; 013import org.json.JSONObject; 014 015/** 016 * Process a JSON RPC call 017 * 018 * @author <a href="mailto:seade@backstagetech.com.au">Scott Eade</a> 019 */ 020public class JSONProcessor 021{ 022 /** Log. */ 023 private static Log log = LogFactory.getLog(JSONProcessor.class); 024 025 /** 026 * Process a JSON RPC call 027 * @param cdata the JSON data 028 * @param json_bridge the {@link JSONRPCBridge} object 029 * @param request the request 030 * @return the return object of the JSON RPC call 031 */ 032 public static Object processCall(CharArrayWriter cdata, JSONRPCBridge json_bridge, HttpServletRequest request) 033 { 034 // Process the request 035 JSONObject json_req = null; 036 Object json_res = null; 037 try 038 { 039 json_req = new JSONObject(cdata.toString()); 040 if (log.isDebugEnabled()) 041 { 042 String methodName = json_req.getString("method"); 043 JSONArray arguments = json_req.getJSONArray("params"); 044 045 // If this a CallableReference it will have a non-zero objectID 046 int object_id = json_req.optInt("objectID"); 047 StringBuilder sb = new StringBuilder(".doprocessCall(): call "); 048 if (object_id != 0) 049 { 050 sb.append("objectID=").append(object_id).append(" "); 051 } 052 sb.append(methodName).append("(").append(arguments).append(")"); 053 log.debug(sb.toString()); 054 } 055 //json_res = json_bridge.call(new Object[] {request}, object_id, methodName, arguments); 056 json_res = json_bridge.call(new Object[] {request}, json_req); 057 } 058 catch (JSONException e) 059 { 060 log.error(".processCall(): can't parse call: " + cdata, e); 061 json_res = JSONRPCResult.MSG_ERR_PARSE; 062 } 063 // Write the response 064 if (log.isDebugEnabled()) 065 { 066 log.debug(".processCall(): returns " + json_res.toString()); 067 } 068 return json_res; 069 } 070 071}