/* ********************************************************************** **
** 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.internal.persist.dao;
import org.rssowl.core.internal.persist.service.DatabaseEvent;
import org.rssowl.core.persist.IFolder;
import org.rssowl.core.persist.IFolderChild;
import org.rssowl.core.persist.dao.IFolderDAO;
import org.rssowl.core.persist.event.FolderEvent;
import org.rssowl.core.persist.event.FolderListener;
import org.rssowl.core.persist.service.PersistenceException;
import org.rssowl.core.util.CoreUtils;
import org.rssowl.core.util.ReparentInfo;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/**
* Caching DAO for {@link IFolder}.
*/
public class CachingFolderDAO extends CachingDAO<FolderDAOImpl, IFolder, FolderListener, FolderEvent> implements IFolderDAO {
/* Dummy value to associate with an Object in the maps */
private static final Object PRESENT = new Object();
private final ConcurrentMap<IFolder, Object> fRootFolders;
public CachingFolderDAO() {
super(new FolderDAOImpl());
fRootFolders = new ConcurrentHashMap<IFolder, Object>(4, 0.75f, 1);
}
/*
* @see
* org.rssowl.core.internal.persist.dao.CachingDAO#onDatabaseClosed(org.rssowl
* .core.internal.persist.service.DatabaseEvent)
*/
@Override
protected void onDatabaseClosed(DatabaseEvent event) {
super.onDatabaseClosed(event);
fRootFolders.clear();
}
/*
* @see
* org.rssowl.core.internal.persist.dao.CachingDAO#onDatabaseOpened(org.rssowl
* .core.internal.persist.service.DatabaseEvent)
*/
@Override
protected void onDatabaseOpened(DatabaseEvent event) {
if (USE_LEGACY_CACHE_ACTIVATION) {
super.onDatabaseOpened(event);
/* Ensure we start with a fresh cache */
fRootFolders.clear();
/* Load Roots */
for (IFolder folder : getDAO().loadRoots())
fRootFolders.put(folder, PRESENT);
} else {
/* Load Root Folders */
Collection<IFolder> roots = getDAO().loadRoots();
for (IFolder folder : roots) {
fRootFolders.put(folder, PRESENT);
getCache().put(folder.getId(), folder);
}
/* Cache all Folders from Roots */
Set<IFolder> folders = new HashSet<IFolder>();
CoreUtils.fillFolders(folders, roots);
for (IFolder folder : folders) {
getCache().put(folder.getId(), folder);
}
}
}
/*
* @see org.rssowl.core.internal.persist.dao.CachingDAO#createEntityListener()
*/
@Override
protected FolderListener createEntityListener() {
return new FolderListener() {
public void entitiesAdded(Set<FolderEvent> events) {
for (FolderEvent folderEvent : events) {
IFolder folder = folderEvent.getEntity();
getCache().put(folder.getId(), folder);
if (folder.getParent() == null)
fRootFolders.put(folder, PRESENT);
}
}
public void entitiesDeleted(Set<FolderEvent> events) {
for (FolderEvent folderEvent : events) {
IFolder folder = folderEvent.getEntity();
getCache().remove(folder.getId(), folder);
if (folder.getParent() == null)
fRootFolders.remove(folder);
}
}
public void entitiesUpdated(Set<FolderEvent> events) {
for (FolderEvent folderEvent : events) {
if (folderEvent.getOldParent() != null) {
IFolder folder = folderEvent.getEntity();
if (folder.getParent() == null)
fRootFolders.put(folder, PRESENT);
}
}
}
};
}
/*
* @see org.rssowl.core.persist.dao.IFolderDAO#loadRoots()
*/
public Collection<IFolder> loadRoots() throws PersistenceException {
return Collections.unmodifiableSet(fRootFolders.keySet());
}
/*
* @see org.rssowl.core.persist.dao.IFolderDAO#reparent(java.util.List)
*/
public void reparent(List<ReparentInfo<IFolderChild, IFolder>> reparentInfos) throws PersistenceException {
getDAO().reparent(reparentInfos);
}
}