Author: lindner
Date: Sat Oct 23 10:23:31 2010
New Revision: 1026594

URL: http://svn.apache.org/viewvc?rev=1026594&view=rev
Log:
SHINDIG-1452 | Patch from Bill Wolcken | Allow FeedProcessor to be swapped out 
via Guice injection

Added:
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/FeedProcessorImpl.java
      - copied, changed from r1026591, 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/FeedProcessor.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/FeedProcessorImplTest.java
      - copied, changed from r1026591, 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/FeedProcessorTest.java
Removed:
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/FeedProcessorTest.java
Modified:
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/FeedProcessor.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HttpRequestHandler.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/HttpRequestHandlerTest.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestServletTest.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ServletTestFixture.java

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/FeedProcessor.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/FeedProcessor.java?rev=1026594&r1=1026593&r2=1026594&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/FeedProcessor.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/FeedProcessor.java
 Sat Oct 23 10:23:31 2010
@@ -18,30 +18,14 @@
  */
 package org.apache.shindig.gadgets;
 
-import java.io.StringReader;
-import java.util.List;
-
-import com.sun.syndication.feed.module.mediarss.types.UrlReference;
-
-import com.sun.syndication.feed.module.mediarss.MediaEntryModule;
-import com.sun.syndication.feed.module.mediarss.MediaModule;
-import com.sun.syndication.feed.module.mediarss.types.MediaContent;
-import com.sun.syndication.feed.module.mediarss.types.Thumbnail;
-import com.sun.syndication.feed.synd.SyndContent;
-import com.sun.syndication.feed.synd.SyndEntry;
-import com.sun.syndication.feed.synd.SyndFeed;
-import com.sun.syndication.feed.synd.SyndPerson;
-import com.sun.syndication.io.FeedException;
-import com.sun.syndication.io.SyndFeedInput;
-import org.apache.shindig.gadgets.http.HttpResponse;
-import org.json.JSONArray;
-import org.json.JSONException;
 import org.json.JSONObject;
+import com.google.inject.ImplementedBy;
 
 /**
  * Processes RSS & Atom Feeds and converts them into JSON output.
  */
