blob: ac09ab2095f35a290e8c81711a15f93824ec772b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2009 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.core.externalization;
import java.io.File;
import java.util.Set;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.mylyn.internal.tasks.core.ITaskListChangeListener;
import org.eclipse.mylyn.internal.tasks.core.ITaskListRunnable;
import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
import org.eclipse.mylyn.internal.tasks.core.RepositoryModel;
import org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta;
import org.eclipse.mylyn.internal.tasks.core.TaskList;
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
import org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.ITaskActivationListener;
import org.eclipse.mylyn.tasks.core.TaskRepository;
/**
* @author Rob Elves
*/
public class TaskListExternalizationParticipant extends AbstractExternalizationParticipant implements
IExternalizationParticipant, ITaskListChangeListener, ITaskActivationListener {
private static final String DESCRIPTION = Messages.TaskListExternalizationParticipant_Task_List;
private final ExternalizationManager manager;
private final TaskListExternalizer taskListWriter;
private final TaskList taskList;
private boolean dirty;
private final TaskRepositoryManager taskRepositoryManager;
private final RepositoryModel repositoryModel;
public TaskListExternalizationParticipant(RepositoryModel repositoryModel, TaskList taskList,
TaskListExternalizer taskListExternalizer, ExternalizationManager manager,
TaskRepositoryManager repositoryManager) {
this.repositoryModel = repositoryModel;
this.manager = manager;
this.taskList = taskList;
this.taskListWriter = taskListExternalizer;
this.taskRepositoryManager = repositoryManager;
}
@Override
public ISchedulingRule getSchedulingRule() {
return TaskList.getSchedulingRule();
}
@Override
public boolean isDirty() {
return dirty;
}
@Override
public void load(final File sourceFile, IProgressMonitor monitor) throws CoreException {
ITaskListRunnable loadRunnable = new ITaskListRunnable() {
public void execute(IProgressMonitor monitor) throws CoreException {
resetTaskList();
taskListWriter.readTaskList(taskList, sourceFile);
}
};
taskList.run(loadRunnable, monitor);
}
@Override
protected boolean performLoad(File dataFile, IProgressMonitor monitor) throws CoreException {
if (super.performLoad(dataFile, monitor)) {
return true;
} else {
try {
// attempt restore of old Mylyn tasklist.xml.zip
File oldTasklist = new File(dataFile.getParent(), ITasksCoreConstants.OLD_M_2_TASKLIST_FILENAME);
if (oldTasklist.exists()) {
load(oldTasklist, monitor);
return true;
}
} catch (CoreException e) {
// ignore
}
}
return false;
}
/**
* public for tests
*/
public void resetTaskList() {
repositoryModel.clear();
taskList.reset();
prepareOrphanContainers();
}
private void prepareOrphanContainers() {
for (TaskRepository repository : taskRepositoryManager.getAllRepositories()) {
if (!repository.getConnectorKind().equals(LocalRepositoryConnector.CONNECTOR_KIND)) {
taskList.addUnmatchedContainer(new UnmatchedTaskContainer(repository.getConnectorKind(),
repository.getRepositoryUrl()));
}
}
}
@Override
public void save(final File targetFile, IProgressMonitor monitor) throws CoreException {
ITaskListRunnable saveRunnable = new ITaskListRunnable() {
public void execute(IProgressMonitor monitor) throws CoreException {
synchronized (TaskListExternalizationParticipant.this) {
dirty = false;
}
taskListWriter.writeTaskList(taskList, targetFile);
}
};
taskList.run(saveRunnable, monitor);
}
@Override
public String getDescription() {
return DESCRIPTION;
}
@Override
public String getFileName() {
return ITasksCoreConstants.DEFAULT_TASK_LIST_FILE;
}
public void containersChanged(Set<TaskContainerDelta> containers) {
for (TaskContainerDelta taskContainerDelta : containers) {
if (!taskContainerDelta.isTransient()) {
synchronized (TaskListExternalizationParticipant.this) {
dirty = true;
}
manager.requestSave();
return;
}
}
}
public void preTaskActivated(ITask task) {
// ignore
}
public void preTaskDeactivated(ITask task) {
// ignore
}
public void taskActivated(ITask task) {
synchronized (TaskListExternalizationParticipant.this) {
dirty = true;
}
manager.requestSave();
return;
}
public void taskDeactivated(ITask task) {
synchronized (TaskListExternalizationParticipant.this) {
dirty = true;
}
manager.requestSave();
return;
}
}