From 105f9b524f9d34b780db0d0fbbc2517f53743651 Mon Sep 17 00:00:00 2001 From: relves Date: Tue, 25 May 2010 20:07:15 +0000 Subject: NEW - bug 302907: [api] support categorization in Task Repositories view https://bugs.eclipse.org/bugs/show_bug.cgi?id=302907 --- org.eclipse.mylyn.tasks.core/META-INF/MANIFEST.MF | 1 + .../mylyn/internal/tasks/core/Category.java | 59 ++++++++++++++++ .../internal/tasks/core/IRepositoryConstants.java | 12 ++++ .../internal/tasks/core/TaskRepositoryManager.java | 78 +++++++++++++++++++++- .../tasks/core/AbstractRepositoryMigrator.java | 30 +++++++++ 5 files changed, 177 insertions(+), 3 deletions(-) create mode 100644 org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/Category.java create mode 100644 org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryMigrator.java (limited to 'org.eclipse.mylyn.tasks.core') diff --git a/org.eclipse.mylyn.tasks.core/META-INF/MANIFEST.MF b/org.eclipse.mylyn.tasks.core/META-INF/MANIFEST.MF index b9018cbd8..857a0009a 100644 --- a/org.eclipse.mylyn.tasks.core/META-INF/MANIFEST.MF +++ b/org.eclipse.mylyn.tasks.core/META-INF/MANIFEST.MF @@ -14,6 +14,7 @@ Export-Package: org.eclipse.mylyn.internal.provisional.tasks.core;x-internal:=tr org.eclipse.mylyn.internal.tasks.core;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs", org.eclipse.mylyn.internal.tasks.core.data;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs", org.eclipse.mylyn.internal.tasks.core.externalization;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs", + org.eclipse.mylyn.internal.tasks.core.notifications;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs", org.eclipse.mylyn.internal.tasks.core.sync;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs", org.eclipse.mylyn.tasks.core, org.eclipse.mylyn.tasks.core.data, diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/Category.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/Category.java new file mode 100644 index 000000000..02c87dccc --- /dev/null +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/Category.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2010 Tasktop Technologies and others. + * 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.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Tasktop Technologies - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.internal.tasks.core; + +import org.eclipse.core.runtime.PlatformObject; + +/** + * Categories include Tasks, Bugs, Other... + * + * @author Robert Elves + */ +public class Category extends PlatformObject { + + private final String id; + + private final String label; + + private final int rank; + + public Category(String id, String label, int rank) { + this.id = id; + this.label = label; + this.rank = rank; + } + + public String getId() { + return id; + } + + public int compareTo(Object arg0) { + if (arg0 instanceof Category) { + return this.getRank() - ((Category) arg0).getRank(); + } + return 0; + } + + public int getRank() { + return rank; + } + + public String getLabel() { + return label; + } + + @Override + public String toString() { + return getLabel(); + }; + +} diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/IRepositoryConstants.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/IRepositoryConstants.java index 5105c9e3c..f31e48a98 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/IRepositoryConstants.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/IRepositoryConstants.java @@ -29,6 +29,8 @@ public interface IRepositoryConstants { public static final String PROPERTY_CONNECTOR_KIND = "kind"; //$NON-NLS-1$ + public static final String PROPERTY_CATEGORY = "category"; //$NON-NLS-1$ + public static final String PROPERTY_URL = "url"; //$NON-NLS-1$ public static final String PROPERTY_LABEL = "label"; //$NON-NLS-1$ @@ -37,4 +39,14 @@ public interface IRepositoryConstants { public static final String KIND_UNKNOWN = ""; //$NON-NLS-1$ + public static final String CATEGORY_TASKS = "org.eclipse.mylyn.category.tasks"; //$NON-NLS-1$ + + public static final String CATEGORY_BUGS = "org.eclipse.mylyn.category.bugs"; //$NON-NLS-1$ + + public static final String CATEGORY_BUILD = "org.eclipse.mylyn.category.build"; //$NON-NLS-1$ + + public static final String CATEGORY_REVIEW = "org.eclipse.mylyn.category.review"; //$NON-NLS-1$ + + public static final String CATEGORY_OTHER = "org.eclipse.mylyn.category.other"; //$NON-NLS-1$ + } diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskRepositoryManager.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskRepositoryManager.java index 62c7a8615..c3d64d2b5 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskRepositoryManager.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskRepositoryManager.java @@ -33,6 +33,7 @@ import org.eclipse.core.runtime.Status; import org.eclipse.mylyn.commons.core.StatusHandler; import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryDelta.Type; import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; +import org.eclipse.mylyn.tasks.core.AbstractRepositoryMigrator; import org.eclipse.mylyn.tasks.core.IRepositoryListener; import org.eclipse.mylyn.tasks.core.IRepositoryManager; import org.eclipse.mylyn.tasks.core.ITask; @@ -57,6 +58,7 @@ public class TaskRepositoryManager implements IRepositoryManager { private final Map repositoryConnectors = new HashMap(); + // connector kinds to corresponding repositories private final Map> repositoryMap = new HashMap>(); private final Set listeners = new CopyOnWriteArraySet(); @@ -67,6 +69,8 @@ public class TaskRepositoryManager implements IRepositoryManager { public static final String PREFIX_LOCAL = "local-"; //$NON-NLS-1$ + private static final Map repositoryCategories = new HashMap(); + private final PropertyChangeListener PROPERTY_CHANGE_LISTENER = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { TaskRepositoryManager.this.notifyRepositorySettingsChanged((TaskRepository) evt.getSource(), @@ -76,7 +80,20 @@ public class TaskRepositoryManager implements IRepositoryManager { private final TaskRepositoriesExternalizer externalizer = new TaskRepositoriesExternalizer(); + private List migrators; + public TaskRepositoryManager() { + this.migrators = Collections.emptyList(); + Category catTasks = new Category(IRepositoryConstants.CATEGORY_TASKS, "Tasks", 0); //$NON-NLS-1$ + repositoryCategories.put(catTasks.getId(), catTasks); + Category catBugs = new Category(IRepositoryConstants.CATEGORY_BUGS, "Bugs", 100); //$NON-NLS-1$ + repositoryCategories.put(catBugs.getId(), catBugs); + Category catBuild = new Category(IRepositoryConstants.CATEGORY_BUILD, "Build", 200); //$NON-NLS-1$ + repositoryCategories.put(catBuild.getId(), catBuild); + Category catReview = new Category(IRepositoryConstants.CATEGORY_REVIEW, "Review", 300); //$NON-NLS-1$ + repositoryCategories.put(catReview.getId(), catReview); + Category catOther = new Category(IRepositoryConstants.CATEGORY_OTHER, "Other", 400); //$NON-NLS-1$ + repositoryCategories.put(catOther.getId(), catOther); } public synchronized Collection getRepositoryConnectors() { @@ -118,6 +135,7 @@ public class TaskRepositoryManager implements IRepositoryManager { // TODO 4.0 return false to indicate that remove was unsuccessful return; } + repository.addChangeListener(PROPERTY_CHANGE_LISTENER); } @@ -182,6 +200,19 @@ public class TaskRepositoryManager implements IRepositoryManager { return sb.toString(); } + public Category getCategory(String id) { + Category category = repositoryCategories.get(IRepositoryConstants.CATEGORY_OTHER); + Category cat = repositoryCategories.get(id); + if (cat != null) { + category = cat; + } + return category; + } + + public Collection getCategories() { + return Collections.unmodifiableCollection(repositoryCategories.values()); + } + public TaskRepository getRepository(String kind, String urlString) { Assert.isNotNull(kind); Assert.isNotNull(urlString); @@ -233,11 +264,11 @@ public class TaskRepositoryManager implements IRepositoryManager { return null; } - public Set getRepositories(String kind) { - Assert.isNotNull(kind); + public Set getRepositories(String connectorKind) { + Assert.isNotNull(connectorKind); Set result; synchronized (this) { - result = repositoryMap.get(kind); + result = repositoryMap.get(connectorKind); } if (result == null) { return Collections.emptySet(); @@ -309,9 +340,14 @@ public class TaskRepositoryManager implements IRepositoryManager { if (removeHttpAuthMigration(repository)) { migration = true; } + if (applyMigrators(repository)) { + migration = true; + } if (repositoryMap.containsKey(repository.getConnectorKind())) { repositoryMap.get(repository.getConnectorKind()).add(repository); + repository.addChangeListener(PROPERTY_CHANGE_LISTENER); + } else { orphanedRepositories.add(repository); } @@ -323,6 +359,33 @@ public class TaskRepositoryManager implements IRepositoryManager { } } + private boolean applyMigrators(final TaskRepository repository) { + final boolean[] result = new boolean[1]; + for (AbstractRepositoryMigrator migrator : migrators) { + if (migrator.getConnectorKind().equals(repository.getConnectorKind())) { + + final AbstractRepositoryMigrator finalRepositoryMigrator = migrator; + result[0] = false; + SafeRunner.run(new ISafeRunnable() { + + public void handleException(Throwable e) { + StatusHandler.log(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN, + "Repository migration failed for repository \"" + repository.getUrl() + "\"", e)); //$NON-NLS-1$ //$NON-NLS-2$ + } + + public void run() throws Exception { + if (finalRepositoryMigrator.migrateRepository(repository)) { + result[0] = true; + } + } + + }); + break; + } + } + return result[0]; + } + @SuppressWarnings("deprecation") private boolean removeHttpAuthMigration(TaskRepository repository) { String httpusername = repository.getProperty(TaskRepository.AUTH_HTTP_USERNAME); @@ -447,4 +510,13 @@ public class TaskRepositoryManager implements IRepositoryManager { } } + public Category getCategory(TaskRepository repository) { + String categoryId = repository.getProperty(IRepositoryConstants.PROPERTY_CATEGORY); + return getCategory(categoryId); + } + + public void initialize(List repositoryMigrators) { + this.migrators = repositoryMigrators; + + } } diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryMigrator.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryMigrator.java new file mode 100644 index 000000000..ed302de15 --- /dev/null +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryMigrator.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * Copyright (c) 2010 Tasktop Technologies and others. + * 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.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Tasktop Technologies - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.tasks.core; + +/** + * Implement a connector specific repository migrator to perform connector specific migration procedures on task + * repositories of the same connector kind upon startup. Override and contribute by the + * org.eclipse.mylyn.tasks.ui.repositories extension point's taskListMigrator element. + * + * @author Robert Elves + * @since 3.4 + */ +public abstract class AbstractRepositoryMigrator { + + public abstract String getConnectorKind(); + + public boolean migrateRepository(TaskRepository repository) { + return false; + } + +} -- cgit v1.2.3