Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteffen Pingel2011-08-23 00:49:47 +0000
committerSteffen Pingel2011-08-23 00:49:47 +0000
commit88eb0b5a82b31512654a83aa7bd336341c74358a (patch)
tree07995ad18394bc8c1efe93f5447f4b7f450bf529
parent322adb87a8732b447c0c271762fe3b861c19c269 (diff)
downloadorg.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
-rw-r--r--org.eclipse.mylyn.tasks.core/schema/taskActivationListeners.exsd28
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITasksCoreConstants.java2
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskActivityManager.java49
-rw-r--r--org.eclipse.mylyn.tasks.tests/plugin.xml2
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/MockTaskActivationListenerExtension.java68
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskActivityManagerTest.java99
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));

Back to the top