All Downloads are FREE. Search and download functionalities are using the official Maven repository.

donky.microsoft.aspnet.signalr.client.transport.TransportHelper Maven / Gradle / Ivy

There is a newer version: 2.7.0.3
Show newest version
/*
Copyright (c) Microsoft Open Technologies, Inc.
All Rights Reserved
See License.txt in the project root for license information.
*/

package donky.microsoft.aspnet.signalr.client.transport;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

import donky.microsoft.aspnet.signalr.client.Connection;
import donky.microsoft.aspnet.signalr.client.ConnectionBase;
import donky.microsoft.aspnet.signalr.client.Constants;
import donky.microsoft.aspnet.signalr.client.LogLevel;
import donky.microsoft.aspnet.signalr.client.Logger;
import donky.microsoft.aspnet.signalr.client.MessageResult;

public class TransportHelper {
    public static MessageResult processReceivedData(String data, ConnectionBase connection) {
        Logger logger = connection.getLogger();
        MessageResult result = new MessageResult();
        
        if (data == null) {
            return result;
        }

        data = data.trim();

        if ("".equals(data)) {
            return result;
        }

        JsonObject json = null;

        try {
            json = connection.getJsonParser().parse(data).getAsJsonObject();
        } catch (Exception e) {
            connection.onError(e, false);
            return result;
        }

        if (json.entrySet().size() == 0) {
            return result;
        }

        if (json.get("I") != null) {
            logger.log("Invoking message received with: " + json.toString(), LogLevel.Verbose);
            connection.onReceived(json);
        } else {

            // disconnected
            if (json.get("D") != null) {
                if (json.get("D").getAsInt() == 1) {
                    logger.log("Disconnect message received", LogLevel.Verbose);
                    result.setDisconnect(true);
                    return result;
                }
            }

            // should reconnect
            if (json.get("T") != null) {
                if (json.get("T").getAsInt() == 1) {
                    logger.log("Reconnect message received", LogLevel.Verbose);
                    result.setReconnect(true);
                }
            }

            if (json.get("G") != null) {
                String groupsToken = json.get("G").getAsString();
                logger.log("Group token received: " + groupsToken, LogLevel.Verbose);
                connection.setGroupsToken(groupsToken);
            }

            JsonElement messages = json.get("M");
            if (messages != null && messages.isJsonArray()) {

                if (json.get("C") != null) {
                    String messageId = json.get("C").getAsString();
                    logger.log("MessageId received: " + messageId, LogLevel.Verbose);
                    connection.setMessageId(messageId);
                }

                JsonArray messagesArray = messages.getAsJsonArray();
                int size = messagesArray.size();

                for (int i = 0; i < size; i++) {
                    JsonElement message = messagesArray.get(i);
                    JsonElement processedMessage = null;

                    logger.log("Invoking OnReceived with: " + processedMessage, LogLevel.Verbose);
                    connection.onReceived(message);
                }
            }

            if (json.get("S") != null) {
                if (json.get("S").getAsInt() == 1) {
                    logger.log("Initialization message received", LogLevel.Information);
                    result.setInitialize(true);
                }
            }
        }

        return result;
    }

    /**
     * Creates the query string used on receive
     * 
     * @param transport
     *            Transport to use
     * @param connection
     *            Current connection
     * @return The querystring
     */
    public static String getReceiveQueryString(ClientTransport transport, ConnectionBase connection) {
        StringBuilder qsBuilder = new StringBuilder();

        qsBuilder.append("?transport=" + transport.getName()).append("&connectionToken=" + urlEncode(connection.getConnectionToken()));

        qsBuilder.append("&connectionId=" + urlEncode(connection.getConnectionId()));

        if (connection.getMessageId() != null) {
            qsBuilder.append("&messageId=" + urlEncode(connection.getMessageId()));
        }

        if (connection.getGroupsToken() != null) {
            qsBuilder.append("&groupsToken=" + urlEncode(connection.getGroupsToken()));
        }

        String connectionData = connection.getConnectionData();
        if (connectionData != null) {
            qsBuilder.append("&connectionData=" + urlEncode(connectionData));
        }

        String customQuery = connection.getQueryString();

        if (customQuery != null) {
            qsBuilder.append("&").append(customQuery);
        }

        return qsBuilder.toString();
    }

    /**
     * Creates the query string used on sending
     * 
     * @param connection
     *            current connection
     * @return The querystring
     */
    public static String getNegotiateQueryString(ConnectionBase connection) {
        StringBuilder qsBuilder = new StringBuilder();
        qsBuilder.append("?clientProtocol=" + urlEncode(Connection.PROTOCOL_VERSION.toString()));

        if (connection.getConnectionData() != null) {
            qsBuilder.append("&").append("connectionData=" + urlEncode(connection.getConnectionData()));
        }

        if (connection.getQueryString() != null) {
            qsBuilder.append("&").append(connection.getQueryString());
        }

        return qsBuilder.toString();
    }

    /**
     * Creates the query string used on sending
     * 
     * @param transport
     *            the transport to use
     * @param connection
     *            current connection
     * @return The querystring
     */
    public static String getSendQueryString(ClientTransport transport, ConnectionBase connection) {
        StringBuilder qsBuilder = new StringBuilder();
        qsBuilder.append("?transport=" + TransportHelper.urlEncode(transport.getName()));

        qsBuilder.append("&connectionToken=" + TransportHelper.urlEncode(connection.getConnectionToken()));

        qsBuilder.append("&connectionId=" + TransportHelper.urlEncode(connection.getConnectionId()));

        if (connection.getConnectionData() != null) {
            qsBuilder.append("&connectionData=" + TransportHelper.urlEncode(connection.getConnectionData()));
        }

        if (connection.getQueryString() != null) {
            qsBuilder.append("&").append(connection.getQueryString());
        }

        return qsBuilder.toString();
    }

    public static String urlEncode(String s) {
        if (s == null) {
            return "";
        }

        String encoded = null;
        try {
            encoded = URLEncoder.encode(s, Constants.UTF8_NAME);
        } catch (UnsupportedEncodingException e) {
        }

        return encoded;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy