org.apache.streams.datasift.serializer.DatasiftInteractionActivitySerializer.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.streams.datasift.serializer.DatasiftInteractionActivitySerializer.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
 *
 *   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 org.apache.streams.datasift.serializer;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import org.apache.streams.data.ActivitySerializer;
import org.apache.streams.datasift.Datasift;
import org.apache.streams.datasift.interaction.Interaction;
import org.apache.streams.datasift.links.Links;
import org.apache.streams.datasift.util.StreamsDatasiftMapper;
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.Generator;
import org.apache.streams.pojo.json.Icon;
import org.apache.streams.pojo.json.Image;
import org.apache.streams.pojo.json.Provider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

/**
 *
 */
public class DatasiftInteractionActivitySerializer implements ActivitySerializer<Datasift>, Serializable {

    private static final Logger LOGGER = LoggerFactory.getLogger(DatasiftInteractionActivitySerializer.class);

    private static DatasiftInteractionActivitySerializer instance = new DatasiftInteractionActivitySerializer();

    public static DatasiftInteractionActivitySerializer getInstance() {
        return instance;
    }

    ObjectMapper mapper = StreamsDatasiftMapper.getInstance();

    @Override
    public String serializationFormat() {
        return "application/json+datasift.com.v1.1";
    }

    @Override
    public Datasift serialize(Activity deserialized) {
        throw new UnsupportedOperationException("Cannot currently serialize to Datasift JSON");
    }

    public Activity deserialize(String datasiftJson) {
        try {
            return deserialize(this.mapper.readValue(datasiftJson, Datasift.class));
        } catch (Exception e) {
            LOGGER.error("Exception while trying convert,\n {},\n to a Datasift object.", datasiftJson);
            LOGGER.error("Exception : {}", e);
            throw new RuntimeException(e);
        }
    }

    @Override
    public Activity deserialize(Datasift serialized) {

        try {

            Activity activity = convert(serialized);

            return activity;

        } catch (Exception e) {
            throw new IllegalArgumentException("Unable to deserialize", e);
        }

    }

    @Override
    public List<Activity> deserializeAll(List<Datasift> datasifts) {
        List<Activity> activities = Lists.newArrayList();
        for (Datasift datasift : datasifts) {
            activities.add(deserialize(datasift));
        }
        return activities;
    }

    public static Generator buildGenerator(Interaction interaction) {
        Generator generator = new Generator();
        generator.setDisplayName(interaction.getSource());
        generator.setId(interaction.getSource());
        return generator;
    }

    public static Icon getIcon(Interaction interaction) {
        return null;
    }

    public static Provider buildProvider(Interaction interaction) {
        Provider provider = new Provider();
        provider.setId("id:providers:" + interaction.getType());
        provider.setDisplayName(interaction.getType());
        return provider;
    }

    public static String getUrls(Interaction interaction) {
        return null;
    }

    public static void addDatasiftExtension(Activity activity, Datasift datasift) {
        Map<String, Object> extensions = ExtensionUtil.ensureExtensions(activity);
        extensions.put("datasift", datasift);
    }

    public static String formatId(String... idparts) {
        return Joiner.on(":").join(Lists.asList("id:datasift", idparts));
    }

    public Activity convert(Datasift event) {

        Preconditions.checkNotNull(event);
        Preconditions.checkNotNull(event.getInteraction());

        Activity activity = new Activity();
        activity.setActor(buildActor(event.getInteraction()));
        activity.setVerb(selectVerb(event));
        activity.setObject(buildActivityObject(event.getInteraction()));
        activity.setId(formatId(activity.getVerb(), event.getInteraction().getId()));
        activity.setTarget(buildTarget(event.getInteraction()));
        activity.setPublished(event.getInteraction().getCreatedAt());
        activity.setGenerator(buildGenerator(event.getInteraction()));
        activity.setIcon(getIcon(event.getInteraction()));
        activity.setProvider(buildProvider(event.getInteraction()));
        activity.setTitle(event.getInteraction().getTitle());
        activity.setContent(event.getInteraction().getContent());
        activity.setUrl(event.getInteraction().getLink());
        activity.setLinks(getLinks(event));
        addDatasiftExtension(activity, event);
        if (event.getInteraction().getGeo() != null) {
            addLocationExtension(activity, event.getInteraction());
        }
        return activity;
    }

    private String selectVerb(Datasift event) {
        return "post";
    }

    public Actor buildActor(Interaction interaction) {
        Actor actor = new Actor();
        org.apache.streams.datasift.interaction.Author author = interaction.getAuthor();
        if (author == null) {
            LOGGER.warn("Interaction does not contain author information.");
            return actor;
        }
        String userName = author.getUsername();
        String name = author.getName();
        Long id = author.getId();
        if (userName != null) {
            actor.setDisplayName(userName);
        } else {
            actor.setDisplayName(name);
        }

        if (id != null) {
            actor.setId(id.toString());
        } else {
            if (userName != null)
                actor.setId(userName);
            else
                actor.setId(name);
        }
        Image image = new Image();
        image.setUrl(interaction.getAuthor().getAvatar());
        actor.setImage(image);
        if (interaction.getAuthor().getLink() != null) {
            actor.setUrl(interaction.getAuthor().getLink());
        }
        return actor;
    }

    public static ActivityObject buildActivityObject(Interaction interaction) {
        ActivityObject actObj = new ActivityObject();
        actObj.setObjectType(interaction.getContenttype());
        actObj.setUrl(interaction.getLink());
        actObj.setId(formatId("post", interaction.getId()));
        actObj.setContent(interaction.getContent());

        return actObj;
    }

    public static List<String> getLinks(Datasift event) {
        List<String> result = Lists.newArrayList();
        Links links = event.getLinks();
        if (links == null)
            return null;
        for (Object link : links.getNormalizedUrl()) {
            if (link != null) {
                if (link instanceof String) {
                    result.add((String) link);
                } else {
                    LOGGER.warn("link is not of type String : {}", link.getClass().getName());
                }
            }
        }
        return result;
    }

    public static ActivityObject buildTarget(Interaction interaction) {
        return null;
    }

    public static void addLocationExtension(Activity activity, Interaction interaction) {
        Map<String, Object> extensions = ExtensionUtil.ensureExtensions(activity);
        Map<String, Object> location = new HashMap<String, Object>();
        Map<String, Double> coordinates = new HashMap<String, Double>();
        coordinates.put("latitude", interaction.getGeo().getLatitude());
        coordinates.put("longitude", interaction.getGeo().getLongitude());
        location.put("coordinates", coordinates);
        extensions.put("location", location);
    }

    public static String firstStringIfNotNull(List<Object> list) {
        if (list != null && list.size() > 0) {
            return (String) list.get(0);
        } else
            return null;
    }
}