| /******************************************************************************* |
| * Copyright (c) 2004, 2012 Tasktop Technologies and others. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * https://www.eclipse.org/legal/epl-2.0 |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * Tasktop Technologies - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.mylyn.internal.tasks.ui.wizards; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.util.Date; |
| import java.util.Enumeration; |
| import java.util.Locale; |
| import java.util.zip.ZipEntry; |
| import java.util.zip.ZipFile; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.OperationCanceledException; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.core.runtime.jobs.Job; |
| import org.eclipse.jface.dialogs.IDialogSettings; |
| import org.eclipse.jface.dialogs.MessageDialog; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.wizard.IWizardContainer; |
| import org.eclipse.jface.wizard.Wizard; |
| import org.eclipse.mylyn.commons.core.CoreUtil; |
| import org.eclipse.mylyn.commons.core.ICoreRunnable; |
| import org.eclipse.mylyn.commons.ui.CommonUiUtil; |
| import org.eclipse.mylyn.commons.workbench.WorkbenchUtil; |
| import org.eclipse.mylyn.internal.commons.core.ZipFileUtil; |
| import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants; |
| import org.eclipse.mylyn.internal.tasks.core.externalization.AbstractExternalizationParticipant; |
| import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; |
| import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; |
| import org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater; |
| import org.eclipse.mylyn.tasks.ui.TasksUi; |
| import org.eclipse.osgi.util.NLS; |
| import org.eclipse.ui.IImportWizard; |
| import org.eclipse.ui.IWorkbench; |
| import org.eclipse.ui.PlatformUI; |
| |
| import com.ibm.icu.text.SimpleDateFormat; |
| |
| /** |
| * @author Rob Elves |
| */ |
| @SuppressWarnings("restriction") |
| public class TaskDataImportWizard extends Wizard implements IImportWizard { |
| |
| private TaskDataImportWizardPage importPage = null; |
| |
| public TaskDataImportWizard() { |
| IDialogSettings masterSettings = TasksUiPlugin.getDefault().getDialogSettings(); |
| setDialogSettings(getSettingsSection(masterSettings)); |
| setNeedsProgressMonitor(true); |
| setWindowTitle(Messages.TaskDataImportWizard_Import); |
| } |
| |
| /** |
| * Finds or creates a dialog settings section that is used to make the dialog control settings persistent |
| */ |
| private IDialogSettings getSettingsSection(IDialogSettings master) { |
| IDialogSettings settings = master.getSection("org.eclipse.mylyn.tasklist.ui.importWizard"); //$NON-NLS-1$ |
| if (settings == null) { |
| settings = master.addNewSection("org.eclipse.mylyn.tasklist.ui.importWizard"); //$NON-NLS-1$ |
| } |
| return settings; |
| } |
| |
| @Override |
| public void addPages() { |
| importPage = new TaskDataImportWizardPage(); |
| importPage.setWizard(this); |
| addPage(importPage); |
| } |
| |
| public void init(IWorkbench workbench, IStructuredSelection selection) { |
| // no initialization needed |
| } |
| |
| @Override |
| public boolean canFinish() { |
| return importPage.isPageComplete(); |
| } |
| |
| @Override |
| public boolean performFinish() { |
| String sourceZip = importPage.getSourceZipFile(); |
| final File sourceZipFile = new File(sourceZip); |
| |
| if (!sourceZipFile.exists()) { |
| MessageDialog.openError(getShell(), Messages.TaskDataImportWizard_File_not_found, sourceZipFile.toString() |
| + Messages.TaskDataImportWizard_could_not_be_found); |
| return false; |
| } else if (!CoreUtil.TEST_MODE |
| && !MessageDialog.openConfirm(getShell(), Messages.TaskDataImportWizard_confirm_overwrite, |
| Messages.TaskDataImportWizard_existing_task_data_about_to_be_erased_proceed)) { |
| return false; |
| } |
| |
| if (performFinish(sourceZipFile, getContainer())) { |
| importPage.saveSettings(); |
| return true; |
| } else { |
| return false; |
| } |
| } |
| |
| public static boolean performFinish(final File sourceZipFile, final IWizardContainer container) { |
| TasksUi.getTaskActivityManager().deactivateTask(TasksUi.getTaskActivityManager().getActiveTask()); |
| try { |
| TaskWorkingSetUpdater.setEnabled(false); |
| |
| if (container != null) { |
| CommonUiUtil.run(container, new FileCopyJob(sourceZipFile)); |
| } else { |
| WorkbenchUtil.busyCursorWhile(new FileCopyJob(sourceZipFile)); |
| } |
| } catch (CoreException e) { |
| Status status = new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, NLS.bind( |
| "Problems encountered importing task data: {0}", e.getMessage()), e); //$NON-NLS-1$ |
| TasksUiInternal.logAndDisplayStatus(Messages.TaskDataImportWizard_task_data_import_failed, status); |
| } catch (OperationCanceledException e) { |
| // canceled |
| } finally { |
| TaskWorkingSetUpdater.setEnabled(true); |
| } |
| return true; |
| } |
| |
| /** Job that performs the file copying and zipping */ |
| static class FileCopyJob implements ICoreRunnable { |
| |
| private static final String PREFIX_BACKUP = ".backup-"; //$NON-NLS-1$ |
| |
| private final String JOB_LABEL = Messages.TaskDataImportWizard_Importing_Data; |
| |
| private final File sourceZipFile; |
| |
| public FileCopyJob(File sourceZipFile) { |
| this.sourceZipFile = sourceZipFile; |
| } |
| |
| public void run(final IProgressMonitor monitor) throws CoreException { |
| try { |
| boolean hasDefaultTaskList = false; |
| int numEntries = 0; |
| |
| // determine properties of backup |
| ZipFile zipFile = new ZipFile(sourceZipFile, ZipFile.OPEN_READ); |
| try { |
| Enumeration<? extends ZipEntry> entries = zipFile.entries(); |
| while (entries.hasMoreElements()) { |
| ZipEntry entry = entries.nextElement(); |
| if (entry.getName().equals(ITasksCoreConstants.DEFAULT_TASK_LIST_FILE)) { |
| hasDefaultTaskList = true; |
| } |
| numEntries++; |
| } |
| } finally { |
| zipFile.close(); |
| } |
| |
| if (numEntries > 0) { |
| monitor.beginTask(JOB_LABEL, numEntries); |
| Job.getJobManager().beginRule(ITasksCoreConstants.ROOT_SCHEDULING_RULE, monitor); |
| |
| if (monitor.isCanceled()) { |
| return; |
| } |
| |
| ZipFileUtil.unzipFiles(sourceZipFile, TasksUiPlugin.getDefault().getDataDirectory(), monitor); |
| |
| if (!hasDefaultTaskList) { |
| renameTaskList(); |
| } |
| |
| readTaskListData(); |
| } |
| } catch (IOException e) { |
| Status status = new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, e.getMessage(), e); |
| throw new CoreException(status); |
| } finally { |
| Job.getJobManager().endRule(ITasksCoreConstants.ROOT_SCHEDULING_RULE); |
| monitor.done(); |
| } |
| } |
| |
| private void readTaskListData() { |
| if (!CoreUtil.TEST_MODE) { |
| PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() { |
| public void run() { |
| try { |
| TasksUiPlugin.getDefault().reloadDataDirectory(); |
| } catch (CoreException e) { |
| TasksUiInternal.displayStatus(Messages.TaskDataImportWizard_Import_Error, e.getStatus()); |
| } |
| } |
| }); |
| } else { |
| TasksUiPlugin.getDefault().initializeDataSources(); |
| } |
| } |
| |
| /** |
| * Rename existing task list file to avoid loading that instead of the restored old one. |
| */ |
| private void renameTaskList() { |
| SimpleDateFormat format = new SimpleDateFormat(ITasksCoreConstants.FILENAME_TIMESTAMP_FORMAT, |
| Locale.ENGLISH); |
| String date = format.format(new Date()); |
| |
| File taskListFile = new File(TasksUiPlugin.getDefault().getDataDirectory(), |
| ITasksCoreConstants.DEFAULT_TASK_LIST_FILE); |
| if (taskListFile.exists()) { |
| taskListFile.renameTo(new File(taskListFile.getParentFile(), taskListFile.getName() + PREFIX_BACKUP |
| + date)); |
| } |
| |
| File taskListFileSnapshot = new File(TasksUiPlugin.getDefault().getDataDirectory(), |
| AbstractExternalizationParticipant.SNAPSHOT_PREFIX + ITasksCoreConstants.DEFAULT_TASK_LIST_FILE); |
| if (taskListFileSnapshot.exists()) { |
| taskListFileSnapshot.renameTo(new File(taskListFile.getParentFile(), taskListFileSnapshot.getName() |
| + PREFIX_BACKUP + date)); |
| } |
| } |
| |
| } |
| |
| } |