com.google.wave.api.impl.EventMessageBundleGsonAdaptor.java Source code

Java tutorial

Introduction

Here is the source code for com.google.wave.api.impl.EventMessageBundleGsonAdaptor.java

Source

/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package com.google.wave.api.impl;

import com.google.gson.InstanceCreator;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.wave.api.Blip;
import com.google.wave.api.BlipData;
import com.google.wave.api.OperationQueue;
import com.google.wave.api.OperationRequest;
import com.google.wave.api.BlipThread;
import com.google.wave.api.Wavelet;
import com.google.wave.api.event.Event;
import com.google.wave.api.event.EventSerializationException;
import com.google.wave.api.event.EventSerializer;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

/**
 * Gson adaptor to serialize and deserialize {@link EventMessageBundle}.
 *
 * @author douwe@google.com (Douwe Osinga)
 */
public class EventMessageBundleGsonAdaptor implements InstanceCreator<EventMessageBundle>,
        JsonSerializer<EventMessageBundle>, JsonDeserializer<EventMessageBundle> {

    public static final String EVENTS_TAG = "events";
    public static final String WAVELET_TAG = "wavelet";
    public static final String BLIPS_TAG = "blips";
    public static final String THREADS_TAG = "threads";
    private static final String PROXYING_FOR_TAG = "proxyingFor";
    private static final String ROBOT_ADDRESS_TAG = "robotAddress";
    private static final String RPC_SERVER_URL_TAG = "rpcServerUrl";

    @Override
    public EventMessageBundle createInstance(Type type) {
        return new EventMessageBundle("", "http://opensocial.example.com");
    }

    @Override
    public JsonElement serialize(EventMessageBundle src, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject result = new JsonObject();

        JsonArray events = new JsonArray();
        for (Event event : src.getEvents()) {
            try {
                events.add(EventSerializer.serialize(event, context));
            } catch (EventSerializationException e) {
                throw new JsonParseException(e);
            }
        }
        result.add(EVENTS_TAG, events);

        result.add(WAVELET_TAG, context.serialize(src.getWaveletData()));
        result.add(BLIPS_TAG, context.serialize(src.getBlipData()));
        result.add(THREADS_TAG, context.serialize(src.getThreads()));
        result.addProperty(ROBOT_ADDRESS_TAG, src.getRobotAddress());

        String proxyingFor = src.getProxyingFor();
        if (proxyingFor != null && !proxyingFor.isEmpty()) {
            result.addProperty(PROXYING_FOR_TAG, proxyingFor);
        }

        String rpcServerUrl = src.getRpcServerUrl();
        if (rpcServerUrl != null && !rpcServerUrl.isEmpty()) {
            result.addProperty(RPC_SERVER_URL_TAG, rpcServerUrl);
        }
        return result;
    }

    @Override
    public EventMessageBundle deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException {
        JsonObject jsonObj = json.getAsJsonObject();
        String robotAddress = jsonObj.get(ROBOT_ADDRESS_TAG).getAsString();
        String rpcServerUrl = "";
        if (jsonObj.has(RPC_SERVER_URL_TAG)) {
            rpcServerUrl = jsonObj.get(RPC_SERVER_URL_TAG).getAsString();
        }
        EventMessageBundle result = new EventMessageBundle(robotAddress, rpcServerUrl);

        OperationQueue operationQueue;
        if (jsonObj.has(PROXYING_FOR_TAG)) {
            result.setProxyingFor(jsonObj.get(PROXYING_FOR_TAG).getAsString());
            operationQueue = new OperationQueue(new ArrayList<OperationRequest>(), result.getProxyingFor());
        } else {
            operationQueue = new OperationQueue();
        }

        // Deserialize wavelet.
        WaveletData waveletData = context.deserialize(jsonObj.get(WAVELET_TAG), WaveletData.class);
        result.setWaveletData(waveletData);
        Map<String, Blip> blips = new HashMap<String, Blip>();
        Map<String, BlipThread> threads = new HashMap<String, BlipThread>();
        Wavelet wavelet = Wavelet.deserialize(operationQueue, blips, threads, waveletData);
        wavelet.setRobotAddress(robotAddress);
        result.setWavelet(wavelet);

        // Deserialize threads.
        Map<String, BlipThread> tempThreads = context.deserialize(jsonObj.get(THREADS_TAG),
                GsonFactory.THREAD_MAP_TYPE);
        for (Entry<String, BlipThread> entry : tempThreads.entrySet()) {
            BlipThread thread = entry.getValue();
            threads.put(entry.getKey(),
                    new BlipThread(thread.getId(), thread.getLocation(), thread.getBlipIds(), blips));
        }

        // Deserialize blips.
        Map<String, BlipData> blipDatas = context.deserialize(jsonObj.get(BLIPS_TAG), GsonFactory.BLIP_MAP_TYPE);
        result.setBlipData(blipDatas);
        for (Entry<String, BlipData> entry : blipDatas.entrySet()) {
            blips.put(entry.getKey(), Blip.deserialize(operationQueue, wavelet, entry.getValue()));
        }

        // Deserialize events.
        JsonArray eventsArray = jsonObj.get(EVENTS_TAG).getAsJsonArray();
        List<Event> events = new ArrayList<Event>(eventsArray.size());
        for (JsonElement element : eventsArray) {
            JsonObject eventObject = element.getAsJsonObject();
            try {
                events.add(EventSerializer.deserialize(wavelet, result, eventObject, context));
            } catch (EventSerializationException e) {
                throw new JsonParseException(e.getMessage());
            }
        }
        result.setEvents(events);
        return result;
    }
}