org.syncany.operations.daemon.messages.api.JsonMessageFactory.java Source code

Java tutorial

Introduction

Here is the source code for org.syncany.operations.daemon.messages.api.JsonMessageFactory.java

Source

/*
 * Syncany, www.syncany.org
 * Copyright (C) 2011-2015 Philipp C. Heckel <philipp.heckel@gmail.com>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.syncany.operations.daemon.messages.api;

import java.util.logging.Level;

import com.google.common.base.Optional;
import com.google.common.collect.Iterables;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

/**
 * @author Christian Roth <christian.roth@port17.de>
 */
public abstract class JsonMessageFactory extends MessageFactory {
    private static final Gson SERIALIZER = new Gson();
    private static final JsonParser PARSER = new JsonParser();

    public static Response toResponse(String responseMessageString) throws Exception {
        Message responseMessage = toMessage(responseMessageString);

        if (!(responseMessage instanceof Response)) {
            throw new Exception("Invalid class: Message is not a response type: " + responseMessage.getClass());
        }

        return (Response) responseMessage;
    }

    public static Request toRequest(String responseMessageString) throws Exception {
        Message requestMessage = toMessage(responseMessageString);

        if (!(requestMessage instanceof Request)) {
            throw new Exception("Invalid class: Message is not a request type:" + requestMessage.getClass());
        }

        return (Request) requestMessage;
    }

    public static Message toMessage(String messageStr) throws Exception {
        String messageType = getMessageType(messageStr);
        Class<? extends Message> messageClass = getMessageClass(messageType);

        JsonObject result = PARSER.parse(messageStr).getAsJsonObject();
        JsonElement serializedMessage = Optional.fromNullable(Iterables.get(result.entrySet(), 0).getValue())
                .or(new JsonObject());

        Message message = SERIALIZER.fromJson(serializedMessage, messageClass);
        logger.log(Level.INFO, "Message created: " + message);

        return message;
    }

    public static String toJson(Message response) throws Exception {
        JsonElement je = SERIALIZER.toJsonTree(response);
        JsonObject jo = new JsonObject();
        jo.add(response.getClass().getSimpleName(), je);
        return jo.toString();
    }

    /** 
     * Parses JSON message for message type. 
     * First key contains message name:
     * 
     * <pre>
     * { "messageType":
     *   {
     *     // payload
     *   }
     * }
     * </pre>
     */
    private static String getMessageType(String message) throws Exception {
        try {
            JsonObject result = PARSER.parse(message).getAsJsonObject();
            return Iterables.get(result.entrySet(), 0).getKey();
        } catch (Exception e) {
            throw new Exception("Cannot find type of message. Invalid JSON: " + message);
        }
    }
}