View | Details | Raw Unified | Return to bug 333930 | Differences between
and this patch

Collapse All | Expand All

(-)a/org.eclipse.mylyn.tasks.core/plugin.xml (+1 lines)
Lines 13-18 Link Here
13
<plugin>
13
<plugin>
14
   <extension-point id="templates" name="templates" schema="schema/templates.exsd"/>
14
   <extension-point id="templates" name="templates" schema="schema/templates.exsd"/>
15
   <extension-point id="synchronizationParticipants" name="Synchronization Participants" schema="schema/synchronizationParticipants.exsd"/>
15
   <extension-point id="synchronizationParticipants" name="Synchronization Participants" schema="schema/synchronizationParticipants.exsd"/>
16
   <extension-point id="taskJobListeners" name="org.eclipse.mylyn.tasks.core" schema="schema/taskJobListeners.exsd"/>
16
   <extension-point id="taskActivationListeners" name="Task Activation Listeners" schema="schema/taskActivationListeners.exsd"/>
17
   <extension-point id="taskActivationListeners" name="Task Activation Listeners" schema="schema/taskActivationListeners.exsd"/>
17
   <extension-point id="activityMonitor" name="Task Activity Monitor" schema="schema/activityMonitor.exsd"/>
18
   <extension-point id="activityMonitor" name="Task Activity Monitor" schema="schema/activityMonitor.exsd"/>
18
   <extension-point id="contextStore" name="Task Context Store" schema="schema/contextStore.exsd"/>
19
   <extension-point id="contextStore" name="Task Context Store" schema="schema/contextStore.exsd"/>
(-)a/org.eclipse.mylyn.tasks.core/schema/taskJobListeners.exsd (+104 lines)
Added Link Here
1
<?xml version='1.0' encoding='UTF-8'?>
2
<!-- Schema file written by PDE -->
3
<schema targetNamespace="org.eclipse.mylyn.tasks.core" xmlns="http://www.w3.org/2001/XMLSchema">
4
<annotation>
5
      <appInfo>
6
         <meta.schema plugin="org.eclipse.mylyn.tasks.core" id="taskJobListeners" name="org.eclipse.mylyn.tasks.core"/>
7
      </appInfo>
8
      <documentation>
9
         Provides notification of task submission.
10
      </documentation>
11
   </annotation>
12
13
   <element name="extension">
14
      <annotation>
15
         <appInfo>
16
            <meta.element />
17
         </appInfo>
18
      </annotation>
19
      <complexType>
20
         <sequence minOccurs="1" maxOccurs="unbounded">
21
            <element ref="listener"/>
22
         </sequence>
23
         <attribute name="point" type="string" use="required">
24
            <annotation>
25
               <documentation>
26
                  
27
               </documentation>
28
            </annotation>
29
         </attribute>
30
         <attribute name="id" type="string">
31
            <annotation>
32
               <documentation>
33
                  
34
               </documentation>
35
            </annotation>
36
         </attribute>
37
         <attribute name="name" type="string">
38
            <annotation>
39
               <documentation>
40
                  
41
               </documentation>
42
               <appInfo>
43
                  <meta.attribute translatable="true"/>
44
               </appInfo>
45
            </annotation>
46
         </attribute>
47
      </complexType>
48
   </element>
49
50
   <element name="listener">
51
      <complexType>
52
         <attribute name="name" type="string">
53
            <annotation>
54
               <documentation>
55
                  
56
               </documentation>
57
            </annotation>
58
         </attribute>
59
         <attribute name="connectorKind" type="string">
60
            <annotation>
61
               <documentation>
62
                  If specified, the listener is only notified about submits for the specified connector. Otherwise, it is notified about all submits.
63
               </documentation>
64
            </annotation>
65
         </attribute>
66
         <attribute name="class" type="string">
67
            <annotation>
68
               <documentation>
69
                  
70
               </documentation>
71
               <appInfo>
72
                  <meta.attribute kind="java" basedOn="org.eclipse.mylyn.tasks.core.TaskJobListener:"/>
73
               </appInfo>
74
            </annotation>
75
         </attribute>
76
      </complexType>
