/* ********************************************************************** **
** 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.ui.internal.dialogs.cleanup;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.osgi.util.NLS;
import org.rssowl.core.Owl;
import org.rssowl.core.internal.persist.pref.DefaultPreferences;
import org.rssowl.core.persist.IBookMark;
import org.rssowl.core.persist.INews;
import org.rssowl.core.persist.ISearchFilter;
import org.rssowl.core.persist.ISearchMark;
import org.rssowl.core.persist.dao.DynamicDAO;
import org.rssowl.core.persist.dao.INewsDAO;
import org.rssowl.core.persist.pref.IPreferenceScope;
import org.rssowl.core.persist.reference.NewsReference;
import org.rssowl.core.util.CoreUtils;
import org.rssowl.core.util.StringUtils;
import org.rssowl.core.util.SyncUtils;
import org.rssowl.ui.internal.Activator;
import org.rssowl.ui.internal.Controller;
import org.rssowl.ui.internal.OwlUI;
import org.rssowl.ui.internal.dialogs.ConfirmDialog;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* @author bpasero
*/
public class CleanUpWizard extends Wizard {
private CleanUpOptionsPage fCleanUpOptionsPage;
private FeedSelectionPage fFeedSelectionPage;
private CleanUpSummaryPage fCleanUpSummaryPage;
/*
* @see org.eclipse.jface.wizard.Wizard#addPages()
*/
@Override
public void addPages() {
setWindowTitle(Messages.CleanUpWizard_CLEAN_UP);
setHelpAvailable(false);
/* Choose Feeds for Clean-Up */
fFeedSelectionPage = new FeedSelectionPage(Messages.CleanUpWizard_CHOOSE_BOOKMARKS);
addPage(fFeedSelectionPage);
/* Clean Up Options */
fCleanUpOptionsPage = new CleanUpOptionsPage(Messages.CleanUpWizard_CLEANUP_OPS);
addPage(fCleanUpOptionsPage);
/* Clean Up Summary */
fCleanUpSummaryPage = new CleanUpSummaryPage(Messages.CleanUpWizard_SUMMARY);
addPage(fCleanUpSummaryPage);
}
/*
* @see org.eclipse.jface.wizard.Wizard#performFinish()
*/
@Override
public boolean performFinish() {
final INewsDAO newsDao = DynamicDAO.getDAO(INewsDAO.class);
final CleanUpOperations operations = fCleanUpOptionsPage.getOperations();
final AtomicBoolean askForRestart = new AtomicBoolean(false);
/* Receive Tasks */
final List<CleanUpTask> tasks = fCleanUpSummaryPage.getTasks();
/* Show final confirmation prompt */
StringBuilder smNames= new StringBuilder();
int bmCounter = 0;
int smCounter = 0;
int newsCounter = 0;
for (CleanUpTask task : tasks) {
if (task instanceof BookMarkTask)
bmCounter++;
else if (task instanceof NewsTask)
newsCounter += ((NewsTask) task).getNews().size();
else if (task instanceof DeleteOrphanedSearchMarkTask) {
List<ISearchMark> searches = ((DeleteOrphanedSearchMarkTask) task).getSearchMarks();
smCounter += searches.size();
for (ISearchMark search : searches) {
smNames.append(search.getName()).append(", "); //$NON-NLS-1$
}
if (smNames.length() != 0)
smNames.delete(smNames.length() - 2, smNames.length());
}
}
if (bmCounter != 0 || newsCounter != 0 || smCounter != 0) {
StringBuilder msg = new StringBuilder(Messages.CleanUpWizard_PLEASE_CONFIRM_DELETE).append("\n\n"); //$NON-NLS-1$
if (bmCounter == 1)
msg.append(Messages.CleanUpWizard_ONE_FEED).append("\n"); //$NON-NLS-1$
else if (bmCounter > 1)
msg.append(NLS.bind(Messages.CleanUpWizard_N_FEEDS, bmCounter)).append("\n"); //$NON-NLS-1$
if (newsCounter != 0)
msg.append(NLS.bind(Messages.CleanUpWizard_N_NEWS, newsCounter)).append("\n"); //$NON-NLS-1$
if (smCounter == 1)
msg.append(NLS.bind(Messages.CleanUpWizard_ONE_SEARCH, StringUtils.replaceAll(smNames.toString(), "&", "&&"))).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
else if (smCounter > 1)
msg.append(NLS.bind(Messages.CleanUpWizard_N_SEARCHES, smCounter, StringUtils.replaceAll(smNames.toString(), "&", "&&"))).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
ConfirmDialog dialog = new ConfirmDialog(getShell(), Messages.CleanUpWizard_CONFIRM_DELETE, Messages.CleanUpWizard_NO_UNDO, msg.toString(), null);
if (dialog.open() != Window.OK)
return false;
}
/* Restore Editors if Bookmarks are to be deleted */
if (bmCounter > 0)
OwlUI.getFeedViews();
/* Runnable that performs the tasks */
IRunnableWithProgress runnable = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) {
IPreferenceScope preferences = Owl.getPreferenceService().getGlobalScope();
boolean optimizeSearch = false;
monitor.beginTask(Messages.CleanUpWizard_WAIT_CLEANUP, IProgressMonitor.UNKNOWN);
/* Perform Tasks */
List<IBookMark> bookmarks = new ArrayList<IBookMark>();
for (CleanUpTask task : tasks) {
/* Delete Bookmark Task */
if (task instanceof BookMarkTask)
bookmarks.add(((BookMarkTask) task).getMark());
/* Delete News Task */
else if (task instanceof NewsTask) {
Collection<NewsReference> news = ((NewsTask) task).getNews();
List<INews> resolvedNews = new ArrayList<INews>(news.size());
for (NewsReference newsRef : news) {
INews resolvedNewsItem = newsRef.resolve();
if (resolvedNewsItem != null && resolvedNewsItem.isVisible())
resolvedNews.add(resolvedNewsItem);
else
CoreUtils.reportIndexIssue();
}
newsDao.setState(resolvedNews, INews.State.DELETED, false, false);
}
/* Delete Orphaned Searches */
else if (task instanceof DeleteOrphanedSearchMarkTask) {
List<ISearchMark> searches = ((DeleteOrphanedSearchMarkTask) task).getSearchMarks();
DynamicDAO.deleteAll(searches);
}
/* Disable Orphaned News Filters */
else if (task instanceof DisableOrphanedNewsFiltersTask) {
List<ISearchFilter> filters = ((DisableOrphanedNewsFiltersTask) task).getFilters();
for (ISearchFilter filter : filters) {
filter.setEnabled(false);
}
DynamicDAO.saveAll(filters);
}
/* Optimize Lucene Index */
else if (task instanceof OptimizeSearchTask)
optimizeSearch = true;
/* Clean-Up Lucene Index */
else if (task instanceof CleanUpIndexTask) {
preferences.putBoolean(DefaultPreferences.CLEAN_UP_INDEX, false);
Owl.getPersistenceService().getModelSearch().cleanUpOnNextStartup();
askForRestart.set(true);
}
/* Defrag Database */
else if (task instanceof DefragDatabaseTask) {
Owl.getPersistenceService().defragmentOnNextStartup();
askForRestart.set(true);
}
}
/* Delete BookMarks */
Controller.getDefault().getSavedSearchService().forceQuickUpdate();
DynamicDAO.deleteAll(bookmarks);
/* Optimize Search */
if (optimizeSearch)
Owl.getPersistenceService().getModelSearch().optimize();
/* Save Operations */
preferences.putBoolean(DefaultPreferences.CLEAN_UP_BM_BY_LAST_VISIT_STATE, operations.deleteFeedByLastVisit());
preferences.putInteger(DefaultPreferences.CLEAN_UP_BM_BY_LAST_VISIT_VALUE, operations.getLastVisitDays());
preferences.putBoolean(DefaultPreferences.CLEAN_UP_BM_BY_LAST_UPDATE_STATE, operations.deleteFeedByLastUpdate());
preferences.putInteger(DefaultPreferences.CLEAN_UP_BM_BY_LAST_UPDATE_VALUE, operations.getLastUpdateDays());
if (SyncUtils.hasSyncCredentials())
preferences.putBoolean(DefaultPreferences.CLEAN_UP_BM_BY_SYNCHRONIZATION, operations.deleteFeedsBySynchronization());
preferences.putBoolean(DefaultPreferences.CLEAN_UP_BM_BY_CON_ERROR, operations.deleteFeedsByConError());
preferences.putBoolean(DefaultPreferences.CLEAN_UP_BM_BY_DUPLICATES, operations.deleteFeedsByDuplicates());
preferences.putBoolean(DefaultPreferences.CLEAN_UP_NEWS_BY_AGE_STATE, operations.deleteNewsByAge());
preferences.putInteger(DefaultPreferences.CLEAN_UP_NEWS_BY_AGE_VALUE, operations.getMaxNewsAge());
preferences.putBoolean(DefaultPreferences.CLEAN_UP_NEWS_BY_COUNT_STATE, operations.deleteNewsByCount());
preferences.putInteger(DefaultPreferences.CLEAN_UP_NEWS_BY_COUNT_VALUE, operations.getMaxNewsCountPerFeed());
preferences.putBoolean(DefaultPreferences.CLEAN_UP_READ_NEWS_STATE, operations.deleteReadNews());
preferences.putBoolean(DefaultPreferences.CLEAN_UP_NEVER_DEL_UNREAD_NEWS_STATE, operations.keepUnreadNews());
preferences.putBoolean(DefaultPreferences.CLEAN_UP_NEVER_DEL_LABELED_NEWS_STATE, operations.keepLabeledNews());
monitor.done();
}
};
/* Perform Runnable in separate Thread and show progress */
try {
getContainer().run(true, false, runnable);
} catch (InvocationTargetException e) {
Activator.getDefault().logError(e.getMessage(), e);
} catch (InterruptedException e) {
Activator.getDefault().logError(e.getMessage(), e);
}
/* Ask to restart if Task was used */
if (askForRestart.get()) {
boolean restart = MessageDialog.openQuestion(getShell(), Messages.CleanUpWizard_RESTART_RSSOWL, Messages.CleanUpWizard_RESTART_TO_CLEANUP);
if (restart)
Controller.getDefault().restart();
}
return true;
}
/*
* @see org.eclipse.jface.wizard.Wizard#needsProgressMonitor()
*/
@Override
public boolean needsProgressMonitor() {
return true;
}
}