package com.sonycsl.Kadecot.wamp.provider; import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.database.Cursor; import android.os.RemoteException; import android.util.Log; import com.sonycsl.Kadecot.core.provider.KadecotCoreStore; import com.sonycsl.Kadecot.wamp.provider.KadecotProviderClient.Procedure; import com.sonycsl.wamp.WampError; import com.sonycsl.wamp.message.WampInvocationMessage; import com.sonycsl.wamp.message.WampMessage; import com.sonycsl.wamp.message.WampMessageFactory; import com.sonycsl.wamp.message.WampMessageType; import com.sonycsl.wamp.role.WampCallee; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.lang.reflect.InvocationTargetException; public class ProviderCallee extends WampCallee { private ContentResolver mResolver; public ProviderCallee(ContentResolver resolver) throws RemoteException { mResolver = resolver; ContentProviderClient provider = mResolver .acquireContentProviderClient(KadecotCoreStore.Devices.CONTENT_URI); ContentValues values = new ContentValues(); values.put(KadecotCoreStore.Devices.DeviceColumns.STATUS, false); provider.update(KadecotCoreStore.Devices.CONTENT_URI, values, null, null); provider.release(); } private WampMessage createError(WampInvocationMessage msg, String error) { return WampMessageFactory.createError(WampMessageType.INVOCATION, msg.getRequestId(), new JSONObject(), error); } @Override protected WampMessage invocation(String procedure, WampMessage msg) { if (!msg.isInvocationMessage()) { throw new IllegalArgumentException(); } WampInvocationMessage iMsg = msg.asInvocationMessage(); Procedure proc = Procedure.getEnum(procedure); if (proc == null) { return createError(iMsg, WampError.NO_SUCH_PROCEDURE); } try { return (WampMessage) ProviderCallee.this.getClass() .getDeclaredMethod(proc.getMethod(), WampInvocationMessage.class).invoke(ProviderCallee.this, msg); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } return createError(iMsg, WampError.INVALID_ARGUMENT); } private boolean isDeviceExists(WampInvocationMessage msg) throws RemoteException, JSONException { ContentProviderClient provider = mResolver.acquireContentProviderClient( KadecotCoreStore.Devices.CONTENT_URI); JSONObject json = msg.getArgumentsKw(); Cursor cursor = provider.query(KadecotCoreStore.Devices.CONTENT_URI, new String[] { KadecotCoreStore.Devices.DeviceColumns.DEVICE_ID }, KadecotCoreStore.Devices.DeviceColumns.DEVICE_ID + "=?", new String[] { json.getString(KadecotCoreStore.Devices.DeviceColumns.DEVICE_ID) }, null); final int count = cursor.getCount(); cursor.close(); provider.release(); if (count > 1) { throw new IllegalArgumentException("fatal: DEVICE_ID is not UNIQUE"); } return count == 1 ? true : false; } private long getDeviceId(WampInvocationMessage msg) throws RemoteException, JSONException { ContentProviderClient provider = mResolver.acquireContentProviderClient( KadecotCoreStore.Devices.CONTENT_URI); JSONObject json = msg.getArgumentsKw(); Cursor cursor = provider.query(KadecotCoreStore.Devices.CONTENT_URI, new String[] { KadecotCoreStore.Devices.DeviceColumns.DEVICE_ID }, KadecotCoreStore.Devices.DeviceColumns.PROTOCOL + "=? and " + KadecotCoreStore.Devices.DeviceColumns.UUID + "=?", new String[] { json.getString(KadecotCoreStore.Devices.DeviceColumns.PROTOCOL), json.getString(KadecotCoreStore.Devices.DeviceColumns.UUID) }, null); cursor.moveToFirst(); final int count = cursor.getCount(); final long id = (count == 1) ? cursor.getLong(cursor .getColumnIndex(KadecotCoreStore.Devices.DeviceColumns.DEVICE_ID)) : -1; cursor.close(); provider.release(); if (count > 1) { throw new IllegalArgumentException("fatal: DEVICE_ID is not UNIQUE"); } return id; } private ContentValues convertTo(JSONObject json) throws JSONException { ContentValues values = new ContentValues(); values.put(KadecotCoreStore.Devices.DeviceColumns.PROTOCOL, json.getString(KadecotCoreStore.Devices.DeviceColumns.PROTOCOL)); values.put(KadecotCoreStore.Devices.DeviceColumns.UUID, json.getString(KadecotCoreStore.Devices.DeviceColumns.UUID)); values.put(KadecotCoreStore.Devices.DeviceColumns.DEVICE_TYPE, json.getString(KadecotCoreStore.Devices.DeviceColumns.DEVICE_TYPE)); values.put(KadecotCoreStore.Devices.DeviceColumns.DESCRIPTION, json.getString(KadecotCoreStore.Devices.DeviceColumns.DESCRIPTION)); values.put(KadecotCoreStore.Devices.DeviceColumns.STATUS, json.getBoolean(KadecotCoreStore.Devices.DeviceColumns.STATUS) ? 1 : 0); values.put(KadecotCoreStore.Devices.DeviceColumns.NICKNAME, json.getString(KadecotCoreStore.Devices.DeviceColumns.DESCRIPTION)); return values; } private WampMessage insertDevice(WampInvocationMessage msg) { ContentValues values; try { values = convertTo(msg.getArgumentsKw()); } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } ContentProviderClient provider = mResolver.acquireContentProviderClient( KadecotCoreStore.Devices.CONTENT_URI); long deviceId = -1; try { deviceId = ContentUris .parseId(provider.insert( KadecotCoreStore.Devices.CONTENT_URI, values)); } catch (RemoteException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } finally { provider.release(); } if (deviceId < 0) { return createError(msg, WampError.INVALID_ARGUMENT); } try { return WampMessageFactory.createYield( msg.getRequestId(), new JSONObject(), new JSONArray(), new JSONObject(msg.getArgumentsKw().toString()).put( KadecotCoreStore.Devices.DeviceColumns.DEVICE_ID, deviceId)); } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } } private WampMessage updateDevice(WampInvocationMessage msg, long deviceId) { ContentValues values; try { values = convertTo(msg.getArgumentsKw()); } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } ContentProviderClient provider = mResolver.acquireContentProviderClient( KadecotCoreStore.Devices.CONTENT_URI); try { Cursor cursor = provider.query(KadecotCoreStore.Devices.CONTENT_URI, new String[] { KadecotCoreStore.Devices.DeviceColumns.STATUS }, KadecotCoreStore.Devices.DeviceColumns.DEVICE_ID + "=?", new String[] { String.valueOf(deviceId) }, null); assert cursor.getCount() == 1; cursor.moveToFirst(); boolean status = cursor.getInt(cursor .getColumnIndex(KadecotCoreStore.Devices.DeviceColumns.STATUS)) == 1 ? true : false; cursor.close(); if (status ^ values.getAsBoolean(KadecotCoreStore.Devices.DeviceColumns.STATUS)) { int numOfRows = 0; numOfRows = provider.update(KadecotCoreStore.Devices.CONTENT_URI, values, KadecotCoreStore.Devices.DeviceColumns.DEVICE_ID + "=?", new String[] { String.valueOf(deviceId) }); if (numOfRows != 1) { return createError(msg, WampError.INVALID_ARGUMENT); } } } catch (RemoteException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } finally { provider.release(); } try { return WampMessageFactory.createYield( msg.getRequestId(), new JSONObject(), new JSONArray(), new JSONObject(msg.getArgumentsKw().toString()).put( KadecotCoreStore.Devices.DeviceColumns.DEVICE_ID, deviceId)); } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } } @SuppressWarnings("unused") private WampMessage putDevice(WampInvocationMessage msg) { if (!msg.hasArgumentsKw()) { return createError(msg, WampError.INVALID_ARGUMENT); } long deviceId; try { deviceId = getDeviceId(msg); } catch (RemoteException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } WampMessage reply; if (deviceId > 0) { return updateDevice(msg, deviceId); } else { return insertDevice(msg); } } @SuppressWarnings("unused") private WampMessage removeDevice(WampInvocationMessage msg) { if (!msg.hasArgumentsKw()) { return createError(msg, WampError.INVALID_ARGUMENT); } try { if (!isDeviceExists(msg)) { return createError(msg, WampError.INVALID_ARGUMENT); } } catch (RemoteException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } ContentProviderClient provider = mResolver.acquireContentProviderClient( KadecotCoreStore.Devices.CONTENT_URI); try { provider.delete( KadecotCoreStore.Devices.CONTENT_URI, KadecotCoreStore.Devices.DeviceColumns.DEVICE_ID + "=?", new String[] { String.valueOf(msg.getArgumentsKw().getLong( KadecotCoreStore.Devices.DeviceColumns.DEVICE_ID)) }); } catch (RemoteException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } finally { provider.release(); } return WampMessageFactory.createYield(msg.getRequestId(), new JSONObject()); } @SuppressWarnings("unused") private WampMessage getDeviceList(WampInvocationMessage msg) { ContentProviderClient provider = mResolver.acquireContentProviderClient( KadecotCoreStore.Devices.CONTENT_URI); Cursor cursor; try { cursor = provider.query(KadecotCoreStore.Devices.CONTENT_URI, null, null, null, null); } catch (RemoteException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } finally { provider.release(); } final JSONArray deviceList = new JSONArray(); cursor.moveToFirst(); if (cursor.getCount() > 0) { do { JSONObject json = new JSONObject(); try { json.put( KadecotCoreStore.Devices.DeviceColumns.DEVICE_ID, cursor.getLong(cursor .getColumnIndex(KadecotCoreStore.Devices.DeviceColumns.DEVICE_ID))); json.put( KadecotCoreStore.Devices.DeviceColumns.PROTOCOL, cursor.getString(cursor .getColumnIndex(KadecotCoreStore.Devices.DeviceColumns.PROTOCOL))); json.put( KadecotCoreStore.Devices.DeviceColumns.DEVICE_TYPE, cursor.getString(cursor .getColumnIndex(KadecotCoreStore.Devices.DeviceColumns.DEVICE_TYPE))); json.put( KadecotCoreStore.Devices.DeviceColumns.DESCRIPTION, cursor.getString(cursor .getColumnIndex(KadecotCoreStore.Devices.DeviceColumns.DESCRIPTION))); json.put( KadecotCoreStore.Devices.DeviceColumns.STATUS, cursor.getInt(cursor .getColumnIndex(KadecotCoreStore.Devices.DeviceColumns.STATUS)) == 1 ? true : false); json.put( KadecotCoreStore.Devices.DeviceColumns.NICKNAME, cursor.getString(cursor .getColumnIndex(KadecotCoreStore.Devices.DeviceColumns.NICKNAME))); } catch (JSONException e) { continue; } deviceList.put(json); } while (cursor.moveToNext()); } cursor.close(); try { return WampMessageFactory.createYield(msg.getRequestId(), new JSONObject(), new JSONArray(), new JSONObject().put("deviceList", deviceList)); } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } } @SuppressWarnings("unused") private WampMessage changeNickname(WampInvocationMessage msg) { if (!msg.hasArgumentsKw()) { return createError(msg, WampError.INVALID_ARGUMENT); } try { if (!isDeviceExists(msg)) { return createError(msg, WampError.INVALID_ARGUMENT); } } catch (RemoteException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } ContentProviderClient provider = mResolver.acquireContentProviderClient( KadecotCoreStore.Devices.CONTENT_URI); ContentValues values = new ContentValues(); JSONObject json = msg.getArgumentsKw(); int numOfRows = 0; try { long deviceId = json.getLong(KadecotCoreStore.Devices.DeviceColumns.DEVICE_ID); values.put(KadecotCoreStore.Devices.DeviceColumns.DEVICE_ID, deviceId); values.put(KadecotCoreStore.Devices.DeviceColumns.NICKNAME, json.getString(KadecotCoreStore.Devices.DeviceColumns.NICKNAME)); numOfRows = provider.update(KadecotCoreStore.Devices.CONTENT_URI, values, KadecotCoreStore.Devices.DeviceColumns.DEVICE_ID + "=?", new String[] { String.valueOf(deviceId) }); } catch (RemoteException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } finally { provider.release(); } if (numOfRows != 1) { return createError(msg, WampError.INVALID_ARGUMENT); } return WampMessageFactory.createYield(msg.getRequestId(), new JSONObject()); } private boolean isTopicExists(WampInvocationMessage msg) throws RemoteException, JSONException { ContentProviderClient provider = mResolver.acquireContentProviderClient( KadecotCoreStore.Topics.CONTENT_URI); Cursor cursor = provider.query(KadecotCoreStore.Topics.CONTENT_URI, new String[] { KadecotCoreStore.Topics.TopicColumns.NAME }, KadecotCoreStore.Topics.TopicColumns.NAME + "=?", new String[] { msg.getArgumentsKw().getString(KadecotCoreStore.Topics.TopicColumns.NAME) }, null); provider.release(); final int count = cursor.getCount(); cursor.close(); if (count > 1) { throw new IllegalArgumentException("fatal: NAME is not UNIQUE"); } return (count == 1) ? true : false; } @SuppressWarnings("unused") private WampMessage putTopic(WampInvocationMessage msg) { if (!msg.hasArgumentsKw()) { return createError(msg, WampError.INVALID_ARGUMENT); } try { if (isTopicExists(msg)) { return WampMessageFactory.createYield(msg.getRequestId(), new JSONObject()); } } catch (RemoteException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } ContentValues values = new ContentValues(); try { String topic = msg.getArgumentsKw().getString( KadecotCoreStore.Topics.TopicColumns.NAME); values.put(KadecotCoreStore.Topics.TopicColumns.NAME, topic); values.put(KadecotCoreStore.Topics.TopicColumns.DESCRIPTION, msg.getArgumentsKw() .getString(KadecotCoreStore.Topics.TopicColumns.DESCRIPTION)); values.put(KadecotCoreStore.Topics.TopicColumns.PROTOCOL, topic.split("\\.", 5)[3]); } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } ContentProviderClient provider = mResolver .acquireContentProviderClient(KadecotCoreStore.Topics.CONTENT_URI); try { provider.insert(KadecotCoreStore.Topics.CONTENT_URI, values); } catch (RemoteException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } finally { provider.release(); } return WampMessageFactory.createYield(msg.getRequestId(), new JSONObject()); } @SuppressWarnings("unused") private WampMessage removeTopic(WampInvocationMessage msg) { if (!msg.hasArgumentsKw()) { return createError(msg, WampError.INVALID_ARGUMENT); } try { if (isTopicExists(msg)) { return WampMessageFactory.createYield(msg.getRequestId(), new JSONObject()); } } catch (RemoteException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } ContentProviderClient provider = mResolver .acquireContentProviderClient(KadecotCoreStore.Topics.CONTENT_URI); try { provider.delete( KadecotCoreStore.Topics.CONTENT_URI, KadecotCoreStore.Topics.TopicColumns.NAME + "=?", new String[] { msg.getArgumentsKw().getString( KadecotCoreStore.Topics.TopicColumns.NAME) }); } catch (RemoteException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } finally { provider.release(); } return WampMessageFactory.createYield(msg.getRequestId(), new JSONObject()); } private boolean isProcedureExists(WampInvocationMessage msg) throws RemoteException, JSONException { ContentProviderClient provider = mResolver.acquireContentProviderClient( KadecotCoreStore.Procedures.CONTENT_URI); Cursor cursor = provider.query( KadecotCoreStore.Procedures.CONTENT_URI, new String[] { KadecotCoreStore.Procedures.ProcedureColumns.NAME }, KadecotCoreStore.Procedures.ProcedureColumns.NAME + "=?", new String[] { msg.getArgumentsKw().getString( KadecotCoreStore.Procedures.ProcedureColumns.NAME) }, null); provider.release(); final int count = cursor.getCount(); cursor.close(); if (count > 1) { throw new IllegalArgumentException("fatal: NAME is not UNIQUE"); } return (count == 1) ? true : false; } @SuppressWarnings("unused") private WampMessage putProcedure(WampInvocationMessage msg) { if (!msg.hasArgumentsKw()) { return createError(msg, WampError.INVALID_ARGUMENT); } try { if (isProcedureExists(msg)) { return WampMessageFactory.createYield(msg.getRequestId(), new JSONObject()); } } catch (RemoteException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } ContentValues values = new ContentValues(); try { String procedure = msg.getArgumentsKw().getString( KadecotCoreStore.Procedures.ProcedureColumns.NAME); values.put( KadecotCoreStore.Procedures.ProcedureColumns.NAME, procedure); values.put( KadecotCoreStore.Procedures.ProcedureColumns.DESCRIPTION, msg.getArgumentsKw() .getString(KadecotCoreStore.Procedures.ProcedureColumns.DESCRIPTION)); try { values.put( KadecotCoreStore.Procedures.ProcedureColumns.PROTOCOL, procedure.split("\\.", 5)[3]); } catch (ArrayIndexOutOfBoundsException e) { Log.e("ProviderCallee", "procedure=" + procedure + "msg=" + msg); } } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } ContentProviderClient provider = mResolver .acquireContentProviderClient(KadecotCoreStore.Procedures.CONTENT_URI); try { provider.insert(KadecotCoreStore.Procedures.CONTENT_URI, values); } catch (RemoteException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } finally { provider.release(); } return WampMessageFactory.createYield(msg.getRequestId(), new JSONObject()); } @SuppressWarnings("unused") private WampMessage removeProcedure(WampInvocationMessage msg) { if (!msg.hasArgumentsKw()) { return createError(msg, WampError.INVALID_ARGUMENT); } try { if (isProcedureExists(msg)) { return WampMessageFactory.createYield(msg.getRequestId(), new JSONObject()); } } catch (RemoteException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } ContentProviderClient provider = mResolver .acquireContentProviderClient(KadecotCoreStore.Procedures.CONTENT_URI); try { provider.delete( KadecotCoreStore.Procedures.CONTENT_URI, KadecotCoreStore.Procedures.ProcedureColumns.NAME + "=?", new String[] { msg.getArgumentsKw().getString( KadecotCoreStore.Procedures.ProcedureColumns.NAME) }); } catch (RemoteException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } finally { provider.release(); } return WampMessageFactory.createYield(msg.getRequestId(), new JSONObject()); } @SuppressWarnings("unused") private WampMessage getTopicList(WampInvocationMessage msg) { if (!msg.hasArgumentsKw()) { return createError(msg, WampError.INVALID_ARGUMENT); } final JSONArray topics = new JSONArray(); ContentProviderClient provider = mResolver .acquireContentProviderClient(KadecotCoreStore.Topics.CONTENT_URI); Cursor cursor; try { cursor = provider.query(KadecotCoreStore.Topics.CONTENT_URI, new String[] { KadecotCoreStore.Topics.TopicColumns.NAME }, KadecotCoreStore.Topics.TopicColumns.PROTOCOL + "=?", new String[] { msg.getArgumentsKw().getString( KadecotCoreStore.Topics.TopicColumns.PROTOCOL) }, null); } catch (RemoteException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } cursor.moveToFirst(); if (cursor.getCount() > 0) { do { topics.put(cursor.getString(cursor .getColumnIndex(KadecotCoreStore.Topics.TopicColumns.NAME))); } while (cursor.moveToNext()); } try { return WampMessageFactory.createYield( msg.getRequestId(), new JSONObject(), new JSONArray(), new JSONObject().put("topicList", topics)); } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } } @SuppressWarnings("unused") private WampMessage getProcedureList(WampInvocationMessage msg) { if (!msg.hasArgumentsKw()) { return createError(msg, WampError.INVALID_ARGUMENT); } final JSONArray topics = new JSONArray(); ContentProviderClient provider = mResolver .acquireContentProviderClient(KadecotCoreStore.Procedures.CONTENT_URI); Cursor cursor; try { cursor = provider.query(KadecotCoreStore.Procedures.CONTENT_URI, new String[] { KadecotCoreStore.Procedures.ProcedureColumns.NAME }, KadecotCoreStore.Procedures.ProcedureColumns.PROTOCOL + "=?", new String[] { msg.getArgumentsKw().getString( KadecotCoreStore.Procedures.ProcedureColumns.PROTOCOL) }, null); } catch (RemoteException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } finally { provider.release(); } cursor.moveToFirst(); if (cursor.getCount() > 0) { do { topics.put(cursor.getString(cursor .getColumnIndex(KadecotCoreStore.Procedures.ProcedureColumns.NAME))); } while (cursor.moveToNext()); } try { return WampMessageFactory.createYield( msg.getRequestId(), new JSONObject(), new JSONArray(), new JSONObject().put("procedureList", topics)); } catch (JSONException e) { e.printStackTrace(); return createError(msg, WampError.INVALID_ARGUMENT); } } }