[jboss-cvs] JBossBlog SVN: r167 - in trunk/src: action/org/jboss/blog/session/feed/posts and 8 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Jan 9 07:38:31 EST 2008


Author: adamw
Date: 2008-01-09 07:38:31 -0500 (Wed, 09 Jan 2008)
New Revision: 167

Added:
   trunk/src/test/org/jboss/blog/session/feed/
   trunk/src/test/org/jboss/blog/session/feed/posts/
   trunk/src/test/org/jboss/blog/session/feed/posts/AggregatedFeedPostsTest.java
   trunk/src/test/org/jboss/blog/tools/TestTools.java
Removed:
   trunk/src/action/org/jboss/blog/session/feed/aggregated/
Modified:
   trunk/src/action/org/jboss/blog/session/feed/posts/AggregatedFeedPosts.java
   trunk/src/action/org/jboss/blog/session/parser/ParserServiceImpl.java
   trunk/src/model/org/jboss/blog/model/Post.java
   trunk/src/test/org/jboss/blog/session/merge/test/MergeServiceTest.java
   trunk/src/tools/org/jboss/blog/tools/GeneralTools.java
Log:


Modified: trunk/src/action/org/jboss/blog/session/feed/posts/AggregatedFeedPosts.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/feed/posts/AggregatedFeedPosts.java	2008-01-08 11:38:16 UTC (rev 166)
+++ trunk/src/action/org/jboss/blog/session/feed/posts/AggregatedFeedPosts.java	2008-01-09 12:38:31 UTC (rev 167)
@@ -1,14 +1,18 @@
 package org.jboss.blog.session.feed.posts;
 
 import org.jboss.blog.model.feed.AggregatedFeed;
+import org.jboss.blog.model.feed.Feed;
 import org.jboss.blog.model.Post;
+import org.jboss.blog.service.FeedsService;
+import org.jboss.blog.tools.GeneralTools;
 import org.jboss.seam.ScopeType;
 import org.jboss.seam.annotations.In;
 import org.jboss.seam.annotations.Name;
 import org.jboss.seam.annotations.Scope;
 
-import javax.persistence.EntityManager;
 import java.util.List;
+import java.util.ArrayList;
+import java.util.Collections;
 
 /**
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
@@ -17,15 +21,59 @@
 @Scope(ScopeType.STATELESS)
 public class AggregatedFeedPosts {
     @In
-    private EntityManager entityManager;
-
+    private FeedsService feedsService;
+    
     @SuppressWarnings("unchecked")
-    public List<Post> getPosts(AggregatedFeed feed, int from, int to) {
-        return entityManager.createQuery(
+    public List<Post> getPosts(AggregatedFeed aggregatedFeed, int from, int to) {
+        /*return entityManager.createQuery(
                 "select post from Post post " +
                         "where post.feed in " +
                         "(select feed from AggregatedFeed af, Feed feed where af = ?1 and feed in elements(af.feeds)) " +
                         "order by post.published desc, post.link")
-                .setParameter(1, feed).setMaxResults(to-from).setFirstResult(from).getResultList();
+                .setParameter(1, feed).setMaxResults(to-from).setFirstResult(from).getResultList();*/
+
+        // Initial list of aggregated feeds.
+        List<Feed> availableFeeds = aggregatedFeed.getFeeds();
+
+        // Generating the list of posts.
+        List<Post> posts = new ArrayList<Post>();
+
+        // Bounds for the number of posts read from each feed.
+        int feedPostsFrom = 0;
+        int feedPostsTo = to;
+
+        do {
+            // A list of feeds from which we may later read more posts, if necessary.
+            List<Feed> newAvailableFeeds = new ArrayList<Feed>();
+
+            for (Feed feed : availableFeeds) {
+                List<Post> feedPosts = feedsService.getPosts(feed, feedPostsFrom, feedPostsTo);
+
+                // Checking if this feed has any more posts; if so, remembering it so it can be checked for more posts,
+                // if needed.
+                if (feedPosts.size() == from-to) {
+                    newAvailableFeeds.add(feed);
+                }
+
+                // Apply the local filters
+                // TODO
+
+                // Apply the global filters
+                // TODO
+
+                posts.addAll(feedPosts);
+            }
+
+            availableFeeds = newAvailableFeeds;
+
+            feedPostsFrom = feedPostsTo;
+            feedPostsTo += to;
+        } while (availableFeeds.size() != 0 && posts.size() < to);
+
+        // Sort the posts
+        Collections.sort(posts);
+
+        // Cut the list to the desired length
+        return GeneralTools.subList(posts, from, to);
     }
 }

