/* ********************************************************************** ** ** Copyright notice ** ** ** ** (c) 2005-2009 RSSOwl Development Team ** ** http://www.rssowl.org/ ** ** ** ** All rights reserved ** ** ** ** This program and the accompanying materials are made available under ** ** the terms of the Eclipse Public License v1.0 which accompanies this ** ** distribution, and is available at: ** ** http://www.rssowl.org/legal/epl-v10.html ** ** ** ** A copy is found in the file epl-v10.html and important notices to the ** ** license from the team is found in the textfile LICENSE.txt distributed ** ** in this package. ** ** ** ** This copyright notice MUST APPEAR in all copies of the file! ** ** ** ** Contributors: ** ** RSSOwl Development Team - initial API and implementation ** ** ** ** ********************************************************************** */ package org.rssowl.core.tests.controller; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import org.eclipse.core.runtime.NullProgressMonitor; import org.junit.Before; import org.junit.Test; import org.rssowl.core.Owl; import org.rssowl.core.internal.persist.Feed; import org.rssowl.core.internal.persist.pref.DefaultPreferences; import org.rssowl.core.internal.persist.service.PersistenceServiceImpl; import org.rssowl.core.persist.IAttachment; import org.rssowl.core.persist.IBookMark; import org.rssowl.core.persist.IFeed; import org.rssowl.core.persist.IFolder; import org.rssowl.core.persist.INews; import org.rssowl.core.persist.NewsCounter; import org.rssowl.core.persist.dao.DynamicDAO; import org.rssowl.core.persist.dao.INewsCounterDAO; import org.rssowl.core.persist.dao.INewsDAO; import org.rssowl.core.persist.event.AttachmentEvent; import org.rssowl.core.persist.event.AttachmentListener; import org.rssowl.core.persist.event.NewsAdapter; import org.rssowl.core.persist.event.NewsEvent; import org.rssowl.core.persist.event.NewsListener; import org.rssowl.core.persist.pref.IPreferenceScope; import org.rssowl.core.persist.reference.FeedLinkReference; import org.rssowl.core.persist.reference.FeedReference; import org.rssowl.core.persist.service.PersistenceException; import org.rssowl.core.tests.model.LargeBlockSizeTest; import org.rssowl.ui.internal.Controller; import java.net.URI; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Random; import java.util.Set; /** * This Test-Case tries to be very close to a real-world-example by modifying a * Feed in memory and using Controller#reload() on it to test the results. * Summmary of Tests: * <ul> * <li>Title: testTitle()</li> * <li>Link: testLink()</li> * <li>Guid: testGuid()</li> * <li>Title, Link: testTitleLink()</li> * <li>Title, Guid: testTitleGuid()</li> * <li>Title, PubDate: testTitlePubDate()</li> * <li>Title, Link, PubDate: testTitleLinkPubdate()</li> * <li>Title, Guid, PubDate: testTitleGuidPubDate()</li> * <li>Title, Link, Guid: testTitleLinkGuid()</li> * <li>Title, Link, Guid, PubDate: testTitleLinkGuidPubDate()</li> * </ul> * * @author bpasero */ public class ReloadTestLocal extends LargeBlockSizeTest { private Controller fController; private SimpleDateFormat fDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz"); //$NON-NLS-1$ private Random fRand = new Random(); private INewsDAO fNewsDao; /** * @throws Exception */ @Before public void setUp() throws Exception { ((PersistenceServiceImpl)Owl.getPersistenceService()).recreateSchemaForTests(); InMemoryProtocolHandler.FEED = null; fController = Controller.getDefault(); fNewsDao = Owl.getPersistenceService().getDAOService().getNewsDAO(); } @Test @SuppressWarnings("all") public void testInMemoryFeed() throws Exception { IFeed feed = new Feed(new URI("inmemory://rss_2_0.xml")); //$NON-NLS-1$ feed = DynamicDAO.save(feed); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); FeedReference feedRef = new FeedReference(feed.getId()); Date d = new Date(); InMemoryProtocolHandler.FEED = generateFeed("Title", "http://www.link.de", "http://www.guid.de", fDateFormat.format(d)); fController.reload(createBookMark(feed), null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); INews news = feedRef.resolve().getNews().get(0); assertEquals("Title", news.getTitle()); assertEquals("http://www.link.de", news.getLink().toString()); assertEquals("http://www.guid.de", news.getGuid().getValue()); assertEquals(d.toString(), news.getPublishDate().toString()); } @Test @SuppressWarnings("all") public void testTitle() throws Exception { NewsListener newsListener = null; try { IFeed feed = new Feed(new URI("inmemory://rss_2_0.xml")); //$NON-NLS-1$ feed = DynamicDAO.save(feed); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); FeedReference feedRef = new FeedReference(feed.getId()); IBookMark bookmark = createBookMark(feed); final int addedCounter[] = new int[] { 0 }; final int updatedCounter[] = new int[] { 0 }; newsListener = new NewsListener() { public void entitiesAdded(Set<NewsEvent> events) { addedCounter[0] += events.size(); } public void entitiesDeleted(Set<NewsEvent> events) { fail("Did not expect this Event"); } public void entitiesUpdated(Set<NewsEvent> events) { updatedCounter[0] += events.size(); } }; DynamicDAO.addEntityListener(INews.class, newsListener); /* First Reload */ InMemoryProtocolHandler.FEED = generateFeed("Title", null, null, null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); assertEquals(INews.State.NEW, feedRef.resolve().getNews().get(0).getState()); assertEquals(1, addedCounter[0]); /* Set to Unread */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.UNREAD, true, false); assertEquals(1, updatedCounter[0]); /* Second Reload with different Title */ InMemoryProtocolHandler.FEED = generateFeed("Title *new*", null, null, null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(2, feedRef.resolve().getNews().size()); assertEquals(2, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); assertEquals(1, updatedCounter[0]); assertEquals(2, addedCounter[0]); List<INews> news = feedRef.resolve().getNews(); for (INews newsItem : news) { if ("Title".equals(newsItem.getTitle())) assertEquals(INews.State.UNREAD, newsItem.getState()); else if ("Title *new*".equals(newsItem.getTitle())) assertEquals(INews.State.NEW, newsItem.getState()); } /* Set to Read */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); assertEquals(3, updatedCounter[0]); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(2, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(1).getState()); assertEquals(3, updatedCounter[0]); } finally { if (newsListener != null) DynamicDAO.removeEntityListener(INews.class, newsListener); } } @Test @SuppressWarnings("all") public void testLink() throws Exception { NewsListener newsListener = null; try { IFeed feed = new Feed(new URI("inmemory://rss_2_0.xml")); //$NON-NLS-1$ feed = DynamicDAO.save(feed); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); FeedReference feedRef = new FeedReference(feed.getId()); IBookMark bookmark = createBookMark(feed); final int addedCounter[] = new int[] { 0 }; final int updatedCounter[] = new int[] { 0 }; newsListener = new NewsListener() { public void entitiesAdded(Set<NewsEvent> events) { addedCounter[0] += events.size(); } public void entitiesDeleted(Set<NewsEvent> events) { fail("Did not expect this Event"); } public void entitiesUpdated(Set<NewsEvent> events) { updatedCounter[0] += events.size(); } }; DynamicDAO.addEntityListener(INews.class, newsListener); /* First Reload */ InMemoryProtocolHandler.FEED = generateFeed(null, "http://www.link.de", null, null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); assertEquals(INews.State.NEW, feedRef.resolve().getNews().get(0).getState()); /* Set to Unread */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.UNREAD, true, false); /* Second Reload with different Link */ InMemoryProtocolHandler.FEED = generateFeed(null, "http://www.link_other.de", null, null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(2, feedRef.resolve().getNews().size()); assertEquals(2, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); List<INews> news = feedRef.resolve().getNews(); for (INews newsItem : news) { if ("http://www.link.de".equals(newsItem.getLink().toString())) assertEquals(INews.State.UNREAD, newsItem.getState()); else if ("http://www.link_other.de".equals(newsItem.getLink().toString())) assertEquals(INews.State.NEW, newsItem.getState()); } /* Set to Read */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(2, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(1).getState()); /* Test Event Counter */ assertEquals(2, addedCounter[0]); assertEquals(3, updatedCounter[0]); } finally { if (newsListener != null) DynamicDAO.removeEntityListener(INews.class, newsListener); } } @Test @SuppressWarnings("all") public void testGuid() throws Exception { NewsListener newsListener = null; try { IFeed feed = new Feed(new URI("inmemory://rss_2_0.xml")); //$NON-NLS-1$ feed = DynamicDAO.save(feed); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); FeedReference feedRef = new FeedReference(feed.getId()); IBookMark bookmark = createBookMark(feed); final int addedCounter[] = new int[] { 0 }; final int updatedCounter[] = new int[] { 0 }; newsListener = new NewsListener() { public void entitiesAdded(Set<NewsEvent> events) { addedCounter[0] += events.size(); } public void entitiesDeleted(Set<NewsEvent> events) { fail("Did not expect this Event"); } public void entitiesUpdated(Set<NewsEvent> events) { updatedCounter[0] += events.size(); } }; DynamicDAO.addEntityListener(INews.class, newsListener); /* First Reload */ InMemoryProtocolHandler.FEED = generateFeed(null, null, "http://www.guid.de", null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); assertEquals(INews.State.NEW, feedRef.resolve().getNews().get(0).getState()); /* Set to Unread */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.UNREAD, true, false); /* Second Reload with different Guid */ InMemoryProtocolHandler.FEED = generateFeed(null, null, "http://www.guid_other.de", null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(2, feedRef.resolve().getNews().size()); assertEquals(2, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); List<INews> news = feedRef.resolve().getNews(); for (INews newsItem : news) { if ("http://www.guid.de".equals(newsItem.getGuid().getValue())) assertEquals(INews.State.UNREAD, newsItem.getState()); else if ("http://www.guid_other.de".equals(newsItem.getGuid().getValue())) assertEquals(INews.State.NEW, newsItem.getState()); } /* Set to Read */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(2, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(1).getState()); /* Test Event Counter */ assertEquals(2, addedCounter[0]); assertEquals(3, updatedCounter[0]); } finally { if (newsListener != null) DynamicDAO.removeEntityListener(INews.class, newsListener); } } @Test @SuppressWarnings("all") public void testTitleLink() throws Exception { NewsListener newsListener = null; try { IFeed feed = new Feed(new URI("inmemory://rss_2_0.xml")); //$NON-NLS-1$ feed = DynamicDAO.save(feed); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); FeedReference feedRef = new FeedReference(feed.getId()); IBookMark bookmark = createBookMark(feed); final int addedCounter[] = new int[] { 0 }; final int updatedCounter[] = new int[] { 0 }; newsListener = new NewsListener() { public void entitiesAdded(Set<NewsEvent> events) { addedCounter[0] += events.size(); } public void entitiesDeleted(Set<NewsEvent> events) { fail("Did not expect this Event"); } public void entitiesUpdated(Set<NewsEvent> events) { updatedCounter[0] += events.size(); } }; DynamicDAO.addEntityListener(INews.class, newsListener); /* First Reload */ InMemoryProtocolHandler.FEED = generateFeed("Title", "http://www.link.de", null, null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); assertEquals(INews.State.NEW, feedRef.resolve().getNews().get(0).getState()); /* Set to Unread */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.UNREAD, true, false); /* Second Reload with updated Title */ InMemoryProtocolHandler.FEED = generateFeed("Title *updated*", "http://www.link.de", null, null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.UPDATED, feedRef.resolve().getNews().get(0).getState()); /* Set to Read and Reload */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Fourth Reload with added News */ InMemoryProtocolHandler.FEED = generateFeed("Title *updated*", "http://www.link_other.de", null, null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(2, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); List<INews> news = feedRef.resolve().getNews(); for (INews newsItem : news) { if ("http://www.link.de".equals(newsItem.getLink().toString())) assertEquals(INews.State.READ, newsItem.getState()); else if ("http://www.link_other.de".equals(newsItem.getLink().toString())) assertEquals(INews.State.NEW, newsItem.getState()); } /* Set to Read */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(2, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(1).getState()); /* Test Event Counter */ assertEquals(2, addedCounter[0]); assertEquals(4, updatedCounter[0]); } finally { if (newsListener != null) DynamicDAO.removeEntityListener(INews.class, newsListener); } } @Test @SuppressWarnings("all") public void testTitleGuid() throws Exception { NewsListener newsListener = null; try { IFeed feed = new Feed(new URI("inmemory://rss_2_0.xml")); //$NON-NLS-1$ feed = DynamicDAO.save(feed); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); FeedReference feedRef = new FeedReference(feed.getId()); IBookMark bookmark = createBookMark(feed); final int addedCounter[] = new int[] { 0 }; final int updatedCounter[] = new int[] { 0 }; newsListener = new NewsListener() { public void entitiesAdded(Set<NewsEvent> events) { addedCounter[0] += events.size(); } public void entitiesDeleted(Set<NewsEvent> events) { fail("Did not expect this Event"); } public void entitiesUpdated(Set<NewsEvent> events) { updatedCounter[0] += events.size(); } }; DynamicDAO.addEntityListener(INews.class, newsListener); /* First Reload */ InMemoryProtocolHandler.FEED = generateFeed("Title", null, "http://www.guid.de", null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); assertEquals(INews.State.NEW, feedRef.resolve().getNews().get(0).getState()); /* Set to Unread */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.UNREAD, true, false); /* Second Reload with updated Title */ InMemoryProtocolHandler.FEED = generateFeed("Title *updated*", null, "http://www.guid.de", null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.UPDATED, feedRef.resolve().getNews().get(0).getState()); /* Set to Read and Reload */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Fourth Reload with added News */ InMemoryProtocolHandler.FEED = generateFeed("Title *updated*", null, "http://www.guid_other.de", null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(2, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); List<INews> news = feedRef.resolve().getNews(); for (INews newsItem : news) { if ("http://www.guid.de".equals(newsItem.getGuid().getValue())) assertEquals(INews.State.READ, newsItem.getState()); else if ("http://www.guid_other.de".equals(newsItem.getGuid().getValue())) assertEquals(INews.State.NEW, newsItem.getState()); } /* Set to Read */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(2, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(1).getState()); /* Test Event Counter */ assertEquals(2, addedCounter[0]); assertEquals(4, updatedCounter[0]); } finally { if (newsListener != null) DynamicDAO.removeEntityListener(INews.class, newsListener); } } /** * Tests that news with the same title will not be updated if their * description changes. * * @throws Exception */ @Test @SuppressWarnings("all") public void testTitleDescription() throws Exception { NewsListener newsListener = null; try { IFeed feed = new Feed(new URI("inmemory://rss_2_0.xml")); //$NON-NLS-1$ feed = DynamicDAO.save(feed); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); FeedReference feedRef = new FeedReference(feed.getId()); IBookMark bookmark = createBookMark(feed); final int addedCounter[] = new int[] { 0 }; final int updatedCounter[] = new int[] { 0 }; newsListener = new NewsListener() { public void entitiesAdded(Set<NewsEvent> events) { addedCounter[0] += events.size(); } public void entitiesDeleted(Set<NewsEvent> events) { fail("Did not expect this Event"); } public void entitiesUpdated(Set<NewsEvent> events) { updatedCounter[0] += events.size(); } }; DynamicDAO.addEntityListener(INews.class, newsListener); long now = System.currentTimeMillis(); String description = "Initial description"; /* First Reload */ InMemoryProtocolHandler.FEED = generateFeed("Title", null, null, fDateFormat.format(now), description); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); assertEquals(INews.State.NEW, feedRef.resolve().getNews().get(0).getState()); /* Set to Unread */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.UNREAD, true, false); /* Second Reload with updated description */ long ms = now + 100000; String updatedDescription = description + "updated"; InMemoryProtocolHandler.FEED = generateFeed("Title", null, null, fDateFormat.format(new Date(ms)), updatedDescription); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.UNREAD, feedRef.resolve().getNews().get(0).getState()); /* Set to Read and Reload */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Fourth Reload with added News */ ms = System.currentTimeMillis() + 1000000; InMemoryProtocolHandler.FEED = generateFeed("Title Other", null, null, fDateFormat.format(ms)); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(2, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); List<INews> news = feedRef.resolve().getNews(); for (INews newsItem : news) { if ("Title".equals(newsItem.getTitle())) assertEquals(INews.State.READ, newsItem.getState()); else if ("Title Other".equals(newsItem.getTitle())) assertEquals(INews.State.NEW, newsItem.getState()); } /* Set to Read */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(2, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(1).getState()); /* Test Event Counter */ assertEquals(2, addedCounter[0]); assertEquals(4, updatedCounter[0]); } finally { if (newsListener != null) DynamicDAO.removeEntityListener(INews.class, newsListener); } } @Test @SuppressWarnings("all") public void testTitleLinkPubdate() throws Exception { NewsListener newsListener = null; try { IFeed feed = new Feed(new URI("inmemory://rss_2_0.xml")); //$NON-NLS-1$ feed = DynamicDAO.save(feed); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); FeedReference feedRef = new FeedReference(feed.getId()); IBookMark bookmark = createBookMark(feed); final int addedCounter[] = new int[] { 0 }; final int updatedCounter[] = new int[] { 0 }; newsListener = new NewsListener() { public void entitiesAdded(Set<NewsEvent> events) { addedCounter[0] += events.size(); } public void entitiesDeleted(Set<NewsEvent> events) { fail("Did not expect this Event"); } public void entitiesUpdated(Set<NewsEvent> events) { updatedCounter[0] += events.size(); } }; DynamicDAO.addEntityListener(INews.class, newsListener); long now = System.currentTimeMillis(); /* First Reload */ InMemoryProtocolHandler.FEED = generateFeed("Title", "http://www.link.de", null, fDateFormat.format(now)); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); assertEquals(INews.State.NEW, feedRef.resolve().getNews().get(0).getState()); /* Set to Unread */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.UNREAD, true, false); /* Second Reload with updated Title */ InMemoryProtocolHandler.FEED = generateFeed("Title *updated*", "http://www.link.de", null, fDateFormat.format(now)); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.UPDATED, feedRef.resolve().getNews().get(0).getState()); /* Set to Read and Reload */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Fourth Reload with updated Publish Date */ long ms = now + 100000; InMemoryProtocolHandler.FEED = generateFeed("Title *updated*", "http://www.link.de", null, fDateFormat.format(ms)); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Set to Read and Reload */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Fifth Reload with updated Title and Publish Date */ ms = now + 1000000; InMemoryProtocolHandler.FEED = generateFeed("Title *updated #2*", "http://www.link.de", null, fDateFormat.format(ms)); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.UPDATED, feedRef.resolve().getNews().get(0).getState()); /* Set to Read and Reload */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Sixth Reload with added News */ InMemoryProtocolHandler.FEED = generateFeed("Title *updated #2*", "http://www.link_other.de", null, fDateFormat.format(now)); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(2, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); List<INews> news = feedRef.resolve().getNews(); for (INews newsItem : news) { if ("http://www.link.de".equals(newsItem.getLink().toString())) assertEquals(INews.State.READ, newsItem.getState()); else if ("http://www.link_other.de".equals(newsItem.getLink().toString())) assertEquals(INews.State.NEW, newsItem.getState()); } /* Set to Read */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(2, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(1).getState()); /* Test Event Counter */ assertEquals(2, addedCounter[0]); assertEquals(7, updatedCounter[0]); } finally { if (newsListener != null) DynamicDAO.removeEntityListener(INews.class, newsListener); } } @Test @SuppressWarnings("all") public void testTitleGuidPubDate() throws Exception { NewsListener newsListener = null; try { IFeed feed = new Feed(new URI("inmemory://rss_2_0.xml")); //$NON-NLS-1$ feed = DynamicDAO.save(feed); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); FeedReference feedRef = new FeedReference(feed.getId()); IBookMark bookmark = createBookMark(feed); final int addedCounter[] = new int[] { 0 }; final int updatedCounter[] = new int[] { 0 }; newsListener = new NewsListener() { public void entitiesAdded(Set<NewsEvent> events) { addedCounter[0] += events.size(); } public void entitiesDeleted(Set<NewsEvent> events) { fail("Did not expect this Event"); } public void entitiesUpdated(Set<NewsEvent> events) { updatedCounter[0] += events.size(); } }; DynamicDAO.addEntityListener(INews.class, newsListener); long now = System.currentTimeMillis(); /* First Reload */ InMemoryProtocolHandler.FEED = generateFeed("Title", null, "http://www.guid.de", fDateFormat.format(now)); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); assertEquals(INews.State.NEW, feedRef.resolve().getNews().get(0).getState()); /* Set to Unread */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.UNREAD, true, false); /* Second Reload with updated Title */ InMemoryProtocolHandler.FEED = generateFeed("Title *updated*", null, "http://www.guid.de", fDateFormat.format(now)); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.UPDATED, feedRef.resolve().getNews().get(0).getState()); /* Set to Read and Reload */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Fourth Reload with updated Publish Date */ long ms = now + 100000; InMemoryProtocolHandler.FEED = generateFeed("Title *updated*", null, "http://www.guid.de", fDateFormat.format(ms)); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Set to Read and Reload */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Fifth Reload with updated Title and Publish Date */ ms = now + 1000000; InMemoryProtocolHandler.FEED = generateFeed("Title *updated #2*", null, "http://www.guid.de", fDateFormat.format(ms)); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.UPDATED, feedRef.resolve().getNews().get(0).getState()); /* Set to Read and Reload */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Sixth Reload with added News */ InMemoryProtocolHandler.FEED = generateFeed("Title *updated #2*", null, "http://www.guid_other.de", fDateFormat.format(now)); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(2, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); List<INews> news = feedRef.resolve().getNews(); for (INews newsItem : news) { if ("http://www.guid.de".equals(newsItem.getGuid().getValue())) assertEquals(INews.State.READ, newsItem.getState()); else if ("http://www.guid_other.de".equals(newsItem.getGuid().getValue())) assertEquals(INews.State.NEW, newsItem.getState()); } /* Set to Read */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(2, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(1).getState()); /* Test Event Counter */ assertEquals(2, addedCounter[0]); assertEquals(7, updatedCounter[0]); } finally { if (newsListener != null) DynamicDAO.removeEntityListener(INews.class, newsListener); } } @Test @SuppressWarnings("all") public void testTitleLinkGuid() throws Exception { NewsListener newsListener = null; try { IFeed feed = new Feed(new URI("inmemory://rss_2_0.xml")); //$NON-NLS-1$ feed = DynamicDAO.save(feed); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); FeedReference feedRef = new FeedReference(feed.getId()); IBookMark bookmark = createBookMark(feed); final int addedCounter[] = new int[] { 0 }; final int updatedCounter[] = new int[] { 0 }; newsListener = new NewsListener() { public void entitiesAdded(Set<NewsEvent> events) { addedCounter[0] += events.size(); } public void entitiesDeleted(Set<NewsEvent> events) { fail("Did not expect this Event"); } public void entitiesUpdated(Set<NewsEvent> events) { updatedCounter[0] += events.size(); } }; DynamicDAO.addEntityListener(INews.class, newsListener); /* First Reload */ InMemoryProtocolHandler.FEED = generateFeed("Title", "http://www.link.de", "http://www.guid.de", null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); assertEquals(INews.State.NEW, feedRef.resolve().getNews().get(0).getState()); /* Set to Unread */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.UNREAD, true, false); /* Second Reload with updated Title */ InMemoryProtocolHandler.FEED = generateFeed("Title *updated*", "http://www.link.de", "http://www.guid.de", null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.UPDATED, feedRef.resolve().getNews().get(0).getState()); /* Set to Read and Reload */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Fourth Reload with updated Link */ InMemoryProtocolHandler.FEED = generateFeed("Title *updated*", "http://www.link_updated.de", "http://www.guid.de", null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Set to Read and Reload */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Fifth Reload with updated Title and Link */ InMemoryProtocolHandler.FEED = generateFeed("Title *updated #2*", "http://www.link_updated_again.de", "http://www.guid.de", null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.UPDATED, feedRef.resolve().getNews().get(0).getState()); /* Set to Read and Reload */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Sixth Reload with added News */ InMemoryProtocolHandler.FEED = generateFeed("Title *updated #2*", "http://www.link_updated_again.de", "http://www.guid_other.de", null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(2, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); List<INews> news = feedRef.resolve().getNews(); for (INews newsItem : news) { if ("http://www.guid.de".equals(newsItem.getGuid().getValue())) assertEquals(INews.State.READ, newsItem.getState()); else if ("http://www.guid_other.de".equals(newsItem.getGuid().getValue())) assertEquals(INews.State.NEW, newsItem.getState()); } /* Set to Read */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(2, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(1).getState()); /* Test Event Counter */ assertEquals(2, addedCounter[0]); assertEquals(7, updatedCounter[0]); } finally { if (newsListener != null) DynamicDAO.removeEntityListener(INews.class, newsListener); } } @Test @SuppressWarnings("all") public void testTitleLinkGuidPubDate() throws Exception { NewsListener newsListener = null; try { IFeed feed = new Feed(new URI("inmemory://rss_2_0.xml")); //$NON-NLS-1$ feed = DynamicDAO.save(feed); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); FeedReference feedRef = new FeedReference(feed.getId()); IBookMark bookmark = createBookMark(feed); final int addedCounter[] = new int[] { 0 }; final int updatedCounter[] = new int[] { 0 }; newsListener = new NewsListener() { public void entitiesAdded(Set<NewsEvent> events) { addedCounter[0] += events.size(); } public void entitiesDeleted(Set<NewsEvent> events) { fail("Did not expect this Event"); } public void entitiesUpdated(Set<NewsEvent> events) { updatedCounter[0] += events.size(); } }; DynamicDAO.addEntityListener(INews.class, newsListener); long now = System.currentTimeMillis(); /* First Reload */ InMemoryProtocolHandler.FEED = generateFeed("Title", "http://www.link.de", "http://www.guid.de", fDateFormat.format(now)); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); assertEquals(INews.State.NEW, feedRef.resolve().getNews().get(0).getState()); /* Set to Unread */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.UNREAD, true, false); /* Second Reload with updated Title */ InMemoryProtocolHandler.FEED = generateFeed("Title *updated*", "http://www.link.de", "http://www.guid.de", fDateFormat.format(now)); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.UPDATED, feedRef.resolve().getNews().get(0).getState()); /* Set to Read and Reload */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Fourth Reload with updated Link */ InMemoryProtocolHandler.FEED = generateFeed("Title *updated*", "http://www.link_updated.de", "http://www.guid.de", fDateFormat.format(now)); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Set to Read and Reload */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Reload with updated description */ String updatedDescription = "updatedDescription"; InMemoryProtocolHandler.FEED = generateFeed("Title *updated*", "http://www.link_updated.de", "http://www.guid.de", fDateFormat.format(now + 1000), updatedDescription); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Set to Read and Reload */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Fifth Reload with updated Title and Link */ InMemoryProtocolHandler.FEED = generateFeed("Title *updated #2*", "http://www.link_updated_again.de", "http://www.guid.de", fDateFormat.format(now), updatedDescription); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.UPDATED, feedRef.resolve().getNews().get(0).getState()); /* Set to Read and Reload */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Reload with updated Title and Publish Date */ long ms2 = now + 200000; InMemoryProtocolHandler.FEED = generateFeed("Title *updated #2 #3*", "http://www.link_updated_again.de", "http://www.guid.de", fDateFormat.format(ms2), updatedDescription + " again"); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.UPDATED, feedRef.resolve().getNews().get(0).getState()); /* Set to Read and Reload */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Reload with updated Title, Link and Publish Date */ long ms3 = now + 500000; InMemoryProtocolHandler.FEED = generateFeed("Title *updated #2 #3 #4*", "http://www.link_updated_again_again.de", "http://www.guid.de", fDateFormat.format(ms3)); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.UPDATED, feedRef.resolve().getNews().get(0).getState()); /* Set to Read and Reload */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); /* Sixth Reload with added News */ InMemoryProtocolHandler.FEED = generateFeed("Title *updated #2 #3 #4*", "http://www.link_updated_again_again.de", "http://www.guid_other.de", fDateFormat.format(ms3)); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(2, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); List<INews> news = feedRef.resolve().getNews(); for (INews newsItem : news) { if ("http://www.guid.de".equals(newsItem.getGuid().getValue())) assertEquals(INews.State.READ, newsItem.getState()); else if ("http://www.guid_other.de".equals(newsItem.getGuid().getValue())) assertEquals(INews.State.NEW, newsItem.getState()); } /* Set to Read */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.READ, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(2, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(0).getState()); assertEquals(INews.State.READ, feedRef.resolve().getNews().get(1).getState()); /* Test Event Counter */ assertEquals(2, addedCounter[0]); assertEquals(12, updatedCounter[0]); } finally { if (newsListener != null) DynamicDAO.removeEntityListener(INews.class, newsListener); } } @Test @SuppressWarnings("all") public void testNewsDeleted() throws Exception { NewsListener newsListener = null; try { IFeed feed = new Feed(new URI("inmemory://rss_2_0.xml")); //$NON-NLS-1$ feed = DynamicDAO.save(feed); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); FeedReference feedRef = new FeedReference(feed.getId()); IBookMark bookmark = createBookMark(feed); final int addedCounter[] = new int[] { 0 }; final int updatedCounter[] = new int[] { 0 }; final int removedCounter[] = new int[] { 0 }; newsListener = new NewsListener() { public void entitiesAdded(Set<NewsEvent> events) { addedCounter[0] += events.size(); } public void entitiesDeleted(Set<NewsEvent> events) { removedCounter[0] += events.size(); } public void entitiesUpdated(Set<NewsEvent> events) { updatedCounter[0] += events.size(); } }; DynamicDAO.addEntityListener(INews.class, newsListener); /* First Reload */ InMemoryProtocolHandler.FEED = generateFeed("Title", "http://www.link.de", null, fDateFormat.format(System.currentTimeMillis())); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); assertEquals(INews.State.NEW, feedRef.resolve().getNews().get(0).getState()); /* Delete News (set to Hidden) */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.HIDDEN, true, false); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); /* Reload unchanged Feed */ fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); /* Second Reload */ InMemoryProtocolHandler.FEED = generateFeed("Title", "http://www.link_other.de", null, fDateFormat.format(System.currentTimeMillis())); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(2, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); List<INews> news = feedRef.resolve().getNews(); for (INews newsItem : news) { if ("http://www.link.de".equals(newsItem.getLink().toString())) assertEquals(INews.State.HIDDEN, newsItem.getState()); else if ("http://www.link_other.de".equals(newsItem.getLink().toString())) assertEquals(INews.State.NEW, newsItem.getState()); } /* Really Delete News */ news = feedRef.resolve().getNews(); for (INews newsItem : news) { if ("http://www.link.de".equals(newsItem.getLink().toString())) fNewsDao.setState(new ArrayList<INews>(Arrays.asList(newsItem)), INews.State.DELETED, false, false); } news = feedRef.resolve().getNews(); for (INews newsItem : news) { if ("http://www.link.de".equals(newsItem.getLink().toString())) assertEquals(INews.State.DELETED, newsItem.getState()); else if ("http://www.link_other.de".equals(newsItem.getLink().toString())) assertEquals(INews.State.NEW, newsItem.getState()); } /* Reload unchanged Feed */ fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); /* Test Event Counter */ assertEquals(2, addedCounter[0]); assertEquals(2, updatedCounter[0]); assertEquals(1, removedCounter[0]); } finally { if (newsListener != null) DynamicDAO.removeEntityListener(INews.class, newsListener); } } @Test @SuppressWarnings("all") public void testNewsUpdatedOnOtherFields() throws Exception { NewsListener newsListener = null; NewsListener oldNewsListener = null; try { IFeed feed = new Feed(new URI("inmemory://rss_2_0.xml")); //$NON-NLS-1$ feed = DynamicDAO.save(feed); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); FeedReference feedRef = new FeedReference(feed.getId()); IBookMark bookmark = createBookMark(feed); final int addedCounter[] = new int[] { 0 }; final int updatedCounter[] = new int[] { 0 }; newsListener = new NewsListener() { public void entitiesAdded(Set<NewsEvent> events) { addedCounter[0] += events.size(); } public void entitiesDeleted(Set<NewsEvent> events) { fail("Did not expect this Event"); } public void entitiesUpdated(Set<NewsEvent> events) { updatedCounter[0] += events.size(); } }; DynamicDAO.addEntityListener(INews.class, newsListener); /* First Reload */ InMemoryProtocolHandler.FEED = generateFeed("Title", "http://www.link.de", null, null, "Hello World", "bpasero", null, "mp3"); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); assertEquals(INews.State.NEW, feedRef.resolve().getNews().get(0).getState()); assertEquals("Hello World", feedRef.resolve().getNews().get(0).getDescription()); assertEquals("bpasero", feedRef.resolve().getNews().get(0).getAuthor().getName()); /* Set to Unread */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.UNREAD, true, false); assertEquals(1, updatedCounter[0]); /* Second Reload - changed Description */ InMemoryProtocolHandler.FEED = generateFeed("Title", "http://www.link.de", null, fDateFormat.format(new Date()), "Hello World Changed", "bpasero", null, "mp3"); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.UNREAD, feedRef.resolve().getNews().get(0).getState()); assertEquals("Hello World Changed", feedRef.resolve().getNews().get(0).getDescription()); assertEquals(2, updatedCounter[0]); /* Set to Unread and Reload */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.UNREAD, true, false); fController.reload(bookmark, null, new NullProgressMonitor()); /* This Reload - added Enclosure */ InMemoryProtocolHandler.FEED = generateFeed("Title", "http://www.link.de", null, null, "Hello World Changed", "bpasero", "http://www.download.de", "mp3"); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feed.getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.UNREAD, feedRef.resolve().getNews().get(0).getState()); assertEquals(1, feedRef.resolve().getNews().get(0).getAttachments().size()); assertEquals("http://www.download.de", feedRef.resolve().getNews().get(0).getAttachments().get(0).getLink().toString()); assertEquals(3, updatedCounter[0]); /* This Reload - Changed Author */ InMemoryProtocolHandler.FEED = generateFeed("Title", "http://www.link.de", null, null, "Hello World Changed", "ijuma", "http://www.download.de", "mp3"); oldNewsListener = new NewsAdapter() { @Override public void entitiesUpdated(Set<NewsEvent> events) { assertEquals(1, events.size()); int attachmentsSize = events.iterator().next().getOldNews().getAttachments().size(); assertEquals(1, attachmentsSize); } }; DynamicDAO.addEntityListener(INews.class, oldNewsListener); fController.reload(bookmark, null, new NullProgressMonitor()); DynamicDAO.removeEntityListener(INews.class, oldNewsListener); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); assertEquals(INews.State.UNREAD, feedRef.resolve().getNews().get(0).getState()); assertEquals("ijuma", feedRef.resolve().getNews().get(0).getAuthor().getName()); assertEquals(3, updatedCounter[0]); /* Test Event Counter */ assertEquals(1, addedCounter[0]); assertEquals(3, updatedCounter[0]); } finally { if (newsListener != null) DynamicDAO.removeEntityListener(INews.class, newsListener); if (oldNewsListener != null) DynamicDAO.removeEntityListener(INews.class, oldNewsListener); } } @Test @SuppressWarnings("all") public void testAttachmentAddedUpdatedEvent() throws Exception { AttachmentListener attachmentListener = null; try { IFeed feed = new Feed(new URI("inmemory://rss_2_0.xml")); //$NON-NLS-1$ feed = DynamicDAO.save(feed); IBookMark bookmark = createBookMark(feed); final int addedCounter[] = new int[] { 0 }; final int updatedCounter[] = new int[] { 0 }; attachmentListener = new AttachmentListener() { public void entitiesAdded(Set<AttachmentEvent> events) { addedCounter[0]++; } public void entitiesDeleted(Set<AttachmentEvent> events) {} public void entitiesUpdated(Set<AttachmentEvent> events) { updatedCounter[0]++; } }; DynamicDAO.addEntityListener(IAttachment.class, attachmentListener); /* First Reload */ InMemoryProtocolHandler.FEED = generateFeedWithEnclosure("Title", null, "http://www.mp3.com/me.mp3", "wav"); fController.reload(bookmark, null, new NullProgressMonitor()); /* Second Reload with different attachment type */ InMemoryProtocolHandler.FEED = generateFeedWithEnclosure("Title", null, "http://www.mp3.com/me.mp3", "mp3"); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, addedCounter[0]); assertEquals(1, updatedCounter[0]); } finally { if (attachmentListener != null) DynamicDAO.removeEntityListener(IAttachment.class, attachmentListener); } } private NewsCounter loadNewsCounter() { return DynamicDAO.getDAO(INewsCounterDAO.class).load(); } private int getNewCount(IFeed feed) { return loadNewsCounter().getNewCount(feed.getLink().toString()); } private int getUnreadCount(IFeed feed) { return loadNewsCounter().getUnreadCount(feed.getLink().toString()); } @Test @SuppressWarnings("all") public void testNewsServiceWithReloadBookMarkAndCleanup() throws Exception { IFeed feed = new Feed(new URI("inmemory://rss_2_0.xml")); //$NON-NLS-1$ feed = DynamicDAO.save(feed); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); FeedReference feedRef = new FeedReference(feed.getId()); IBookMark bookmark = createBookMark(feed); IPreferenceScope preferences = Owl.getPreferenceService().getEntityScope(bookmark); preferences.putInteger(DefaultPreferences.DEL_NEWS_BY_COUNT_VALUE, 0); preferences.putBoolean(DefaultPreferences.DEL_NEWS_BY_COUNT_STATE, true); preferences.putBoolean(DefaultPreferences.NEVER_DEL_UNREAD_NEWS_STATE, false); /* First Reload */ InMemoryProtocolHandler.FEED = generateFeed("Title", "http://www.link.de", null, null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); assertEquals(1, getUnreadCount(feed)); assertEquals(1, getNewCount(feed)); /* Set to UNREAD */ fNewsDao.setState(feedRef.resolve().getNews(), INews.State.UNREAD, true, false); assertEquals(0, getNewCount(feed)); /* Second Reload */ fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(0, getUnreadCount(feed)); assertEquals(0, getNewCount(feed)); /* Third Reload */ InMemoryProtocolHandler.FEED = generateEmptyFeed(); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(0, feedRef.resolve().getNews().size()); } @Test @SuppressWarnings("all") public void testReloadFeedWithDuplicateNews() throws Exception { /* Duplicate News with: Title */ { IFeed feed = new Feed(new URI("inmemory://rss_2_0.xml")); //$NON-NLS-1$ feed = DynamicDAO.save(feed); FeedReference feedRef = new FeedReference(feed.getId()); IBookMark bookmark = createBookMark(feed); InMemoryProtocolHandler.FEED = generateFeedWithDuplicateNews("News Title", null, null, null, "Description", null, null, null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); DynamicDAO.delete(feedRef.resolve()); } /* Duplicate News with: Title, Link */ { IFeed feed = new Feed(new URI("inmemory://rss_2_0.xml")); //$NON-NLS-1$ feed = DynamicDAO.save(feed); FeedReference feedRef = new FeedReference(feed.getId()); IBookMark bookmark = createBookMark(feed); InMemoryProtocolHandler.FEED = generateFeedWithDuplicateNews("News Title", "http://www.link.com", null, null, "Description", null, null, null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); DynamicDAO.delete(feedRef.resolve()); } /* Duplicate News with: Title, Guid */ { IFeed feed = new Feed(new URI("inmemory://rss_2_0.xml")); //$NON-NLS-1$ feed = DynamicDAO.save(feed); FeedReference feedRef = new FeedReference(feed.getId()); IBookMark bookmark = createBookMark(feed); InMemoryProtocolHandler.FEED = generateFeedWithDuplicateNews("News Title", null, "http://www.link.com", null, "Description", null, null, null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); DynamicDAO.delete(feedRef.resolve()); } /* Duplicate News with: Title, Link, Guid */ { IFeed feed = new Feed(new URI("inmemory://rss_2_0.xml")); //$NON-NLS-1$ feed = DynamicDAO.save(feed); FeedReference feedRef = new FeedReference(feed.getId()); IBookMark bookmark = createBookMark(feed); InMemoryProtocolHandler.FEED = generateFeedWithDuplicateNews("News Title", "http://www.link.com", "http://www.guid.com", null, "Description", null, null, null); fController.reload(bookmark, null, new NullProgressMonitor()); assertEquals(1, feedRef.resolve().getNews().size()); DynamicDAO.delete(feedRef.resolve()); } } @SuppressWarnings("nls") private String generateFeed(String title, String link, String guid, String pubDate) { return generateFeed(title, link, guid, pubDate, null, null, null, "mp3"); } @SuppressWarnings("nls") private String generateFeed(String title, String link, String guid, String pubDate, String description) { return generateFeed(title, link, guid, pubDate, description, null, null, "mp3"); } @SuppressWarnings("nls") private String generateFeedWithEnclosure(String title, String link, String enclosure, String type) { return generateFeed(title, link, null, null, null, null, enclosure, type); } @SuppressWarnings("nls") private String generateFeed(String title, String link, String guid, String pubDate, String description, String author, String enclosure, String type) { StringBuilder str = new StringBuilder(); str.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); str.append("<rss version=\"2.0\">\n"); str.append("<channel>\n"); str.append("<title>In Memory Feed</title>\n"); str.append("<lastBuildDate>"); str.append(fDateFormat.format(new Date(System.currentTimeMillis() + fRand.nextInt(100000)))); str.append("</lastBuildDate>\n"); generateNews(title, link, guid, pubDate, description, author, enclosure, type, str); str.append("</channel>\n"); str.append("</rss>"); return str.toString(); } @SuppressWarnings("nls") private String generateFeedWithDuplicateNews(String title, String link, String guid, String pubDate, String description, String author, String enclosure, String type) { StringBuilder str = new StringBuilder(); str.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); str.append("<rss version=\"2.0\">\n"); str.append("<channel>\n"); str.append("<title>In Memory Feed</title>\n"); str.append("<lastBuildDate>"); str.append(fDateFormat.format(new Date(System.currentTimeMillis() + fRand.nextInt(100000)))); str.append("</lastBuildDate>\n"); generateNews(title, link, guid, pubDate, description, author, enclosure, type, str); generateNews(title, link, guid, pubDate, description, author, enclosure, type, str); generateNews(title, link, guid, pubDate, description, author, enclosure, type, str); str.append("</channel>\n"); str.append("</rss>"); return str.toString(); } private void generateNews(String title, String link, String guid, String pubDate, String description, String author, String enclosure, String type, StringBuilder str) { str.append("<item>\n"); if (title != null) str.append("<title>").append(title).append("</title>\n"); if (link != null) str.append("<link>").append(link).append("</link>\n"); if (guid != null) str.append("<guid>").append(guid).append("</guid>\n"); if (pubDate != null) str.append("<pubDate>").append(pubDate).append("</pubDate>\n"); if (description != null) str.append("<description>").append(description).append("</description>\n"); if (author != null) str.append("<author>").append(author).append("</author>\n"); if (enclosure != null) str.append("<enclosure url=\"" + enclosure + "\" type=\"" + type + "\" />\n"); str.append("</item>\n"); } @SuppressWarnings("nls") private String generateEmptyFeed() { StringBuilder str = new StringBuilder(); str.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); str.append("<rss version=\"2.0\">\n"); str.append("<channel>\n"); str.append("<title>In Memory Feed</title>\n"); str.append("<lastBuildDate>"); str.append(fDateFormat.format(new Date(System.currentTimeMillis() + fRand.nextInt(100000)))); str.append("</lastBuildDate>\n"); str.append("</channel>\n"); str.append("</rss>"); return str.toString(); } private IBookMark createBookMark(IFeed feed) throws PersistenceException { IFolder folder = DynamicDAO.save(Owl.getModelFactory().createFolder(null, null, "Root")); return DynamicDAO.save(Owl.getModelFactory().createBookMark(null, folder, new FeedLinkReference(feed.getLink()), "BookMark")); } }