/*
* 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.moreover;
import org.apache.streams.data.util.ActivityUtil;
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.Provider;
import com.moreover.api.Article;
import com.moreover.api.Author;
import com.moreover.api.AuthorPublishingPlatform;
import com.moreover.api.Feed;
import com.moreover.api.Source;
import org.joda.time.DateTime;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import static org.apache.streams.data.util.ActivityUtil.LANGUAGE_EXTENSION;
import static org.apache.streams.data.util.ActivityUtil.LOCATION_EXTENSION;
import static org.apache.streams.data.util.ActivityUtil.LOCATION_EXTENSION_COUNTRY;
import static org.apache.streams.data.util.ActivityUtil.getObjectId;
/**
* Provides utilities for Moreover data.
*/
public class MoreoverUtils {
private MoreoverUtils() {
}
public static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
/**
* convert article into Activity.
* @param article article
* @return Activity
*/
public static Activity convert(Article article) {
Activity activity = new Activity();
Source source = article.getSource();
activity.setActor(convert(article.getAuthor(), source.getName()));
activity.setProvider(convert(source));
activity.setTarget(convertTarget(source));
activity.setObject(convertObject(article));
activity.setPublished(DateTime.parse(article.getPublishedDate()));
activity.setContent(article.getContent());
activity.setTitle(article.getTitle());
activity.setVerb("posted");
fixActivityId(activity);
addLocationExtension(activity, source);
addLanguageExtension(activity, article);
activity.setLinks(convertLinks(article));
return activity;
}
/**
* convert Source to Provider.
* @param source Source
* @return Provider
*/
public static Provider convert(Source source) {
Provider provider = new Provider();
Feed feed = source.getFeed();
String display = getProviderId(feed);
provider.setId(ActivityUtil.getProviderId(display.trim().toLowerCase().replace(" ", "_")));
provider.setDisplayName(display);
provider.setUrl(feed.getUrl());
return provider;
}
/**
* convert Author and platformName to Actor.
* @param author Author
* @param platformName platformName
* @return $.actor
*/
public static ActivityObject convert(Author author, String platformName) {
ActivityObject actor = new ActivityObject();
AuthorPublishingPlatform platform = author.getPublishingPlatform();
String userId = platform.getUserId();
if (userId != null) {
actor.setId(ActivityUtil.getPersonId(getProviderId(platformName), userId));
}
actor.setDisplayName(author.getName());
actor.setUrl(author.getHomeUrl());
actor.setSummary(author.getDescription());
actor.setAdditionalProperty("email", author.getEmail());
return actor;
}
private static void fixActivityId(Activity activity) {
if (activity.getId() != null && activity.getId().matches("\\{[a-z]*\\}")) {
activity.setId(null);
}
}
private static List convertLinks(Article article) {
List<String> list = new LinkedList<>();
Article.OutboundUrls outboundUrls = article.getOutboundUrls();
if (outboundUrls != null) {
for (String url : outboundUrls.getOutboundUrl()) {
list.add(url);
}
}
return list;
}
/**
* convertTarget.
* @param source source
* @return ActivityObject $.target
*/
public static ActivityObject convertTarget(Source source) {
ActivityObject object = new ActivityObject();
object.setUrl(source.getHomeUrl());
object.setDisplayName(source.getName());
return object;
}
/**
* convertObject.
* @param article article
* @return ActivityObject $.object
*/
public static ActivityObject convertObject(Article article) {
ActivityObject object = new ActivityObject();
object.setContent(article.getContent());
object.setSummary(article.getTitle());
object.setUrl(article.getOriginalUrl());
object.setObjectType(article.getDataFormat());
String type = article.getDataFormat().equals("text") ? "article" : article.getDataFormat();
object.setId(getObjectId(getProviderId(article.getSource().getFeed()), type, article.getId()));
object.setPublished(DateTime.parse(article.getPublishedDate()));
return object;
}
/**
* addLocationExtension.
* @param activity Activity
* @param source Source
*/
public static void addLocationExtension(Activity activity, Source source) {
Map<String, Object> extensions = ExtensionUtil.getInstance().ensureExtensions(activity);
String country = source.getLocation().getCountryCode() == null
? source.getLocation().getCountry()
: source.getLocation().getCountryCode();
if (country != null) {
Map<String, Object> location = new HashMap<>();
location.put(LOCATION_EXTENSION_COUNTRY, country);
extensions.put(LOCATION_EXTENSION, location);
}
}
/**
* addLanguageExtension.
* @param activity Activity
* @param article Article
*/
public static void addLanguageExtension(Activity activity, Article article) {
Map<String, Object> extensions = ExtensionUtil.getInstance().ensureExtensions(activity);
String language = article.getLanguage();
if (language != null) {
extensions.put(LANGUAGE_EXTENSION, language);
}
}
private static String getProviderId(Feed feed) {
return getProviderId(feed.getPublishingPlatform() == null ? feed.getMediaType() : feed.getPublishingPlatform());
}
private static String getProviderId(String feed) {
return feed.toLowerCase().replace(" ", "_").trim();
}
}