77
   </element>
78
79
   <annotation>
80
      <appInfo>
81
         <meta.section type="since"/>
82
      </appInfo>
83
      <documentation>
84
         3.7
85
      </documentation>
86
   </annotation>
87
88
89
90
91
   <annotation>
92
      <appInfo>
93
         <meta.section type="copyright"/>
94
      </appInfo>
95
      <documentation>
96
         Copyright (c) 2004, 2009 Tasktop Technologies and others.
97
All rights reserved. This program and the accompanying materials
98
are made available under the terms of the Eclipse Public License v1.0
99
which accompanies this distribution, and is available at
100
http://www.eclipse.org/legal/epl-v10.html
101
      </documentation>
102
   </annotation>
103
104
</schema>
(-)a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskJobFactory.java (-2 / +40 lines)
Lines 11-16 Link Here
11
11
12
package org.eclipse.mylyn.internal.tasks.core;
12
package org.eclipse.mylyn.internal.tasks.core;
13
13
14
import java.util.ArrayList;
15
import java.util.HashMap;
16
import java.util.List;
17
import java.util.Map;
14
import java.util.Set;
18
import java.util.Set;
15
19
16
import org.eclipse.core.runtime.CoreException;
20
import org.eclipse.core.runtime.CoreException;
Lines 21-27 Link Here
21
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
25
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
22
import org.eclipse.core.runtime.jobs.Job;
26
import org.eclipse.core.runtime.jobs.Job;
23
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
27
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
24
import org.eclipse.mylyn.commons.core.StatusHandler;
25
import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager;
28
import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager;
26
import org.eclipse.mylyn.internal.tasks.core.sync.SubmitTaskAttachmentJob;
29
import org.eclipse.mylyn.internal.tasks.core.sync.SubmitTaskAttachmentJob;
27
import org.eclipse.mylyn.internal.tasks.core.sync.SubmitTaskJob;
30
import org.eclipse.mylyn.internal.tasks.core.sync.SubmitTaskJob;
Lines 32-37 Link Here
32
import org.eclipse.mylyn.tasks.core.IRepositoryManager;
35
import org.eclipse.mylyn.tasks.core.IRepositoryManager;
33
import org.eclipse.mylyn.tasks.core.IRepositoryModel;
36
import org.eclipse.mylyn.tasks.core.IRepositoryModel;
34
import org.eclipse.mylyn.tasks.core.ITask;
37
import org.eclipse.mylyn.tasks.core.ITask;
38
import org.eclipse.mylyn.tasks.core.TaskJobListener;
35
import org.eclipse.mylyn.tasks.core.TaskRepository;
39
import org.eclipse.mylyn.tasks.core.TaskRepository;
36
import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentSource;
40
import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentSource;
37
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
41
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
Lines 44-49 Link Here
44
 * @author Steffen Pingel
48
 * @author Steffen Pingel
45
 */
49
 */
