/* ********************************************************************** ** ** Copyright notice ** ** ** ** (c) 2005-2011 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.model; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; import org.eclipse.core.runtime.NullProgressMonitor; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.rssowl.core.Owl; import org.rssowl.core.internal.persist.dao.CachingDAO; import org.rssowl.core.internal.persist.service.DBManager; import org.rssowl.core.internal.persist.service.PersistenceServiceImpl; import org.rssowl.core.persist.IBookMark; import org.rssowl.core.persist.IEntity; import org.rssowl.core.persist.IFeed; import org.rssowl.core.persist.IFolder; import org.rssowl.core.persist.ILabel; import org.rssowl.core.persist.IModelFactory; import org.rssowl.core.persist.INews; import org.rssowl.core.persist.INews.State; import org.rssowl.core.persist.INewsBin; import org.rssowl.core.persist.ISearchCondition; import org.rssowl.core.persist.ISearchField; import org.rssowl.core.persist.ISearchMark; import org.rssowl.core.persist.SearchSpecifier; import org.rssowl.core.persist.dao.DynamicDAO; import org.rssowl.core.persist.dao.IBookMarkDAO; import org.rssowl.core.persist.dao.IFolderDAO; import org.rssowl.core.persist.dao.ILabelDAO; import org.rssowl.core.persist.dao.INewsBinDAO; import org.rssowl.core.persist.dao.ISearchMarkDAO; import org.rssowl.core.persist.pref.IPreferenceScope; import org.rssowl.core.persist.reference.FeedLinkReference; import org.rssowl.core.persist.reference.NewsReference; import org.rssowl.core.util.LongOperationMonitor; import java.net.URI; import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.EnumSet; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; /** * Tests specifically for the CachingDAOs in RSSOwl. * * @author bpasero */ @SuppressWarnings("unchecked") public class CachingDAOTest extends LargeBlockSizeTest { private IModelFactory fFactory; private static class NullOperationMonitor extends LongOperationMonitor { public NullOperationMonitor() { super(new NullProgressMonitor()); } } private static final AtomicInteger fgCounter = new AtomicInteger(); /** * @throws Exception */ @Before public void setUp() throws Exception { ((PersistenceServiceImpl)Owl.getPersistenceService()).recreateSchemaForTests(); fFactory = Owl.getModelFactory(); } /** * @throws Exception */ @After public void tearDown() throws Exception { System.setProperty("rssowl.reindex", "false"); //Clear any set reindex marker DBManager.getDefault().getReIndexFile().delete(); DBManager.getDefault().getDefragmentFile().delete(); DBManager.getDefault().getCleanUpIndexFile().delete(); } private void setProperties(IEntity entity) { IPreferenceScope prefs = Owl.getPreferenceService().getEntityScope(entity); prefs.putBoolean("booleanKey", true); prefs.putInteger("integerKey", 10); prefs.putIntegers("integersKey", new int[] { 1, 2, 3, 4, 5 }); prefs.putLong("longKey", 5l); prefs.putLongs("longsKey", new long[] { 10l, 20l, 30l, 40l, 50l }); prefs.putString("stringKey", "Hello World"); prefs.putStrings("stringsKey", new String[] { "Hello", "World", "foo", "bar" }); DynamicDAO.save(entity); } private void setProperties(IBookMark entity) { setProperties((IEntity) entity); entity.setCreationDate(new Date(10000)); entity.setErrorLoading(true); entity.setLastVisitDate(new Date(100)); entity.setPopularity(1000); DynamicDAO.save(entity); } private void setProperties(ISearchMark entity) { setProperties((IEntity) entity); entity.setCreationDate(new Date(10000)); entity.setLastVisitDate(new Date(100)); entity.setPopularity(1000); entity.setMatchAllConditions(true); ISearchField allField = fFactory.createSearchField(IEntity.ALL_FIELDS, INews.class.getName()); entity.addSearchCondition(DynamicDAO.save(fFactory.createSearchCondition(allField, SearchSpecifier.CONTAINS, "foo bar"))); ISearchField ageInDaysField = fFactory.createSearchField(INews.AGE_IN_DAYS, INews.class.getName()); entity.addSearchCondition(DynamicDAO.save(fFactory.createSearchCondition(ageInDaysField, SearchSpecifier.IS, 5))); ISearchField attachmentContentField = fFactory.createSearchField(INews.ATTACHMENTS_CONTENT, INews.class.getName()); entity.addSearchCondition(DynamicDAO.save(fFactory.createSearchCondition(attachmentContentField, SearchSpecifier.CONTAINS, "hello world"))); ISearchField authorField = fFactory.createSearchField(INews.AUTHOR, INews.class.getName()); entity.addSearchCondition(DynamicDAO.save(fFactory.createSearchCondition(authorField, SearchSpecifier.CONTAINS_NOT, "author help"))); ISearchField categoriesField = fFactory.createSearchField(INews.CATEGORIES, INews.class.getName()); entity.addSearchCondition(DynamicDAO.save(fFactory.createSearchCondition(categoriesField, SearchSpecifier.IS_NOT, "categories horror"))); ISearchField descriptionField = fFactory.createSearchField(INews.DESCRIPTION, INews.class.getName()); entity.addSearchCondition(DynamicDAO.save(fFactory.createSearchCondition(descriptionField, SearchSpecifier.CONTAINS_ALL, "lorem ipsum dolor sit..."))); ISearchField feedField = fFactory.createSearchField(INews.FEED, INews.class.getName()); entity.addSearchCondition(DynamicDAO.save(fFactory.createSearchCondition(feedField, SearchSpecifier.IS, "http://www.rssowl.org"))); ISearchField hasAttachmentsField = fFactory.createSearchField(INews.HAS_ATTACHMENTS, INews.class.getName()); entity.addSearchCondition(DynamicDAO.save(fFactory.createSearchCondition(hasAttachmentsField, SearchSpecifier.IS, true))); ISearchField labelField = fFactory.createSearchField(INews.LABEL, INews.class.getName()); entity.addSearchCondition(DynamicDAO.save(fFactory.createSearchCondition(labelField, SearchSpecifier.IS_NOT, "myLabel"))); ISearchField linkField = fFactory.createSearchField(INews.LINK, INews.class.getName()); entity.addSearchCondition(DynamicDAO.save(fFactory.createSearchCondition(linkField, SearchSpecifier.IS, "http://www.rssowl.de"))); ISearchField locationField = fFactory.createSearchField(INews.LOCATION, INews.class.getName()); entity.addSearchCondition(DynamicDAO.save(fFactory.createSearchCondition(locationField, SearchSpecifier.SCOPE, new Long[][] { { 1l, 2l, 3l }, { 4l, 5l, 6l }, { 6l, 7l, 8l } }))); entity.addSearchCondition(DynamicDAO.save(fFactory.createSearchCondition(locationField, SearchSpecifier.IS, new Long[][] { { 1l, 2l, 3l }, { 0l, 0l, 0l }, { 6l, 7l, 8l } }))); entity.addSearchCondition(DynamicDAO.save(fFactory.createSearchCondition(locationField, SearchSpecifier.IS_AFTER, new Long[][] { { 0l, 0l, 0l }, { 4l, 5l, 6l }, { 6l, 7l, 8l } }))); entity.addSearchCondition(DynamicDAO.save(fFactory.createSearchCondition(locationField, SearchSpecifier.IS_BEFORE, new Long[][] { { 1l, 2l, 3l }, { 4l, 5l, 6l }, { 0l, 0l, 0l } }))); entity.addSearchCondition(DynamicDAO.save(fFactory.createSearchCondition(locationField, SearchSpecifier.IS_GREATER_THAN, new Long[][] { { 0l, 0l, 0l }, { 0l, 0l, 0l }, { 0l, 0l, 0l } }))); ISearchField modifiedDateField = fFactory.createSearchField(INews.MODIFIED_DATE, INews.class.getName()); entity.addSearchCondition(DynamicDAO.save(fFactory.createSearchCondition(modifiedDateField, SearchSpecifier.IS_AFTER, new Date(1000)))); ISearchField stateField = fFactory.createSearchField(INews.STATE, INews.class.getName()); entity.addSearchCondition(DynamicDAO.save(fFactory.createSearchCondition(stateField, SearchSpecifier.IS, EnumSet.of(State.NEW, State.UNREAD, State.UPDATED, State.READ)))); DynamicDAO.save(entity); } private void setProperties(INewsBin entity) { setProperties((IEntity) entity); entity.setCreationDate(new Date(10000)); entity.setLastVisitDate(new Date(100)); entity.setPopularity(1000); IFeed feed = DynamicDAO.save(fFactory.createFeed(null, URI.create(String.valueOf(fgCounter.incrementAndGet())))); INews news1 = fFactory.createNews(null, feed, new Date()); news1.setState(INews.State.NEW); DynamicDAO.save(news1); INews news2 = fFactory.createNews(null, feed, new Date()); news2.setState(INews.State.UNREAD); DynamicDAO.save(news2); INews news3 = fFactory.createNews(null, feed, new Date()); news3.setState(INews.State.READ); DynamicDAO.save(news3); DynamicDAO.save(feed); DynamicDAO.save(fFactory.createNews(news1, entity)); DynamicDAO.save(fFactory.createNews(news2, entity)); DynamicDAO.save(fFactory.createNews(news3, entity)); DynamicDAO.save(entity); } private void assertProperties(IEntity entity) { IPreferenceScope prefs = Owl.getPreferenceService().getEntityScope(entity); assertTrue(prefs.getBoolean("booleanKey")); assertEquals(10, prefs.getInteger("integerKey")); assertTrue(Arrays.equals(new int[] { 1, 2, 3, 4, 5 }, prefs.getIntegers("integersKey"))); assertEquals(5l, prefs.getLong("longKey")); assertTrue(Arrays.equals(new long[] { 10l, 20l, 30l, 40l, 50l }, prefs.getLongs("longsKey"))); assertEquals("Hello World", prefs.getString("stringKey")); assertTrue(Arrays.equals(new String[] { "Hello", "World", "foo", "bar" }, prefs.getStrings("stringsKey"))); } private void assertProperties(IBookMark entity) { assertProperties((IEntity) entity); assertEquals(new Date(10000), entity.getCreationDate()); assertEquals(new Date(100), entity.getLastVisitDate()); assertEquals(true, entity.isErrorLoading()); assertEquals(1000, entity.getPopularity()); } private void assertProperties(ISearchMark entity) { assertProperties((IEntity) entity); assertEquals(new Date(10000), entity.getCreationDate()); assertEquals(new Date(100), entity.getLastVisitDate()); assertEquals(1000, entity.getPopularity()); assertEquals(true, entity.matchAllConditions()); List<ISearchCondition> conditions = entity.getSearchConditions(); assertEquals(17, conditions.size()); for (ISearchCondition condition : conditions) { switch (condition.getField().getId()) { case IEntity.ALL_FIELDS: assertEquals(SearchSpecifier.CONTAINS, condition.getSpecifier()); assertEquals("foo bar", condition.getValue()); break; case INews.AGE_IN_DAYS: assertEquals(SearchSpecifier.IS, condition.getSpecifier()); assertEquals(5, condition.getValue()); break; case INews.ATTACHMENTS_CONTENT: assertEquals(SearchSpecifier.CONTAINS, condition.getSpecifier()); assertEquals("hello world", condition.getValue()); break; case INews.AUTHOR: assertEquals(SearchSpecifier.CONTAINS_NOT, condition.getSpecifier()); assertEquals("author help", condition.getValue()); break; case INews.CATEGORIES: assertEquals(SearchSpecifier.IS_NOT, condition.getSpecifier()); assertEquals("categories horror", condition.getValue()); break; case INews.DESCRIPTION: assertEquals(SearchSpecifier.CONTAINS_ALL, condition.getSpecifier()); assertEquals("lorem ipsum dolor sit...", condition.getValue()); break; case INews.FEED: assertEquals(SearchSpecifier.IS, condition.getSpecifier()); assertEquals("http://www.rssowl.org", condition.getValue()); break; case INews.HAS_ATTACHMENTS: assertEquals(SearchSpecifier.IS, condition.getSpecifier()); assertEquals(true, condition.getValue()); break; case INews.LABEL: assertEquals(SearchSpecifier.IS_NOT, condition.getSpecifier()); assertEquals("myLabel", condition.getValue()); break; case INews.LINK: assertEquals(SearchSpecifier.IS, condition.getSpecifier()); assertEquals("http://www.rssowl.de", condition.getValue()); break; case INews.LOCATION: switch (condition.getSpecifier()) { case SCOPE: Long[][] value = (Long[][]) condition.getValue(); assertEquals(3, value.length); assertTrue(Arrays.equals(new Long[] { 1l, 2l, 3l }, value[0])); assertTrue(Arrays.equals(new Long[] { 4l, 5l, 6l }, value[1])); assertTrue(Arrays.equals(new Long[] { 6l, 7l, 8l }, value[2])); break; case IS: value = (Long[][]) condition.getValue(); assertEquals(3, value.length); assertTrue(Arrays.equals(new Long[] { 1l, 2l, 3l }, value[0])); assertTrue(Arrays.equals(new Long[] { 0l, 0l, 0l }, value[1])); assertTrue(Arrays.equals(new Long[] { 6l, 7l, 8l }, value[2])); break; case IS_AFTER: value = (Long[][]) condition.getValue(); assertEquals(3, value.length); assertTrue(Arrays.equals(new Long[] { 0l, 0l, 0l }, value[0])); assertTrue(Arrays.equals(new Long[] { 4l, 5l, 6l }, value[1])); assertTrue(Arrays.equals(new Long[] { 6l, 7l, 8l }, value[2])); break; case IS_BEFORE: value = (Long[][]) condition.getValue(); assertEquals(3, value.length); assertTrue(Arrays.equals(new Long[] { 1l, 2l, 3l }, value[0])); assertTrue(Arrays.equals(new Long[] { 4l, 5l, 6l }, value[1])); assertTrue(Arrays.equals(new Long[] { 0l, 0l, 0l }, value[2])); break; case IS_GREATER_THAN: value = (Long[][]) condition.getValue(); assertEquals(3, value.length); assertTrue(Arrays.equals(new Long[] { 0l, 0l, 0l }, value[0])); assertTrue(Arrays.equals(new Long[] { 0l, 0l, 0l }, value[1])); assertTrue(Arrays.equals(new Long[] { 0l, 0l, 0l }, value[2])); break; default: fail(); } break; case INews.MODIFIED_DATE: assertEquals(SearchSpecifier.IS_AFTER, condition.getSpecifier()); assertEquals(new Date(1000), condition.getValue()); break; case INews.STATE: assertEquals(SearchSpecifier.IS, condition.getSpecifier()); assertEquals(INews.State.getVisible(), condition.getValue()); break; default: fail(); } } } private void assertProperties(INewsBin entity) { assertProperties((IEntity) entity); assertEquals(new Date(10000), entity.getCreationDate()); assertEquals(new Date(100), entity.getLastVisitDate()); assertEquals(1000, entity.getPopularity()); assertEquals(1, entity.getNewsCount(EnumSet.of(INews.State.NEW))); assertEquals(1, entity.getNewsCount(EnumSet.of(INews.State.UNREAD))); assertEquals(1, entity.getNewsCount(EnumSet.of(INews.State.READ))); assertEquals(1, entity.getNews(EnumSet.of(INews.State.NEW)).size()); assertEquals(1, entity.getNews(EnumSet.of(INews.State.UNREAD)).size()); assertEquals(1, entity.getNews(EnumSet.of(INews.State.READ)).size()); Set<NewsReference> set = new HashSet<NewsReference>(); set.addAll(entity.getNewsRefs()); assertEquals(3, set.size()); for (NewsReference newsRef : set) { assertNotNull(newsRef.resolve()); } } /** * Tests Bookmarks, News Bins, Searchmarks and Folders in a deeply nested * hierarchy are fully resolvable from the caching DAOs. * * @throws Exception */ @Test public void testDeepHierarchyResolvedWithCachingDAOSingleRoot() throws Exception { /* Folders */ IFolder root = DynamicDAO.save(fFactory.createFolder(null, null, "Root")); Long rootFolderId = root.getId(); setProperties(root); IFolder subRoot1 = DynamicDAO.save(fFactory.createFolder(null, root, "Sub Root 1")); Long subRootFolder1Id = subRoot1.getId(); setProperties(subRoot1); IFolder subRoot2 = DynamicDAO.save(fFactory.createFolder(null, root, "Sub Root 2")); Long subRootFolder2Id = subRoot2.getId(); setProperties(subRoot2); IFolder subRoot3 = DynamicDAO.save(fFactory.createFolder(null, root, "Sub Root 3")); Long subRootFolder3Id = subRoot3.getId(); setProperties(subRoot3); IFolder subSubRoot1 = DynamicDAO.save(fFactory.createFolder(null, subRoot3, "Sub Sub Root 1")); Long subSubRootFolder1Id = subSubRoot1.getId(); setProperties(subSubRoot1); IFolder subSubSubRoot1 = DynamicDAO.save(fFactory.createFolder(null, subSubRoot1, "Sub Sub Sub Root 1")); Long subSubSubRootFolder1Id = subSubSubRoot1.getId(); setProperties(subSubSubRoot1); /* Book Marks */ IFeed feed1 = fFactory.createFeed(null, URI.create("1")); IBookMark rootBM1 = DynamicDAO.save(fFactory.createBookMark(null, root, new FeedLinkReference(feed1.getLink()), "Root Bookmark 1")); Long rootBM1Id = rootBM1.getId(); setProperties(rootBM1); IFeed feed2 = fFactory.createFeed(null, URI.create("2")); IBookMark rootBM2 = DynamicDAO.save(fFactory.createBookMark(null, root, new FeedLinkReference(feed2.getLink()), "Root Bookmark 2")); Long rootBM2Id = rootBM2.getId(); setProperties(rootBM2); IFeed feed3 = fFactory.createFeed(null, URI.create("3")); IBookMark subRoot1BM1 = DynamicDAO.save(fFactory.createBookMark(null, subRoot1, new FeedLinkReference(feed3.getLink()), "Sub Root 1 Bookmark 1")); Long subRoot1BM1Id = subRoot1BM1.getId(); setProperties(subRoot1BM1); IFeed feed4 = fFactory.createFeed(null, URI.create("4")); IBookMark subRoot1BM2 = DynamicDAO.save(fFactory.createBookMark(null, subRoot1, new FeedLinkReference(feed4.getLink()), "Sub Root 1 Bookmark 2")); Long subRoot1BM2Id = subRoot1BM2.getId(); setProperties(subRoot1BM2); IFeed feed5 = fFactory.createFeed(null, URI.create("5")); IBookMark subRoot2BM1 = DynamicDAO.save(fFactory.createBookMark(null, subRoot2, new FeedLinkReference(feed5.getLink()), "Sub Root 2 Bookmark 1")); Long subRoot2BM1Id = subRoot2BM1.getId(); setProperties(subRoot2BM1); IFeed feed6 = fFactory.createFeed(null, URI.create("6")); IBookMark subRoot3BM1 = DynamicDAO.save(fFactory.createBookMark(null, subRoot3, new FeedLinkReference(feed6.getLink()), "Sub Root 3 Bookmark 1")); Long subRoot3BM1Id = subRoot3BM1.getId(); setProperties(subRoot3BM1); IFeed feed7 = fFactory.createFeed(null, URI.create("7")); IBookMark subSubRoot1BM1 = DynamicDAO.save(fFactory.createBookMark(null, subSubRoot1, new FeedLinkReference(feed7.getLink()), "Sub Sub Root 1 Bookmark 1")); Long subSubRoot1BM1Id = subSubRoot1BM1.getId(); setProperties(subSubRoot1BM1); IFeed feed8 = fFactory.createFeed(null, URI.create("8")); IBookMark subSubSubRoot1BM1 = DynamicDAO.save(fFactory.createBookMark(null, subSubSubRoot1, new FeedLinkReference(feed8.getLink()), "Sub Sub Sub Root 1 Bookmark 1")); Long subSubSubRoot1BM1Id = subSubSubRoot1BM1.getId(); setProperties(subSubSubRoot1BM1); /* News Bins */ INewsBin rootNB1 = DynamicDAO.save(fFactory.createNewsBin(null, root, "Root Newsbin 1")); Long rootNB1Id = rootNB1.getId(); setProperties(rootNB1); INewsBin rootNB2 = DynamicDAO.save(fFactory.createNewsBin(null, root, "Root Newsbin 2")); Long rootNB2Id = rootNB2.getId(); setProperties(rootNB2); INewsBin subRoot1NB1 = DynamicDAO.save(fFactory.createNewsBin(null, subRoot1, "Sub Root 1 Newsbin 1")); Long subRoot1NB1Id = subRoot1NB1.getId(); setProperties(subRoot1NB1); INewsBin subRoot1NB2 = DynamicDAO.save(fFactory.createNewsBin(null, subRoot1, "Sub Root 1 Newsbin 2")); Long subRoot1NB2Id = subRoot1NB2.getId(); setProperties(subRoot1NB2); INewsBin subRoot2NB1 = DynamicDAO.save(fFactory.createNewsBin(null, subRoot2, "Sub Root 2 Newsbin 1")); Long subRoot2NB1Id = subRoot2NB1.getId(); setProperties(subRoot2NB1); INewsBin subRoot3NB1 = DynamicDAO.save(fFactory.createNewsBin(null, subRoot3, "Sub Root 3 Newsbin 1")); Long subRoot3NB1Id = subRoot3NB1.getId(); setProperties(subRoot3NB1); INewsBin subSubRoot1NB1 = DynamicDAO.save(fFactory.createNewsBin(null, subSubRoot1, "Sub Sub Root 1 Newsbin 1")); Long subSubRoot1NB1Id = subSubRoot1NB1.getId(); setProperties(subSubRoot1NB1); INewsBin subSubSubRoot1NB1 = DynamicDAO.save(fFactory.createNewsBin(null, subSubSubRoot1, "Sub Sub Sub Root 1 Newsbin 1")); Long subSubSubRoot1NB1Id = subSubSubRoot1NB1.getId(); setProperties(subSubSubRoot1NB1); /* Search Marks */ ISearchMark rootSM1 = DynamicDAO.save(fFactory.createSearchMark(null, root, "Root Searchmark 1")); Long rootSM1Id = rootSM1.getId(); setProperties(rootSM1); ISearchMark rootSM2 = DynamicDAO.save(fFactory.createSearchMark(null, root, "Root Searchmark 2")); Long rootSM2Id = rootSM2.getId(); setProperties(rootSM2); ISearchMark subRoot1SM1 = DynamicDAO.save(fFactory.createSearchMark(null, subRoot1, "Sub Root 1 Searchmark 1")); Long subRoot1SM1Id = subRoot1SM1.getId(); setProperties(subRoot1SM1); ISearchMark subRoot1SM2 = DynamicDAO.save(fFactory.createSearchMark(null, subRoot1, "Sub Root 1 Searchmark 2")); Long subRoot1SM2Id = subRoot1SM2.getId(); setProperties(subRoot1SM2); ISearchMark subRoot2SM1 = DynamicDAO.save(fFactory.createSearchMark(null, subRoot2, "Sub Root 2 Searchmark 1")); Long subRoot2SM1Id = subRoot2SM1.getId(); setProperties(subRoot2SM1); ISearchMark subRoot3SM1 = DynamicDAO.save(fFactory.createSearchMark(null, subRoot3, "Sub Root 3 Searchmark 1")); Long subRoot3SM1Id = subRoot3SM1.getId(); setProperties(subRoot3SM1); ISearchMark subSubRoot1SM1 = DynamicDAO.save(fFactory.createSearchMark(null, subSubRoot1, "Sub Sub Root 1 Searchmark 1")); Long subSubRoot1SM1Id = subSubRoot1SM1.getId(); setProperties(subSubRoot1SM1); ISearchMark subSubSubRoot1SM1 = DynamicDAO.save(fFactory.createSearchMark(null, subSubSubRoot1, "Sub Sub Sub Root 1 Searchmark 1")); Long subSubSubRoot1SM1Id = subSubSubRoot1SM1.getId(); setProperties(subSubSubRoot1SM1); DynamicDAO.save(root); /* Reopen Database */ Owl.getPersistenceService().shutdown(false); root = null; subRoot1 = null; subRoot2 = null; subRoot3 = null; subSubRoot1 = null; subSubSubRoot1 = null; rootBM1 = null; rootBM2 = null; subRoot1BM1 = null; subRoot1BM2 = null; subRoot2BM1 = null; subRoot3BM1 = null; subSubRoot1BM1 = null; subSubSubRoot1BM1 = null; rootNB1 = null; rootNB2 = null; subRoot1NB1 = null; subRoot1NB2 = null; subRoot2NB1 = null; subRoot3NB1 = null; subSubRoot1NB1 = null; subSubSubRoot1NB1 = null; rootSM1 = null; rootSM2 = null; subRoot1SM1 = null; subRoot1SM2 = null; subRoot2SM1 = null; subRoot3SM1 = null; subSubRoot1SM1 = null; subSubSubRoot1SM1 = null; System.gc(); Owl.getPersistenceService().startup(new NullOperationMonitor(), false, false); /* Assert Folders */ CachingDAO dao = (CachingDAO) DynamicDAO.getDAO(IFolderDAO.class); root = (IFolder) dao.load(rootFolderId); assertNotNull(root); assertEquals("Root", root.getName()); assertProperties(root); subRoot1 = (IFolder) dao.load(subRootFolder1Id); assertNotNull(subRoot1); assertEquals("Sub Root 1", subRoot1.getName()); assertProperties(subRoot1); subRoot2 = (IFolder) dao.load(subRootFolder2Id); assertNotNull(subRoot2); assertEquals("Sub Root 2", subRoot2.getName()); assertProperties(subRoot2); subRoot3 = (IFolder) dao.load(subRootFolder3Id); assertNotNull(subRoot3); assertEquals("Sub Root 3", subRoot3.getName()); assertProperties(subRoot3); subSubRoot1 = (IFolder) dao.load(subSubRootFolder1Id); assertNotNull(subSubRoot1); assertEquals("Sub Sub Root 1", subSubRoot1.getName()); assertProperties(subSubRoot1); subSubSubRoot1 = (IFolder) dao.load(subSubSubRootFolder1Id); assertNotNull(subSubSubRoot1); assertEquals("Sub Sub Sub Root 1", subSubSubRoot1.getName()); assertProperties(subSubSubRoot1); /* Assert Bookmarks */ dao = (CachingDAO) DynamicDAO.getDAO(IBookMarkDAO.class); rootBM1 = (IBookMark) dao.load(rootBM1Id); assertNotNull(rootBM1); assertEquals("Root Bookmark 1", rootBM1.getName()); assertProperties(rootBM1); rootBM2 = (IBookMark) dao.load(rootBM2Id); assertNotNull(rootBM2); assertEquals("Root Bookmark 2", rootBM2.getName()); assertProperties(rootBM2); subRoot1BM1 = (IBookMark) dao.load(subRoot1BM1Id); assertNotNull(subRoot1BM1); assertEquals("Sub Root 1 Bookmark 1", subRoot1BM1.getName()); assertProperties(subRoot1BM1); subRoot1BM2 = (IBookMark) dao.load(subRoot1BM2Id); assertNotNull(subRoot1BM2); assertEquals("Sub Root 1 Bookmark 2", subRoot1BM2.getName()); assertProperties(subRoot1BM2); subRoot2BM1 = (IBookMark) dao.load(subRoot2BM1Id); assertNotNull(subRoot2BM1); assertEquals("Sub Root 2 Bookmark 1", subRoot2BM1.getName()); assertProperties(subRoot2BM1); subRoot3BM1 = (IBookMark) dao.load(subRoot3BM1Id); assertNotNull(subRoot3BM1); assertEquals("Sub Root 3 Bookmark 1", subRoot3BM1.getName()); assertProperties(subRoot3BM1); subSubRoot1BM1 = (IBookMark) dao.load(subSubRoot1BM1Id); assertNotNull(subSubRoot1BM1); assertEquals("Sub Sub Root 1 Bookmark 1", subSubRoot1BM1.getName()); assertProperties(subSubRoot1BM1); subSubSubRoot1BM1 = (IBookMark) dao.load(subSubSubRoot1BM1Id); assertNotNull(subSubSubRoot1BM1); assertEquals("Sub Sub Sub Root 1 Bookmark 1", subSubSubRoot1BM1.getName()); assertProperties(subSubSubRoot1BM1); /* Assert News Bins */ dao = (CachingDAO) DynamicDAO.getDAO(INewsBinDAO.class); rootNB1 = (INewsBin) dao.load(rootNB1Id); assertNotNull(rootNB1); assertEquals("Root Newsbin 1", rootNB1.getName()); assertProperties(rootNB1); rootNB2 = (INewsBin) dao.load(rootNB2Id); assertNotNull(rootNB2); assertEquals("Root Newsbin 2", rootNB2.getName()); assertProperties(rootNB2); subRoot1NB1 = (INewsBin) dao.load(subRoot1NB1Id); assertNotNull(subRoot1NB1); assertEquals("Sub Root 1 Newsbin 1", subRoot1NB1.getName()); assertProperties(subRoot1NB1); subRoot1NB2 = (INewsBin) dao.load(subRoot1NB2Id); assertNotNull(subRoot1NB2); assertEquals("Sub Root 1 Newsbin 2", subRoot1NB2.getName()); assertProperties(subRoot1NB2); subRoot2NB1 = (INewsBin) dao.load(subRoot2NB1Id); assertNotNull(subRoot2NB1); assertEquals("Sub Root 2 Newsbin 1", subRoot2NB1.getName()); assertProperties(subRoot2NB1); subRoot3NB1 = (INewsBin) dao.load(subRoot3NB1Id); assertNotNull(subRoot3NB1); assertEquals("Sub Root 3 Newsbin 1", subRoot3NB1.getName()); assertProperties(subRoot3NB1); subSubRoot1NB1 = (INewsBin) dao.load(subSubRoot1NB1Id); assertNotNull(subSubRoot1NB1); assertEquals("Sub Sub Root 1 Newsbin 1", subSubRoot1NB1.getName()); assertProperties(subSubRoot1NB1); subSubSubRoot1NB1 = (INewsBin) dao.load(subSubSubRoot1NB1Id); assertNotNull(subSubSubRoot1NB1); assertEquals("Sub Sub Sub Root 1 Newsbin 1", subSubSubRoot1NB1.getName()); assertProperties(subSubSubRoot1NB1); /* Assert Search Marks */ dao = (CachingDAO) DynamicDAO.getDAO(ISearchMarkDAO.class); rootSM1 = (ISearchMark) dao.load(rootSM1Id); assertNotNull(rootSM1); assertEquals("Root Searchmark 1", rootSM1.getName()); assertProperties(rootSM1); rootSM2 = (ISearchMark) dao.load(rootSM2Id); assertNotNull(rootSM2); assertEquals("Root Searchmark 2", rootSM2.getName()); assertProperties(rootSM2); subRoot1SM1 = (ISearchMark) dao.load(subRoot1SM1Id); assertNotNull(subRoot1SM1); assertEquals("Sub Root 1 Searchmark 1", subRoot1SM1.getName()); assertProperties(subRoot1SM1); subRoot1SM2 = (ISearchMark) dao.load(subRoot1SM2Id); assertNotNull(subRoot1SM2); assertEquals("Sub Root 1 Searchmark 2", subRoot1SM2.getName()); assertProperties(subRoot1SM2); subRoot2SM1 = (ISearchMark) dao.load(subRoot2SM1Id); assertNotNull(subRoot2SM1); assertEquals("Sub Root 2 Searchmark 1", subRoot2SM1.getName()); assertProperties(subRoot2SM1); subRoot3SM1 = (ISearchMark) dao.load(subRoot3SM1Id); assertNotNull(subRoot3SM1); assertEquals("Sub Root 3 Searchmark 1", subRoot3SM1.getName()); assertProperties(subRoot3SM1); subSubRoot1SM1 = (ISearchMark) dao.load(subSubRoot1SM1Id); assertNotNull(subSubRoot1SM1); assertEquals("Sub Sub Root 1 Searchmark 1", subSubRoot1SM1.getName()); assertProperties(subSubRoot1SM1); subSubSubRoot1SM1 = (ISearchMark) dao.load(subSubSubRoot1SM1Id); assertNotNull(subSubSubRoot1SM1); assertEquals("Sub Sub Sub Root 1 Searchmark 1", subSubSubRoot1SM1.getName()); assertProperties(subSubSubRoot1SM1); } /** * Tests Bookmarks, News Bins, Searchmarks and Folders in a deeply nested * hierarchy of multiple root folders are fully resolvable from the caching * DAOs. * * @throws Exception */ @Test public void testDeepHierarchyResolvedWithCachingDAOMultiRoot() throws Exception { /* Folders */ IFolder root1 = DynamicDAO.save(fFactory.createFolder(null, null, "Root 1")); Long rootFolder1Id = root1.getId(); setProperties(root1); IFolder root2 = DynamicDAO.save(fFactory.createFolder(null, null, "Root 2")); Long rootFolder2Id = root2.getId(); setProperties(root2); IFolder root3 = DynamicDAO.save(fFactory.createFolder(null, null, "Root 3")); Long rootFolder3Id = root3.getId(); setProperties(root3); IFolder subRoot1 = DynamicDAO.save(fFactory.createFolder(null, root1, "Sub Root 1")); Long subRootFolder1Id = subRoot1.getId(); setProperties(subRoot1); IFolder subRoot2 = DynamicDAO.save(fFactory.createFolder(null, root2, "Sub Root 2")); Long subRootFolder2Id = subRoot2.getId(); setProperties(subRoot2); IFolder subRoot3 = DynamicDAO.save(fFactory.createFolder(null, root3, "Sub Root 3")); Long subRootFolder3Id = subRoot3.getId(); setProperties(subRoot3); IFolder subSubRoot1 = DynamicDAO.save(fFactory.createFolder(null, subRoot3, "Sub Sub Root 1")); Long subSubRootFolder1Id = subSubRoot1.getId(); setProperties(subSubRoot1); IFolder subSubSubRoot1 = DynamicDAO.save(fFactory.createFolder(null, subSubRoot1, "Sub Sub Sub Root 1")); Long subSubSubRootFolder1Id = subSubSubRoot1.getId(); setProperties(subSubSubRoot1); /* Book Marks */ IFeed feed1 = fFactory.createFeed(null, URI.create("1")); IBookMark rootBM1 = DynamicDAO.save(fFactory.createBookMark(null, root1, new FeedLinkReference(feed1.getLink()), "Root Bookmark 1")); Long rootBM1Id = rootBM1.getId(); setProperties(rootBM1); IFeed feed2 = fFactory.createFeed(null, URI.create("2")); IBookMark rootBM2 = DynamicDAO.save(fFactory.createBookMark(null, root1, new FeedLinkReference(feed2.getLink()), "Root Bookmark 2")); Long rootBM2Id = rootBM2.getId(); setProperties(rootBM2); IFeed feed3 = fFactory.createFeed(null, URI.create("3")); IBookMark subRoot1BM1 = DynamicDAO.save(fFactory.createBookMark(null, subRoot1, new FeedLinkReference(feed3.getLink()), "Sub Root 1 Bookmark 1")); Long subRoot1BM1Id = subRoot1BM1.getId(); setProperties(subRoot1BM1); IFeed feed4 = fFactory.createFeed(null, URI.create("4")); IBookMark subRoot1BM2 = DynamicDAO.save(fFactory.createBookMark(null, subRoot1, new FeedLinkReference(feed4.getLink()), "Sub Root 1 Bookmark 2")); Long subRoot1BM2Id = subRoot1BM2.getId(); setProperties(subRoot1BM2); IFeed feed5 = fFactory.createFeed(null, URI.create("5")); IBookMark subRoot2BM1 = DynamicDAO.save(fFactory.createBookMark(null, subRoot2, new FeedLinkReference(feed5.getLink()), "Sub Root 2 Bookmark 1")); Long subRoot2BM1Id = subRoot2BM1.getId(); setProperties(subRoot2BM1); IFeed feed6 = fFactory.createFeed(null, URI.create("6")); IBookMark subRoot3BM1 = DynamicDAO.save(fFactory.createBookMark(null, subRoot3, new FeedLinkReference(feed6.getLink()), "Sub Root 3 Bookmark 1")); Long subRoot3BM1Id = subRoot3BM1.getId(); setProperties(subRoot3BM1); IFeed feed7 = fFactory.createFeed(null, URI.create("7")); IBookMark subSubRoot1BM1 = DynamicDAO.save(fFactory.createBookMark(null, subSubRoot1, new FeedLinkReference(feed7.getLink()), "Sub Sub Root 1 Bookmark 1")); Long subSubRoot1BM1Id = subSubRoot1BM1.getId(); setProperties(subSubRoot1BM1); IFeed feed8 = fFactory.createFeed(null, URI.create("8")); IBookMark subSubSubRoot1BM1 = DynamicDAO.save(fFactory.createBookMark(null, subSubSubRoot1, new FeedLinkReference(feed8.getLink()), "Sub Sub Sub Root 1 Bookmark 1")); Long subSubSubRoot1BM1Id = subSubSubRoot1BM1.getId(); setProperties(subSubSubRoot1BM1); /* News Bins */ INewsBin rootNB1 = DynamicDAO.save(fFactory.createNewsBin(null, root1, "Root Newsbin 1")); Long rootNB1Id = rootNB1.getId(); setProperties(rootNB1); INewsBin rootNB2 = DynamicDAO.save(fFactory.createNewsBin(null, root1, "Root Newsbin 2")); Long rootNB2Id = rootNB2.getId(); setProperties(rootNB2); INewsBin subRoot1NB1 = DynamicDAO.save(fFactory.createNewsBin(null, subRoot1, "Sub Root 1 Newsbin 1")); Long subRoot1NB1Id = subRoot1NB1.getId(); setProperties(subRoot1NB1); INewsBin subRoot1NB2 = DynamicDAO.save(fFactory.createNewsBin(null, subRoot1, "Sub Root 1 Newsbin 2")); Long subRoot1NB2Id = subRoot1NB2.getId(); setProperties(subRoot1NB2); INewsBin subRoot2NB1 = DynamicDAO.save(fFactory.createNewsBin(null, subRoot2, "Sub Root 2 Newsbin 1")); Long subRoot2NB1Id = subRoot2NB1.getId(); setProperties(subRoot2NB1); INewsBin subRoot3NB1 = DynamicDAO.save(fFactory.createNewsBin(null, subRoot3, "Sub Root 3 Newsbin 1")); Long subRoot3NB1Id = subRoot3NB1.getId(); setProperties(subRoot3NB1); INewsBin subSubRoot1NB1 = DynamicDAO.save(fFactory.createNewsBin(null, subSubRoot1, "Sub Sub Root 1 Newsbin 1")); Long subSubRoot1NB1Id = subSubRoot1NB1.getId(); setProperties(subSubRoot1NB1); INewsBin subSubSubRoot1NB1 = DynamicDAO.save(fFactory.createNewsBin(null, subSubSubRoot1, "Sub Sub Sub Root 1 Newsbin 1")); Long subSubSubRoot1NB1Id = subSubSubRoot1NB1.getId(); setProperties(subSubSubRoot1NB1); /* Search Marks */ ISearchMark rootSM1 = DynamicDAO.save(fFactory.createSearchMark(null, root1, "Root Searchmark 1")); Long rootSM1Id = rootSM1.getId(); setProperties(rootSM1); ISearchMark rootSM2 = DynamicDAO.save(fFactory.createSearchMark(null, root1, "Root Searchmark 2")); Long rootSM2Id = rootSM2.getId(); setProperties(rootSM2); ISearchMark subRoot1SM1 = DynamicDAO.save(fFactory.createSearchMark(null, subRoot1, "Sub Root 1 Searchmark 1")); Long subRoot1SM1Id = subRoot1SM1.getId(); setProperties(subRoot1SM1); ISearchMark subRoot1SM2 = DynamicDAO.save(fFactory.createSearchMark(null, subRoot1, "Sub Root 1 Searchmark 2")); Long subRoot1SM2Id = subRoot1SM2.getId(); setProperties(subRoot1SM2); ISearchMark subRoot2SM1 = DynamicDAO.save(fFactory.createSearchMark(null, subRoot2, "Sub Root 2 Searchmark 1")); Long subRoot2SM1Id = subRoot2SM1.getId(); setProperties(subRoot2SM1); ISearchMark subRoot3SM1 = DynamicDAO.save(fFactory.createSearchMark(null, subRoot3, "Sub Root 3 Searchmark 1")); Long subRoot3SM1Id = subRoot3SM1.getId(); setProperties(subRoot3SM1); ISearchMark subSubRoot1SM1 = DynamicDAO.save(fFactory.createSearchMark(null, subSubRoot1, "Sub Sub Root 1 Searchmark 1")); Long subSubRoot1SM1Id = subSubRoot1SM1.getId(); setProperties(subSubRoot1SM1); ISearchMark subSubSubRoot1SM1 = DynamicDAO.save(fFactory.createSearchMark(null, subSubSubRoot1, "Sub Sub Sub Root 1 Searchmark 1")); Long subSubSubRoot1SM1Id = subSubSubRoot1SM1.getId(); setProperties(subSubSubRoot1SM1); DynamicDAO.save(root1); /* Reopen Database */ Owl.getPersistenceService().shutdown(false); root1 = null; root2 = null; root3 = null; subRoot1 = null; subRoot2 = null; subRoot3 = null; subSubRoot1 = null; subSubSubRoot1 = null; rootBM1 = null; rootBM2 = null; subRoot1BM1 = null; subRoot1BM2 = null; subRoot2BM1 = null; subRoot3BM1 = null; subSubRoot1BM1 = null; subSubSubRoot1BM1 = null; rootNB1 = null; rootNB2 = null; subRoot1NB1 = null; subRoot1NB2 = null; subRoot2NB1 = null; subRoot3NB1 = null; subSubRoot1NB1 = null; subSubSubRoot1NB1 = null; rootSM1 = null; rootSM2 = null; subRoot1SM1 = null; subRoot1SM2 = null; subRoot2SM1 = null; subRoot3SM1 = null; subSubRoot1SM1 = null; subSubSubRoot1SM1 = null; System.gc(); Owl.getPersistenceService().startup(new NullOperationMonitor(), false, false); /* Assert Folders */ CachingDAO dao = (CachingDAO) DynamicDAO.getDAO(IFolderDAO.class); root1 = (IFolder) dao.load(rootFolder1Id); assertNotNull(root1); assertEquals("Root 1", root1.getName()); assertProperties(root1); root2 = (IFolder) dao.load(rootFolder2Id); assertNotNull(root2); assertEquals("Root 2", root2.getName()); assertProperties(root2); root3 = (IFolder) dao.load(rootFolder3Id); assertNotNull(root3); assertEquals("Root 3", root3.getName()); assertProperties(root3); subRoot1 = (IFolder) dao.load(subRootFolder1Id); assertNotNull(subRoot1); assertEquals("Sub Root 1", subRoot1.getName()); assertProperties(subRoot1); subRoot2 = (IFolder) dao.load(subRootFolder2Id); assertNotNull(subRoot2); assertEquals("Sub Root 2", subRoot2.getName()); assertProperties(subRoot2); subRoot3 = (IFolder) dao.load(subRootFolder3Id); assertNotNull(subRoot3); assertEquals("Sub Root 3", subRoot3.getName()); assertProperties(subRoot3); subSubRoot1 = (IFolder) dao.load(subSubRootFolder1Id); assertNotNull(subSubRoot1); assertEquals("Sub Sub Root 1", subSubRoot1.getName()); assertProperties(subSubRoot1); subSubSubRoot1 = (IFolder) dao.load(subSubSubRootFolder1Id); assertNotNull(subSubSubRoot1); assertEquals("Sub Sub Sub Root 1", subSubSubRoot1.getName()); assertProperties(subSubSubRoot1); /* Assert Bookmarks */ dao = (CachingDAO) DynamicDAO.getDAO(IBookMarkDAO.class); rootBM1 = (IBookMark) dao.load(rootBM1Id); assertNotNull(rootBM1); assertEquals("Root Bookmark 1", rootBM1.getName()); assertProperties(rootBM1); rootBM2 = (IBookMark) dao.load(rootBM2Id); assertNotNull(rootBM2); assertEquals("Root Bookmark 2", rootBM2.getName()); assertProperties(rootBM2); subRoot1BM1 = (IBookMark) dao.load(subRoot1BM1Id); assertNotNull(subRoot1BM1); assertEquals("Sub Root 1 Bookmark 1", subRoot1BM1.getName()); assertProperties(subRoot1BM1); subRoot1BM2 = (IBookMark) dao.load(subRoot1BM2Id); assertNotNull(subRoot1BM2); assertEquals("Sub Root 1 Bookmark 2", subRoot1BM2.getName()); assertProperties(subRoot1BM2); subRoot2BM1 = (IBookMark) dao.load(subRoot2BM1Id); assertNotNull(subRoot2BM1); assertEquals("Sub Root 2 Bookmark 1", subRoot2BM1.getName()); assertProperties(subRoot2BM1); subRoot3BM1 = (IBookMark) dao.load(subRoot3BM1Id); assertNotNull(subRoot3BM1); assertEquals("Sub Root 3 Bookmark 1", subRoot3BM1.getName()); assertProperties(subRoot3BM1); subSubRoot1BM1 = (IBookMark) dao.load(subSubRoot1BM1Id); assertNotNull(subSubRoot1BM1); assertEquals("Sub Sub Root 1 Bookmark 1", subSubRoot1BM1.getName()); assertProperties(subSubRoot1BM1); subSubSubRoot1BM1 = (IBookMark) dao.load(subSubSubRoot1BM1Id); assertNotNull(subSubSubRoot1BM1); assertEquals("Sub Sub Sub Root 1 Bookmark 1", subSubSubRoot1BM1.getName()); assertProperties(subSubSubRoot1BM1); /* Assert News Bins */ dao = (CachingDAO) DynamicDAO.getDAO(INewsBinDAO.class); rootNB1 = (INewsBin) dao.load(rootNB1Id); assertNotNull(rootNB1); assertEquals("Root Newsbin 1", rootNB1.getName()); assertProperties(rootNB1); rootNB2 = (INewsBin) dao.load(rootNB2Id); assertNotNull(rootNB2); assertEquals("Root Newsbin 2", rootNB2.getName()); assertProperties(rootNB2); subRoot1NB1 = (INewsBin) dao.load(subRoot1NB1Id); assertNotNull(subRoot1NB1); assertEquals("Sub Root 1 Newsbin 1", subRoot1NB1.getName()); assertProperties(subRoot1NB1); subRoot1NB2 = (INewsBin) dao.load(subRoot1NB2Id); assertNotNull(subRoot1NB2); assertEquals("Sub Root 1 Newsbin 2", subRoot1NB2.getName()); assertProperties(subRoot1NB2); subRoot2NB1 = (INewsBin) dao.load(subRoot2NB1Id); assertNotNull(subRoot2NB1); assertEquals("Sub Root 2 Newsbin 1", subRoot2NB1.getName()); assertProperties(subRoot2NB1); subRoot3NB1 = (INewsBin) dao.load(subRoot3NB1Id); assertNotNull(subRoot3NB1); assertEquals("Sub Root 3 Newsbin 1", subRoot3NB1.getName()); assertProperties(subRoot3NB1); subSubRoot1NB1 = (INewsBin) dao.load(subSubRoot1NB1Id); assertNotNull(subSubRoot1NB1); assertEquals("Sub Sub Root 1 Newsbin 1", subSubRoot1NB1.getName()); assertProperties(subSubRoot1NB1); subSubSubRoot1NB1 = (INewsBin) dao.load(subSubSubRoot1NB1Id); assertNotNull(subSubSubRoot1NB1); assertEquals("Sub Sub Sub Root 1 Newsbin 1", subSubSubRoot1NB1.getName()); assertProperties(subSubSubRoot1NB1); /* Assert Search Marks */ dao = (CachingDAO) DynamicDAO.getDAO(ISearchMarkDAO.class); rootSM1 = (ISearchMark) dao.load(rootSM1Id); assertNotNull(rootSM1); assertEquals("Root Searchmark 1", rootSM1.getName()); assertProperties(rootSM1); rootSM2 = (ISearchMark) dao.load(rootSM2Id); assertNotNull(rootSM2); assertEquals("Root Searchmark 2", rootSM2.getName()); assertProperties(rootSM2); subRoot1SM1 = (ISearchMark) dao.load(subRoot1SM1Id); assertNotNull(subRoot1SM1); assertEquals("Sub Root 1 Searchmark 1", subRoot1SM1.getName()); assertProperties(subRoot1SM1); subRoot1SM2 = (ISearchMark) dao.load(subRoot1SM2Id); assertNotNull(subRoot1SM2); assertEquals("Sub Root 1 Searchmark 2", subRoot1SM2.getName()); assertProperties(subRoot1SM2); subRoot2SM1 = (ISearchMark) dao.load(subRoot2SM1Id); assertNotNull(subRoot2SM1); assertEquals("Sub Root 2 Searchmark 1", subRoot2SM1.getName()); assertProperties(subRoot2SM1); subRoot3SM1 = (ISearchMark) dao.load(subRoot3SM1Id); assertNotNull(subRoot3SM1); assertEquals("Sub Root 3 Searchmark 1", subRoot3SM1.getName()); assertProperties(subRoot3SM1); subSubRoot1SM1 = (ISearchMark) dao.load(subSubRoot1SM1Id); assertNotNull(subSubRoot1SM1); assertEquals("Sub Sub Root 1 Searchmark 1", subSubRoot1SM1.getName()); assertProperties(subSubRoot1SM1); subSubSubRoot1SM1 = (ISearchMark) dao.load(subSubSubRoot1SM1Id); assertNotNull(subSubSubRoot1SM1); assertEquals("Sub Sub Sub Root 1 Searchmark 1", subSubSubRoot1SM1.getName()); assertProperties(subSubSubRoot1SM1); } /** * Tests Bookmarks, News Bins, Searchmarks and Folders in a crazy deeply * nested hierarchy are fully resolvable from the caching DAOs. * * @throws Exception */ @Test public void testCrazyDeepHierarchyResolvedWithCachingDAOSingleRoot() throws Exception { IFolder folder = null; for (int i = 0; i < 20; i++) { folder = DynamicDAO.save(fFactory.createFolder(null, folder, "Folder " + i)); setProperties(folder); IFeed feed = fFactory.createFeed(null, URI.create("1")); IBookMark bm = DynamicDAO.save(fFactory.createBookMark(null, folder, new FeedLinkReference(feed.getLink()), "Bookmark " + i)); setProperties(bm); INewsBin nb = DynamicDAO.save(fFactory.createNewsBin(null, folder, "Newsbin " + i)); setProperties(nb); ISearchMark sm = DynamicDAO.save(fFactory.createSearchMark(null, folder, "Searchmark " + i)); setProperties(sm); DynamicDAO.save(folder); } /* Reopen Database */ Owl.getPersistenceService().shutdown(false); System.gc(); Owl.getPersistenceService().startup(new NullOperationMonitor(), false, false); /* Assert Folders */ CachingDAO dao = (CachingDAO) DynamicDAO.getDAO(IFolderDAO.class); Collection all = dao.loadAll(); assertEquals(20, all.size()); for (Object object : all) { if (object instanceof IFolder) assertProperties((IFolder) object); else fail(); } /* Assert Bookmarks */ dao = (CachingDAO) DynamicDAO.getDAO(IBookMarkDAO.class); all = dao.loadAll(); assertEquals(20, all.size()); for (Object object : all) { if (object instanceof IBookMark) assertProperties((IBookMark) object); else fail(); } /* Assert News Bins */ dao = (CachingDAO) DynamicDAO.getDAO(INewsBinDAO.class); all = dao.loadAll(); assertEquals(20, all.size()); for (Object object : all) { if (object instanceof INewsBin) assertProperties((INewsBin) object); else fail(); } /* Assert Search Marks */ dao = (CachingDAO) DynamicDAO.getDAO(ISearchMarkDAO.class); all = dao.loadAll(); assertEquals(20, all.size()); for (Object object : all) { if (object instanceof ISearchMark) assertProperties((ISearchMark) object); else fail(); } } /** * Tests Bookmarks, News Bins, Searchmarks and Folders in a crazy deeply * nested hierarchy are fully resolvable from the caching DAOs. * * @throws Exception */ @Test public void testCrazyDeepHierarchyResolvedWithCachingDAOSingleRootEmergencyStartup() throws Exception { IFolder folder = null; for (int i = 0; i < 20; i++) { folder = DynamicDAO.save(fFactory.createFolder(null, folder, "Folder " + i)); setProperties(folder); IFeed feed = fFactory.createFeed(null, URI.create("1")); IBookMark bm = DynamicDAO.save(fFactory.createBookMark(null, folder, new FeedLinkReference(feed.getLink()), "Bookmark " + i)); setProperties(bm); INewsBin nb = DynamicDAO.save(fFactory.createNewsBin(null, folder, "Newsbin " + i)); setProperties(nb); ISearchMark sm = DynamicDAO.save(fFactory.createSearchMark(null, folder, "Searchmark " + i)); setProperties(sm); DynamicDAO.save(folder); } /* Reopen Database */ Owl.getPersistenceService().shutdown(false); System.gc(); Owl.getPersistenceService().startup(new NullOperationMonitor(), true, false); /* Assert Folders */ { CachingDAO dao = (CachingDAO) DynamicDAO.getDAO(IFolderDAO.class); Collection all = dao.loadAll(); assertEquals(20, all.size()); for (Object object : all) { if (object instanceof IFolder) assertProperties((IFolder) object); else fail(); } /* Assert Bookmarks */ dao = (CachingDAO) DynamicDAO.getDAO(IBookMarkDAO.class); all = dao.loadAll(); assertEquals(20, all.size()); for (Object object : all) { if (object instanceof IBookMark) assertProperties((IBookMark) object); else fail(); } /* Assert News Bins */ dao = (CachingDAO) DynamicDAO.getDAO(INewsBinDAO.class); all = dao.loadAll(); assertEquals(20, all.size()); for (Object object : all) { if (object instanceof INewsBin) assertProperties((INewsBin) object); else fail(); } /* Assert Search Marks */ dao = (CachingDAO) DynamicDAO.getDAO(ISearchMarkDAO.class); all = dao.loadAll(); assertEquals(20, all.size()); for (Object object : all) { if (object instanceof ISearchMark) assertProperties((ISearchMark) object); else fail(); } } /* Reopen Database */ Owl.getPersistenceService().shutdown(false); System.gc(); Owl.getPersistenceService().startup(new NullOperationMonitor(), false, false); /* Assert Folders */ CachingDAO dao = (CachingDAO) DynamicDAO.getDAO(IFolderDAO.class); Collection all = dao.loadAll(); assertEquals(20, all.size()); for (Object object : all) { if (object instanceof IFolder) assertProperties((IFolder) object); else fail(); } /* Assert Bookmarks */ dao = (CachingDAO) DynamicDAO.getDAO(IBookMarkDAO.class); all = dao.loadAll(); assertEquals(20, all.size()); for (Object object : all) { if (object instanceof IBookMark) assertProperties((IBookMark) object); else fail(); } /* Assert News Bins */ dao = (CachingDAO) DynamicDAO.getDAO(INewsBinDAO.class); all = dao.loadAll(); assertEquals(20, all.size()); for (Object object : all) { if (object instanceof INewsBin) assertProperties((INewsBin) object); else fail(); } /* Assert Search Marks */ dao = (CachingDAO) DynamicDAO.getDAO(ISearchMarkDAO.class); all = dao.loadAll(); assertEquals(20, all.size()); for (Object object : all) { if (object instanceof ISearchMark) assertProperties((ISearchMark) object); else fail(); } } /** * @throws Exception */ @Test public void testCachingLabelDAO() throws Exception { ILabel label1 = fFactory.createLabel(null, "Hello"); label1.setOrder(5); label1 = DynamicDAO.save(label1); Long label1Id = label1.getId(); ILabel label2 = fFactory.createLabel(null, "Hello World"); label2.setColor("255,255,0"); label2 = DynamicDAO.save(label2); Long label2Id = label2.getId(); ILabel label3 = fFactory.createLabel(null, "Foo Bar"); label3.setProperty("key", "value"); label3 = DynamicDAO.save(label3); Long label3Id = label3.getId(); DynamicDAO.save(label1); DynamicDAO.save(label2); DynamicDAO.save(label3); label1 = null; label2 = null; label3 = null; /* Reopen Database */ Owl.getPersistenceService().shutdown(false); System.gc(); Owl.getPersistenceService().startup(new NullOperationMonitor(), false, false); /* Assert Folders */ CachingDAO dao = (CachingDAO) DynamicDAO.getDAO(ILabelDAO.class); label1 = (ILabel) dao.load(label1Id); assertEquals("Hello", label1.getName()); assertEquals(5, label1.getOrder()); label2 = (ILabel) dao.load(label2Id); assertEquals("Hello World", label2.getName()); assertEquals("255,255,0", label2.getColor()); label3 = (ILabel) dao.load(label3Id); assertEquals("Foo Bar", label3.getName()); assertEquals("value", label3.getProperty("key")); } /** * @throws Exception */ @Test public void testCachingLabelDAOEmergencyStartup() throws Exception { ILabel label1 = fFactory.createLabel(null, "Hello"); label1.setOrder(5); label1 = DynamicDAO.save(label1); Long label1Id = label1.getId(); ILabel label2 = fFactory.createLabel(null, "Hello World"); label2.setColor("255,255,0"); label2 = DynamicDAO.save(label2); Long label2Id = label2.getId(); ILabel label3 = fFactory.createLabel(null, "Foo Bar"); label3.setProperty("key", "value"); label3 = DynamicDAO.save(label3); Long label3Id = label3.getId(); DynamicDAO.save(label1); DynamicDAO.save(label2); DynamicDAO.save(label3); label1 = null; label2 = null; label3 = null; /* Reopen Database */ Owl.getPersistenceService().shutdown(false); System.gc(); Owl.getPersistenceService().startup(new NullOperationMonitor(), true, false); /* Assert Folders */ CachingDAO dao = (CachingDAO) DynamicDAO.getDAO(ILabelDAO.class); label1 = (ILabel) dao.load(label1Id); assertEquals("Hello", label1.getName()); assertEquals(5, label1.getOrder()); label2 = (ILabel) dao.load(label2Id); assertEquals("Hello World", label2.getName()); assertEquals("255,255,0", label2.getColor()); label3 = (ILabel) dao.load(label3Id); assertEquals("Foo Bar", label3.getName()); assertEquals("value", label3.getProperty("key")); /* Reopen Database */ Owl.getPersistenceService().shutdown(false); System.gc(); Owl.getPersistenceService().startup(new NullOperationMonitor(), false, false); label1 = (ILabel) dao.load(label1Id); assertEquals("Hello", label1.getName()); assertEquals(5, label1.getOrder()); label2 = (ILabel) dao.load(label2Id); assertEquals("Hello World", label2.getName()); assertEquals("255,255,0", label2.getColor()); label3 = (ILabel) dao.load(label3Id); assertEquals("Foo Bar", label3.getName()); assertEquals("value", label3.getProperty("key")); } }