You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2011/06/14 22:30:16 UTC

svn commit: r1135779 - in /openejb/trunk/sandbox/tools: ./ src/main/java/org/apache/openejb/tools/twitter/ src/main/java/org/apache/openejb/tools/twitter/util/ src/main/resources/ src/test/java/org/apache/openejb/tools/

Author: rmannibucau
Date: Tue Jun 14 20:30:15 2011
New Revision: 1135779

URL: http://svn.apache.org/viewvc?rev=1135779&view=rev
Log:
OPENEJB-1565  retweet functionnality, thanks Vishwanath for this patch

Added:
    openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/RetweetAppConstants.java
    openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/ScreenNamesRetriever.java
    openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/UserStatusRetriever.java
    openejb/trunk/sandbox/tools/src/main/resources/log4j.properties
Modified:
    openejb/trunk/sandbox/tools/pom.xml
    openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/AuthorizationUrlGenerator.java
    openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/ContribListStatusRetriever.java
    openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/JsonResponseParser.java
    openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/OpenEJBMessageFilterUtil.java
    openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/Retweet.java
    openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/StoreAccessToken.java
    openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/util/RetweetAppUtil.java
    openejb/trunk/sandbox/tools/src/test/java/org/apache/openejb/tools/RetweetITest.java
    openejb/trunk/sandbox/tools/src/test/java/org/apache/openejb/tools/RetweetTest.java

Modified: openejb/trunk/sandbox/tools/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/pom.xml?rev=1135779&r1=1135778&r2=1135779&view=diff
==============================================================================
--- openejb/trunk/sandbox/tools/pom.xml (original)
+++ openejb/trunk/sandbox/tools/pom.xml Tue Jun 14 20:30:15 2011
@@ -115,6 +115,12 @@
       <scope>compile</scope>
     </dependency>
 
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <version>1.2.16</version>
+    </dependency>
+
   </dependencies>
 </project>
 