Modified: trunk/src/action/org/jboss/blog/session/parser/ParserServiceImpl.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/parser/ParserServiceImpl.java	2008-01-08 11:38:16 UTC (rev 166)
+++ trunk/src/action/org/jboss/blog/session/parser/ParserServiceImpl.java	2008-01-09 12:38:31 UTC (rev 167)
@@ -10,7 +10,6 @@
 import org.jboss.blog.model.Enclosure;
 import org.jboss.blog.session.category.CategoryServiceBean;
 import org.jboss.blog.tools.StringTools;
-import org.jboss.blog.tools.GeneralTools;
 import org.jboss.seam.annotations.AutoCreate;
 import org.jboss.seam.annotations.In;
 import org.jboss.seam.annotations.Name;
@@ -101,16 +100,7 @@
                 }
             }
 
-            Collections.sort(posts, new Comparator<Post>() {
-                public int compare(Post post1, Post post2) {
-                    int dateCompare = - GeneralTools.safeCompare(post1.getPublished(), post2.getPublished());
-                    if (dateCompare == 0) {
-                        return GeneralTools.safeCompare(post1.getLink(), post2.getLink());
-                    } else {
-                        return dateCompare;
-                    }
-                }
-            });
+            Collections.sort(posts);
 
             return feed;
         } catch (FeedException e) {

Modified: trunk/src/model/org/jboss/blog/model/Post.java
===================================================================
--- trunk/src/model/org/jboss/blog/model/Post.java	2008-01-08 11:38:16 UTC (rev 166)
+++ trunk/src/model/org/jboss/blog/model/Post.java	2008-01-09 12:38:31 UTC (rev 167)
@@ -7,6 +7,7 @@
 import org.hibernate.validator.Pattern;
 import org.jboss.blog.tools.StripHtmlBridge;
 import org.jboss.blog.tools.StringTools;
+import org.jboss.blog.tools.GeneralTools;
 import org.jboss.blog.model.feed.Feed;
 
 import javax.persistence.*;
@@ -18,7 +19,7 @@
  */
 @Entity
 @Indexed
-public class Post {
+public class Post implements Comparable<Post> {
     @Id
     @GeneratedValue
     @Column(updatable = false)
@@ -175,4 +176,13 @@
         result = 31 * result + (titleAsId != null ? titleAsId.hashCode() : 0);
         return result;
     }
+
+    public int compareTo(Post post2) {
+        int dateCompare = - GeneralTools.safeCompare(getPublished(), post2.getPublished());
+        if (dateCompare == 0) {
+            return GeneralTools.safeCompare(getLink(), post2.getLink());
+        } else {
+            return dateCompare;
+        }
+    }
 }

Added: trunk/src/test/org/jboss/blog/session/feed/posts/AggregatedFeedPostsTest.java
===================================================================
--- trunk/src/test/org/jboss/blog/session/feed/posts/AggregatedFeedPostsTest.java	                        (rev 0)
+++ trunk/src/test/org/jboss/blog/session/feed/posts/AggregatedFeedPostsTest.java	2008-01-09 12:38:31 UTC (rev 167)
@@ -0,0 +1,109 @@
+package org.jboss.blog.session.feed.posts;
+
+import static org.easymock.EasyMock.*;
+
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+import org.jboss.blog.model.feed.AggregatedFeed;
+import org.jboss.blog.model.feed.Feed;
+import org.jboss.blog.model.Post;
+import org.jboss.blog.service.FeedsService;
+import org.jboss.blog.tools.TestTools;
+
+import java.util.*;
+
+/**
+ * @author <a href="mailto:adam at warski.org">Adam Warski</a>
+ */
+public class AggregatedFeedPostsTest {
+    private Feed feed_0_posts;
+    private Feed feed_1_posts;
+    private Feed feed_2_posts;
+    private Feed feed_3_posts;
+    private Feed feed_4_posts;
+
+    private List<Post> list_0_posts;
+    private List<Post> list_1_posts;
+    private List<Post> list_2_posts;
+    private List<Post> list_3_posts;
+    private List<Post> list_4_posts;
+
+    private AggregatedFeed aggFeed1;
+
+    private FeedsService mockFeedsService;
+    private AggregatedFeedPosts aggFeedPosts;
+
+    private void addPosts(List<Post> posts, int count) {
+        for (int i=0; i<count; i++) {
+            posts.add(new Post());
+        }
+    }
+
+    @BeforeMethod
+    public void setupFeeds() {
+        feed_0_posts = new Feed();
+        feed_1_posts = new Feed();
+        feed_2_posts = new Feed();
+        feed_3_posts = new Feed();
+        feed_4_posts = new Feed();
+
+        list_0_posts = new ArrayList<Post>();
+        list_1_posts = new ArrayList<Post>();
+        list_2_posts = new ArrayList<Post>();
+        list_3_posts = new ArrayList<Post>();
+        list_4_posts = new ArrayList<Post>();
+
+        addPosts(list_0_posts, 0);
+        addPosts(list_1_posts, 1);
+        addPosts(list_2_posts, 2);
+        addPosts(list_3_posts, 3);
+        addPosts(list_4_posts, 4);
+
+        aggFeed1 = new AggregatedFeed();
+        aggFeed1.setFeeds(Arrays.asList(feed_0_posts, feed_1_posts, feed_2_posts, feed_3_posts, feed_4_posts));
+    }
+
+    @BeforeMethod
+    public void setupMocks() throws IllegalAccessException, NoSuchFieldException {
+        aggFeedPosts = new AggregatedFeedPosts();
+        mockFeedsService = createMock(FeedsService.class);
+
+        TestTools.setField(aggFeedPosts, "feedsService", mockFeedsService);
+    }
+
+    @Test
+    public void testGetLessThanAvailable() {
+        // Setup
+        expect(mockFeedsService.getPosts(feed_0_posts, 0, 2)).andReturn(list_0_posts);
+        expect(mockFeedsService.getPosts(feed_1_posts, 0, 2)).andReturn(list_1_posts);
+        expect(mockFeedsService.getPosts(feed_2_posts, 0, 2)).andReturn(list_2_posts);
+        expect(mockFeedsService.getPosts(feed_3_posts, 0, 2)).andReturn(list_3_posts);
+        expect(mockFeedsService.getPosts(feed_4_posts, 0, 2)).andReturn(list_4_posts);
+
+        // Test
+        replay(mockFeedsService);
+        List<Post> posts = aggFeedPosts.getPosts(aggFeed1, 0, 2);
+
+        // Check
+        verify(mockFeedsService);
+        assert posts.size() == 2;
+    }
+
+    @Test
+    public void testGetExactlyAvailable() {
+        // Setup
+        expect(mockFeedsService.getPosts(feed_0_posts, 0, 10)).andReturn(list_0_posts);
+        expect(mockFeedsService.getPosts(feed_1_posts, 0, 10)).andReturn(list_1_posts);
+        expect(mockFeedsService.getPosts(feed_2_posts, 0, 10)).andReturn(list_2_posts);
+        expect(mockFeedsService.getPosts(feed_3_posts, 0, 10)).andReturn(list_3_posts);
+        expect(mockFeedsService.getPosts(feed_4_posts, 0, 10)).andReturn(list_4_posts);
+
+        // Test
+        replay(mockFeedsService);
+        List<Post> posts = aggFeedPosts.getPosts(aggFeed1, 0, 10);
+
+        // Check
+        verify(mockFeedsService);
+        assert posts.size() == 10;
+    }
+}

Modified: trunk/src/test/org/jboss/blog/session/merge/test/MergeServiceTest.java
===================================================================
--- trunk/src/test/org/jboss/blog/session/merge/test/MergeServiceTest.java	2008-01-08 11:38:16 UTC (rev 166)
+++ trunk/src/test/org/jboss/blog/session/merge/test/MergeServiceTest.java	2008-01-09 12:38:31 UTC (rev 167)
@@ -5,12 +5,12 @@
 import org.jboss.blog.model.Post;
 import org.jboss.blog.service.FeedsService;
 import org.jboss.blog.session.merge.MergeServiceBean;
+import org.jboss.blog.tools.TestTools;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import javax.persistence.EntityManager;
-import java.lang.reflect.Field;
 import java.util.*;
 
 /**
@@ -49,13 +49,6 @@
         return cal.getTime();
     }
 
-    private void setField(Object o, String fieldName, Object setTo)
-            throws NoSuchFieldException, IllegalAccessException {
-        Field f = o.getClass().getDeclaredField(fieldName);
-        f.setAccessible(true);
-        f.set(o, setTo);
-    }
-
     @BeforeClass
     public void setupClass() {
         mergeServiceBean = new MergeServiceBean();
@@ -77,10 +70,10 @@
     @BeforeMethod
     public void setupMocks() throws IllegalAccessException, NoSuchFieldException {
         mockEntityManager = createMock(EntityManager.class);
-        setField(mergeServiceBean, "entityManager", mockEntityManager);
+        TestTools.setField(mergeServiceBean, "entityManager", mockEntityManager);
 
         mockFeedsService = createMock(FeedsService.class);
-        setField(mergeServiceBean, "feedsService", mockFeedsService);
+        TestTools.setField(mergeServiceBean, "feedsService", mockFeedsService);
     }
 
     @Test

Added: trunk/src/test/org/jboss/blog/tools/TestTools.java
===================================================================
--- trunk/src/test/org/jboss/blog/tools/TestTools.java	                        (rev 0)
+++ trunk/src/test/org/jboss/blog/tools/TestTools.java	2008-01-09 12:38:31 UTC (rev 167)
@@ -0,0 +1,15 @@
+package org.jboss.blog.tools;
+
+import java.lang.reflect.Field;
+
+/**
+ * @author <a href="mailto:adam at warski.org">Adam Warski</a>
+ */
+public class TestTools {
+    public static void setField(Object o, String fieldName, Object setTo)
+            throws NoSuchFieldException, IllegalAccessException {
+        Field f = o.getClass().getDeclaredField(fieldName);
+        f.setAccessible(true);
+        f.set(o, setTo);
+    }
+}

Modified: trunk/src/tools/org/jboss/blog/tools/GeneralTools.java
===================================================================
--- trunk/src/tools/org/jboss/blog/tools/GeneralTools.java	2008-01-08 11:38:16 UTC (rev 166)
+++ trunk/src/tools/org/jboss/blog/tools/GeneralTools.java	2008-01-09 12:38:31 UTC (rev 167)
@@ -1,6 +1,8 @@
 package org.jboss.blog.tools;
 
 import java.io.*;
+import java.util.List;
+import java.util.Collections;
 
 /**
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
@@ -64,4 +66,16 @@
             return o1.compareTo(o2);
         }
     }
+
+    public static <T> List<T> subList(List<T> list, int from, int to) {
+        if (from > to) {
+            return Collections.emptyList();
+        }
+
+        if (from > list.size()) {
+            return Collections.emptyList();
+        }
+
+        return list.subList(from, Math.min(to, list.size()));
+    }
 }




More information about the jboss-cvs-commits mailing list