/** * ========================================================================= * __ ____ ____ __ ____ ___ __ __ ____ ____ ____ * || || \\ || (( \ || \\ // \\ ||\ || || \\ || || \\ * || ||_// ||== \\ ||_// (( )) ||\\|| || )) ||== ||_// * |__|| || \\ ||___ \_)) || \\_// || \|| ||_// ||___ || \\ * ========================================================================= * * Copyright 2012 Brad Peabody * * Licensed 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.jresponder.util; import java.util.HashMap; import java.util.List; import java.util.Map; import net.minidev.json.JSONValue; import org.jresponder.service.ServiceException; import org.springframework.beans.factory.InitializingBean; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; /** * Utility stuff that is specific to the JSON API * @author bradpeabody * */ @Component("jrWebApiUtil") public class WebApiUtil implements InitializingBean { /* ====================================================================== */ /* singleton support with override - boiler plate (see package desc) */ private static WebApiUtil instance; public static WebApiUtil getInstance() { return instance; } public static void setInstance(WebApiUtil inst) { instance = inst; } public void afterPropertiesSet() { setInstance(this); } /* ====================================================================== */ // /** // * Parse the params to a map // * @param aParams // * @return // */ // @SuppressWarnings("unchecked") // public Map<String,Object> paramsToMap(String aParams) { // // Object ret = JSONValue.parse(aParams); // if (ret instanceof Map) { // return ((Map<String,Object>)ret); // } // // throw new IllegalArgumentException("Unable to parse parameters or wrong type - expected object/map"); // } // // /** // * Parse the params to a list // * @param aParams // * @return // */ // @SuppressWarnings("unchecked") // public List<Object> paramsToList(String aParams) { // // Object ret = JSONValue.parse(aParams); // if (ret instanceof List) { // return ((List<Object>)ret); // } // // throw new IllegalArgumentException("Unable to parse parameters or wrong type - expected array/list"); // } /** * Helper that converts an object to a JSON-RPC 2.0 response with a result * and returns a corresponding * ResponseEntity which can be returned directly back to Spring MVC and go * to the browser. * @param aId the JSON-RPC 2.0 request id * @param aCallback if non-null means JSONP is requested with the specified * callback function name * @param aObject the response object - usually a Map * @return */ public ResponseEntity<String> jsonRpcResult(String aId, String aCallback, Object aObject) { Map<String,Object> ret = new HashMap<String,Object>(); ret.put("id", aId); ret.put("result", aObject); ret.put("jsonrpc", "2.0"); String myResultString = JSONValue.toJSONString(ret); HttpHeaders responseHeaders = new HttpHeaders(); // normal JSON response if (aCallback == null || aCallback.trim().length() < 1) { responseHeaders.set("Content-type", "application/json-rpc"); } // JSONP handled differently else { responseHeaders.set("Content-type", "application/javascript"); // wrap result in JSONP callback myResultString = aCallback + "&&" + aCallback + "(" + myResultString + ")"; } return new ResponseEntity<String>(myResultString, responseHeaders, HttpStatus.CREATED); } /** * Make a JSON-RPC 2.0 error from a {@link ServiceException}. * @return */ public ResponseEntity<String> jsonRpcError(String aId, String aCallback, ServiceException e) { Map<String,Object> err = new HashMap<String,Object>(); err.put("code", e.getServiceExceptionType().getCode()); err.put("message", e.toString()); err.put("data", e.getDataMap()); Map<String,Object> ret = new HashMap<String,Object>(); ret.put("id", aId); ret.put("error", err); ret.put("jsonrpc", "2.0"); String myResultString = JSONValue.toJSONString(ret); HttpHeaders responseHeaders = new HttpHeaders(); // normal JSON response if (aCallback == null || aCallback.trim().length() < 1) { responseHeaders.set("Content-type", "application/json-rpc"); } // JSONP handled differently else { responseHeaders.set("Content-type", "application/javascript"); // wrap result in JSONP callback myResultString = aCallback + "&&" + aCallback + "(" + myResultString + ")"; } return new ResponseEntity<String>(myResultString, responseHeaders, HttpStatus.CREATED); } // /** // * Make a JSON-RPC 2.0 error // * @param aId the JSON-RPC 2.0 request id // * @param aCallback if non-null means JSONP is requested with the specified // * callback function name // * @param aObject // * @return // */ // public ResponseEntity<String> jsonRpcError(String aId, String aCallback, Long aErrorCode, String aMessage, Object aData) { // // Map<String,Object> err = new HashMap<String,Object>(); // err.put("code", aErrorCode); // err.put("message", aMessage); // if (aData != null) { // err.put("data", aData); // } // // Map<String,Object> ret = new HashMap<String,Object>(); // ret.put("id", aId); // ret.put("error", err); // ret.put("jsonrpc", "2.0"); // // String myResultString = JSONValue.toJSONString(ret); // // HttpHeaders responseHeaders = new HttpHeaders(); // // // normal JSON response // if (aCallback == null || aCallback.trim().length() < 1) { // responseHeaders.set("Content-type", "application/json-rpc"); // } // // JSONP handled differently // else { // responseHeaders.set("Content-type", "application/javascript"); // // wrap result in JSONP callback // myResultString = aCallback + "&&" + aCallback + "(" + myResultString + ")"; // } // // // return new ResponseEntity<String>(myResultString, // responseHeaders, HttpStatus.CREATED); // } // /** // * Like namesake but with null data. // * // * @param aId the JSON-RPC 2.0 request id // * @param aCallback if non-null means JSONP is requested with the specified // * callback function name // * @param aErrorCode // * @param aMessage // * @return // */ // public ResponseEntity<String> jsonRpcError(String aId, String aCallback, Long aErrorCode, String aMessage) { // return jsonRpcError(aId, aCallback, aErrorCode, aMessage, null); // } /** * Generic 404 result * @return */ public ResponseEntity<String> result404(String aMessage) { HttpHeaders responseHeaders = new HttpHeaders(); return new ResponseEntity<String>(aMessage != null ? aMessage : "Not found", responseHeaders, HttpStatus.NOT_FOUND); } /** * Dump result as plain text * * @param aText * @return */ public ResponseEntity<String> plainTextResult(String aText) { HttpHeaders responseHeaders = new HttpHeaders(); responseHeaders.set("Content-type", "text/plain"); return new ResponseEntity<String>(aText, responseHeaders, HttpStatus.CREATED); } }