Modified: openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/AuthorizationUrlGenerator.java
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/AuthorizationUrlGenerator.java?rev=1135779&r1=1135778&r2=1135779&view=diff
==============================================================================
--- openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/AuthorizationUrlGenerator.java (original)
+++ openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/AuthorizationUrlGenerator.java Tue Jun 14 20:30:15 2011
@@ -30,7 +30,7 @@ import org.apache.openejb.tools.twitter.
 import java.util.Properties;
 
 public class AuthorizationUrlGenerator {
-    static Properties retweetToolProperties;
+	static Properties retweetToolProperties;
     static OAuthConsumer consumer;
     static OAuthProvider provider;
 

Modified: openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/ContribListStatusRetriever.java
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/ContribListStatusRetriever.java?rev=1135779&r1=1135778&r2=1135779&view=diff
==============================================================================
--- openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/ContribListStatusRetriever.java (original)
+++ openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/ContribListStatusRetriever.java Tue Jun 14 20:30:15 2011
@@ -14,6 +14,7 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
+/*
 package org.apache.openejb.tools.twitter;
 
 import org.apache.http.HttpResponse;
@@ -56,3 +57,4 @@ public class ContribListStatusRetriever 
         return response;
     }
 }
+*/
\ No newline at end of file

Modified: openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/JsonResponseParser.java
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/JsonResponseParser.java?rev=1135779&r1=1135778&r2=1135779&view=diff
==============================================================================
--- openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/JsonResponseParser.java (original)
+++ openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/JsonResponseParser.java Tue Jun 14 20:30:15 2011
@@ -20,6 +20,7 @@ import org.apache.http.HttpResponse;
 import org.apache.http.client.ClientProtocolException;
 import org.apache.http.client.ResponseHandler;
 import org.apache.http.impl.client.BasicResponseHandler;
+import org.apache.log4j.Logger;
 import org.codehaus.jackson.JsonParseException;
 import org.codehaus.jackson.map.JsonMappingException;
 import org.codehaus.jackson.map.ObjectMapper;
@@ -33,6 +34,8 @@ import java.util.Map;
 
 
 public class JsonResponseParser {
+	
+	private static Logger logger = Logger.getLogger(JsonResponseParser.class);
 
     public static String getResponseBody(HttpResponse response) {
         ResponseHandler<String> responseHander = new BasicResponseHandler();
@@ -45,7 +48,7 @@ public class JsonResponseParser {
             e.printStackTrace();
         }
 
-        System.out.println("Response Body Data:" + responseBody);
+        logger.debug("Response Body Data:" + responseBody);
 
         return responseBody;
     }
@@ -64,8 +67,29 @@ public class JsonResponseParser {
         } catch (IOException e) {
             e.printStackTrace();
         }
-        System.out.println("Json to List of key value pairs:" + result);
+        logger.debug("Json to List of key value pairs:" + result);
         return result;
     }
+    
+
+	@SuppressWarnings("rawtypes")
+	public static Map getMapFromJson(Reader jsonDataReader)
+	{
+		Map result = null;
+		ObjectMapper mapper = new ObjectMapper();
+		try {
+			result=mapper.readValue(jsonDataReader, new TypeReference<Map>() {
+			});
+		} catch (JsonParseException e) {
+			e.printStackTrace();
+		} catch (JsonMappingException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		
+		return result;
+	
+	}
 
 }

Modified: openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/OpenEJBMessageFilterUtil.java
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/OpenEJBMessageFilterUtil.java?rev=1135779&r1=1135778&r2=1135779&view=diff
==============================================================================
--- openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/OpenEJBMessageFilterUtil.java (original)
+++ openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/OpenEJBMessageFilterUtil.java Tue Jun 14 20:30:15 2011
@@ -16,56 +16,125 @@
  */
 package org.apache.openejb.tools.twitter;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.log4j.Logger;
+
 public class OpenEJBMessageFilterUtil {
+	
+	static SimpleDateFormat dateFormat = new SimpleDateFormat(RetweetAppConstants.TWITTER_DATE_FORMAT);
+	private static Logger logger = Logger.getLogger(OpenEJBMessageFilterUtil.class);
+	
+	@SuppressWarnings("rawtypes")
+	public static List<String> getNonRetweetedOpenEJBStatusIDs(
+			List<Map> keyValuePairs) {
+
+		List<String> openEJBStatusIDs = new ArrayList<String>();
+
+		for (Object keyValuePair : keyValuePairs) {
+			Map keyValue = (Map) keyValuePair;
+			if (keyValue.containsKey("text")) {
+				acceptOrRejectTweets(openEJBStatusIDs, keyValue);
+			}
+		}
+
+		return openEJBStatusIDs;
+	}
+
+	@SuppressWarnings("rawtypes")
+	private static void acceptOrRejectTweets(List<String> openEJBStatusIDs,
+			Map keyValue) {
+		String tweet = (String) keyValue.get("text");
+		if (!isOlderThanAnHour(keyValue) & isOpenEJBTweet(tweet) & !isRetweeted(keyValue) ) {
+		    acceptTweet(openEJBStatusIDs, keyValue, tweet);
+		} else {
+			logWhyTweetWasRejected(keyValue, tweet);
+		}
+	}
+
+	
+	@SuppressWarnings("rawtypes")
+	private static void acceptTweet(List<String> openEJBStatusIDs,
+			Map keyValue, String tweet) {
+		logger.info("Adding Tweet:" + tweet);
+		Number tweetId = (Number) keyValue.get("id");
+		openEJBStatusIDs.add(tweetId.toString());
+	}
+
+	@SuppressWarnings("rawtypes")
+	private static void logWhyTweetWasRejected(Map keyValue, String tweet) {
+		logger.debug("IsOpenEJBTweet?:" + isOpenEJBTweet(tweet));
+		logger.debug("Was it retweeted before:" + isRetweeted(keyValue));
+		logger.info("Tweet Not Considered:" + keyValue.get("text"));
+	}
 
     @SuppressWarnings("rawtypes")
-    public static List<String> getNonRetweetedOpenEJBStatusIDs(List<Map> keyValuePairs) {
-
-        List<String> openEJBStatusIDs = new ArrayList<String>();
-
-        for (Object keyValuePair : keyValuePairs) {
-            Map keyValue = (Map) keyValuePair;
-            if (keyValue.containsKey("text")) {
-                String tweet = (String) keyValue.get("text");
-                if (isOpenEJBTweet(tweet) && !isRetweeted(keyValue)) {
-                    System.out.println("Adding Tweet:" + tweet);
-                    Number tweetId = (Number) keyValue.get("id");
-                    openEJBStatusIDs.add(tweetId.toString());
-                } else {
-                    System.out.println("Tweet Not Considered:" + keyValue.get("text"));
-                    System.out.println("IsOpenEJBTweet?:" + isOpenEJBTweet(tweet));
-                    System.out.println("Was it retweeted before:" + isRetweeted(keyValue));
-                }
-
-            }
-        }
-
-        return openEJBStatusIDs;
-    }
+	private static boolean isOlderThanAnHour(Map keyValue) {
+    	String dateAsString =(String) keyValue.get("created_at");
+    	Calendar calendar = Calendar.getInstance();
+    	calendar.add(Calendar.HOUR_OF_DAY, -1);
+    	try {
+			Date tweetDate = dateFormat.parse(dateAsString);
+			logger.debug("Older than an hour?: "+tweetDate.before(calendar.getTime()));
+			return tweetDate.before(calendar.getTime());
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+        
+    	return false;
+	}
 
-    @SuppressWarnings("rawtypes")
+	@SuppressWarnings("rawtypes")
     private static boolean isRetweeted(Map keyValue) {
-        Integer retweetCount = new Integer((Integer) keyValue.get("retweet_count"));
-        if (retweetCount > 0) {
+        
+		Integer retweetCount;
+		try {
+			retweetCount = null;
+			retweetCount = getRetweetCount(keyValue, retweetCount);
+		} catch (NumberFormatException ignoredException) {
+			//Sometimes retweet-count returned by twitter is "100+" A non Number.
+			//Ignoring such exception
+			logger.debug("Skipping this status...");
+			return true;
+		}        
+		
+		if (retweetCount > 0) {
             return true;
         } else {
             return false;
         }
     }
 
+	@SuppressWarnings("rawtypes")
+	private static Integer getRetweetCount(Map keyValue, Integer retweetCount) {
+		if(keyValue.get("retweet_count") instanceof String) {
+		retweetCount = new Integer((String)keyValue.get("retweet_count"));
+		}
+		else if(keyValue.get("retweet_count") instanceof Integer) {
+			retweetCount =(Integer)keyValue.get("retweet_count");
+		}
+		return retweetCount;
+	}
+
 
+	/*
+	 * tweet.contains(string) can't help since mentions can end with period, like "#openejb." 
+	 */
     private static boolean isOpenEJBTweet(String tweet) {
         String[] words = tweet.split(" ");
         List<String> wordsAsList = Arrays.asList(words);
         for (String word : wordsAsList) {
             if (isOpenEJBMentioned(word)) {
                 String mentionName = word.trim().substring(1, 8);
-                if (mentionName.equalsIgnoreCase("openejb")) {return true;}
+                if (mentionName.equalsIgnoreCase("openejb")) {
+                	return true;}
             }
         }
         return false;

Modified: openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/Retweet.java
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/Retweet.java?rev=1135779&r1=1135778&r2=1135779&view=diff
==============================================================================
--- openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/Retweet.java (original)
+++ openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/Retweet.java Tue Jun 14 20:30:15 2011
@@ -16,24 +16,25 @@
  */
 package org.apache.openejb.tools.twitter;
 
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Properties;
+import java.util.Set;
+
 import oauth.signpost.OAuthConsumer;
 import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
 import oauth.signpost.exception.OAuthCommunicationException;
 import oauth.signpost.exception.OAuthExpectationFailedException;
 import oauth.signpost.exception.OAuthMessageSignerException;
+
 import org.apache.http.HttpResponse;
 import org.apache.http.client.ClientProtocolException;
 import org.apache.http.client.HttpClient;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.log4j.Logger;
 import org.apache.openejb.tools.twitter.util.RetweetAppUtil;
 
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
 /**
  * We should monitor this feed http://twitter.com/#!/OpenEJB/contributors
  * and retweet anything that mentions OpenEJB
@@ -60,31 +61,26 @@ public class Retweet {
 
     public static Properties retweetToolProperties = RetweetAppUtil.getTwitterAppProperties();
     public static OAuthConsumer consumer;
+    private static Logger logger = Logger.getLogger(Retweet.class);
 
-    @SuppressWarnings("rawtypes")
     public static void main(String[] args) {
-        HttpResponse response = ContribListStatusRetriever.getStatusesFromOpenEJBContributorsList();
-        String responseBody = JsonResponseParser.getResponseBody(response);
-        StringReader jsonDataReader = new StringReader(responseBody);
-        //Each status is a entry in the list. Each status has various properties in the form of key-value pairs
-        List<Map> listFromJson = JsonResponseParser.getListFromJson(jsonDataReader);
-        List<String> nonRetweetedOpenEJBStatusIDs = OpenEJBMessageFilterUtil.getNonRetweetedOpenEJBStatusIDs(listFromJson);
 
-        System.out.println("About to retweet:" + nonRetweetedOpenEJBStatusIDs);
-        retweetIfListIsNotEmpty(nonRetweetedOpenEJBStatusIDs);
+    	Set<String> nonRetweetedOpenEJBStatusIDs = UserStatusRetriever.getAllContributorsOpenEJBStatuses();
+        logger.info("About to retweet:" + nonRetweetedOpenEJBStatusIDs);
+        retweetIfNotEmpty(nonRetweetedOpenEJBStatusIDs);
 
     }
 
-    private static void retweetIfListIsNotEmpty(List<String> nonRetweetedOpenEJBStatusIDs) {
+    private static void retweetIfNotEmpty(Collection<String> nonRetweetedOpenEJBStatusIDs) {
 
         if (!nonRetweetedOpenEJBStatusIDs.isEmpty()) {
-            retweetThisListOfStatuses(nonRetweetedOpenEJBStatusIDs);
+            retweetThisCollectionOfStatuses(nonRetweetedOpenEJBStatusIDs);
         } else {
-            System.out.println("No message to retweet.");
+            logger.info("No message to retweet.");
         }
     }
 
-    private static void retweetThisListOfStatuses(List<String> nonRetweetedOpenEJBStatusIDs) {
+    private static void retweetThisCollectionOfStatuses(Collection<String> nonRetweetedOpenEJBStatusIDs) {
 
         for (String statusIDToRetweet : nonRetweetedOpenEJBStatusIDs) {
             try {
@@ -114,14 +110,14 @@ public class Retweet {
     }
 
     public static HttpResponse retweet(String statusIDToRetweet) throws OAuthMessageSignerException, OAuthExpectationFailedException, OAuthCommunicationException {
-        HttpPost httpPost = new HttpPost("http://api.twitter.com/1/statuses/retweet/" + statusIDToRetweet + ".json");
+        HttpPost httpPost = new HttpPost(RetweetAppConstants.RETWEET_URL+statusIDToRetweet+".json");
         initConsumer();
         consumer.sign(httpPost);
         HttpResponse response = null;
         try {
             response = getHttpClient().execute(httpPost);
-            System.out.println(response.getStatusLine());
-            System.out.println("Retweeted " + statusIDToRetweet);
+            logger.debug(response.getStatusLine());
+            logger.info("Retweeted " + statusIDToRetweet);
         } catch (ClientProtocolException e) {
             e.printStackTrace();
         } catch (IOException e) {
@@ -136,7 +132,7 @@ public class Retweet {
     }
 
     private static void pauseBeforeTheNextRetweet() {
-        try {
+        try { //So it doesn't look like spamming
             Thread.sleep(1000 * 60 * 5);
         } catch (InterruptedException e) {
             e.printStackTrace();

Added: openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/RetweetAppConstants.java
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/RetweetAppConstants.java?rev=1135779&view=auto
==============================================================================
--- openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/RetweetAppConstants.java (added)
+++ openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/RetweetAppConstants.java Tue Jun 14 20:30:15 2011
@@ -0,0 +1,24 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.tools.twitter;
+
+public class RetweetAppConstants {
+
+	public static final String TWITTER_DATE_FORMAT="EEE MMM d H:m:s Z y";
+	public static final String USER_TIMELINE_STATUS_URL="http://api.twitter.com/1/statuses/user_timeline.json?include_rts=true&count=20&screen_name=";
+	public static final String RETWEET_URL="http://api.twitter.com/1/statuses/retweet/";
+}

Added: openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/ScreenNamesRetriever.java
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/ScreenNamesRetriever.java?rev=1135779&view=auto
==============================================================================
--- openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/ScreenNamesRetriever.java (added)
+++ openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/ScreenNamesRetriever.java Tue Jun 14 20:30:15 2011
@@ -0,0 +1,114 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.tools.twitter;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import oauth.signpost.exception.OAuthCommunicationException;
+import oauth.signpost.exception.OAuthExpectationFailedException;
+import oauth.signpost.exception.OAuthMessageSignerException;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.log4j.Logger;
+
+
+public class ScreenNamesRetriever {
+	
+	private static Logger logger = Logger.getLogger(ScreenNamesRetriever.class);
+	
+	public static void main(String[] args) throws OAuthMessageSignerException, OAuthExpectationFailedException, OAuthCommunicationException {
+		getContributorsNames();
+	}
+	
+	public static List<String>  getContributorsNames() 
+	{
+			List<String> contributorsScreenNames = null;
+        	try {
+        		contributorsScreenNames = getContributorsScreenNames();
+			} catch (OAuthMessageSignerException e) {
+				e.printStackTrace();
+			} catch (OAuthExpectationFailedException e) {
+				e.printStackTrace();
+			} catch (OAuthCommunicationException e) {
+				e.printStackTrace();
+			} catch (ClientProtocolException e) {
+				e.printStackTrace();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+        	return contributorsScreenNames;
+	}
+
+	@SuppressWarnings("rawtypes")
+	private static List<String> getContributorsScreenNames()
+			throws OAuthMessageSignerException,
+			OAuthExpectationFailedException, OAuthCommunicationException,
+			IOException, ClientProtocolException {
+		HttpResponse response = getContribListMembersResponse();
+		String responseBody = JsonResponseParser.getResponseBody(response);
+		StringReader reader= new StringReader(responseBody);
+		Map mapFromJson = JsonResponseParser.getMapFromJson(reader);
+		logger.debug("MAP:"+mapFromJson);
+		List listFromJson=(List) mapFromJson.get("users");
+		return getScreenNamesAlone(listFromJson);
+	}
+
+	@SuppressWarnings("rawtypes")
+	private static List<String> getScreenNamesAlone(List listFromJson) 
+	{
+		List<String> contribMembersList = new ArrayList<String>();
+		for(Object object:listFromJson)
+		{
+			LinkedHashMap map = (LinkedHashMap)object;
+			contribMembersList.add((String)map.get("screen_name"));
+		}
+		return contribMembersList;
+	}
+	
+
+	private static HttpResponse getContribListMembersResponse()
+			throws OAuthMessageSignerException,
+			OAuthExpectationFailedException, OAuthCommunicationException,
+			IOException, ClientProtocolException {
+		HttpClient client = new DefaultHttpClient();
+		HttpGet httpGet = getRequestForContribListMembers();
+		Retweet.initConsumer();
+		Retweet.consumer.sign(httpGet);
+		HttpResponse response = client.execute(getRequestForContribListMembers());
+		return response;
+	}
+	
+	public static  HttpGet getRequestForContribListMembers() 
+	{
+		String listName="contributors";
+		String ownerScreenName="OpenEJB";
+		HttpGet httpGet = new HttpGet("http://api.twitter.com/1/lists/members.json?slug="+listName
+				+"&owner_screen_name="+ownerScreenName);
+		return httpGet;
+		
+	}
+
+}

Modified: openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/StoreAccessToken.java
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/StoreAccessToken.java?rev=1135779&r1=1135778&r2=1135779&view=diff
==============================================================================
--- openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/StoreAccessToken.java (original)
+++ openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/StoreAccessToken.java Tue Jun 14 20:30:15 2011
@@ -14,6 +14,7 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
+/*
 package org.apache.openejb.tools.twitter;
 
 public class StoreAccessToken {
@@ -21,3 +22,4 @@ public class StoreAccessToken {
     // Store it in File/DB
     // This access token would be used for any READ/WRITE
 }
+*/
\ No newline at end of file

Added: openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/UserStatusRetriever.java
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/UserStatusRetriever.java?rev=1135779&view=auto
==============================================================================
--- openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/UserStatusRetriever.java (added)
+++ openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/UserStatusRetriever.java Tue Jun 14 20:30:15 2011
@@ -0,0 +1,76 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.tools.twitter;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.methods.HttpGet;
+
+public class UserStatusRetriever {
+	
+	public static HttpGet  getHttpRequestToRetrieveUserStatuses(String screenName)
+	{
+		
+		HttpGet requestForUserStatus=new HttpGet(RetweetAppConstants.USER_TIMELINE_STATUS_URL+screenName);
+		return requestForUserStatus;
+	}
+	
+	public static HttpResponse getUserStatusResponse(HttpGet userStatusRequest)
+	{
+        HttpResponse response = null;
+        try {
+            response = Retweet.getHttpClient().execute(userStatusRequest);
+        } catch (ClientProtocolException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        
+        return response;
+    	
+	}
+	
+	@SuppressWarnings("rawtypes")
+	public static List<String> getUserOpenEJBStatus(String screenName)
+	{
+	   HttpResponse userStatusResponse = getUserStatusResponse(getHttpRequestToRetrieveUserStatuses(screenName));	
+	   String responseBody = JsonResponseParser.getResponseBody(userStatusResponse);
+	   StringReader dataToParse = new StringReader(responseBody);
+	   List<Map> listFromJson = JsonResponseParser.getListFromJson(dataToParse);
+	   List<String> nonRetweetedOpenEJBStatusIDs = OpenEJBMessageFilterUtil.getNonRetweetedOpenEJBStatusIDs(listFromJson);
+	   return nonRetweetedOpenEJBStatusIDs;
+	}
+	
+	public static Set<String> getAllContributorsOpenEJBStatuses()
+	{
+	  List<String> contributorsNames = ScreenNamesRetriever.getContributorsNames();	
+	  Set<String> openEJBStatuses = new HashSet<String>(); 
+	  for(String screenName : contributorsNames)
+	  {
+		  openEJBStatuses.addAll(getUserOpenEJBStatus(screenName));
+	  }
+	  return openEJBStatuses;
+	}
+
+}

Modified: openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/util/RetweetAppUtil.java
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/util/RetweetAppUtil.java?rev=1135779&r1=1135778&r2=1135779&view=diff
==============================================================================
--- openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/util/RetweetAppUtil.java (original)
+++ openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/twitter/util/RetweetAppUtil.java Tue Jun 14 20:30:15 2011
@@ -16,6 +16,7 @@
  */
 package org.apache.openejb.tools.twitter.util;
 
+import org.apache.log4j.Logger;
 import org.springframework.core.io.ClassPathResource;
 
 import java.io.FileNotFoundException;
@@ -24,11 +25,12 @@ import java.util.Properties;
 
 public class RetweetAppUtil {
 
+	private static Logger logger = Logger.getLogger(RetweetAppUtil.class);
     public static Properties getTwitterAppProperties() {
 
-        Properties retweetAppProperties = new Properties();
-        try {
-            ClassPathResource retweetToolPropertiesFile = new ClassPathResource(
+    	Properties retweetAppProperties = new Properties();
+    	try {
+    		ClassPathResource retweetToolPropertiesFile = new ClassPathResource(
                     "RetweetTool.properties");
             retweetAppProperties.load(retweetToolPropertiesFile
                     .getInputStream());
@@ -38,9 +40,8 @@ public class RetweetAppUtil {
             e.printStackTrace();
         }
 
-        System.out.print("Using the following properties: ");
-        System.out.print("---------------------------------");
-        retweetAppProperties.list(System.out);
+        logger.info("Using the following properties: ");
+        logger.info(retweetAppProperties);
         return retweetAppProperties;
 
     }

Added: openejb/trunk/sandbox/tools/src/main/resources/log4j.properties
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/main/resources/log4j.properties?rev=1135779&view=auto
==============================================================================
--- openejb/trunk/sandbox/tools/src/main/resources/log4j.properties (added)
+++ openejb/trunk/sandbox/tools/src/main/resources/log4j.properties Tue Jun 14 20:30:15 2011
@@ -0,0 +1,32 @@
+#
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You under the Apache License, Version 2.0
+#  (the "License"); you may not use this file except in compliance with
+#  the License.  You may obtain a copy of the License at
+# 
+#      http://www.apache.org/licenses/LICENSE-2.0
+# 
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+#
+
+# Set root logger level to DEBUG and its only appender to Appender1.
+log4j.rootLogger=INFO, Appender1,Appender2
+
+# Appender1 is set to be a ConsoleAppender.
+log4j.appender.Appender1=org.apache.log4j.ConsoleAppender
+log4j.appender.Appender2=org.apache.log4j.RollingFileAppender
+log4j.appender.Appender2.File=RetweetTool.log
+
+
+# Appender2 uses PatternLayout.
+log4j.appender.Appender1.layout=org.apache.log4j.PatternLayout
+log4j.appender.Appender1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
+
+log4j.appender.Appender2.layout=org.apache.log4j.PatternLayout
+log4j.appender.Appender2.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

Modified: openejb/trunk/sandbox/tools/src/test/java/org/apache/openejb/tools/RetweetITest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/test/java/org/apache/openejb/tools/RetweetITest.java?rev=1135779&r1=1135778&r2=1135779&view=diff
==============================================================================
--- openejb/trunk/sandbox/tools/src/test/java/org/apache/openejb/tools/RetweetITest.java (original)
+++ openejb/trunk/sandbox/tools/src/test/java/org/apache/openejb/tools/RetweetITest.java Tue Jun 14 20:30:15 2011
@@ -16,35 +16,35 @@
  */
 package org.apache.openejb.tools;
 
-import static org.junit.Assert.assertNotNull;
-
-import java.io.StringReader;
-import java.util.List;
-import java.util.Map;
-
+import static org.junit.Assert.*;
+import java.io.IOException;
 import org.apache.http.HttpResponse;
-import org.apache.openejb.tools.twitter.ContribListStatusRetriever;
-import org.apache.openejb.tools.twitter.JsonResponseParser;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.BasicResponseHandler;
+import org.apache.openejb.tools.twitter.ScreenNamesRetriever;
+import org.apache.openejb.tools.twitter.UserStatusRetriever;
 import org.junit.Test;
 
 public class RetweetITest {
 
-	
-	
-	@SuppressWarnings("rawtypes")
 	@Test
-	public void convertJsonResponseToListOfKeyValuePairs()
+	public void screenNamesListShouldNotBeEmpty()
 	{
-		HttpResponse statusesFromOpenEJBContributorsList = ContribListStatusRetriever.getStatusesFromOpenEJBContributorsList();
-		String responseBody = JsonResponseParser.getResponseBody(statusesFromOpenEJBContributorsList);
-		
-		assertNotNull(responseBody);
-		
-		StringReader jsonDataReader=new StringReader(responseBody);
-		List<Map> listFromJson = JsonResponseParser.getListFromJson(jsonDataReader);
-		
-		assertNotNull(listFromJson);
+		assertFalse(ScreenNamesRetriever.getContributorsNames().isEmpty());
 	}
 	
+	@Test
+	public void userStatusShouldBeRetrieved() throws ClientProtocolException, IOException
+	{
+		HttpGet httpGet = UserStatusRetriever.getHttpRequestToRetrieveUserStatuses("stratwine");
+		HttpResponse userStatusResponse = UserStatusRetriever.getUserStatusResponse(httpGet);
+		ResponseHandler<String> responseHander = new BasicResponseHandler();
+		String responseBody = (String)responseHander.handleResponse(userStatusResponse);
+		System.out.println(responseBody);
+		assertTrue(userStatusResponse.getStatusLine().getStatusCode()==200);
+
+	}
 
 }

Modified: openejb/trunk/sandbox/tools/src/test/java/org/apache/openejb/tools/RetweetTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/test/java/org/apache/openejb/tools/RetweetTest.java?rev=1135779&r1=1135778&r2=1135779&view=diff
==============================================================================
--- openejb/trunk/sandbox/tools/src/test/java/org/apache/openejb/tools/RetweetTest.java (original)
+++ openejb/trunk/sandbox/tools/src/test/java/org/apache/openejb/tools/RetweetTest.java Tue Jun 14 20:30:15 2011
@@ -16,14 +16,8 @@
  */
 package org.apache.openejb.tools;
 
-import static org.junit.Assert.assertTrue;
-import java.io.IOException;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.ResponseHandler;
-import org.apache.http.impl.client.BasicResponseHandler;
-import org.apache.openejb.tools.twitter.ContribListStatusRetriever;
 import org.apache.openejb.tools.twitter.Retweet;
+import org.apache.openejb.tools.twitter.UserStatusRetriever;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -36,17 +30,12 @@ public class RetweetTest {
 	{
 	  Retweet.initConsumer();
 	}
-	
+		
 	@Test
-	public void contributorsListStatusesShouldBeRetrieved() throws ClientProtocolException, IOException
+	public void userStatusShouldBeRetrieved()
 	{
-		HttpResponse response=ContribListStatusRetriever.getStatusesFromOpenEJBContributorsList();
-		
-		assertTrue(response.getStatusLine().getStatusCode()==200);
-		
-		ResponseHandler<String> responseHander = new BasicResponseHandler();
-		String responseBody = (String)responseHander.handleResponse(response);
-		System.out.println(responseBody);
+		UserStatusRetriever.getUserOpenEJBStatus("stratwine");
+		//No asserts. Just to check if it run without exceptions
 	}