/* * 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.gmail.provider; import org.apache.streams.data.ActivitySerializer; 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.Generator; import org.apache.streams.pojo.json.Icon; import org.apache.streams.pojo.json.Provider; import com.fasterxml.jackson.annotation.JsonBackReference; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonManagedReference; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.node.ObjectNode; import com.googlecode.gmail4j.GmailException; import com.googlecode.gmail4j.GmailMessage; import com.googlecode.gmail4j.javamail.JavaMailGmailMessage; import com.sun.mail.imap.IMAPFolder; import com.sun.mail.imap.IMAPMessage; import com.sun.mail.imap.IMAPSSLStore; import org.apache.commons.lang.NotImplementedException; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; import javax.mail.internet.MimeMultipart; /** * GMailMessageActivitySerializer converts a GMail message to Activity. */ public class GMailMessageActivitySerializer implements ActivitySerializer<GmailMessage> { private static final Logger LOGGER = LoggerFactory.getLogger(GMailMessageActivitySerializer.class); private GMailProvider provider; public GMailMessageActivitySerializer(GMailProvider provider) { this.provider = provider; ObjectMapper mapper = new ObjectMapper(); mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, Boolean.FALSE); mapper.addMixInAnnotations(IMAPSSLStore.class, MessageMixIn.class); mapper.addMixInAnnotations(IMAPFolder.class, MessageMixIn.class); mapper.addMixInAnnotations(IMAPMessage.class, MessageMixIn.class); mapper.addMixInAnnotations(MimeMultipart.class, MessageMixIn.class); mapper.addMixInAnnotations(JavaMailGmailMessage.class, MessageMixIn.class); } public GMailMessageActivitySerializer() { } public static Generator buildGenerator(ObjectNode event) { return null; } public static Icon getIcon(ObjectNode event) { return null; } public static Provider buildProvider(ObjectNode event) { Provider provider = new Provider(); provider.setId("id:providers:gmail"); return provider; } public static List<Object> getLinks(ObjectNode event) { return null; } public static String getUrls(ObjectNode event) { return null; } public static void addGMailExtension(Activity activity, GmailMessage gmailMessage) { Map<String, Object> extensions = ExtensionUtil.getInstance().ensureExtensions(activity); extensions.put("gmail", gmailMessage); } public static String formatId(String... idparts) { return String.join(":", Stream.concat(Arrays.stream(new String[] {"id:googleplus"}), Arrays.stream(idparts)).collect(Collectors.toList())); } @Override public String serializationFormat() { return "gmail.v1"; } @Override public GmailMessage serialize(Activity activity) { return null; } @Override public Activity deserialize(GmailMessage gmailMessage) { Activity activity = new Activity(); activity.setId(formatId(this.provider.getConfig().getUserName(), String.valueOf(gmailMessage.getMessageNumber()))); activity.setPublished(new DateTime(gmailMessage.getSendDate())); Provider provider = new Provider(); provider.setId("http://gmail.com"); provider.setDisplayName("GMail"); activity.setProvider(provider); ActivityObject actor = new ActivityObject(); actor.setId(gmailMessage.getFrom().getEmail()); actor.setDisplayName(gmailMessage.getFrom().getName()); activity.setActor(actor); activity.setVerb("email"); ActivityObject object = new ActivityObject(); try { object.setId(gmailMessage.getTo().get(0).getEmail()); object.setDisplayName(gmailMessage.getTo().get(0).getName()); } catch (GmailException e) { LOGGER.warn(e.getMessage()); } activity.setTitle(gmailMessage.getSubject()); try { activity.setContent(gmailMessage.getContentText()); } catch (GmailException e) { LOGGER.warn(e.getMessage()); } activity.setObject(object); return activity; } @Override public List<Activity> deserializeAll(List<GmailMessage> serializedList) { throw new NotImplementedException("Not currently implemented"); } public Activity convert(ObjectNode event) { return null; } interface MessageMixIn { @JsonManagedReference @JsonIgnore IMAPSSLStore getDefaultFolder(); // we don't need it! @JsonManagedReference @JsonIgnore IMAPSSLStore getPersonalNamespaces(); // we don't need it! @JsonManagedReference @JsonIgnore IMAPFolder getStore(); // we don't need it! // @JsonManagedReference // @JsonIgnore // @JsonBackReference //IMAPFolder getParent(); // we don't need it! @JsonManagedReference @JsonIgnore @JsonBackReference IMAPMessage getFolder(); // we don't need it! @JsonManagedReference @JsonIgnore @JsonProperty("parent") @JsonBackReference MimeMultipart getParent(); } }