com.ca.mas.cordova.connecta.MASConnectaPlugin.java Source code

Java tutorial

Introduction

Here is the source code for com.ca.mas.cordova.connecta.MASConnectaPlugin.java

Source

/*
 * Copyright (c) 2016 CA, Inc.
 * This software may be modified and distributed under the terms
 * of the MIT license. See the LICENSE file for details.
 *
 */
package com.ca.mas.cordova.connecta;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Base64;
import android.util.Log;

import com.ca.mas.connecta.client.MASConnectOptions;
import com.ca.mas.connecta.client.MASConnectaClient;
import com.ca.mas.connecta.client.MASConnectaManager;
import com.ca.mas.connecta.util.ConnectaConsts;
import com.ca.mas.cordova.core.MASCordovaException;
import com.ca.mas.foundation.MAS;
import com.ca.mas.foundation.MASCallback;
import com.ca.mas.foundation.MASFoundationStrings;
import com.ca.mas.foundation.MASUser;
import com.ca.mas.messaging.MASMessage;
import com.ca.mas.messaging.MessagingConsts;
import com.ca.mas.messaging.topic.MASTopic;
import com.ca.mas.messaging.topic.MASTopicBuilder;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.PluginResult;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import static com.ca.mas.cordova.connecta.MASConnectaUtil.getError;
import static com.ca.mas.foundation.MASUser.getCurrentUser;

public class MASConnectaPlugin extends CordovaPlugin {

    private static final String TAG = MASConnectaPlugin.class.getCanonicalName();
    private static CallbackContext _messageReceiverCallback = null;
    private static volatile boolean isListenerRegistered = false;

    private static MASConnectaPlugin _plugin = null;

    @Override
    protected void pluginInitialize() {
        super.pluginInitialize();
        _plugin = this;
    }

    public static Context getCordovaContext() {
        return _plugin.cordova.getActivity().getApplicationContext();
    }

    @Override
    public boolean execute(String action, final JSONArray args, final CallbackContext callbackContext)
            throws JSONException {
        if (action.equalsIgnoreCase("registerReceiver")) {
            registerReceiver(args, callbackContext);
        } else if (action.equalsIgnoreCase("startListeningToMyMessages")) {
            startListeningToMyMessages(args, callbackContext);
        } else if (action.equalsIgnoreCase("stopListeningToMyMessages")) {
            stopListeningToMyMessages(args, callbackContext);
        } else if (action.equalsIgnoreCase("sendMessageToUserOnTopic")) {
            sendMessageToUserOnTopic(args, callbackContext);
        } else if (action.equalsIgnoreCase("sendMessageToUser")) {
            sendMessageToUser(args, callbackContext);
        } else if (action.equalsIgnoreCase("connect")) {
            connect(args, callbackContext);
        } else if (action.equalsIgnoreCase("disconnect")) {
            disconnect(args, callbackContext);
        } else if (action.equalsIgnoreCase("subscribe")) {
            subscribe(args, callbackContext);
        } else if (action.equalsIgnoreCase("unsubscribe")) {
            unsubscribe(args, callbackContext);
        } else if (action.equalsIgnoreCase("publish")) {
            publish(args, callbackContext);
        } else if (action.equalsIgnoreCase("initializeMQTTClient")) {
            success(callbackContext, true);
        } else if (action.equalsIgnoreCase("isConnected")) {
            success(callbackContext, MASConnectaManager.getInstance().isConnected());
        } else {
            callbackContext.error("Invalid action");
            return false;
        }
        return true;
    }

