[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