46
public class TaskJobFactory implements ITaskJobFactory {
50
public class TaskJobFactory implements ITaskJobFactory {
51
	private static final String ALL_CONNECTORS = "org.eclipse.mylyn.tasks.core.all.connectors"; //$NON-NLS-1$
52
53
	/**
54
	 * listeners provided by extension point
55
	 */
56
	private static Map<String, List<TaskJobListener>> taskJobListeners;
47
57
48
	private final TaskList taskList;
58
	private final TaskList taskList;
49
59
Lines 52-57 Link Here
52
	private final IRepositoryManager repositoryManager;
62
	private final IRepositoryManager repositoryManager;
53
63
54
	private final IRepositoryModel tasksModel;
64
	private final IRepositoryModel tasksModel;
65
66
	protected static synchronized List<TaskJobListener> getTaskJobListeners(AbstractRepositoryConnector connector) {
67
		if (taskJobListeners == null) {
68
			taskJobListeners = new HashMap<String, List<TaskJobListener>>();
69
			List<TaskJobListener> listeners = loadTaskJobListeners(""); //$NON-NLS-1$
70
			taskJobListeners.put(ALL_CONNECTORS, listeners);
71
		}
72
		if (taskJobListeners.get(connector.getConnectorKind()) == null) {
73
			List<TaskJobListener> listeners = loadTaskJobListeners(connector.getConnectorKind());
74
			taskJobListeners.put(connector.getConnectorKind(), listeners);
75
		}
76
		List<TaskJobListener> listeners = new ArrayList<TaskJobListener>();
77
		listeners.addAll(taskJobListeners.get(ALL_CONNECTORS));
78
		listeners.addAll(taskJobListeners.get(connector.getConnectorKind()));
79
		return listeners;
80
	}
81
82
	protected static List<TaskJobListener> loadTaskJobListeners(String connectorKind) {
83
		ExtensionPointReader<TaskJobListener> reader = new ExtensionPointReader<TaskJobListener>(
84
				ITasksCoreConstants.ID_PLUGIN,
85
				"taskJobListeners", "listener", TaskJobListener.class, "connectorKind", connectorKind); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
86
		IStatus status = reader.read();
87
		if (!status.isOK()) {
88
			StatusHandler.log(status);
89
		}
90
		return reader.getItems();
91
	}
55
92
56
	public TaskJobFactory(TaskList taskList, TaskDataManager taskDataManager, IRepositoryManager repositoryManager,
93
	public TaskJobFactory(TaskList taskList, TaskDataManager taskDataManager, IRepositoryManager repositoryManager,
57
			IRepositoryModel tasksModel) {
94
			IRepositoryModel tasksModel) {
Lines 102-108 Link Here
102
139
103
	public SubmitJob createSubmitTaskJob(AbstractRepositoryConnector connector, TaskRepository taskRepository,
140
	public SubmitJob createSubmitTaskJob(AbstractRepositoryConnector connector, TaskRepository taskRepository,
104
			final ITask task, TaskData taskData, Set<TaskAttribute> oldAttributes) {
141
			final ITask task, TaskData taskData, Set<TaskAttribute> oldAttributes) {
105
		SubmitJob job = new SubmitTaskJob(taskDataManager, connector, taskRepository, task, taskData, oldAttributes);
142
		SubmitJob job = new SubmitTaskJob(taskDataManager, connector, taskRepository, task, taskData, oldAttributes,
143
				getTaskJobListeners(connector));
106
		job.setPriority(Job.INTERACTIVE);
144
		job.setPriority(Job.INTERACTIVE);
107
		try {
145
		try {
108
			taskList.run(new ITaskListRunnable() {
146
			taskList.run(new ITaskListRunnable() {
(-)a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SubmitTaskJob.java (-3 / +51 lines)
Lines 11-25 Link Here
11
11
12
package org.eclipse.mylyn.internal.tasks.core.sync;
12
package org.eclipse.mylyn.internal.tasks.core.sync;
13
13
14
import java.util.Collections;
15
import java.util.List;
14
import java.util.Set;
16
import java.util.Set;
15
17
16
import org.eclipse.core.runtime.CoreException;
18
import org.eclipse.core.runtime.CoreException;
17
import org.eclipse.core.runtime.IProgressMonitor;
19
import org.eclipse.core.runtime.IProgressMonitor;
20
import org.eclipse.core.runtime.ISafeRunnable;
18
import org.eclipse.core.runtime.IStatus;
21
import org.eclipse.core.runtime.IStatus;
19
import org.eclipse.core.runtime.OperationCanceledException;
22
import org.eclipse.core.runtime.OperationCanceledException;
23
import org.eclipse.core.runtime.SafeRunner;
20
import org.eclipse.core.runtime.Status;
24
import org.eclipse.core.runtime.Status;
21
import org.eclipse.mylyn.commons.core.StatusHandler;
22
import org.eclipse.mylyn.commons.net.Policy;
23
import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
25
import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
24
import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants.MutexSchedulingRule;
26
import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants.MutexSchedulingRule;
25
import org.eclipse.mylyn.internal.tasks.core.TaskTask;
27
import org.eclipse.mylyn.internal.tasks.core.TaskTask;
Lines 28-33 Link Here
28
import org.eclipse.mylyn.tasks.core.ITask;
30
import org.eclipse.mylyn.tasks.core.ITask;
29
import org.eclipse.mylyn.tasks.core.RepositoryResponse;
31
import org.eclipse.mylyn.tasks.core.RepositoryResponse;
30
import org.eclipse.mylyn.tasks.core.RepositoryStatus;
32
import org.eclipse.mylyn.tasks.core.RepositoryStatus;
33
import org.eclipse.mylyn.tasks.core.TaskJobEvent;
34
import org.eclipse.mylyn.tasks.core.TaskJobListener;
31
import org.eclipse.mylyn.tasks.core.TaskRepository;
35
import org.eclipse.mylyn.tasks.core.TaskRepository;
32
import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
36
import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
33
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
37
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
Lines 49-69 Link Here
49
53
50
	private ITask task;
54
	private ITask task;
51
55
56
	private final ITask originalTask;
57
52
	private final Set<TaskAttribute> oldAttributes;
58
	private final Set<TaskAttribute> oldAttributes;
53
59
54
	private final TaskDataManager taskDataManager;
60
	private final TaskDataManager taskDataManager;
55
61
56
	private RepositoryResponse response;
62
	private RepositoryResponse response;
57
63
64
	private final List<TaskJobListener> taskJobListeners;
65
58
	public SubmitTaskJob(TaskDataManager taskDataManager, AbstractRepositoryConnector connector,
66
	public SubmitTaskJob(TaskDataManager taskDataManager, AbstractRepositoryConnector connector,
59
			TaskRepository taskRepository, ITask task, TaskData taskData, Set<TaskAttribute> oldAttributes) {
67
			TaskRepository taskRepository, ITask task, TaskData taskData, Set<TaskAttribute> oldAttributes) {
68
		this(taskDataManager, connector, taskRepository, task, taskData, oldAttributes,
69
				Collections.<TaskJobListener> emptyList());
70
	}
71
72
	public SubmitTaskJob(TaskDataManager taskDataManager, AbstractRepositoryConnector connector,
73
			TaskRepository taskRepository, ITask task, TaskData taskData, Set<TaskAttribute> oldAttributes,
74
			List<TaskJobListener> taskJobListeners) {
60
		super("Submitting Task"); //$NON-NLS-1$
75
		super("Submitting Task"); //$NON-NLS-1$
61
		this.taskDataManager = taskDataManager;
76
		this.taskDataManager = taskDataManager;
62
		this.connector = connector;
77
		this.connector = connector;
63
		this.taskRepository = taskRepository;
78
		this.taskRepository = taskRepository;
64
		this.task = task;
79
		this.task = task;
80
		this.originalTask = task;
65
		this.taskData = taskData;
81
		this.taskData = taskData;
66
		this.oldAttributes = oldAttributes;
82
		this.oldAttributes = oldAttributes;
83
		this.taskJobListeners = taskJobListeners;
67
		setRule(new MutexSchedulingRule());
84
		setRule(new MutexSchedulingRule());
68
	}
85
	}
69
86
Lines 75-81 Link Here
75
			try {
92
			try {
76
				monitor.beginTask(Messages.SubmitTaskJob_Submitting_task,
93
				monitor.beginTask(Messages.SubmitTaskJob_Submitting_task,
77
						2 * (1 + getSubmitJobListeners().length) * 100);
94
						2 * (1 + getSubmitJobListeners().length) * 100);
78
95
				fireTaskAboutToSubmit();
79
				// post task data
96
				// post task data
80
				AbstractTaskDataHandler taskDataHandler = connector.getTaskDataHandler();
97
				AbstractTaskDataHandler taskDataHandler = connector.getTaskDataHandler();
81
				monitor.subTask(Messages.SubmitTaskJob_Sending_data);
98
				monitor.subTask(Messages.SubmitTaskJob_Sending_data);
Lines 96-101 Link Here
96
				task = createTask(monitor, updatedTaskData);
113
				task = createTask(monitor, updatedTaskData);
97
				taskDataManager.putSubmittedTaskData(task, updatedTaskData, monitor);
114
				taskDataManager.putSubmittedTaskData(task, updatedTaskData, monitor);
98
				fireTaskSynchronized(monitor);
115
				fireTaskSynchronized(monitor);
116
				fireTaskSubmissionComplete();
99
			} catch (CoreException e) {
117
			} catch (CoreException e) {
100
				errorStatus = e.getStatus();
118
				errorStatus = e.getStatus();
101
			} catch (OperationCanceledException e) {
119
			} catch (OperationCanceledException e) {
Lines 115-120 Link Here
115
		}
133
		}
116
	}
134
	}
117
135
136
	protected void fireTaskAboutToSubmit() {
137
		for (final TaskJobListener listener : taskJobListeners) {
138
			SafeRunner.run(new ISafeRunnable() {
139
				public void run() throws Exception {
140
					listener.aboutToSubmit(new TaskJobEvent(originalTask, task));
141
				}
142
143
				public void handleException(Throwable e) {
144
					StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
145
							"Error thrown by TaskJobListener", e)); //$NON-NLS-1$
146
				}
147
			});
148
		}
149
	}
150
151
	protected void fireTaskSubmissionComplete() {
152
		for (final TaskJobListener listener : taskJobListeners) {
153
			SafeRunner.run(new ISafeRunnable() {
154
				public void run() throws Exception {
155
					listener.taskSubmitted(new TaskJobEvent(originalTask, task));
156
				}
157
158
				public void handleException(Throwable e) {
159
					StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
160
							"Error thrown by TaskJobListener", e)); //$NON-NLS-1$
161
				}
162
			});
163
		}
164
	}
165
118
	private ITask createTask(IProgressMonitor monitor, TaskData updatedTaskData) throws CoreException {
166
	private ITask createTask(IProgressMonitor monitor, TaskData updatedTaskData) throws CoreException {
119
		if (taskData.isNew()) {
167
		if (taskData.isNew()) {
120
			task = new TaskTask(connector.getConnectorKind(), taskRepository.getRepositoryUrl(),
168
			task = new TaskTask(connector.getConnectorKind(), taskRepository.getRepositoryUrl(),
(-)a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskJobEvent.java (+42 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2012 Tasktop Technologies and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     Tasktop Technologies - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylyn.tasks.core;
13
14
/**
15
 * @author Sam Davis
16
 */
17
public class TaskJobEvent {
18
	private final ITask task;
19
20
	private final ITask originalTask;
21
22
	public TaskJobEvent(ITask originalTask, ITask task) {
23
		this.originalTask = originalTask;
24
		this.task = task;
25
	}
26
27
	/**
28
	 * @return the original task that was submitted
29
	 */
30
	public ITask getOriginalTask() {
31
		return originalTask;
32
	}
33
34
	/**
35
	 * @return the task that exists after submission has completed; will be the same as originalTask unless originalTask
36
	 *         was a new (previously unsubmitted) task and this is a submission complete event
37
	 */
38
	public ITask getTask() {
39
		return task;
40
	}
41
42
}
(-)a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskJobListener.java (+41 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2012 Tasktop Technologies and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     Tasktop Technologies - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylyn.tasks.core;
13
14
import org.eclipse.mylyn.tasks.core.sync.SubmitJob;
15
import org.eclipse.mylyn.tasks.core.sync.SubmitJobListener;
16
17
/**
18
 * Clients can contribute an implementation of this class to be notified of all task submissions for a particular
19
 * connector, or all connectors. Implementations can be contributed using the taskJobListeners extension point. See also
20
 * {@link SubmitJobListener} if you only need to be notified about specific {@link SubmitJob}s.
21
 * 
22
 * @author Sam Davis
23
 */
24
public abstract class TaskJobListener {
25
26
	/**
27
	 * Called when a task is about to be submitted. Note that the submission may fail after this call due to network
28
	 * error, invalid credentials, etc.
29
	 * 
30
	 * @param event
31
	 */
32
	public abstract void aboutToSubmit(TaskJobEvent event);
33
34
	/**
35
	 * Called after a submission has completed successfully.
36
	 * 
37
	 * @param event
38
	 */
39
	public abstract void taskSubmitted(TaskJobEvent event);
40
41
}

Return to bug 333930