    /**
     * Register the listener for incoming messages
     */
    private void registerReceiver(final JSONArray args, final CallbackContext callbackContext) {
        _messageReceiverCallback = callbackContext;
        if (!isListenerRegistered) {
            try {
                IntentFilter intentFilter = new IntentFilter();
                intentFilter.addAction(ConnectaConsts.MAS_CONNECTA_BROADCAST_MESSAGE_ARRIVED);
                LocalBroadcastManager.getInstance(this.cordova.getActivity())
                        .registerReceiver(new BroadcastReceiver() {
                            @Override
                            public void onReceive(Context context, Intent intent) {
                                if (!intent.getAction()
                                        .equals(ConnectaConsts.MAS_CONNECTA_BROADCAST_MESSAGE_ARRIVED)) {
                                    return;
                                }
                                try {
                                    MASMessage message = MASMessage.newInstance(intent);
                                    try {
                                        final String senderId = message.getSenderId();
                                        final String contentType = message.getContentType();
                                        if (contentType.startsWith("image")) {
                                            byte[] msg = message.getPayload();
                                            if (MAS.DEBUG) {
                                                Log.w(TAG, "message receiver got image from " + senderId
                                                        + ", image length " + msg.length);
                                            }
                                        } else {
                                            byte[] msg = message.getPayload();
                                            String m = new String(msg);
                                            if (MAS.DEBUG) {
                                                Log.w(TAG, "message receiver got text message from " + senderId
                                                        + ", " + m);
                                            }
                                        }
                                    } catch (Exception ignore) {

                                    }
                                    JSONObject obj = new JSONObject(
                                            message.createJSONStringFromMASMessage(context));
                                    String payload = obj.getString("Payload");
                                    byte[] payloadBytes = decodeBase64IncomingMessage(payload);
                                    payload = new String(payloadBytes);
                                    obj.put("Payload", payload);
                                    PluginResult result = new PluginResult(PluginResult.Status.OK, obj);
                                    result.setKeepCallback(true);
                                    _messageReceiverCallback.sendPluginResult(result);
                                } catch (Exception jce) {
                                    Log.e(TAG, "message parse exception: " + jce);
                                    JSONObject obj = getError(new MASCordovaException("Invalid Message received"));
                                    PluginResult result = new PluginResult(PluginResult.Status.ERROR, obj);
                                    result.setKeepCallback(true);
                                    _messageReceiverCallback.sendPluginResult(result);
                                }
                            }
                        }, intentFilter);
                isListenerRegistered = true;
                PluginResult result = new PluginResult(PluginResult.Status.OK, true);
                result.setKeepCallback(true);
                callbackContext.sendPluginResult(result);
            } catch (Exception ex) {
                isListenerRegistered = false;
                Log.e(TAG, "initMessageReceiver exception: " + ex);
                callbackContext.error("Unable to initialize:" + ex.getMessage());
            }
        }
    }

