/* * Copyright (C) 2013-2014 Sony Computer Science Laboratories, Inc. All Rights Reserved. * Copyright (C) 2014 Sony Corporation. All Rights Reserved. */ package com.sonycsl.Kadecot.call; import android.content.Context; import com.sonycsl.Kadecot.device.DeviceManager; import com.sonycsl.Kadecot.device.DeviceProperty; import com.sonycsl.Kadecot.log.Logger; import com.sonycsl.Kadecot.server.ServerSettings; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RequestProcessor { protected final Context mContext; protected final int mPermissionLevel; protected DeviceManager mDeviceManager; protected ServerSettings mServerSettings; protected Logger mLogger; public RequestProcessor(Context context, int permissionLevel) { mContext = context.getApplicationContext(); mPermissionLevel = permissionLevel; mDeviceManager = DeviceManager.getInstance(mContext); mServerSettings = ServerSettings.getInstance(mContext); mLogger = Logger.getInstance(mContext); } public Response process(final String methodName, final JSONObject params) { try { Method method = getClass().getMethod(methodName, new Class[] { JSONObject.class }); try { return (Response) method.invoke(this, new Object[] { params }); } catch (CannotProcessRequestException e) { return e.getErrorResponse(); } } catch (NoSuchMethodException e) { e.printStackTrace(); return new ErrorResponse(ErrorResponse.METHOD_NOT_FOUND_CODE, e); } catch (IllegalArgumentException e) { e.printStackTrace(); return new ErrorResponse(ErrorResponse.METHOD_NOT_FOUND_CODE, e); } catch (IllegalAccessException e) { e.printStackTrace(); return new ErrorResponse(ErrorResponse.INTERNAL_ERROR_CODE, e); } catch (InvocationTargetException e) { e.printStackTrace(); return new ErrorResponse(ErrorResponse.INTERNAL_ERROR_CODE, e); } } // devices public Response set(JSONObject paramsObject) { String nickname; ArrayList<DeviceProperty> propertyList = new ArrayList<DeviceProperty>(); if (paramsObject == null || paramsObject.length() <= 0) { return new ErrorResponse(ErrorResponse.INVALID_PARAMS_CODE); } try { JSONArray params = paramsObject.getJSONArray("param"); nickname = params.getString(0); for (int i = 1; i < params.length(); i++) { JSONArray prop = params.getJSONArray(i); if (prop == null || prop.length() != 2) { return new ErrorResponse(ErrorResponse.INVALID_PARAMS_CODE); } DeviceProperty dp = new DeviceProperty(prop.getString(0), prop.get(1)); propertyList.add(dp); } return mDeviceManager.set(nickname, propertyList, mPermissionLevel); } catch (JSONException e) { e.printStackTrace(); return new ErrorResponse(ErrorResponse.INVALID_PARAMS_CODE, e); } } public Response get(JSONObject paramsObject) { String nickname; ArrayList<DeviceProperty> propertyList = new ArrayList<DeviceProperty>(); if (paramsObject == null || paramsObject.length() <= 0) { return new ErrorResponse(ErrorResponse.INVALID_PARAMS_CODE); } try { JSONArray params = paramsObject.getJSONArray("param"); nickname = params.getString(0); for (int i = 1; i < params.length(); i++) { JSONArray prop = params.getJSONArray(i); if (prop == null) { return new ErrorResponse(ErrorResponse.INVALID_PARAMS_CODE); } DeviceProperty dp = new DeviceProperty(prop.getString(0), prop.get(1)); propertyList.add(dp); } return mDeviceManager.get(nickname, propertyList, mPermissionLevel); } catch (JSONException e) { e.printStackTrace(); return new ErrorResponse(ErrorResponse.INVALID_PARAMS_CODE, e); } } public Response queryLog(JSONArray params) { long beginning; long end; if (params == null || params.length() <= 1) { return new ErrorResponse(ErrorResponse.INVALID_PARAMS_CODE); } try { beginning = params.getLong(0); end = params.getLong(1); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); return new ErrorResponse(ErrorResponse.INVALID_PARAMS_CODE, e); } JSONArray logList; if (params.length() >= 3) { try { final JSONObject obj = params.getJSONObject(2); logList = mLogger.queryLog(beginning, end, new Logger.LogFilter() { @Override public boolean predicate(LinkedHashMap<String, String> data) { try { Iterator<?> keys = obj.keys(); boolean flag = true; while (keys.hasNext()) { String key = (String) keys.next(); String reg = obj.getString(key); String dataStr = data.get(key); Pattern p = Pattern.compile(reg); Matcher m = p.matcher(dataStr); if (!m.find()) { flag = false; break; } } return flag; // if(!obj.isNull("nickname")) { // String nicknameReg = obj.getString("nickname"); // String dataNickname = Logger.getNickname(data); // Pattern p = Pattern.compile(nicknameReg); // Matcher m = p.matcher(dataNickname); // if (m.find()){ // } else { // return false; // } // } } catch (JSONException e) { e.printStackTrace(); return false; } // return true; } }); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); logList = mLogger.queryLog(beginning, end); } } else { logList = mLogger.queryLog(beginning, end); } return new Response(logList); } public Response refreshDeviceList(JSONObject params) { mDeviceManager.refreshDeviceList(mPermissionLevel); return new Response(new JSONObject()); } public Response getDeviceList(JSONObject params) { return new Response(mDeviceManager.getDeviceList(mPermissionLevel)); } public Response changeNickname(JSONObject params) { return mDeviceManager.changeNickname(params); } public Response deleteDevice(JSONObject params) { return mDeviceManager.deleteDeviceData(params); } public Response deleteInactiveDevices(JSONObject params) { return mDeviceManager.deleteInactiveDevices(mPermissionLevel); } }