com.google.gplus.serializer.util.GooglePlusActivityUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gplus.serializer.util.GooglePlusActivityUtil.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.gplus.serializer.util;

import com.google.api.client.util.Maps;
import com.google.api.services.plus.model.Comment;
import com.google.api.services.plus.model.Person;
import org.apache.streams.pojo.extensions.ExtensionUtil;
import org.apache.streams.pojo.json.Activity;
import org.apache.streams.pojo.json.ActivityObject;
import org.apache.streams.pojo.json.Actor;
import org.apache.streams.pojo.json.Image;
import org.apache.streams.pojo.json.Provider;
import org.joda.time.DateTime;
import com.google.common.base.Joiner;
import com.google.common.base.Optional;
import com.google.common.collect.Lists;
import org.apache.streams.exceptions.ActivitySerializerException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.*;
import java.util.List;

import static org.apache.streams.data.util.ActivityUtil.ensureExtensions;

public class GooglePlusActivityUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(GooglePlusActivityUtil.class);

    /**
     * Given a {@link com.google.api.services.plus.model.Person} object and an
     * {@link org.apache.streams.pojo.json.Activity} object, fill out the appropriate details
     *
     * @param item
     * @param activity
     * @throws ActivitySerializerException
     */
    public static void updateActivity(Person item, Activity activity) throws ActivitySerializerException {
        activity.setActor(buildActor(item));
        activity.setVerb("update");

        activity.setId(formatId(activity.getVerb(), Optional.fromNullable(item.getId()).orNull()));

        activity.setProvider(getProvider());
        activity.setPublished(new DateTime());
    }

    /**
     * Given a {@link List} of {@link com.google.api.services.plus.model.Comment} objects and an
     * {@link org.apache.streams.pojo.json.Activity}, update that Activity to contain all comments
     *
     * @param comments
     * @param activity
     */
    public static void updateActivity(List<Comment> comments, Activity activity) {
        for (Comment comment : comments) {
            addComment(activity, comment);
        }

        Map<String, Object> extensions = ensureExtensions(activity);
        extensions.put("comment_count", comments.size());
    }

    /**
     * Given a Google Plus {@link com.google.api.services.plus.model.Activity},
     * convert that into an Activity streams formatted {@link org.apache.streams.pojo.json.Activity}
     *
     * @param gPlusActivity
     * @param activity
     */
    public static void updateActivity(com.google.api.services.plus.model.Activity gPlusActivity,
            Activity activity) {
        activity.setActor(buildActor(gPlusActivity.getActor()));
        activity.setVerb("post");
        activity.setTitle(gPlusActivity.getTitle());
        activity.setUrl(gPlusActivity.getUrl());
        activity.setProvider(getProvider());

        if (gPlusActivity.getObject() != null) {
            activity.setContent(gPlusActivity.getObject().getContent());
        }

        activity.setId(formatId(activity.getVerb(), Optional.fromNullable(gPlusActivity.getId()).orNull()));

        DateTime published = new DateTime(String.valueOf(gPlusActivity.getPublished()));
        activity.setPublished(published);

        setObject(activity, gPlusActivity.getObject());
        addGPlusExtensions(activity, gPlusActivity);
    }

    /**
     * Adds a single {@link com.google.api.services.plus.model.Comment} to the Object.Attachments
     * section of the passed in {@link org.apache.streams.pojo.json.Activity}
     *
     * @param activity
     * @param comment
     */
    private static void addComment(Activity activity, Comment comment) {
        ActivityObject obj = new ActivityObject();

        obj.setId(comment.getId());
        obj.setPublished(new DateTime(String.valueOf(comment.getPublished())));
        obj.setUpdated(new DateTime(String.valueOf(comment.getUpdated())));
        obj.setContent(comment.getObject().getContent());
        obj.setObjectType(comment.getObject().getObjectType());

        Map<String, Object> extensions = Maps.newHashMap();
        extensions.put("googlePlus", comment);

        obj.setAdditionalProperty("extensions", extensions);

        if (activity.getObject() == null) {
            activity.setObject(new ActivityObject());
        }
        if (activity.getObject().getAttachments() == null) {
            activity.getObject().setAttachments(new ArrayList<ActivityObject>());
        }

        activity.getObject().getAttachments().add(obj);
    }

    /**
     * Add in necessary extensions from the passed in {@link com.google.api.services.plus.model.Activity} to the
     * {@link org.apache.streams.pojo.json.Activity} object
     *
     * @param activity
     * @param gPlusActivity
     */
    private static void addGPlusExtensions(Activity activity,
            com.google.api.services.plus.model.Activity gPlusActivity) {
        Map<String, Object> extensions = ExtensionUtil.ensureExtensions(activity);

        com.google.api.services.plus.model.Activity.PlusObject object = gPlusActivity.getObject();
        extensions.put("googlePlus", gPlusActivity);

        if (object != null) {
            com.google.api.services.plus.model.Activity.PlusObject.Plusoners plusoners = object.getPlusoners();
            if (plusoners != null) {
                Map<String, Object> likes = new HashMap<>();
                likes.put("count", plusoners.getTotalItems());
                extensions.put("likes", likes);
            }

            com.google.api.services.plus.model.Activity.PlusObject.Resharers resharers = object.getResharers();
            if (resharers != null) {
                Map<String, Object> rebroadcasts = new HashMap<>();
                rebroadcasts.put("count", resharers.getTotalItems());
                extensions.put("rebroadcasts", rebroadcasts);
            }

            extensions.put("keywords", object.getContent());
        }
    }

    /**
     * Set the {@link org.apache.streams.pojo.json.ActivityObject} field given the passed in
     * {@link com.google.api.services.plus.model.Activity.PlusObject}
     *
     * @param activity
     * @param object
     */
    private static void setObject(Activity activity,
            com.google.api.services.plus.model.Activity.PlusObject object) {
        if (object != null) {
            ActivityObject activityObject = new ActivityObject();

            activityObject.setContent(object.getContent());
            activityObject.setObjectType(object.getObjectType());

            java.util.List<ActivityObject> attachmentsList = Lists.newArrayList();
            if (object.getAttachments() != null) {
                for (com.google.api.services.plus.model.Activity.PlusObject.Attachments attachments : object
                        .getAttachments()) {
                    ActivityObject attach = new ActivityObject();

                    attach.setContent(attachments.getContent());
                    attach.setDisplayName(attachments.getDisplayName());
                    attach.setObjectType(attachments.getObjectType());
                    attach.setUrl(attachments.getUrl());

                    Image image = new Image();
                    com.google.api.services.plus.model.Activity.PlusObject.Attachments.Image image1 = attachments
                            .getImage();

                    if (image1 != null) {
                        image.setUrl(image1.getUrl());
                        attach.setImage(image);
                    }

                    attachmentsList.add(attach);
                }

                activityObject.setAttachments(attachmentsList);
            }
            activity.setObject(activityObject);
        }
    }

    /**
     * Given a {@link com.google.api.services.plus.model.Activity.Actor} object, return a fully fleshed
     * out {@link org.apache.streams.pojo.json.Actor} object
     *
     * @param gPlusActor
     * @return
     */
    private static Actor buildActor(com.google.api.services.plus.model.Activity.Actor gPlusActor) {
        Actor actor = new Actor();

        actor.setDisplayName(gPlusActor.getDisplayName());
        actor.setId(formatId(String.valueOf(gPlusActor.getId())));
        actor.setUrl(gPlusActor.getUrl());

        Image image = new Image();
        com.google.api.services.plus.model.Activity.Actor.Image googlePlusImage = gPlusActor.getImage();

        if (googlePlusImage != null) {
            image.setUrl(googlePlusImage.getUrl());
        }
        actor.setImage(image);

        return actor;
    }

    /**
     * Extract the relevant details from the passed in {@link com.google.api.services.plus.model.Person} object and build
     * an actor with them
     *
     * @param person
     * @return Actor constructed with relevant Person details
     */
    private static Actor buildActor(Person person) {
        Actor actor = new Actor();

        actor.setUrl(person.getUrl());
        actor.setDisplayName(person.getDisplayName());
        actor.setId(formatId(String.valueOf(person.getId())));

        if (person.getAboutMe() != null) {
            actor.setSummary(person.getAboutMe());
        } else if (person.getTagline() != null) {
            actor.setSummary(person.getTagline());
        }

        Image image = new Image();
        Person.Image googlePlusImage = person.getImage();

        if (googlePlusImage != null) {
            image.setUrl(googlePlusImage.getUrl());
        }
        actor.setImage(image);

        Map<String, Object> extensions = new HashMap<String, Object>();

        extensions.put("followers", person.getCircledByCount());
        extensions.put("googleplus", person);
        actor.setAdditionalProperty("extensions", extensions);

        return actor;
    }

    /**
     * Gets the common googleplus {@link org.apache.streams.pojo.json.Provider} object
     * @return a provider object representing GooglePlus
     */
    public static Provider getProvider() {
        Provider provider = new Provider();
        provider.setId("id:providers:googleplus");
        provider.setDisplayName("GooglePlus");
        return provider;
    }

    /**
     * Formats the ID to conform with the Apache Streams activity ID convention
     * @param idparts the parts of the ID to join
     * @return a valid Activity ID in format "id:googleplus:part1:part2:...partN"
     */
    public static String formatId(String... idparts) {
        return Joiner.on(":").join(Lists.asList("id:googleplus", idparts));
    }
}