http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/7afd6e0a/streams-contrib/streams-provider-facebook/src/test/java/org/apache/streams/facebook/test/FacebookDocumentClassifierTest.java ---------------------------------------------------------------------- diff --git a/streams-contrib/streams-provider-facebook/src/test/java/org/apache/streams/facebook/test/FacebookDocumentClassifierTest.java b/streams-contrib/streams-provider-facebook/src/test/java/org/apache/streams/facebook/test/FacebookDocumentClassifierTest.java deleted file mode 100644 index bfd5b38..0000000 --- a/streams-contrib/streams-provider-facebook/src/test/java/org/apache/streams/facebook/test/FacebookDocumentClassifierTest.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * 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.facebook.test; - -import org.apache.streams.facebook.Page; -import org.apache.streams.facebook.Post; -import org.apache.streams.facebook.serializer.FacebookDocumentClassifier; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -public class FacebookDocumentClassifierTest { - private String empty = ""; - private String def = "{}"; - private String post = "{\"metadata\":null,\"id\":\"687664828_10153082499914829\",\"from\":{\"metadata\":null,\"id\":\"687664828\",\"name\":\"Steve Blackmon\",\"category\":null,\"createdTime\":null},\"message\":null,\"picture\":\"https://fbexternal-a.akamaihd.net/app_full_proxy.php?app=184136951108&v=1&size=z&cksum=7f4094dff37cedd69072cd2c0b3728b7&src=https%3A%2F%2Fstatic.tripit.com%2Fimages%2Fplaces%2Fsantamonica.jpg%3Fv%3D2014-08-13\",\"link\":\"http://www.tripit.com/trip/show/id/130372979/traveler_fb_uid/687664828?us=fc&um=fa&un=fd\",\"name\":\"Steve is about to leave on a trip to Santa Monica, CA.\",\"caption\":\"Aug 2014 for 3 days\",\"description\":\"TripIt - Free online trip planner and free travel itinerary website for organizing vacations, group trips or business travel\",\"source\":null,\"icon\":\"https://fbcdn-photos-d-a.akamaihd.net/hphotos-ak-xpa1/t39.2080-0/851580_10151367869221109_1073679965_n.gif\",\"actions\":[{\"name\":\"Comment\",\"link\":\"https://www.facebook .com/687664828/posts/10153082499914829\"},{\"name\":\"Like\",\"link\":\"https://www.facebook.com/687664828/posts/10153082499914829\"},{\"name\":\"Plan a trip on TripIt\",\"link\":\"http://www.tripit.com/?us=fc&um=fa&un=fd\"}],\"privacy\":{\"value\":\"ALL_FRIENDS\",\"friends\":\"EMPTY\",\"description\":[\"Your friends\"]},\"type\":\"link\",\"sharesCount\":null,\"place\":null,\"statusType\":\"app_created_story\",\"story\":null,\"objectId\":null,\"application\":{\"id\":\"184136951108\",\"name\":\"TripIt\",\"description\":null,\"category\":null,\"company\":null,\"iconUrl\":null,\"subcategory\":null,\"link\":null,\"logoUrl\":null,\"dailyActiveUsers\":null,\"weeklyActiveUsers\":null,\"monthlyActiveUsers\":null,\"namespace\":\"tripitcom\",\"authDialogDataHelpUrl\":null,\"authDialogDescription\":null,\"authDialogHeadline\":null,\"authDialogPermsExplanation\":null,\"authReferralDefaultActivityPrivacy\":null,\"authReferralResponseType\":null,\"canvasUrl\":null,\"contactEmail\":null,\"createdT ime\":null,\"creatorUid\":null,\"deauthCallbackUrl\":null,\"iphoneAppStoreId\":null,\"hostingUrl\":null,\"mobileWebUrl\":null,\"pageTabDefaultName\":null,\"pageTabUrl\":null,\"privacyPolicyUrl\":null,\"secureCanvasUrl\":null,\"securePageTabUrl\":null,\"serverIpWhitelist\":null,\"termsOfServiceUrl\":null,\"userSupportEmail\":null,\"userSupportUrl\":null,\"websiteUrl\":null,\"canvasName\":null},\"createdTime\":\"2014-08-13T12:22:20.000+0000\",\"updatedTime\":\"2014-08-13T12:22:20.000+0000\",\"scheduledPublishTime\":null,\"targeting\":null,\"published\":null}"; - private String page = "{\"metadata\":null,\"id\":\"142803045874943\",\"name\":\"Senator Angus S. King, Jr.\",\"category\":\"Government official\",\"createdTime\":null,\"link\":\"https://www.facebook.com/SenatorAngusSKingJr\",\"likes\":10246,\"location\":{\"street\":\"359 Dirksen Senate Office Building\",\"city\":\"Washington, District of Columbia\",\"state\":\"DC\",\"country\":\"United States\",\"zip\":\"20510\",\"latitude\":null,\"longitude\":null,\"text\":null},\"phone\":\"202-224-5344\",\"checkins\":0,\"picture\":null,\"cover\":{\"id\":null,\"source\":\"https://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-xpa1/v/t1.0-9/10288792_321537751334804_8200105519500362465_n.jpg?oh=fbcde9b3e1e011dfa3e699628629bc53&oe=546FB617&__gda__=1416717487_3fa5781d7d9c3d58f2bc798a36ac6fc0\",\"offsetY\":9},\"website\":\"http://www.king.senate.gov\",\"talkingAboutCount\":5034,\"accessToken\":null,\"wereHereCount\":0,\"about\":\"Welcome to the official Facebook page of Senator Angus S. King, Jr. (I-ME). \\nhttp://king.senate.gov\\nhttps://twitter.com/SenAngusKing\\nhttps://www.youtube.com/SenatorAngusKing\",\"username\":\"SenatorAngusSKingJr\",\"published\":true,\"communityPage\":false}"; - - - @Test(expected=IllegalArgumentException.class) - public void emptyJSONTest() { - Class inClass = FacebookDocumentClassifier.getInstance().detectClass(empty); - } - - @Test - public void defaultDetectTest() { - Class inClass = FacebookDocumentClassifier.getInstance().detectClass(post); - assertEquals(inClass, Post.class); - } - - @Test - public void postDetectTest() { - Class inClass = FacebookDocumentClassifier.getInstance().detectClass(post); - assertEquals(inClass, Post.class); - } - - @Test - public void pageDetectTest() { - Class inClass = FacebookDocumentClassifier.getInstance().detectClass(page); - assertEquals(inClass, Page.class); - } -} \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/7afd6e0a/streams-contrib/streams-provider-facebook/src/test/java/org/apache/streams/facebook/test/FacebookEventClassifierTest.java ---------------------------------------------------------------------- diff --git a/streams-contrib/streams-provider-facebook/src/test/java/org/apache/streams/facebook/test/FacebookEventClassifierTest.java b/streams-contrib/streams-provider-facebook/src/test/java/org/apache/streams/facebook/test/FacebookEventClassifierTest.java new file mode 100644 index 0000000..076aca9 --- /dev/null +++ b/streams-contrib/streams-provider-facebook/src/test/java/org/apache/streams/facebook/test/FacebookEventClassifierTest.java @@ -0,0 +1,57 @@ +/* + * 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.facebook.test; + +import org.apache.streams.facebook.Page; +import org.apache.streams.facebook.Post; +import org.apache.streams.facebook.provider.FacebookEventClassifier; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class FacebookEventClassifierTest { + private String empty = ""; + private String def = "{}"; + private String post = "{\"metadata\":null,\"id\":\"687664828_10153082499914829\",\"from\":{\"metadata\":null,\"id\":\"687664828\",\"name\":\"Steve Blackmon\",\"category\":null,\"createdTime\":null},\"message\":null,\"picture\":\"https://fbexternal-a.akamaihd.net/app_full_proxy.php?app=184136951108&v=1&size=z&cksum=7f4094dff37cedd69072cd2c0b3728b7&src=https%3A%2F%2Fstatic.tripit.com%2Fimages%2Fplaces%2Fsantamonica.jpg%3Fv%3D2014-08-13\",\"link\":\"http://www.tripit.com/trip/show/id/130372979/traveler_fb_uid/687664828?us=fc&um=fa&un=fd\",\"name\":\"Steve is about to leave on a trip to Santa Monica, CA.\",\"caption\":\"Aug 2014 for 3 days\",\"description\":\"TripIt - Free online trip planner and free travel itinerary website for organizing vacations, group trips or business travel\",\"source\":null,\"icon\":\"https://fbcdn-photos-d-a.akamaihd.net/hphotos-ak-xpa1/t39.2080-0/851580_10151367869221109_1073679965_n.gif\",\"actions\":[{\"name\":\"Comment\",\"link\":\"https://www.facebook .com/687664828/posts/10153082499914829\"},{\"name\":\"Like\",\"link\":\"https://www.facebook.com/687664828/posts/10153082499914829\"},{\"name\":\"Plan a trip on TripIt\",\"link\":\"http://www.tripit.com/?us=fc&um=fa&un=fd\"}],\"privacy\":{\"value\":\"ALL_FRIENDS\",\"friends\":\"EMPTY\",\"description\":[\"Your friends\"]},\"type\":\"link\",\"sharesCount\":null,\"place\":null,\"statusType\":\"app_created_story\",\"story\":null,\"objectId\":null,\"application\":{\"id\":\"184136951108\",\"name\":\"TripIt\",\"description\":null,\"category\":null,\"company\":null,\"iconUrl\":null,\"subcategory\":null,\"link\":null,\"logoUrl\":null,\"dailyActiveUsers\":null,\"weeklyActiveUsers\":null,\"monthlyActiveUsers\":null,\"namespace\":\"tripitcom\",\"authDialogDataHelpUrl\":null,\"authDialogDescription\":null,\"authDialogHeadline\":null,\"authDialogPermsExplanation\":null,\"authReferralDefaultActivityPrivacy\":null,\"authReferralResponseType\":null,\"canvasUrl\":null,\"contactEmail\":null,\"createdT ime\":null,\"creatorUid\":null,\"deauthCallbackUrl\":null,\"iphoneAppStoreId\":null,\"hostingUrl\":null,\"mobileWebUrl\":null,\"pageTabDefaultName\":null,\"pageTabUrl\":null,\"privacyPolicyUrl\":null,\"secureCanvasUrl\":null,\"securePageTabUrl\":null,\"serverIpWhitelist\":null,\"termsOfServiceUrl\":null,\"userSupportEmail\":null,\"userSupportUrl\":null,\"websiteUrl\":null,\"canvasName\":null},\"createdTime\":\"2014-08-13T12:22:20.000+0000\",\"updatedTime\":\"2014-08-13T12:22:20.000+0000\",\"scheduledPublishTime\":null,\"targeting\":null,\"published\":null}"; + private String page = "{\"metadata\":null,\"id\":\"142803045874943\",\"name\":\"Senator Angus S. King, Jr.\",\"category\":\"Government official\",\"createdTime\":null,\"link\":\"https://www.facebook.com/SenatorAngusSKingJr\",\"likes\":10246,\"location\":{\"street\":\"359 Dirksen Senate Office Building\",\"city\":\"Washington, District of Columbia\",\"state\":\"DC\",\"country\":\"United States\",\"zip\":\"20510\",\"latitude\":null,\"longitude\":null,\"text\":null},\"phone\":\"202-224-5344\",\"checkins\":0,\"picture\":null,\"cover\":{\"id\":null,\"source\":\"https://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-xpa1/v/t1.0-9/10288792_321537751334804_8200105519500362465_n.jpg?oh=fbcde9b3e1e011dfa3e699628629bc53&oe=546FB617&__gda__=1416717487_3fa5781d7d9c3d58f2bc798a36ac6fc0\",\"offsetY\":9},\"website\":\"http://www.king.senate.gov\",\"talkingAboutCount\":5034,\"accessToken\":null,\"wereHereCount\":0,\"about\":\"Welcome to the official Facebook page of Senator Angus S. King, Jr. (I-ME). \\nhttp://king.senate.gov\\nhttps://twitter.com/SenAngusKing\\nhttps://www.youtube.com/SenatorAngusKing\",\"username\":\"SenatorAngusSKingJr\",\"published\":true,\"communityPage\":false}"; + + + @Test(expected=IllegalArgumentException.class) + public void emptyJSONTest() { + Class inClass = FacebookEventClassifier.detectClass(empty); + } + + @Test + public void defaultDetectTest() { + Class inClass = FacebookEventClassifier.detectClass(post); + assertEquals(inClass, Post.class); + } + + @Test + public void postDetectTest() { + Class inClass = FacebookEventClassifier.detectClass(post); + assertEquals(inClass, Post.class); + } + + @Test + public void pageDetectTest() { + Class inClass = FacebookEventClassifier.detectClass(page); + assertEquals(inClass, Page.class); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/7afd6e0a/streams-contrib/streams-provider-facebook/src/test/java/org/apache/streams/facebook/test/SimplePageTest.java ---------------------------------------------------------------------- diff --git a/streams-contrib/streams-provider-facebook/src/test/java/org/apache/streams/facebook/test/SimplePageTest.java b/streams-contrib/streams-provider-facebook/src/test/java/org/apache/streams/facebook/test/SimplePageTest.java index 2df0655..856ad36 100644 --- a/streams-contrib/streams-provider-facebook/src/test/java/org/apache/streams/facebook/test/SimplePageTest.java +++ b/streams-contrib/streams-provider-facebook/src/test/java/org/apache/streams/facebook/test/SimplePageTest.java @@ -23,7 +23,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import org.apache.streams.core.StreamsDatum; import org.apache.streams.facebook.Page; -import org.apache.streams.facebook.api.FacebookPageActivityConverter; +import org.apache.streams.facebook.api.FacebookPageActivitySerializer; import org.apache.streams.facebook.processor.FacebookTypeConverter; import org.apache.streams.jackson.StreamsJacksonMapper; import org.apache.streams.pojo.json.Activity; @@ -48,7 +48,7 @@ public class SimplePageTest { private static final String FACEBOOK_JSON= "{\"metadata\":null,\"id\":\"142803045874943\",\"name\":\"Senator Angus S. King, Jr.\",\"category\":\"Government official\",\"createdTime\":null,\"link\":\"https://www.facebook.com/SenatorAngusSKingJr\",\"likes\":10246,\"location\":{\"street\":\"359 Dirksen Senate Office Building\",\"city\":\"Washington, District of Columbia\",\"state\":\"DC\",\"country\":\"United States\",\"zip\":\"20510\",\"latitude\":null,\"longitude\":null,\"text\":null},\"phone\":\"202-224-5344\",\"checkins\":0,\"picture\":null,\"cover\":{\"id\":null,\"source\":\"https://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-xpa1/v/t1.0-9/10288792_321537751334804_8200105519500362465_n.jpg?oh=fbcde9b3e1e011dfa3e699628629bc53&oe=546FB617&__gda__=1416717487_3fa5781d7d9c3d58f2bc798a36ac6fc0\",\"offsetY\":9},\"website\":\"http://www.king.senate.gov\",\"talkingAboutCount\":5034,\"accessToken\":null,\"wereHereCount\":0,\"about\":\"Welcome to the official Facebook page of Senator Angus S. King, Jr. (I-ME).\\nhttp://king.senate.gov\\nhttps://twitter.com/SenAngusKing\\nhttps://www.youtube.com/SenatorAngusKing\",\"username\":\"SenatorAngusSKingJr\",\"published\":true,\"communityPage\":false}"; - private FacebookPageActivityConverter facebookPageActivitySerializer = new FacebookPageActivityConverter(); + private FacebookPageActivitySerializer facebookPageActivitySerializer = new FacebookPageActivitySerializer(); @Before public void setUp() throws Exception { http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/7afd6e0a/streams-contrib/streams-provider-gnip/gnip-edc-googleplus/src/main/java/com/gplus/api/GPlusActivityConverter.java ---------------------------------------------------------------------- diff --git a/streams-contrib/streams-provider-gnip/gnip-edc-googleplus/src/main/java/com/gplus/api/GPlusActivityConverter.java b/streams-contrib/streams-provider-gnip/gnip-edc-googleplus/src/main/java/com/gplus/api/GPlusActivityConverter.java deleted file mode 100644 index 2015e32..0000000 --- a/streams-contrib/streams-provider-gnip/gnip-edc-googleplus/src/main/java/com/gplus/api/GPlusActivityConverter.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * 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 com.gplus.api; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.commons.lang.NotImplementedException; -import org.apache.streams.data.ActivityConverter; -import org.apache.streams.data.util.ActivityUtil; -import org.apache.streams.gnip.powertrack.GnipActivityFixer; -import org.apache.streams.pojo.json.Activity; -import org.json.JSONObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; -import java.util.Map; - -/** - * Created with IntelliJ IDEA. - * User: mdelaet - * Date: 8/30/13 - * Time: 10:48 AM - * To change this template use File | Settings | File Templates. - */ -public class GPlusActivityConverter implements ActivityConverter<String> { - private final static Logger LOGGER = LoggerFactory.getLogger(GPlusActivityConverter.class); - - @Override - public String serializationFormat() { - return "application/gplus+xml"; - } - - @Override - public String serialize(Activity deserialized) { - ObjectMapper jsonMapper = new ObjectMapper(); - String jsonString = new String(); - try{ - jsonString = jsonMapper.writeValueAsString(deserialized); - }catch(Exception e){ - LOGGER.error("Exception serializing Activity Object: " + e); - } - return jsonString; //To change body of implemented methods use File | Settings | File Templates. - } - - @Override - public Activity deserialize(String serialized) { - ObjectMapper jsonMapper = new ObjectMapper(); - JSONObject jsonObject = new JSONObject(); - JSONObject fixedObject = new JSONObject(); - - try{ - jsonObject = new JSONObject(serialized); - fixedObject = GnipActivityFixer.fix(jsonObject); - }catch(Exception e){ - LOGGER.error("Exception deserializing string: " + e); - } - - Activity activity = new Activity(); - try { - activity = jsonMapper.readValue(fixedObject.toString(), Activity.class); - Map<String, Object> extension = ActivityUtil.ensureExtensions(activity); - extension.put("likes", fixedObject.getJSONObject("object").getJSONObject("plusoners").get("totalItems")); - extension.put("rebroadcast", fixedObject.getJSONObject("object").getJSONObject("resharers").get("totalItems")); - } catch( Exception e ) { - LOGGER.error(jsonObject.toString()); - LOGGER.error(fixedObject.toString()); - e.printStackTrace(); - } - return activity; - } - - @Override - public List<Activity> deserializeAll(List<String> serializedList) { - //TODO Support - throw new NotImplementedException("Not currently supported by this deserializer"); - } -} http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/7afd6e0a/streams-contrib/streams-provider-gnip/gnip-edc-googleplus/src/main/java/com/gplus/api/GPlusActivitySerializer.java ---------------------------------------------------------------------- diff --git a/streams-contrib/streams-provider-gnip/gnip-edc-googleplus/src/main/java/com/gplus/api/GPlusActivitySerializer.java b/streams-contrib/streams-provider-gnip/gnip-edc-googleplus/src/main/java/com/gplus/api/GPlusActivitySerializer.java new file mode 100644 index 0000000..0cea46a --- /dev/null +++ b/streams-contrib/streams-provider-gnip/gnip-edc-googleplus/src/main/java/com/gplus/api/GPlusActivitySerializer.java @@ -0,0 +1,93 @@ +/* + * 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 com.gplus.api; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.lang.NotImplementedException; +import org.apache.streams.data.ActivitySerializer; +import org.apache.streams.data.util.ActivityUtil; +import org.apache.streams.gnip.powertrack.GnipActivityFixer; +import org.apache.streams.pojo.json.Activity; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Map; + +/** + * Created with IntelliJ IDEA. + * User: mdelaet + * Date: 8/30/13 + * Time: 10:48 AM + * To change this template use File | Settings | File Templates. + */ +public class GPlusActivitySerializer implements ActivitySerializer<String> { + private final static Logger LOGGER = LoggerFactory.getLogger(GPlusActivitySerializer.class); + + @Override + public String serializationFormat() { + return "application/gplus+xml"; + } + + @Override + public String serialize(Activity deserialized) { + ObjectMapper jsonMapper = new ObjectMapper(); + String jsonString = new String(); + try{ + jsonString = jsonMapper.writeValueAsString(deserialized); + }catch(Exception e){ + LOGGER.error("Exception serializing Activity Object: " + e); + } + return jsonString; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public Activity deserialize(String serialized) { + ObjectMapper jsonMapper = new ObjectMapper(); + JSONObject jsonObject = new JSONObject(); + JSONObject fixedObject = new JSONObject(); + + try{ + jsonObject = new JSONObject(serialized); + fixedObject = GnipActivityFixer.fix(jsonObject); + }catch(Exception e){ + LOGGER.error("Exception deserializing string: " + e); + } + + Activity activity = new Activity(); + try { + activity = jsonMapper.readValue(fixedObject.toString(), Activity.class); + Map<String, Object> extension = ActivityUtil.ensureExtensions(activity); + extension.put("likes", fixedObject.getJSONObject("object").getJSONObject("plusoners").get("totalItems")); + extension.put("rebroadcast", fixedObject.getJSONObject("object").getJSONObject("resharers").get("totalItems")); + } catch( Exception e ) { + LOGGER.error(jsonObject.toString()); + LOGGER.error(fixedObject.toString()); + e.printStackTrace(); + } + return activity; + } + + @Override + public List<Activity> deserializeAll(List<String> serializedList) { + //TODO Support + throw new NotImplementedException("Not currently supported by this deserializer"); + } +} http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/7afd6e0a/streams-contrib/streams-provider-gnip/gnip-edc-googleplus/src/test/java/com/gplus/api/GPlusEDCAsActivityTest.java ---------------------------------------------------------------------- diff --git a/streams-contrib/streams-provider-gnip/gnip-edc-googleplus/src/test/java/com/gplus/api/GPlusEDCAsActivityTest.java b/streams-contrib/streams-provider-gnip/gnip-edc-googleplus/src/test/java/com/gplus/api/GPlusEDCAsActivityTest.java index 6f7db24..3662a01 100644 --- a/streams-contrib/streams-provider-gnip/gnip-edc-googleplus/src/test/java/com/gplus/api/GPlusEDCAsActivityTest.java +++ b/streams-contrib/streams-provider-gnip/gnip-edc-googleplus/src/test/java/com/gplus/api/GPlusEDCAsActivityTest.java @@ -43,10 +43,10 @@ public class GPlusEDCAsActivityTest { private ObjectMapper jsonMapper; XmlMapper xmlMapper; - private GPlusActivityConverter gplusSerializer; + private GPlusActivitySerializer gplusSerializer; public GPlusEDCAsActivityTest() { - gplusSerializer = new GPlusActivityConverter(); + gplusSerializer = new GPlusActivitySerializer(); jsonMapper = new ObjectMapper(); xmlMapper = new XmlMapper(); } http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/7afd6e0a/streams-contrib/streams-provider-gnip/gnip-edc-reddit/src/main/java/com/reddit/api/RedditActivityConverter.java ---------------------------------------------------------------------- diff --git a/streams-contrib/streams-provider-gnip/gnip-edc-reddit/src/main/java/com/reddit/api/RedditActivityConverter.java b/streams-contrib/streams-provider-gnip/gnip-edc-reddit/src/main/java/com/reddit/api/RedditActivityConverter.java deleted file mode 100644 index e9a6bae..0000000 --- a/streams-contrib/streams-provider-gnip/gnip-edc-reddit/src/main/java/com/reddit/api/RedditActivityConverter.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * 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 com.reddit.api; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.commons.lang.NotImplementedException; -import org.apache.streams.data.ActivityConverter; -import org.apache.streams.data.util.ActivityUtil; -import org.apache.streams.gnip.powertrack.GnipActivityFixer; -import org.apache.streams.pojo.json.Activity; -import org.json.JSONObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Created with IntelliJ IDEA. - * User: mdelaet - * Date: 8/29/13 - * Time: 8:32 AM - * To change this template use File | Settings | File Templates. - */ -public class RedditActivityConverter implements ActivityConverter<String> { - private final static Logger LOGGER = LoggerFactory.getLogger(RedditActivityConverter.class); - - public static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZ"; - public static final String PROVIDER_NAME = "facebook"; - - - @Override - public String serializationFormat() { - return "application/reddit+xml"; - } - - @Override - public String serialize(Activity deserialized) { - ObjectMapper jsonMapper = new ObjectMapper(); - String jsonString = new String(); - try{ - jsonString = jsonMapper.writeValueAsString(deserialized); - }catch(Exception e){ - LOGGER.error("Exception serializing Activity Object: " + e); - } - return jsonString; //To change body of implemented methods use File | Settings | File Templates. - } - - @Override - public Activity deserialize(String serialized) { - ObjectMapper jsonMapper = new ObjectMapper(); - JSONObject jsonObject = new JSONObject(); - JSONObject fixedObject = new JSONObject(); - - HashMap<String, String> raw = new HashMap<String, String>(); - raw.put("original", serialized); - - try{ - jsonObject = new JSONObject(serialized); - fixedObject = GnipActivityFixer.fix(jsonObject); - }catch(Exception e){ - LOGGER.error("Exception deserializing string: " + e); - } - - Activity activity = new Activity(); - try { - activity = jsonMapper.readValue(fixedObject.toString(), Activity.class); - Map<String, Object> extension = ActivityUtil.ensureExtensions(activity); - if (fixedObject.names().toString().contains("object")){ - if (fixedObject.getJSONObject("object").names().toString().contains("statistics")){ - if (fixedObject.getJSONObject("object").getJSONObject("statistics").names().toString().contains("upVotes")){ - extension.put("likes", fixedObject.getJSONObject("object").getJSONObject("statistics").get("upVotes")); - } - } - } - - } catch( Exception e ) { - LOGGER.error(jsonObject.toString()); - LOGGER.error(fixedObject.toString()); - e.printStackTrace(); - } - return activity; - } - - @Override - public List<Activity> deserializeAll(List<String> serializedList) { - //TODO Support - throw new NotImplementedException("Not currently supported by this deserializer"); - } -} http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/7afd6e0a/streams-contrib/streams-provider-gnip/gnip-edc-reddit/src/main/java/com/reddit/api/RedditActivitySerializer.java ---------------------------------------------------------------------- diff --git a/streams-contrib/streams-provider-gnip/gnip-edc-reddit/src/main/java/com/reddit/api/RedditActivitySerializer.java b/streams-contrib/streams-provider-gnip/gnip-edc-reddit/src/main/java/com/reddit/api/RedditActivitySerializer.java new file mode 100644 index 0000000..c57bea0 --- /dev/null +++ b/streams-contrib/streams-provider-gnip/gnip-edc-reddit/src/main/java/com/reddit/api/RedditActivitySerializer.java @@ -0,0 +1,107 @@ +/* + * 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 com.reddit.api; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.lang.NotImplementedException; +import org.apache.streams.data.ActivitySerializer; +import org.apache.streams.data.util.ActivityUtil; +import org.apache.streams.gnip.powertrack.GnipActivityFixer; +import org.apache.streams.pojo.json.Activity; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created with IntelliJ IDEA. + * User: mdelaet + * Date: 8/29/13 + * Time: 8:32 AM + * To change this template use File | Settings | File Templates. + */ +public class RedditActivitySerializer implements ActivitySerializer<String> { + private final static Logger LOGGER = LoggerFactory.getLogger(RedditActivitySerializer.class); + + public static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZ"; + public static final String PROVIDER_NAME = "facebook"; + + + @Override + public String serializationFormat() { + return "application/reddit+xml"; + } + + @Override + public String serialize(Activity deserialized) { + ObjectMapper jsonMapper = new ObjectMapper(); + String jsonString = new String(); + try{ + jsonString = jsonMapper.writeValueAsString(deserialized); + }catch(Exception e){ + LOGGER.error("Exception serializing Activity Object: " + e); + } + return jsonString; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public Activity deserialize(String serialized) { + ObjectMapper jsonMapper = new ObjectMapper(); + JSONObject jsonObject = new JSONObject(); + JSONObject fixedObject = new JSONObject(); + + HashMap<String, String> raw = new HashMap<String, String>(); + raw.put("original", serialized); + + try{ + jsonObject = new JSONObject(serialized); + fixedObject = GnipActivityFixer.fix(jsonObject); + }catch(Exception e){ + LOGGER.error("Exception deserializing string: " + e); + } + + Activity activity = new Activity(); + try { + activity = jsonMapper.readValue(fixedObject.toString(), Activity.class); + Map<String, Object> extension = ActivityUtil.ensureExtensions(activity); + if (fixedObject.names().toString().contains("object")){ + if (fixedObject.getJSONObject("object").names().toString().contains("statistics")){ + if (fixedObject.getJSONObject("object").getJSONObject("statistics").names().toString().contains("upVotes")){ + extension.put("likes", fixedObject.getJSONObject("object").getJSONObject("statistics").get("upVotes")); + } + } + } + + } catch( Exception e ) { + LOGGER.error(jsonObject.toString()); + LOGGER.error(fixedObject.toString()); + e.printStackTrace(); + } + return activity; + } + + @Override + public List<Activity> deserializeAll(List<String> serializedList) { + //TODO Support + throw new NotImplementedException("Not currently supported by this deserializer"); + } +} http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/7afd6e0a/streams-contrib/streams-provider-gnip/gnip-edc-reddit/src/test/java/com/reddit/api/RedditEDCAsActivityJSONTest.java ---------------------------------------------------------------------- diff --git a/streams-contrib/streams-provider-gnip/gnip-edc-reddit/src/test/java/com/reddit/api/RedditEDCAsActivityJSONTest.java b/streams-contrib/streams-provider-gnip/gnip-edc-reddit/src/test/java/com/reddit/api/RedditEDCAsActivityJSONTest.java index 9b1203f..fdf8d02 100644 --- a/streams-contrib/streams-provider-gnip/gnip-edc-reddit/src/test/java/com/reddit/api/RedditEDCAsActivityJSONTest.java +++ b/streams-contrib/streams-provider-gnip/gnip-edc-reddit/src/test/java/com/reddit/api/RedditEDCAsActivityJSONTest.java @@ -43,10 +43,10 @@ public class RedditEDCAsActivityJSONTest { private ObjectMapper jsonMapper; XmlMapper xmlMapper; - private RedditActivityConverter redditSerializer; + private RedditActivitySerializer redditSerializer; public RedditEDCAsActivityJSONTest() { - redditSerializer = new RedditActivityConverter(); + redditSerializer = new RedditActivitySerializer(); jsonMapper = new ObjectMapper(); xmlMapper = new XmlMapper(); } http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/7afd6e0a/streams-contrib/streams-provider-gnip/gnip-powertrack/src/main/java/org/apache/streams/gnip/powertrack/ActivityXMLActivityConverter.java ---------------------------------------------------------------------- diff --git a/streams-contrib/streams-provider-gnip/gnip-powertrack/src/main/java/org/apache/streams/gnip/powertrack/ActivityXMLActivityConverter.java b/streams-contrib/streams-provider-gnip/gnip-powertrack/src/main/java/org/apache/streams/gnip/powertrack/ActivityXMLActivityConverter.java deleted file mode 100644 index 5d77f77..0000000 --- a/streams-contrib/streams-provider-gnip/gnip-powertrack/src/main/java/org/apache/streams/gnip/powertrack/ActivityXMLActivityConverter.java +++ /dev/null @@ -1,240 +0,0 @@ -/* - * 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.gnip.powertrack; - -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.dataformat.xml.XmlMapper; -import org.apache.commons.lang.NotImplementedException; -import org.apache.commons.lang.StringUtils; -import org.apache.streams.data.ActivityConverter; -import org.apache.streams.pojo.json.Activity; -import org.json.JSONException; -import org.json.JSONObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; -import java.io.StringReader; -import java.io.StringWriter; -import java.util.Iterator; -import java.util.List; - -/** - * Created with IntelliJ IDEA. - * User: rebanks - * Date: 9/5/13 - * Time: 3:07 PM - * To change this template use File | Settings | File Templates. - */ -public class ActivityXMLActivityConverter implements ActivityConverter<String> { - - private static final Logger LOGGER = LoggerFactory.getLogger(ActivityXMLActivityConverter.class); - - private ObjectMapper mapper; - private XmlMapper xmlMapper; - - public ActivityXMLActivityConverter() { - mapper = new ObjectMapper(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, Boolean.FALSE); - mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, Boolean.TRUE); - mapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, Boolean.TRUE); - xmlMapper = new XmlMapper(); - xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, Boolean.FALSE); - xmlMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, Boolean.TRUE); - xmlMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, Boolean.TRUE); - } - - - @Override - public String serializationFormat() { - return "gnip_activity_xml"; //To change body of implemented methods use File | Settings | File Templates. - } - - @Override - public String serialize(Activity deserialized) { - throw new UnsupportedOperationException(); - } - - @Override - public Activity deserialize(String serializedXML) { - Activity activity = null; - try { - activity = xmlMapper.readValue(new StringReader(setContentIfEmpty(serializedXML)), Activity.class); - activity = mapper.readValue(new StringReader(fixActivityXML(activity, serializedXML)), Activity.class); - } catch (Exception e) { - LOGGER.error("Exception correcting Gnip Activity Xml to Activity format.", e); - LOGGER.error("Xml that caused error : {}", serializedXML); - } - return activity; //To change body of implemented methods use File | Settings | File Templates. - } - - @Override - public List<Activity> deserializeAll(List<String> serializedList) { - throw new NotImplementedException("Not currently supported by this deserializer"); - } - - private String fixActivityXML(Activity activity, String xml) throws Exception{ - JSONObject jsonObject = new JSONObject(mapper.writeValueAsString(activity)); - JSONObject newObject = (JSONObject) fixActivityXML(jsonObject); - StringReader str = new StringReader(newObject.toString()); - newObject = formatFixedJSON(newObject); - newObject = fixDateFormats(newObject, xml); - newObject = createTopLevelConentField(newObject); - return newObject.toString(); - - } - - private Object fixActivityXML(Object obj) throws Exception { - if(obj instanceof JSONObject) { - JSONObject json = new JSONObject(); - JSONObject old = (JSONObject) obj; - Iterator keys = old.keys(); - while(keys.hasNext()) { - String key = (String) keys.next(); - if(StringUtils.isBlank(key)) { - return fixActivityXML(old.get(key)); - } - else if(!key.equals("type")){ - Object o = fixActivityXML(old.get(key)); - if(o != null) - json.put(key, o); - } - - } - if(json.keys().hasNext()) - return json; - else - return null; - } - else { - return obj; - } - - } - - private JSONObject formatFixedJSON(JSONObject json) throws Exception{ - JSONObject topLink = json.optJSONObject("link"); - if(topLink != null) { - json.put("link", topLink.getString("href")); - } - JSONObject actor = json.optJSONObject("actor"); - if(actor != null) { - JSONObject link = actor.optJSONObject("link"); - if(link != null) { - actor.put("link", link.get("href")); - } - } - JSONObject object = json.optJSONObject("object"); - if(object != null) { - JSONObject link = object.optJSONObject("link"); - if(link != null) { - object.put("link", link.get("href")); - } - } - String generator = json.optString("generator"); - if(generator != null) { - JSONObject gen = new JSONObject(); - gen.put("displayName", generator); - json.put("generator", gen); - } - return json; - } - - private JSONObject fixDateFormats(JSONObject json, String xml) throws Exception{ - DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - InputSource is = new InputSource(new StringReader(xml)); - Document doc = docBuilder.parse(is); - //why? - doc.getDocumentElement().normalize(); - if(json.optLong("published", -1L) != -1L) { - json.put("published", getValueFromXML("published", doc)); - } - if(json.optLong("updated", -1L) != -1L) { - json.put("updated", getValueFromXML("updated", doc)); - } - if(json.optLong("created", -1L) != -1L) { - json.put("created", getValueFromXML("created", doc)); - } - return json; - } - - private JSONObject createTopLevelConentField(JSONObject json) throws JSONException { - if(!json.isNull("content")) { - return json; - } - JSONObject object = json.optJSONObject("object"); - if(object != null) { - String content = object.optString("content"); - if(content == null) { - content = object.optString("summary"); - } - if(content != null) { - json.put("content", content); - } - } - return json; - } - - private String getValueFromXML(String tag, Document doc) throws Exception{ - Element base = (Element) doc.getElementsByTagName("entry").item(0); - return base.getElementsByTagName(tag).item(0).getTextContent(); - } - - private String setContentIfEmpty(String xml) throws Exception { - DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - InputSource is = new InputSource(new StringReader(xml)); - Document doc = docBuilder.parse(is); - doc.getDocumentElement().normalize(); - Element base = (Element) doc.getElementsByTagName("entry").item(0); - NodeList nodeList = base.getChildNodes(); -// for(int i=0; i < nodeList.getLength(); ++i) { -// System.out.println(nodeList.item(i).getNodeName()); -// } - Element obj = (Element)base.getElementsByTagName("activity:object").item(0); - Element content = (Element)obj.getElementsByTagName("content").item(0); -// System.out.println("Number of child nodes : "+content.getChildNodes().getLength()); -// System.out.println("Text content before : "+content.getTextContent()); - if(content.getTextContent() == null || content.getTextContent().equals("")) { - content.setTextContent(" "); - } -// System.out.println("Number of child nodes after : "+content.getChildNodes().getLength()); -// System.out.println("Text content after : "+content.getTextContent()); - TransformerFactory tf = TransformerFactory.newInstance(); - Transformer transformer = tf.newTransformer(); - transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); - StringWriter writer = new StringWriter(); - transformer.transform(new DOMSource(doc), new StreamResult(writer)); - String output = writer.getBuffer().toString().replaceAll("\n|\r", ""); -// System.out.println(output); -// System.out.println(output); -// System.out.println(content); - return output; - } -} http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/7afd6e0a/streams-contrib/streams-provider-gnip/gnip-powertrack/src/main/java/org/apache/streams/gnip/powertrack/ActivityXMLActivitySerializer.java ---------------------------------------------------------------------- diff --git a/streams-contrib/streams-provider-gnip/gnip-powertrack/src/main/java/org/apache/streams/gnip/powertrack/ActivityXMLActivitySerializer.java b/streams-contrib/streams-provider-gnip/gnip-powertrack/src/main/java/org/apache/streams/gnip/powertrack/ActivityXMLActivitySerializer.java new file mode 100644 index 0000000..e75927f --- /dev/null +++ b/streams-contrib/streams-provider-gnip/gnip-powertrack/src/main/java/org/apache/streams/gnip/powertrack/ActivityXMLActivitySerializer.java @@ -0,0 +1,240 @@ +/* + * 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.gnip.powertrack; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.xml.XmlMapper; +import org.apache.commons.lang.NotImplementedException; +import org.apache.commons.lang.StringUtils; +import org.apache.streams.data.ActivitySerializer; +import org.apache.streams.pojo.json.Activity; +import org.json.JSONException; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.Iterator; +import java.util.List; + +/** + * Created with IntelliJ IDEA. + * User: rebanks + * Date: 9/5/13 + * Time: 3:07 PM + * To change this template use File | Settings | File Templates. + */ +public class ActivityXMLActivitySerializer implements ActivitySerializer<String> { + + private static final Logger LOGGER = LoggerFactory.getLogger(ActivityXMLActivitySerializer.class); + + private ObjectMapper mapper; + private XmlMapper xmlMapper; + + public ActivityXMLActivitySerializer() { + mapper = new ObjectMapper(); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, Boolean.FALSE); + mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, Boolean.TRUE); + mapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, Boolean.TRUE); + xmlMapper = new XmlMapper(); + xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, Boolean.FALSE); + xmlMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, Boolean.TRUE); + xmlMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, Boolean.TRUE); + } + + + @Override + public String serializationFormat() { + return "gnip_activity_xml"; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public String serialize(Activity deserialized) { + throw new UnsupportedOperationException(); + } + + @Override + public Activity deserialize(String serializedXML) { + Activity activity = null; + try { + activity = xmlMapper.readValue(new StringReader(setContentIfEmpty(serializedXML)), Activity.class); + activity = mapper.readValue(new StringReader(fixActivityXML(activity, serializedXML)), Activity.class); + } catch (Exception e) { + LOGGER.error("Exception correcting Gnip Activity Xml to Activity format.", e); + LOGGER.error("Xml that caused error : {}", serializedXML); + } + return activity; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public List<Activity> deserializeAll(List<String> serializedList) { + throw new NotImplementedException("Not currently supported by this deserializer"); + } + + private String fixActivityXML(Activity activity, String xml) throws Exception{ + JSONObject jsonObject = new JSONObject(mapper.writeValueAsString(activity)); + JSONObject newObject = (JSONObject) fixActivityXML(jsonObject); + StringReader str = new StringReader(newObject.toString()); + newObject = formatFixedJSON(newObject); + newObject = fixDateFormats(newObject, xml); + newObject = createTopLevelConentField(newObject); + return newObject.toString(); + + } + + private Object fixActivityXML(Object obj) throws Exception { + if(obj instanceof JSONObject) { + JSONObject json = new JSONObject(); + JSONObject old = (JSONObject) obj; + Iterator keys = old.keys(); + while(keys.hasNext()) { + String key = (String) keys.next(); + if(StringUtils.isBlank(key)) { + return fixActivityXML(old.get(key)); + } + else if(!key.equals("type")){ + Object o = fixActivityXML(old.get(key)); + if(o != null) + json.put(key, o); + } + + } + if(json.keys().hasNext()) + return json; + else + return null; + } + else { + return obj; + } + + } + + private JSONObject formatFixedJSON(JSONObject json) throws Exception{ + JSONObject topLink = json.optJSONObject("link"); + if(topLink != null) { + json.put("link", topLink.getString("href")); + } + JSONObject actor = json.optJSONObject("actor"); + if(actor != null) { + JSONObject link = actor.optJSONObject("link"); + if(link != null) { + actor.put("link", link.get("href")); + } + } + JSONObject object = json.optJSONObject("object"); + if(object != null) { + JSONObject link = object.optJSONObject("link"); + if(link != null) { + object.put("link", link.get("href")); + } + } + String generator = json.optString("generator"); + if(generator != null) { + JSONObject gen = new JSONObject(); + gen.put("displayName", generator); + json.put("generator", gen); + } + return json; + } + + private JSONObject fixDateFormats(JSONObject json, String xml) throws Exception{ + DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + InputSource is = new InputSource(new StringReader(xml)); + Document doc = docBuilder.parse(is); + //why? + doc.getDocumentElement().normalize(); + if(json.optLong("published", -1L) != -1L) { + json.put("published", getValueFromXML("published", doc)); + } + if(json.optLong("updated", -1L) != -1L) { + json.put("updated", getValueFromXML("updated", doc)); + } + if(json.optLong("created", -1L) != -1L) { + json.put("created", getValueFromXML("created", doc)); + } + return json; + } + + private JSONObject createTopLevelConentField(JSONObject json) throws JSONException { + if(!json.isNull("content")) { + return json; + } + JSONObject object = json.optJSONObject("object"); + if(object != null) { + String content = object.optString("content"); + if(content == null) { + content = object.optString("summary"); + } + if(content != null) { + json.put("content", content); + } + } + return json; + } + + private String getValueFromXML(String tag, Document doc) throws Exception{ + Element base = (Element) doc.getElementsByTagName("entry").item(0); + return base.getElementsByTagName(tag).item(0).getTextContent(); + } + + private String setContentIfEmpty(String xml) throws Exception { + DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + InputSource is = new InputSource(new StringReader(xml)); + Document doc = docBuilder.parse(is); + doc.getDocumentElement().normalize(); + Element base = (Element) doc.getElementsByTagName("entry").item(0); + NodeList nodeList = base.getChildNodes(); +// for(int i=0; i < nodeList.getLength(); ++i) { +// System.out.println(nodeList.item(i).getNodeName()); +// } + Element obj = (Element)base.getElementsByTagName("activity:object").item(0); + Element content = (Element)obj.getElementsByTagName("content").item(0); +// System.out.println("Number of child nodes : "+content.getChildNodes().getLength()); +// System.out.println("Text content before : "+content.getTextContent()); + if(content.getTextContent() == null || content.getTextContent().equals("")) { + content.setTextContent(" "); + } +// System.out.println("Number of child nodes after : "+content.getChildNodes().getLength()); +// System.out.println("Text content after : "+content.getTextContent()); + TransformerFactory tf = TransformerFactory.newInstance(); + Transformer transformer = tf.newTransformer(); + transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); + StringWriter writer = new StringWriter(); + transformer.transform(new DOMSource(doc), new StreamResult(writer)); + String output = writer.getBuffer().toString().replaceAll("\n|\r", ""); +// System.out.println(output); +// System.out.println(output); +// System.out.println(content); + return output; + } +} http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/7afd6e0a/streams-contrib/streams-provider-gnip/gnip-powertrack/src/main/java/org/apache/streams/gnip/powertrack/PowerTrackActivityConverter.java ---------------------------------------------------------------------- diff --git a/streams-contrib/streams-provider-gnip/gnip-powertrack/src/main/java/org/apache/streams/gnip/powertrack/PowerTrackActivityConverter.java b/streams-contrib/streams-provider-gnip/gnip-powertrack/src/main/java/org/apache/streams/gnip/powertrack/PowerTrackActivityConverter.java deleted file mode 100644 index 3f8409b..0000000 --- a/streams-contrib/streams-provider-gnip/gnip-powertrack/src/main/java/org/apache/streams/gnip/powertrack/PowerTrackActivityConverter.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * 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.gnip.powertrack; - -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.commons.lang.NotImplementedException; -import org.apache.streams.data.ActivityConverter; -import org.apache.streams.pojo.json.Activity; -import org.json.JSONObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.StringReader; -import java.util.List; - -/** - * Created with IntelliJ IDEA. - * User: rebanks - * Date: 9/5/13 - * Time: 2:29 PM - * To change this template use File | Settings | File Templates. - */ -public class PowerTrackActivityConverter implements ActivityConverter<String> { - - private static final Logger LOGGER = LoggerFactory.getLogger(PowerTrackActivityConverter.class); - - private ObjectMapper mapper; - - public PowerTrackActivityConverter() { - mapper = new ObjectMapper(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, Boolean.FALSE); - mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, Boolean.TRUE); - mapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, Boolean.TRUE); - } - - - - @Override - public String serializationFormat() { - return "gnip_powertrack"; //To change body of implemented methods use File | Settings | File Templates. - } - - @Override - public String serialize(Activity deserialized) { - throw new UnsupportedOperationException(); - } - - @Override - public Activity deserialize(String serialized) { - Activity activity = null; - try { - JSONObject jsonObject = new JSONObject(serialized); - String content = jsonObject.optString("content", null); - if(content == null) { - content = jsonObject.optString("body", null); - if(content == null) { - content = jsonObject.optString("summary", null); - if(content == null) { - JSONObject object = jsonObject.optJSONObject("object"); - if(object != null) { - content = object.optString("content", null); - if(content == null) { - content = object.optString("body", null); - if(content == null) { - content = object.optString("summary", null); - } - } - } - } - } - - } - if(content != null) { - jsonObject.put("content", content); - } - String dateTime = jsonObject.optString("postedTime"); - if(dateTime != null) { - jsonObject.put("published", dateTime); - } - JSONObject actor = jsonObject.optJSONObject("actor"); - if(actor != null) { - String url = actor.optString("image"); - if(url != null) { - JSONObject media = new JSONObject(); - media.put("url", url); - actor.put("image", media); - } - } - serialized = jsonObject.toString(); - StringReader reader = new StringReader(serialized); - activity = this.mapper.readValue(reader, Activity.class); - } catch (Exception e) { - LOGGER.error("Exception deserializing powertrack string to Activity Object.", e); - LOGGER.error("Exception on json : {}", serialized); - } - return activity; - } - - @Override - public List<Activity> deserializeAll(List<String> serializedList) { - throw new NotImplementedException("Not currently supported by this deserializer"); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/7afd6e0a/streams-contrib/streams-provider-gnip/gnip-powertrack/src/main/java/org/apache/streams/gnip/powertrack/PowerTrackActivitySerializer.java ---------------------------------------------------------------------- diff --git a/streams-contrib/streams-provider-gnip/gnip-powertrack/src/main/java/org/apache/streams/gnip/powertrack/PowerTrackActivitySerializer.java b/streams-contrib/streams-provider-gnip/gnip-powertrack/src/main/java/org/apache/streams/gnip/powertrack/PowerTrackActivitySerializer.java new file mode 100644 index 0000000..55b1423 --- /dev/null +++ b/streams-contrib/streams-provider-gnip/gnip-powertrack/src/main/java/org/apache/streams/gnip/powertrack/PowerTrackActivitySerializer.java @@ -0,0 +1,121 @@ +/* + * 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.gnip.powertrack; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.lang.NotImplementedException; +import org.apache.streams.data.ActivitySerializer; +import org.apache.streams.pojo.json.Activity; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.StringReader; +import java.util.List; + +/** + * Created with IntelliJ IDEA. + * User: rebanks + * Date: 9/5/13 + * Time: 2:29 PM + * To change this template use File | Settings | File Templates. + */ +public class PowerTrackActivitySerializer implements ActivitySerializer<String> { + + private static final Logger LOGGER = LoggerFactory.getLogger(PowerTrackActivitySerializer.class); + + private ObjectMapper mapper; + + public PowerTrackActivitySerializer() { + mapper = new ObjectMapper(); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, Boolean.FALSE); + mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, Boolean.TRUE); + mapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, Boolean.TRUE); + } + + + + @Override + public String serializationFormat() { + return "gnip_powertrack"; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public String serialize(Activity deserialized) { + throw new UnsupportedOperationException(); + } + + @Override + public Activity deserialize(String serialized) { + Activity activity = null; + try { + JSONObject jsonObject = new JSONObject(serialized); + String content = jsonObject.optString("content", null); + if(content == null) { + content = jsonObject.optString("body", null); + if(content == null) { + content = jsonObject.optString("summary", null); + if(content == null) { + JSONObject object = jsonObject.optJSONObject("object"); + if(object != null) { + content = object.optString("content", null); + if(content == null) { + content = object.optString("body", null); + if(content == null) { + content = object.optString("summary", null); + } + } + } + } + } + + } + if(content != null) { + jsonObject.put("content", content); + } + String dateTime = jsonObject.optString("postedTime"); + if(dateTime != null) { + jsonObject.put("published", dateTime); + } + JSONObject actor = jsonObject.optJSONObject("actor"); + if(actor != null) { + String url = actor.optString("image"); + if(url != null) { + JSONObject media = new JSONObject(); + media.put("url", url); + actor.put("image", media); + } + } + serialized = jsonObject.toString(); + StringReader reader = new StringReader(serialized); + activity = this.mapper.readValue(reader, Activity.class); + } catch (Exception e) { + LOGGER.error("Exception deserializing powertrack string to Activity Object.", e); + LOGGER.error("Exception on json : {}", serialized); + } + return activity; + } + + @Override + public List<Activity> deserializeAll(List<String> serializedList) { + throw new NotImplementedException("Not currently supported by this deserializer"); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/7afd6e0a/streams-contrib/streams-provider-gnip/gnip-powertrack/src/test/java/org/apache/streams/gnip/powertrack/test/PowerTrackDeserializationTest.java ---------------------------------------------------------------------- diff --git a/streams-contrib/streams-provider-gnip/gnip-powertrack/src/test/java/org/apache/streams/gnip/powertrack/test/PowerTrackDeserializationTest.java b/streams-contrib/streams-provider-gnip/gnip-powertrack/src/test/java/org/apache/streams/gnip/powertrack/test/PowerTrackDeserializationTest.java index 047d200..6ff7f6e 100644 --- a/streams-contrib/streams-provider-gnip/gnip-powertrack/src/test/java/org/apache/streams/gnip/powertrack/test/PowerTrackDeserializationTest.java +++ b/streams-contrib/streams-provider-gnip/gnip-powertrack/src/test/java/org/apache/streams/gnip/powertrack/test/PowerTrackDeserializationTest.java @@ -18,7 +18,7 @@ package org.apache.streams.gnip.powertrack.test; -import org.apache.streams.gnip.powertrack.PowerTrackActivityConverter; +import org.apache.streams.gnip.powertrack.PowerTrackActivitySerializer; import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; @@ -33,14 +33,14 @@ import org.slf4j.LoggerFactory; */ public class PowerTrackDeserializationTest { - private static final Logger LOGGER = LoggerFactory.getLogger(PowerTrackActivityConverter.class); + private static final Logger LOGGER = LoggerFactory.getLogger(PowerTrackActivitySerializer.class); private static final String ptData1= "{\"gnip\":{\"matching_rules\":[{\"tag\":\"toujours_DE_DE_de\"}],\"klout_score\":32,\"klout_profile\":{\"topics\":[],\"klout_user_id\":\"141018977628748348\",\"link\":\"http://klout.com/user/id/141018977628748348\"},\"language\":{\"value\":\"fr\"}},\"body\":\"RT @Albayraakkk: J'attends ton SMS, tu attends le miens. On croit toujours que l'autre va envoyer un message en premier. Bref, on ne se par\\u201a??\",\"favoritesCount\":0,\"link\":\"http://twitter.com/alexandragriett/statuses/375760903104638976\",\"retweetCount\":168,\"twitter_lang\":\"fr\",\"postedTime\":\"2013-09-05T23:22:35.000Z\",\"provider\":{\"link\":\"http://www.twitter.com\",\"displayName\":\"Twitter\",\"objectType\":\"service\"},\"actor\":{\"summary\":null,\"twitterTimeZone\":null,\"friendsCount\":68,\"favoritesCount\":3,\"link\":\"http://www.twitter.com/alexandragriett\",\"postedTime\":\"2013-05-01T17:52:16.000Z\",\"image\":\"https://si0.twimg.com/profile_images/37880000041435 3370/ef4170ca183eed9f7f30665712baba05_normal.jpeg\",\"links\":[{\"rel\":\"me\",\"href\":null}],\"listedCount\":0,\"id\":\"id:twitter.com:1395160326\",\"languages\":[\"fr\"],\"verified\":false,\"utcOffset\":null,\"followersCount\":47,\"preferredUsername\":\"alexandragriett\",\"displayName\":\"MauvaiseIdee\",\"statusesCount\":333,\"objectType\":\"person\"},\"object\":{\"body\":\"J'attends ton SMS, tu attends le miens. On croit toujours que l'autre va envoyer un message en premier. Bref, on ne se parle plus...\",\"favoritesCount\":24,\"link\":\"http://twitter.com/Albayraakkk/statuses/370496182172540928\",\"twitter_lang\":\"fr\",\"postedTime\":\"2013-08-22T10:42:27.000Z\",\"provider\":{\"link\":\"http://www.twitter.com\",\"displayName\":\"Twitter\",\"objectType\":\"service\"},\"actor\":{\"summary\":\"Le meilleur est dans mes favoris ! J'followback sur Instagram : http://instagram.com/Albayraakkk Kik : Cihan69200 #TeamBooba #TeamLacrim\",\"twitterTimeZone\":\"Athens\",\"friendsCount\":24 998,\"favoritesCount\":677,\"location\":{\"displayName\":\"Dans Ta Timeline\",\"objectType\":\"place\"},\"link\":\"http://www.twitter.com/Albayraakkk\",\"postedTime\":\"2012-06-23T20:59:05.000Z\",\"image\":\"https://si0.twimg.com/profile_images/378800000410070574/26edc26ad5ccb223da8b850244b468eb_normal.jpeg\",\"links\":[{\"rel\":\"me\",\"href\":\"http://facebook.com/CihanAlbayraak\"}],\"listedCount\":69,\"id\":\"id:twitter.com:616472380\",\"languages\":[\"fr\"],\"verified\":false,\"utcOffset\":\"10800\",\"followersCount\":76068,\"preferredUsername\":\"Albayraakkk\",\"displayName\":\"LA VIRGULE \\u201a??\",\"statusesCount\":671,\"objectType\":\"person\"},\"object\":{\"summary\":\"J'attends ton SMS, tu attends le miens. On croit toujours que l'autre va envoyer un message en premier. Bref, on ne se parle plus...\",\"id\":\"object:search.twitter.com,2005:370496182172540928\",\"link\":\"http://twitter.com/Albayraakkk/statuses/370496182172540928\",\"postedTime\":\"2013-08-22T10:42:27.000Z \",\"objectType\":\"note\"},\"twitter_entities\":{\"symbols\":[],\"urls\":[],\"hashtags\":[],\"user_mentions\":[]},\"id\":\"tag:search.twitter.com,2005:370496182172540928\",\"verb\":\"post\",\"generator\":{\"link\":\"http://twitter.com/download/iphone\",\"displayName\":\"Twitter for iPhone\"},\"objectType\":\"activity\"},\"twitter_entities\":{\"symbols\":[],\"urls\":[],\"hashtags\":[],\"user_mentions\":[{\"id\":616472380,\"name\":\"LA VIRGULE \\u201a??\",\"indices\":[3,15],\"screen_name\":\"Albayraakkk\",\"id_str\":\"616472380\"}]},\"twitter_filter_level\":\"medium\",\"content\":\"RT @Albayraakkk: J'attends ton SMS, tu attends le miens. On croit toujours que l'autre va envoyer un message en premier. Bref, on ne se par\\u201a??\",\"id\":\"tag:search.twitter.com,2005:375760903104638976\",\"verb\":\"share\",\"generator\":{\"link\":\"http://twitter.com/download/iphone\",\"displayName\":\"Twitter for iPhone\"},\"published\":\"2013-09-05T23:22:35.000Z\",\"objectType\":\"activity\"}"; @Test public void deserializationTest() { - PowerTrackActivityConverter serializer = new PowerTrackActivityConverter(); + PowerTrackActivitySerializer serializer = new PowerTrackActivitySerializer(); try { Object activity = serializer.deserialize(ptData1); } catch( Exception e ) { http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/7afd6e0a/streams-contrib/streams-provider-google/google-gmail/src/main/java/com/google/gmail/provider/GMailImapProviderTask.java ---------------------------------------------------------------------- diff --git a/streams-contrib/streams-provider-google/google-gmail/src/main/java/com/google/gmail/provider/GMailImapProviderTask.java b/streams-contrib/streams-provider-google/google-gmail/src/main/java/com/google/gmail/provider/GMailImapProviderTask.java index 6c928ce..2beeb88 100644 --- a/streams-contrib/streams-provider-google/google-gmail/src/main/java/com/google/gmail/provider/GMailImapProviderTask.java +++ b/streams-contrib/streams-provider-google/google-gmail/src/main/java/com/google/gmail/provider/GMailImapProviderTask.java @@ -18,6 +18,7 @@ package com.google.gmail.provider; +import com.googlecode.gmail4j.GmailClient; import com.googlecode.gmail4j.GmailMessage; import org.apache.streams.core.StreamsDatum; import org.apache.streams.pojo.json.Activity; @@ -25,6 +26,8 @@ import org.apache.streams.util.ComponentUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Calendar; +import java.util.GregorianCalendar; import java.util.List; /** @@ -48,7 +51,7 @@ public class GMailImapProviderTask implements Runnable { for (GmailMessage message : messages) { Activity activity; - GMailMessageActivityConverter serializer = new GMailMessageActivityConverter( this.provider ); + GMailMessageActivitySerializer serializer = new GMailMessageActivitySerializer( this.provider ); activity = serializer.deserialize(message); StreamsDatum entry = new StreamsDatum(activity); ComponentUtils.offerUntilSuccess(entry, this.provider.providerQueue); http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/7afd6e0a/streams-contrib/streams-provider-google/google-gmail/src/main/java/com/google/gmail/provider/GMailMessageActivityConverter.java ---------------------------------------------------------------------- diff --git a/streams-contrib/streams-provider-google/google-gmail/src/main/java/com/google/gmail/provider/GMailMessageActivityConverter.java b/streams-contrib/streams-provider-google/google-gmail/src/main/java/com/google/gmail/provider/GMailMessageActivityConverter.java deleted file mode 100644 index 1a8a38c..0000000 --- a/streams-contrib/streams-provider-google/google-gmail/src/main/java/com/google/gmail/provider/GMailMessageActivityConverter.java +++ /dev/null @@ -1,202 +0,0 @@ -/* - * 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 com.google.gmail.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.google.common.base.Joiner; -import com.google.common.collect.Lists; -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.apache.streams.data.ActivityConverter; -import org.apache.streams.pojo.json.*; -import org.joda.time.DateTime; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.mail.internet.MimeMultipart; -import java.util.List; -import java.util.Map; - -import static org.apache.streams.data.util.ActivityUtil.ensureExtensions; - -/** -* Created with IntelliJ IDEA. -* User: mdelaet -* Date: 9/30/13 -* Time: 9:24 AM -* To change this template use File | Settings | File Templates. -*/ -public class GMailMessageActivityConverter implements ActivityConverter<GmailMessage> { - - private static final Logger LOGGER = LoggerFactory.getLogger(GMailMessageActivityConverter.class); - - GMailProvider provider; - - ObjectMapper mapper = new ObjectMapper(); - - public GMailMessageActivityConverter(GMailProvider provider) { - - this.provider = provider; - - 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 GMailMessageActivityConverter() { - } - - @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); - Actor actor = new Actor(); - 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); - -// try { -// // if jackson can't serialize the object, find out now -// String jsonString = mapper.writeValueAsString(gmailMessage); -// ObjectNode jsonObject = mapper.valueToTree(gmailMessage); -// // since it can, write the entire source object to extensions.gmail -// Map<String, Object> extensions = Maps.newHashMap(); -// extensions.put("gmail", gmailMessage); -// activity.setAdditionalProperty("extensions", extensions); -// } catch (JsonProcessingException e) { -// LOGGER.debug("Failed Json Deserialization"); -// e.printStackTrace(); -// } - - return activity; - } - - @Override - public List<Activity> deserializeAll(List<GmailMessage> serializedList) { - throw new NotImplementedException("Not currently implemented"); - } - - public Activity convert(ObjectNode event) { - return null; - } - - 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 = ensureExtensions(activity); - extensions.put("gmail", gmailMessage); - } - - public static String formatId(String... idparts) { - return Joiner.on(":").join(Lists.asList("id:gmail", idparts)); - } - - 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(); - } - -}