/* ********************************************************************** ** ** 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.search; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.rssowl.core.Owl; import org.rssowl.core.internal.Activator; import org.rssowl.core.internal.InternalOwl; import org.rssowl.core.persist.INews; import org.rssowl.core.persist.dao.INewsDAO; import org.rssowl.core.persist.event.NewsEvent; import org.rssowl.core.persist.event.runnable.EventType; import org.rssowl.core.persist.reference.NewsReference; import org.rssowl.core.util.ITask; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; /** * An implementation of {@link ITask} to index news. * * @author ijuma * @author bpasero */ public final class IndexingTask implements ITask { /** * This listener will be called by the indexer to indicate the news refs for * which an index operation was requested, but not completed because they are * not in the database anymore. */ static interface RemovedNewsRefsListener { void event(Collection<NewsReference> newsRefs); } private final Indexer fIndexer; private final EventType fTaskType; private final List<INews> fNews; private final Collection<NewsReference> fNewsRefs; private final RemovedNewsRefsListener fRemovedNewsRefsListener; IndexingTask(Indexer indexer, Set<NewsEvent> events, EventType taskType) { this(indexer, getNews(events, taskType), taskType); } private static List<INews> getNews(Set<NewsEvent> events, EventType taskType) { List<INews> news = new ArrayList<INews>(events.size()); for (NewsEvent event : events) { if (taskType == EventType.PERSIST && event.getEntity().getState().equals(INews.State.DELETED)) continue; //News could be deleted from a Filter news.add(event.getEntity()); } return news; } @SuppressWarnings("unchecked") IndexingTask(Indexer indexer, Collection<INews> news, EventType taskType) { fIndexer = indexer; if (news instanceof List) fNews = (List<INews>) news; else fNews = new ArrayList<INews>(news); fNewsRefs = null; fTaskType = taskType; fRemovedNewsRefsListener = null; } IndexingTask(Indexer indexer, EventType taskType, Collection<NewsReference> newsRefs, RemovedNewsRefsListener removedNewsRefsListener) { fIndexer = indexer; fNewsRefs = newsRefs; fNews = null; fTaskType = taskType; fRemovedNewsRefsListener = removedNewsRefsListener; } /* * @see org.rssowl.core.util.ITask#getName() */ public final String getName() { return Messages.IndexingTask_INDEXING_FEED; } /* * @see org.rssowl.core.util.ITask#getPriority() */ public final Priority getPriority() { return Priority.DEFAULT; } /* * @see * org.rssowl.core.util.ITask#run(org.eclipse.core.runtime.IProgressMonitor) */ public final IStatus run(IProgressMonitor monitor) { switch (fTaskType) { /* Add the Entities of the Events to the Index */ case PERSIST: if (!monitor.isCanceled() && !Owl.isShuttingDown()) addToIndex(); break; /* Update the Entities of the Events in the Index */ case UPDATE: if (!monitor.isCanceled() && !Owl.isShuttingDown()) updateIndex(); break; /* Delete the Entities of the Events from the Index */ case REMOVE: if (!monitor.isCanceled() && !Owl.isShuttingDown()) deleteFromIndex(); break; } return Status.OK_STATUS; } private List<INews> getNewsFromRefs(Collection<NewsReference> newsRefs) { List<INews> newsList = new ArrayList<INews>(newsRefs.size()); List<NewsReference> removedNewsRefs = new ArrayList<NewsReference>(1); INewsDAO newsDAO = InternalOwl.getDefault().getPersistenceService().getDAOService().getNewsDAO(); for (NewsReference newsRef : newsRefs) { INews news = newsDAO.load(newsRef.getId()); if (news == null) removedNewsRefs.add(newsRef); else newsList.add(news); } if (fRemovedNewsRefsListener != null) fRemovedNewsRefsListener.event(removedNewsRefs); return newsList; } private List<NewsReference> getRefsFromNews(List<INews> newsList) { List<NewsReference> newsRefs = new ArrayList<NewsReference>(newsList.size()); for (INews news : newsList) newsRefs.add(new NewsReference(news.getId())); return newsRefs; } private void addToIndex() { if (fNews == null) { fIndexer.index(getNewsFromRefs(fNewsRefs), false); return; } fIndexer.index(fNews, false); } private void updateIndex() { if (fNews == null) { fIndexer.index(getNewsFromRefs(fNewsRefs), true); return; } fIndexer.index(fNews, true); } private void deleteFromIndex() { try { if (fNews == null) { fIndexer.removeFromIndex(fNewsRefs); return; } fIndexer.removeFromIndex(getRefsFromNews(fNews)); } catch (IOException e) { Activator.getDefault().getLog().log(Activator.getDefault().createErrorStatus(e.getMessage(), e)); } } }