    private void startListeningToMyMessages(final JSONArray args, final CallbackContext callbackContext) {
        MASUser masUser = getCurrentUser();
        if (masUser == null) {
            MASCordovaException e = new MASCordovaException(MASFoundationStrings.USER_NOT_CURRENTLY_AUTHENTICATED);
            callbackContext.error(getError(e));
            return;
        }
        getCurrentUser().startListeningToMyMessages(new MASCallback<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                String message = "Started listening to my messages";
                success(callbackContext, message);
            }

            @Override
            public void onError(Throwable throwable) {
                Log.e(TAG, throwable.getMessage());
                callbackContext.error(getError(
                        new MASCordovaException("Unable to listen to my messages:" + throwable.getMessage())));
            }
        });
    }

    private void stopListeningToMyMessages(final JSONArray args, final CallbackContext callbackContext) {
        MASUser masUser = getCurrentUser();
        if (masUser == null) {
            MASCordovaException e = new MASCordovaException(MASFoundationStrings.USER_NOT_CURRENTLY_AUTHENTICATED);
            callbackContext.error(getError(e));
            return;
        }
        getCurrentUser().stopListeningToMyMessages(new MASCallback<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                String message = "Unsubscribed to my messages";
                success(callbackContext, message);
            }

            @Override
            public void onError(Throwable throwable) {
                Log.e(TAG, throwable.getMessage());
                callbackContext.error(getError(
                        new MASCordovaException("Unable to unsubscribe to my messages:" + throwable.getMessage())));
            }
        });
    }

    private void sendMessageToUserOnTopic(final JSONArray args, final CallbackContext callbackContext) {
        MASUser masUser = getCurrentUser();
        if (masUser == null) {
            MASCordovaException e = new MASCordovaException(MASFoundationStrings.USER_NOT_CURRENTLY_AUTHENTICATED);
            callbackContext.error(getError(e));
            return;
        }
        final String topic;
        String userName = null;
        final byte[] message;
        final String contentType;
        MASTopic masTopic = null;

        try {
            String message_0 = args.getString(0);
            //message = decodeBase64IncomingMessage(message_0);
            message = message_0.getBytes();
            userName = args.getString(1);
            topic = args.getString(2);
            contentType = args.optString(3, "text/plain");
        } catch (JSONException e) {
            callbackContext
                    .error(getError(new MASCordovaException("Invaid Input, topic/message/userName missing")));
            return;
        } /*catch (MASCordovaException e) {
          callbackContext.error(getError(e));
          return;
          }*/

        getCurrentUser().getUserById(userName, new MASCallback<MASUser>() {
            @Override
            public void onSuccess(final MASUser masUser) {
                if (masUser == null) {
                    callbackContext.error(getError(new MASCordovaException("User not Found")));
                    return;
                }

                MASMessage masMessage = MASMessage.newInstance();
                masMessage.setContentType(contentType);
                masMessage.setPayload(message);
                getCurrentUser().sendMessage(masMessage, masUser, topic, new MASCallback<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        String result = "Message send successfully";
                        success(callbackContext, result);
                    }

                    @Override
                    public void onError(Throwable throwable) {
                        Log.e(TAG, throwable.getMessage());
                        callbackContext.error(getError(
                                new MASCordovaException("Message sending failure:" + throwable.getMessage())));
                    }
                });
            }

            @Override
            public void onError(Throwable throwable) {
                callbackContext.error(getError(new MASCordovaException("User not Found")));
                return;
            }
        });
    }

    private void sendMessageToUser(final JSONArray args, final CallbackContext callbackContext) {
        MASUser masUser = getCurrentUser();
        if (masUser == null) {
            MASCordovaException e = new MASCordovaException(MASFoundationStrings.USER_NOT_CURRENTLY_AUTHENTICATED);
            callbackContext.error(getError(e));
            return;
        }
        String userName = null;
        final byte[] message;
        final String contentType;
        final MASTopic masTopic;

        try {
            String message_0 = args.getString(0);
            //message = decodeBase64IncomingMessage(message_0);
            message = message_0.getBytes();
            userName = args.getString(1);
            contentType = args.optString(2, "text/plain");
        } catch (JSONException e) {
            callbackContext
                    .error(getError(new MASCordovaException("Invaid Input, userName/contentType/message missing")));
            return;
        } /*catch (MASCordovaException e) {
          callbackContext.error(getError(e));
          return;
          }*/
        getCurrentUser().getUserById(userName, new MASCallback<MASUser>() {
            @Override
            public void onSuccess(final MASUser masUser) {
                if (masUser == null) {
                    callbackContext.error(getError(new MASCordovaException("User not Found")));
                    return;
                }

                MASMessage masMessage = MASMessage.newInstance();
                masMessage.setContentType(contentType);
                masMessage.setPayload(message);
                getCurrentUser().sendMessage(masMessage, masUser, new MASCallback<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        String result = "Message send successfully";
                        success(callbackContext, result);
                    }

                    @Override
                    public void onError(Throwable throwable) {
                        Log.e(TAG, throwable.getMessage());
                        callbackContext.error(getError(
                                new MASCordovaException("Message sending failure:" + throwable.getMessage())));
                    }
                });
            }

            @Override
            public void onError(Throwable throwable) {
                callbackContext.error(getError(new MASCordovaException("User not Found")));
                return;
            }
        });
    }

    private void connect(final JSONArray args, final CallbackContext callbackContext) {
        JSONObject connOpts = null;
        final MASConnectOptions connectOptions;
        String clientId = null;
        try {
            clientId = args.optString(0);
            if (!MASConnectaUtil.isNullOrEmpty(clientId)) {
                MASConnectaManager.getInstance().setClientId(clientId);
            }
            connOpts = args.optJSONObject(1);
            connectOptions = MASConnectaUtil.getConnectOptions(connOpts);
            if (connectOptions != null) {
                MASConnectaManager.getInstance().setConnectOptions(connectOptions);
            }
        } catch (MASCordovaException mc) {
            callbackContext.error(getError(mc));
            return;
        }

        MASConnectaManager.getInstance().connect(new MASCallback<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                String message = "Successfully connected to host:" + connectOptions.getServerURIs()[0];
                success(callbackContext, message);
            }

            @Override
            public void onError(Throwable throwable) {
                Log.e(TAG, throwable.getMessage());
                callbackContext.error(getError(new MASCordovaException("Unable to connect to host :"
                        + connectOptions.getServerURIs()[0] + "::" + throwable.getMessage())));
            }
        });
    }

    private void disconnect(final JSONArray args, final CallbackContext callbackContext) {
        MASConnectaManager.getInstance().disconnect(new MASCallback<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                String message = "Successfully disconnected from host";
                success(callbackContext, message);
            }

            @Override
            public void onError(Throwable throwable) {
                Log.e(TAG, throwable.getMessage());
                callbackContext.error(getError(
                        new MASCordovaException("Unable to disconnect from host :" + throwable.getMessage())));
            }
        });
    }

    private void subscribe(final JSONArray args, final CallbackContext callbackContext) {
        String topicName = null;
        int qos = MASConnectaClient.EXACTLY_ONCE;
        MASTopic masTopic = null;
        try {
            topicName = args.getString(0);
            qos = args.optInt(1, MASConnectaClient.EXACTLY_ONCE);
            MASTopicBuilder builder = new MASTopicBuilder().setCustomTopic(topicName).setQos(qos)
                    .enforceTopicStructure(false);
            masTopic = builder.build();
        } catch (JSONException e) {
            callbackContext.error(getError(new MASCordovaException("Invaid Input, topic/qos missing")));
            return;
        } catch (Exception e) {
            callbackContext.error(getError(new MASCordovaException("Invaid Input, topic/qos missing")));
            return;
        }

        MASConnectaManager.getInstance().subscribe(masTopic, new MASCallback<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                String message = "Successfully subscribed to topic";
                success(callbackContext, message);
            }

            @Override
            public void onError(Throwable throwable) {
                throwable.printStackTrace();
                Log.e(TAG, throwable.getMessage());
                callbackContext.error(getError(
                        new MASCordovaException("Unable to subscribe to topic:" + throwable.getMessage())));
            }
        });
    }

    private void unsubscribe(final JSONArray args, final CallbackContext callbackContext) {
        final String topicName;
        MASTopic masTopic = null;
        try {
            topicName = args.getString(0);
            MASTopicBuilder builder = new MASTopicBuilder().setCustomTopic(topicName).enforceTopicStructure(false);
            masTopic = builder.build();
        } catch (JSONException e) {
            callbackContext.error(getError(new MASCordovaException("Topic Name is missing")));
            return;
        }

        MASConnectaManager.getInstance().unsubscribe(masTopic, new MASCallback<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                String message = "Unsubscribed to topic";
                success(callbackContext, message);
            }

            @Override
            public void onError(Throwable throwable) {
                Log.e(TAG, throwable.getMessage());
                callbackContext.error(getError(
                        new MASCordovaException("Unable to unsubscribe to topic:" + throwable.getMessage())));
            }
        });
    }

    private void publish(final JSONArray args, final CallbackContext callbackContext) {
        String topicName = null;
        byte[] message = null;
        String contentType = MessagingConsts.DEFAULT_TEXT_PLAIN_CONTENT_TYPE;
        MASTopic masTopic = null;
        int qos = MASConnectaClient.EXACTLY_ONCE;
        boolean retained = false;

        try {
            topicName = args.getString(0);
            String message_0 = args.getString(1);
            //message = decodeBase64IncomingMessage(message_0);
            message = message_0.getBytes();
            qos = args.optInt(2, MASConnectaClient.EXACTLY_ONCE);
            retained = args.optBoolean(3, false);

            MASTopicBuilder builder = new MASTopicBuilder().setCustomTopic(topicName).setQos(qos)
                    .enforceTopicStructure(false);
            masTopic = builder.build();
            contentType = args.optString(4, "text/plain");
        } catch (JSONException e) {
            callbackContext
                    .error(getError(new MASCordovaException("Invaid Input, topic/message/qos/retained missing")));
            return;
        } /* catch (MASCordovaException e) {
          callbackContext.error(getError(e));
          return;
          }*/ catch (Exception e) {
            callbackContext
                    .error(getError(new MASCordovaException("Invaid Input, topic/message/qos/retained missing")));
            return;
        }

        MASMessage masMessage = MASMessage.newInstance();
        masMessage.setContentType(contentType);
        masMessage.setPayload(message);
        masMessage.setRetained(retained);

        MASConnectaManager.getInstance().publish(masTopic, masMessage, new MASCallback<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                String result = "Message send successfully";
                success(callbackContext, result);
            }

            @Override
            public void onError(Throwable throwable) {
                Log.e(TAG, throwable.getMessage());
                callbackContext.error(
                        getError(new MASCordovaException("Message sending failure:" + throwable.getMessage())));
            }
        });
    }

    private byte[] decodeBase64IncomingMessage(String message) throws MASCordovaException {
        try {
            return Base64.decode(message, Base64.NO_WRAP);
        } catch (Exception ex) {
            throw new MASCordovaException("Invalid message format");
        }
    }

    private void success(CallbackContext callbackContext, boolean value) {
        PluginResult result = new PluginResult(PluginResult.Status.OK, value);
        callbackContext.sendPluginResult(result);
    }

    private void success(CallbackContext callbackContext, JSONObject resultData) {
        PluginResult result = new PluginResult(PluginResult.Status.OK, resultData);
        callbackContext.sendPluginResult(result);
    }

    private void success(CallbackContext callbackContext, Object resultData) {
        PluginResult result = new PluginResult(PluginResult.Status.OK, resultData.toString());
        callbackContext.sendPluginResult(result);
    }

    private void success(CallbackContext callbackContext, JSONArray resultData) {
        PluginResult result = new PluginResult(PluginResult.Status.OK, resultData);
        callbackContext.sendPluginResult(result);
    }
}