-public class FeedProcessor {
+...@implementedby(FeedProcessorImpl.class)
+public interface FeedProcessor {
 
   /**
    * Converts feed XML to JSON.
@@ -56,131 +40,6 @@ public class FeedProcessor {
    *            Number of entries to return.
    * @return The JSON representation of the feed.
    */
-  @SuppressWarnings("unchecked")
-  public JSONObject process(String feedUrl, String feedXml, boolean 
getSummaries, int numEntries)
-          throws GadgetException {
-    try {
-      SyndFeed feed = new SyndFeedInput().build(new StringReader(feedXml));
-      JSONObject json = new JSONObject();
-      json.put("Title", feed.getTitle());
-      json.put("URL", feedUrl);
-      json.put("Description", feed.getDescription());
-      json.put("Link", feed.getLink());
-
-      List<SyndPerson> authors = feed.getAuthors();
-      String jsonAuthor = null;
-      if (authors != null && !authors.isEmpty()) {
-        SyndPerson author = authors.get(0);
-        if (author.getName() != null) {
-          jsonAuthor = author.getName();
-        } else if (author.getEmail() != null) {
-          jsonAuthor = author.getEmail();
-        }
-      }
-      JSONArray entries = new JSONArray();
-      json.put("Entry", entries);
-
-      int entryCnt = 0;
-      for (Object obj : feed.getEntries()) {
-        SyndEntry e = (SyndEntry) obj;
-        if (entryCnt >= numEntries) {
-          break;
-        }
-        entryCnt++;
-
-        JSONObject entry = new JSONObject();
-        entry.put("Title", e.getTitle());
-        entry.put("Link", e.getLink());
-        if (getSummaries) {
-          if (e.getContents() != null && !e.getContents().isEmpty()) {
-            entry.put("Summary", ((SyndContent) 
e.getContents().get(0)).getValue());
-          } else {
-            entry.put("Summary", e.getDescription() != null ? 
e.getDescription().getValue() : "");
-          }
-        }
-
-        if (e.getUpdatedDate() != null) {
-          entry.put("Date", e.getUpdatedDate().getTime());
-        } else if (e.getPublishedDate() != null) {
-          entry.put("Date", e.getPublishedDate().getTime());
-        } else {
-          entry.put("Date", 0);
-        }
-
-        // if no author at feed level, use the first entry author
-        if (jsonAuthor == null) {
-          jsonAuthor = e.getAuthor();
-        }
-
-        JSONObject media = new JSONObject();
-        MediaEntryModule mediaModule = (MediaEntryModule) 
e.getModule(MediaModule.URI);
-        if (mediaModule != null) {
-          if (mediaModule.getMediaContents().length > 0) {
-            JSONArray contents = new JSONArray();
-
-            for (MediaContent c : mediaModule.getMediaContents()) {
-              JSONObject content = new JSONObject();
-
-              if (c.getReference() instanceof UrlReference) {
-                content.put("URL", ((UrlReference) 
c.getReference()).getUrl().toString());
-              }
-
-              if (c.getType() != null) {
-                content.put("Type", c.getType());
-              }
-
-              if (c.getWidth() != null) {
-                content.put("Width", c.getWidth());
-              }
-
-              if (c.getHeight() != null) {
-                content.put("Height", c.getHeight());
-              }
-
-              contents.put(content);
-            }
-
-            media.put("Contents", contents);
-          }
-
-          if (mediaModule.getMetadata() != null) {
-            if (mediaModule.getMetadata().getThumbnail().length > 0) {
-              // "If multiple thumbnails are included, it is assumed that they 
are in order of importance"
-              // Only use the first thumbnail for simplicity's
-              // sake
-
-              JSONObject thumbnail = new JSONObject();
-
-              Thumbnail t = mediaModule.getMetadata().getThumbnail()[0];
-              thumbnail.put("URL", t.getUrl().toString());
-
-              if (t.getWidth() != null) {
-                thumbnail.put("Width", t.getWidth());
-              }
-
-              if (t.getHeight() != null) {
-                thumbnail.put("Height", t.getHeight());
-              }
-
-              media.put("Thumbnail", thumbnail);
-            }
-          }
-        }
-
-        entry.put("Media", media);
-
-        entries.put(entry);
-      }
-
-      json.put("Author", (jsonAuthor != null) ? jsonAuthor : "");
-      return json;
-    } catch (JSONException e) {
-      // This shouldn't ever happen.
-      throw new RuntimeException(e);
-    } catch (FeedException e) {
-      throw new GadgetException(GadgetException.Code.MALFORMED_XML_DOCUMENT, 
e, HttpResponse.SC_BAD_GATEWAY);
-    } catch (IllegalArgumentException e) {
-      throw new GadgetException(GadgetException.Code.MALFORMED_XML_DOCUMENT, 
e, HttpResponse.SC_BAD_GATEWAY);
-    }
-  }
+  JSONObject process(String feedUrl, String feedXml, boolean getSummaries, int 
numEntries)
+      throws GadgetException;
 }

Copied: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/FeedProcessorImpl.java
 (from r1026591, 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/FeedProcessor.java)
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/FeedProcessorImpl.java?p2=shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/FeedProcessorImpl.java&p1=shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/FeedProcessor.java&r1=1026591&r2=1026594&rev=1026594&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/FeedProcessor.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/FeedProcessorImpl.java
 Sat Oct 23 10:23:31 2010
@@ -41,7 +41,7 @@ import org.json.JSONObject;
 /**
  * Processes RSS & Atom Feeds and converts them into JSON output.
  */
-public class FeedProcessor {
+public class FeedProcessorImpl implements FeedProcessor {
 
   /**
    * Converts feed XML to JSON.

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HttpRequestHandler.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HttpRequestHandler.java?rev=1026594&r1=1026593&r2=1026594&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HttpRequestHandler.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HttpRequestHandler.java
 Sat Oct 23 10:23:31 2010
@@ -50,6 +50,7 @@ import javax.servlet.http.HttpServletRes
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
 import com.google.inject.Inject;
+import com.google.inject.Provider;
 
 /**
  * An alternate implementation of the Http proxy service using the standard 
API dispatcher for REST
@@ -98,12 +99,15 @@ public class HttpRequestHandler {
 
   private final RequestPipeline requestPipeline;
   private final ResponseRewriterRegistry contentRewriterRegistry;
+  private final Provider<FeedProcessor> feedProcessorProvider;
 
   @Inject
   public HttpRequestHandler(RequestPipeline requestPipeline,
-      ResponseRewriterRegistry contentRewriterRegistry) {
+      ResponseRewriterRegistry contentRewriterRegistry,
+      Provider<FeedProcessor> feedProcessorProvider) {
     this.requestPipeline = requestPipeline;
     this.contentRewriterRegistry = contentRewriterRegistry;
+       this.feedProcessorProvider = feedProcessorProvider;
   }
 
 
@@ -305,7 +309,7 @@ public class HttpRequestHandler {
   /** Processes a feed (RSS or Atom) using FeedProcessor. */
   protected Object processFeed(HttpApiRequest req, String responseBody)
       throws GadgetException {
-    return new FeedProcessor().process(req.href.toString(), responseBody, 
req.summarize,
+    return feedProcessorProvider.get().process(req.href.toString(), 
responseBody, req.summarize,
         req.entryCount);
   }
 

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java?rev=1026594&r1=1026593&r2=1026594&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java
 Sat Oct 23 10:23:31 2010
@@ -19,6 +19,7 @@
 package org.apache.shindig.gadgets.servlet;
 
 import com.google.inject.Inject;
+import com.google.inject.Provider;
 import com.google.inject.Singleton;
 
 import org.apache.commons.lang.StringUtils;
@@ -72,12 +73,15 @@ public class MakeRequestHandler {
 
   private final RequestPipeline requestPipeline;
   private final ResponseRewriterRegistry contentRewriterRegistry;
+  private final Provider<FeedProcessor> feedProcessorProvider;
 
   @Inject
   public MakeRequestHandler(RequestPipeline requestPipeline,
-      ResponseRewriterRegistry contentRewriterRegistry) {
+      ResponseRewriterRegistry contentRewriterRegistry,
+      Provider<FeedProcessor> feedProcessorProvider) {
     this.requestPipeline = requestPipeline;
     this.contentRewriterRegistry = contentRewriterRegistry;
+       this.feedProcessorProvider = feedProcessorProvider;
   }
 
   /**
@@ -273,7 +277,7 @@ public class MakeRequestHandler {
       throw new GadgetException(GadgetException.Code.INVALID_PARAMETER,
           "numEntries paramater is not a number", HttpResponse.SC_BAD_REQUEST);
     }
-    return new FeedProcessor().process(url, xml, getSummaries, 
numEntries).toString();
+    return feedProcessorProvider.get().process(url, xml, getSummaries, 
numEntries).toString();
   }
 
   /**

Copied: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/FeedProcessorImplTest.java
 (from r1026591, 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/FeedProcessorTest.java)
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/FeedProcessorImplTest.java?p2=shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/FeedProcessorImplTest.java&p1=shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/FeedProcessorTest.java&r1=1026591&r2=1026594&rev=1026594&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/FeedProcessorTest.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/FeedProcessorImplTest.java
 Sat Oct 23 10:23:31 2010
@@ -26,9 +26,9 @@ import org.json.JSONObject;
 import org.junit.Test;
 
 /**
- * Tests for FeedProcessor
+ * Tests for FeedProcessorImpl
  */
-public class FeedProcessorTest {
+public class FeedProcessorImplTest {
 
   private final static String FEED_TITLE = "Example Feed";
   private final static String FEED_AUTHOR = "John Doe";
@@ -154,8 +154,8 @@ public class FeedProcessorTest {
 
   private final FeedProcessor processor;
 
-  public FeedProcessorTest() {
-    processor = new FeedProcessor();
+  public FeedProcessorImplTest() {
+    processor = new FeedProcessorImpl();
   }
 
   @Test

Modified: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/HttpRequestHandlerTest.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/HttpRequestHandlerTest.java?rev=1026594&r1=1026593&r2=1026594&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/HttpRequestHandlerTest.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/HttpRequestHandlerTest.java
 Sat Oct 23 10:23:31 2010
@@ -32,6 +32,8 @@ import org.apache.shindig.common.JsonAss
 import org.apache.shindig.common.testing.FakeGadgetToken;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.gadgets.AuthType;
+import org.apache.shindig.gadgets.FeedProcessor;
+import org.apache.shindig.gadgets.FeedProcessorImpl;
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.http.HttpResponseBuilder;
@@ -60,6 +62,7 @@ import com.google.common.collect.Immutab
 import com.google.common.collect.ImmutableSet;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
+import com.google.inject.Provider;
 
 /**
  * Has coverage for all tests in MakeRequestHandlerTest and should be 
maintained in sync  until
@@ -82,6 +85,12 @@ public class HttpRequestHandlerTest exte
 
   private final Map<String,FormDataItem> emptyFormItems = 
Collections.emptyMap();
 
+  private final Provider<FeedProcessor> feedProcessorProvider = new 
Provider<FeedProcessor>() {
+        public FeedProcessor get() {
+            return new FeedProcessorImpl();
+        }
+  };
+  
   @Before
   public void setUp() throws Exception {
     token = new FakeGadgetToken();
@@ -90,7 +99,7 @@ public class HttpRequestHandlerTest exte
     Injector injector = Guice.createInjector();
     converter = new BeanJsonConverter(injector);
 
-    HttpRequestHandler handler = new HttpRequestHandler(pipeline, 
rewriterRegistry);
+    HttpRequestHandler handler = new HttpRequestHandler(pipeline, 
rewriterRegistry, feedProcessorProvider);
     registry = new DefaultHandlerRegistry(injector, converter,
         new HandlerExecutionListener.NoOpHandler());
     registry.addHandlers(ImmutableSet.<Object>of(handler));

Modified: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java?rev=1026594&r1=1026593&r2=1026594&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java
 Sat Oct 23 10:23:31 2010
@@ -63,7 +63,7 @@ public class MakeRequestHandlerTest exte
   private static final SecurityToken DUMMY_TOKEN = new FakeGadgetToken();
 
   private final MakeRequestHandler handler
-      = new MakeRequestHandler(pipeline, rewriterRegistry);
+      = new MakeRequestHandler(pipeline, rewriterRegistry, 
feedProcessorProvider);
 
   private void expectGetAndReturnBody(String response) throws Exception {
     expectGetAndReturnBody(AuthType.NONE, response);

Modified: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestServletTest.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestServletTest.java?rev=1026594&r1=1026593&r2=1026594&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestServletTest.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestServletTest.java
 Sat Oct 23 10:23:31 2010
@@ -51,7 +51,7 @@ public class MakeRequestServletTest exte
       = Collections.enumeration(Collections.<String>emptyList());
 
   private final MakeRequestServlet servlet = new MakeRequestServlet();
-  private final MakeRequestHandler handler = new MakeRequestHandler(pipeline, 
null);
+  private final MakeRequestHandler handler = new MakeRequestHandler(pipeline, 
null, feedProcessorProvider);
 
   private final HttpRequest internalRequest = new HttpRequest(REQUEST_URL);
   private final HttpResponse internalResponse = new 
HttpResponse(RESPONSE_BODY);

Modified: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ServletTestFixture.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ServletTestFixture.java?rev=1026594&r1=1026593&r2=1026594&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ServletTestFixture.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ServletTestFixture.java
 Sat Oct 23 10:23:31 2010
@@ -20,6 +20,8 @@ package org.apache.shindig.gadgets.servl
 
 import org.apache.shindig.common.EasyMockTestCase;
 import org.apache.shindig.common.servlet.HttpServletResponseRecorder;
+import org.apache.shindig.gadgets.FeedProcessor;
+import org.apache.shindig.gadgets.FeedProcessorImpl;
 import org.apache.shindig.gadgets.LockedDomainService;
 import org.apache.shindig.gadgets.http.RequestPipeline;
 import org.apache.shindig.gadgets.rewrite.CaptureRewriter;
@@ -32,6 +34,8 @@ import java.util.Arrays;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import com.google.inject.Provider;
+
 /**
  * Contains everything needed for making servlet requests, plus a bunch of 
stuff that shouldn't be
  * here.
@@ -47,4 +51,9 @@ public abstract class ServletTestFixture
   public final HttpServletResponse response = mock(HttpServletResponse.class);
   public final HttpServletResponseRecorder recorder = new 
HttpServletResponseRecorder(response);
   public final LockedDomainService lockedDomainService = 
mock(LockedDomainService.class);
+  public final Provider<FeedProcessor> feedProcessorProvider = new 
Provider<FeedProcessor>() {
+    public FeedProcessor get() {
+      return new FeedProcessorImpl();
+    }
+  };
 }


Reply via email to