diff options
author | Steffen Pingel | 2011-08-23 00:49:47 +0000 |
---|---|---|
committer | Steffen Pingel | 2011-08-23 00:49:47 +0000 |
commit | 88eb0b5a82b31512654a83aa7bd336341c74358a (patch) | |
tree | 07995ad18394bc8c1efe93f5447f4b7f450bf529 | |
parent | 322adb87a8732b447c0c271762fe3b861c19c269 (diff) | |
download | org.eclipse.mylyn.tasks-88eb0b5a82b31512654a83aa7bd336341c74358a.tar.gz org.eclipse.mylyn.tasks-88eb0b5a82b31512654a83aa7bd336341c74358a.tar.xz org.eclipse.mylyn.tasks-88eb0b5a82b31512654a83aa7bd336341c74358a.zip |
ASSIGNED - bug 349924: [patch][api] provide extension point for task
activation listeners
https://bugs.eclipse.org/bugs/show_bug.cgi?id=349924
6 files changed, 123 insertions, 125 deletions
diff --git a/org.eclipse.mylyn.tasks.core/schema/taskActivationListeners.exsd b/org.eclipse.mylyn.tasks.core/schema/taskActivationListeners.exsd index 16d6a9794..ac81fe959 100644 --- a/org.eclipse.mylyn.tasks.core/schema/taskActivationListeners.exsd +++ b/org.eclipse.mylyn.tasks.core/schema/taskActivationListeners.exsd @@ -56,7 +56,7 @@ </documentation> </annotation> </attribute> - <attribute name="listenerClass" type="string" use="required"> + <attribute name="class" type="string" use="required"> <annotation> <documentation> @@ -74,36 +74,12 @@ <meta.section type="since"/> </appInfo> <documentation> - Since Mylyn Tasks 3.7 + 3.7 </documentation> </annotation> - <annotation> - <appInfo> - <meta.section type="examples"/> - </appInfo> - <documentation> - [Enter extension point usage example here.] - </documentation> - </annotation> - <annotation> - <appInfo> - <meta.section type="apiinfo"/> - </appInfo> - <documentation> - [Enter API information here.] - </documentation> - </annotation> - <annotation> - <appInfo> - <meta.section type="implementation"/> - </appInfo> - <documentation> - [Enter information about supplied implementation of this extension point.] - </documentation> - </annotation> </schema> diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITasksCoreConstants.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITasksCoreConstants.java index 8185bdc5f..3ff03b8c7 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITasksCoreConstants.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITasksCoreConstants.java @@ -67,8 +67,6 @@ public interface ITasksCoreConstants { public static final String PROPERTY_USE_SECURE_STORAGE = "org.eclipse.mylyn.tasklist.repositories.configuration.securestorage"; //$NON-NLS-1$ - public static final String TASK_ACTIVATION_LISTENER_EP_ID = ID_PLUGIN + ".taskActivationListeners"; //$NON-NLS-1$ - /** * Jobs that have the same instances of this rule set are mutually exclusive. */ diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskActivityManager.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskActivityManager.java index 7a97a926b..5e7573fd0 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskActivityManager.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskActivityManager.java @@ -27,7 +27,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArraySet; import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; @@ -41,6 +40,7 @@ import org.eclipse.mylyn.tasks.core.ITask; import org.eclipse.mylyn.tasks.core.ITaskActivationListener; import org.eclipse.mylyn.tasks.core.ITaskActivityListener; import org.eclipse.mylyn.tasks.core.ITaskActivityManager; +import org.eclipse.osgi.util.NLS; /** * Manages task elapsed time, scheduling, due dates, and the date ranges @@ -96,6 +96,9 @@ public class TaskActivityManager implements ITaskActivityManager { } }; + private static final String ID_EXTENSION_TASK_ACTIVATION_LISTENERS = ITasksCoreConstants.ID_PLUGIN + + ".taskActivationListeners"; //$NON-NLS-1$ + public TaskActivityManager(TaskRepositoryManager repositoryManager, TaskList taskList) { this.taskList = taskList; this.repositoryManager = repositoryManager; @@ -103,35 +106,43 @@ public class TaskActivityManager implements ITaskActivityManager { clear(); } + /** + * Reads task activation listeners from an extension point. + * <p> + * Note: The method is not synchronizes since task activation and de-activation are expected to occur sequentially. + */ private void initTaskListeners() { if (!listenersInitialized) { - try { - IExtensionRegistry registry = Platform.getExtensionRegistry(); - - IExtensionPoint listenerExtensionPoint = registry.getExtensionPoint(ITasksCoreConstants.TASK_ACTIVATION_LISTENER_EP_ID); - IExtension[] listenerExtensions = listenerExtensionPoint.getExtensions(); + listenersInitialized = true; - for (IExtension extension : listenerExtensions) { - IConfigurationElement[] configurationElements = extension.getConfigurationElements(); - for (IConfigurationElement config : configurationElements) { - if ("listener".equals(config.getName())) { //$NON-NLS-1$ - Object object; - object = config.createExecutableExtension("listenerClass");//$NON-NLS-1$ + IExtensionRegistry registry = Platform.getExtensionRegistry(); + IExtensionPoint listenerExtensionPoint = registry.getExtensionPoint(TaskActivityManager.ID_EXTENSION_TASK_ACTIVATION_LISTENERS); + IExtension[] listenerExtensions = listenerExtensionPoint.getExtensions(); + for (IExtension extension : listenerExtensions) { + IConfigurationElement[] elements = extension.getConfigurationElements(); + for (IConfigurationElement element : elements) { + if ("listener".equals(element.getName())) { //$NON-NLS-1$ + try { + Object object = element.createExecutableExtension("class"); //$NON-NLS-1$ if (object instanceof ITaskActivationListener) { addActivationListener((ITaskActivationListener) object); } else { - StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, - "Registering of task activation listener failed: \"" + object + "\"")); //$NON-NLS-1$ //$NON-NLS-2$ + StatusHandler.log(new Status( + IStatus.ERROR, + ITasksCoreConstants.ID_PLUGIN, + NLS.bind( + "Unexpected error registering listener contributed by {0}: ''{1}'' does not extend expected class", //$NON-NLS-1$ + element.getContributor().getName(), object.getClass() + .getCanonicalName()))); } + } catch (Throwable e) { + StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, NLS.bind( + "Unexpected error registering listener contributed by {0}", //$NON-NLS-1$ + element.getContributor().getName()), e)); } } } - } catch (CoreException e) { - StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, - "Registering of task activation listener failed: \"" + e.getMessage() + "\"")); //$NON-NLS-1$ //$NON-NLS-2$ } - - listenersInitialized = true; } } diff --git a/org.eclipse.mylyn.tasks.tests/plugin.xml b/org.eclipse.mylyn.tasks.tests/plugin.xml index 28c47f088..345495ff3 100644 --- a/org.eclipse.mylyn.tasks.tests/plugin.xml +++ b/org.eclipse.mylyn.tasks.tests/plugin.xml @@ -91,7 +91,7 @@ point="org.eclipse.mylyn.tasks.core.taskActivationListeners"> <listener id="org.eclipse.mylyn.tasks.tests.listenerTest" - listenerClass="org.eclipse.mylyn.tasks.tests.MockTaskActivationListenerExtension"> + class="org.eclipse.mylyn.tasks.tests.TaskActivityManagerTest$MockTaskActivationListenerExtension"> </listener> </extension> diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/MockTaskActivationListenerExtension.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/MockTaskActivationListenerExtension.java deleted file mode 100644 index 854b32a6c..000000000 --- a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/MockTaskActivationListenerExtension.java +++ /dev/null @@ -1,68 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 Manuel Doninger 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: - * Manuel Doninger - initial API and implementation - *******************************************************************************/ - -package org.eclipse.mylyn.tasks.tests; - -import org.eclipse.mylyn.tasks.core.ITask; -import org.eclipse.mylyn.tasks.core.TaskActivationAdapter; - -/** - * A task activation listener that is registered through an extension point. - * - * @author Manuel Doninger - */ -public class MockTaskActivationListenerExtension extends TaskActivationAdapter { - - public static MockTaskActivationListenerExtension INSTANCE; - - public boolean hasActivated = false; - - public boolean hasPreActivated = false; - - public boolean hasDeactivated = false; - - public boolean hasPreDeactivated = false; - - public MockTaskActivationListenerExtension() { - super(); - INSTANCE = this; - } - - public void reset() { - hasActivated = false; - hasPreActivated = false; - - hasDeactivated = false; - hasPreDeactivated = false; - - } - - @Override - public void preTaskActivated(ITask task) { - hasPreActivated = true; - } - - @Override - public void preTaskDeactivated(ITask task) { - hasPreDeactivated = true; - } - - @Override - public void taskActivated(ITask task) { - hasActivated = true; - } - - @Override - public void taskDeactivated(ITask task) { - hasDeactivated = true; - } - -}
\ No newline at end of file diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskActivityManagerTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskActivityManagerTest.java index 3ec02ffc1..9dc0a2d61 100644 --- a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskActivityManagerTest.java +++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskActivityManagerTest.java @@ -7,6 +7,7 @@ * * Contributors: * Tasktop Technologies - initial API and implementation + * Manuel Doninger - fixes for bug 349924 *******************************************************************************/ package org.eclipse.mylyn.tasks.tests; @@ -34,9 +35,61 @@ import org.eclipse.mylyn.tasks.tests.connector.MockTask; /** * @author Shawn Minto * @author Robert Elves + * @author Manuel Doninger + * @author Steffen Pingel */ public class TaskActivityManagerTest extends TestCase { + public static class MockTaskActivationListenerExtension extends TaskActivationAdapter { + + public static MockTaskActivationListenerExtension INSTANCE; + + public static int INSTANCE_COUNT; + + public boolean hasActivated = false; + + public boolean hasPreActivated = false; + + public boolean hasDeactivated = false; + + public boolean hasPreDeactivated = false; + + public MockTaskActivationListenerExtension() { + INSTANCE = this; + INSTANCE_COUNT++; + } + + public void reset() { + hasActivated = false; + hasPreActivated = false; + + hasDeactivated = false; + hasPreDeactivated = false; + + } + + @Override + public void preTaskActivated(ITask task) { + hasPreActivated = true; + } + + @Override + public void preTaskDeactivated(ITask task) { + hasPreDeactivated = true; + } + + @Override + public void taskActivated(ITask task) { + hasActivated = true; + } + + @Override + public void taskDeactivated(ITask task) { + hasDeactivated = true; + } + + } + private class MockTaskActivationListener extends TaskActivationAdapter { private boolean hasActivated = false; @@ -137,12 +190,7 @@ public class TaskActivityManagerTest extends TestCase { assertTrue(listener.hasActivated); assertFalse(listener.hasPreDeactivated); assertFalse(listener.hasDeactivated); - assertTrue(MockTaskActivationListenerExtension.INSTANCE.hasPreActivated); - assertTrue(MockTaskActivationListenerExtension.INSTANCE.hasActivated); - assertFalse(MockTaskActivationListenerExtension.INSTANCE.hasPreDeactivated); - assertFalse(MockTaskActivationListenerExtension.INSTANCE.hasDeactivated); - MockTaskActivationListenerExtension.INSTANCE.reset(); listener.reset(); } finally { taskActivityManager.deactivateTask(task); @@ -151,15 +199,48 @@ public class TaskActivityManagerTest extends TestCase { assertFalse(listener.hasActivated); assertTrue(listener.hasPreDeactivated); assertTrue(listener.hasDeactivated); - assertFalse(MockTaskActivationListenerExtension.INSTANCE.hasPreActivated); - assertFalse(MockTaskActivationListenerExtension.INSTANCE.hasActivated); - assertTrue(MockTaskActivationListenerExtension.INSTANCE.hasPreDeactivated); - assertTrue(MockTaskActivationListenerExtension.INSTANCE.hasDeactivated); } finally { taskActivityManager.removeActivationListener(listener); } } + public void testTaskActivationExtension() { + if (MockTaskActivationListenerExtension.INSTANCE != null) { + MockTaskActivationListenerExtension.INSTANCE.reset(); + } + + MockTask task = new MockTask("test:activation"); + try { + taskActivityManager.activateTask(task); + assertNotNull("Expected creation of task activation listener instance", + MockTaskActivationListenerExtension.INSTANCE); + assertTrue(MockTaskActivationListenerExtension.INSTANCE.hasPreActivated); + assertTrue(MockTaskActivationListenerExtension.INSTANCE.hasActivated); + assertFalse(MockTaskActivationListenerExtension.INSTANCE.hasPreDeactivated); + assertFalse(MockTaskActivationListenerExtension.INSTANCE.hasDeactivated); + + MockTaskActivationListenerExtension.INSTANCE.reset(); + } finally { + taskActivityManager.deactivateTask(task); + } + assertFalse(MockTaskActivationListenerExtension.INSTANCE.hasPreActivated); + assertFalse(MockTaskActivationListenerExtension.INSTANCE.hasActivated); + assertTrue(MockTaskActivationListenerExtension.INSTANCE.hasPreDeactivated); + assertTrue(MockTaskActivationListenerExtension.INSTANCE.hasDeactivated); + } + + public void testTaskActivationExtensionInstanceCount() { + MockTask task = new MockTask("test:activation"); + try { + taskActivityManager.activateTask(task); + assertNotNull("Expected creation of task activation listener instance", + MockTaskActivationListenerExtension.INSTANCE); + assertEquals(1, MockTaskActivationListenerExtension.INSTANCE_COUNT); + } finally { + taskActivityManager.deactivateTask(task); + } + } + public void testIsActiveToday() { AbstractTask task = new LocalTask("1", "task-1"); assertFalse(taskActivityManager.isScheduledForToday(task)); |