Skip to content

Commit 428cf43

Browse files
estepperHannesWell
authored andcommitted
Provide TARGET_SAVED and TARGET_DELETED events
When building tools on top of PDE's target platform framework it's often necessary to be informed about state changes in targets. PDE already uses an IEventBroker to send "workspaceTargetChanged" events. This change is about sending two new events: TARGET_SAVED and TARGET_DELETED
1 parent 5cac9e2 commit 428cf43

File tree

10 files changed

+114
-9
lines changed

10 files changed

+114
-9
lines changed

org.eclipse.pde.doc.user/forceQualifierUpdate.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ Add missing reference/api content
77
Pick-up javadoc changes
88
https://github.com/eclipse-platform/eclipse.platform.releng.aggregator/pull/2396
99
Touch for build JVM change causing using newer jquery
10+
Add new TargetEvents constants

ui/org.eclipse.pde.core/.settings/.api_filters

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,27 @@
11
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
22
<component id="org.eclipse.pde.core" version="2">
3+
<resource path="META-INF/MANIFEST.MF">
4+
<filter id="926941240">
5+
<message_arguments>
6+
<message_argument value="3.20.0"/>
7+
<message_argument value="3.19.0"/>
8+
</message_arguments>
9+
</filter>
10+
</resource>
11+
<resource path="src/org/eclipse/pde/core/target/TargetEvents.java" type="org.eclipse.pde.core.target.TargetEvents">
12+
<filter id="336658481">
13+
<message_arguments>
14+
<message_argument value="org.eclipse.pde.core.target.TargetEvents"/>
15+
<message_argument value="TOPIC_TARGET_DELETED"/>
16+
</message_arguments>
17+
</filter>
18+
<filter id="336658481">
19+
<message_arguments>
20+
<message_argument value="org.eclipse.pde.core.target.TargetEvents"/>
21+
<message_argument value="TOPIC_TARGET_SAVED"/>
22+
</message_arguments>
23+
</filter>
24+
</resource>
325
<resource path="src/org/eclipse/pde/internal/core/project/BundleProjectService.java" type="org.eclipse.pde.internal.core.project.BundleProjectService">
426
<filter comment="Platform Team allows use of bundle importers for PDE import from source repository" id="640712815">
527
<message_arguments>

ui/org.eclipse.pde.core/META-INF/MANIFEST.MF

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
22
Bundle-ManifestVersion: 2
33
Bundle-Name: %name
44
Bundle-SymbolicName: org.eclipse.pde.core; singleton:=true
5-
Bundle-Version: 3.19.100.qualifier
5+
Bundle-Version: 3.20.0.qualifier
66
Bundle-Activator: org.eclipse.pde.internal.core.PDECore
77
Bundle-Vendor: %provider-name
88
Bundle-Localization: plugin
@@ -101,6 +101,7 @@ Import-Package: aQute.bnd.build;version="[4.4.0,5.0.0)",
101101
org.eclipse.equinox.internal.p2.publisher.eclipse,
102102
org.eclipse.equinox.p2.publisher,
103103
org.eclipse.equinox.p2.publisher.eclipse,
104+
org.osgi.service.event;version="[1.4.0,2.0.0)",
104105
org.osgi.service.repository;version="[1.1.0,2.0.0)",
105106
org.osgi.util.promise;version="[1.3.0,2.0.0)"
106107
Require-Bundle:

ui/org.eclipse.pde.core/src/org/eclipse/pde/core/target/TargetEvents.java

Lines changed: 60 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,84 @@
1212
********************************************************************************/
1313
package org.eclipse.pde.core.target;
1414

15+
import org.eclipse.e4.core.services.events.IEventBroker;
16+
import org.osgi.service.event.Event;
17+
import org.osgi.service.event.EventHandler;
18+
1519
/**
16-
* Target events and event topic definitions
20+
* Target events and event topic definitions.
21+
*
22+
* <p>
23+
* The following code is an example of to subscribe to the
24+
* {@link #TOPIC_TARGET_SAVED} event:
25+
* </p>
26+
*
27+
* <pre>
28+
* EventHandler eventHandler = event -> {
29+
* if (event.getProperty(IEventBroker.DATA) instanceof ITargetHandle handle) {
30+
* // Work with the target handle...
31+
* }
32+
* };
33+
* IEclipseContext context = EclipseContextFactory.getServiceContext(bundleContext);
34+
* IEventBroker broker = context.get(IEventBroker.class);
35+
* if (broker != null) {
36+
* broker.subscribe(TargetEvents.TOPIC_TARGET_SAVED, eventHandler);
37+
* // Do not forget to unsubscribe later!
38+
* }
39+
* </pre>
1740
*
41+
* @see ITargetPlatformService
42+
* @see IEventBroker#subscribe(String, EventHandler)
43+
* @see IEventBroker#subscribe(String, String, EventHandler, boolean)
44+
* @see IEventBroker#unsubscribe(EventHandler)
1845
* @since 3.13
1946
*/
2047
public class TargetEvents {
2148

2249
/**
23-
* Base topic for all Target events
50+
* Base topic for all target events.
2451
*/
2552
public static final String TOPIC_BASE = "org/eclipse/pde/core/target/TargetEvents"; //$NON-NLS-1$
2653

2754
/**
28-
* Topic for all Target events
55+
* Topic for all target events.
2956
*/
3057
public static final String TOPIC_ALL = TOPIC_BASE + "/*"; //$NON-NLS-1$
3158

3259
/**
33-
* Sent when workspace target definition is changed
60+
* Sent when workspace target definition is changed.
61+
* <p>
62+
* The {@link IEventBroker#DATA data} {@link Event#getProperty(String) event
63+
* property} of events with this topic is the changed
64+
* {@link ITargetDefinition}.
65+
* </p>
3466
*
3567
* @see ITargetPlatformService#getWorkspaceTargetDefinition()
3668
*/
3769
public static final String TOPIC_WORKSPACE_TARGET_CHANGED = TOPIC_BASE + "/workspaceTargetChanged"; //$NON-NLS-1$
3870

71+
/**
72+
* Sent when a target is saved.
73+
* <p>
74+
* The {@link IEventBroker#DATA data} {@link Event#getProperty(String) event
75+
* property} of events with this topic is the saved {@link ITargetHandle}.
76+
* </p>
77+
*
78+
* @see ITargetPlatformService#saveTargetDefinition(ITargetDefinition)
79+
* @see IEventBroker
80+
* @since 3.20
81+
*/
82+
public static final String TOPIC_TARGET_SAVED = TOPIC_BASE + "/targetSaved"; //$NON-NLS-1$
83+
84+
/**
85+
* Sent when a target is deleted.
86+
* <p>
87+
* The {@link IEventBroker#DATA data} {@link Event#getProperty(String) event
88+
* property} of events with this topic is the deleted {@link ITargetHandle}.
89+
* </p>
90+
*
91+
* @see ITargetPlatformService#deleteTarget(ITargetHandle)
92+
* @since 3.20
93+
*/
94+
public static final String TOPIC_TARGET_DELETED = TOPIC_BASE + "/targetDeleted"; //$NON-NLS-1$
3995
}

ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/AbstractTargetHandle.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.eclipse.core.runtime.CoreException;
2121
import org.eclipse.pde.core.target.ITargetDefinition;
2222
import org.eclipse.pde.core.target.ITargetHandle;
23+
import org.eclipse.pde.core.target.TargetEvents;
2324

2425
/**
2526
* Common implementation of target handles.
@@ -53,11 +54,16 @@ public ITargetDefinition getTargetDefinition() throws CoreException {
5354
*/
5455
abstract void delete() throws CoreException;
5556

57+
public final void save(ITargetDefinition definition) throws CoreException {
58+
doSave(definition);
59+
TargetPlatformService.scheduleEvent(TargetEvents.TOPIC_TARGET_SAVED, definition.getHandle());
60+
}
61+
5662
/**
5763
* Saves the definition to underlying storage.
5864
*
5965
* @param definition target to save
6066
* @throws CoreException on failure
6167
*/
62-
abstract void save(ITargetDefinition definition) throws CoreException;
68+
abstract void doSave(ITargetDefinition definition) throws CoreException;
6369
}

ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/ExternalFileTargetHandle.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ protected InputStream getInputStream() throws CoreException {
8181

8282

8383
@Override
84-
void save(ITargetDefinition definition) throws CoreException {
84+
void doSave(ITargetDefinition definition) throws CoreException {
8585
try (OutputStream stream = new BufferedOutputStream(new FileOutputStream(fFile))) {
8686
((TargetDefinition) definition).write(stream);
8787
} catch (IOException e) {

ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/LocalTargetHandle.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ protected OutputStream getOutputStream() throws CoreException {
193193
}
194194

195195
@Override
196-
void save(ITargetDefinition definition) throws CoreException {
196+
void doSave(ITargetDefinition definition) throws CoreException {
197197
try (OutputStream stream = getOutputStream()) {
198198
((TargetDefinition) definition).write(stream);
199199
} catch (IOException e) {

ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/TargetPlatformService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ public void deleteTarget(ITargetHandle handle) throws CoreException {
126126
}
127127
((AbstractTargetHandle) handle).delete();
128128
TargetPlatformHelper.getTargetDefinitionMap().remove(handle);
129+
scheduleEvent(TargetEvents.TOPIC_TARGET_DELETED, handle);
129130
}
130131

131132
@Override
@@ -334,6 +335,10 @@ public void setWorkspaceTargetDefinition(ITargetDefinition target, boolean async
334335
}
335336
}
336337

338+
public static void scheduleEvent(String topic, Object data) {
339+
notifyEvent(topic, data, true);
340+
}
341+
337342
private static void notifyEvent(String topic, Object data, boolean asyncEvents) {
338343
IEclipseContext context = EclipseContextFactory.getServiceContext(PDECore.getDefault().getBundleContext());
339344
IEventBroker broker = context.get(IEventBroker.class);

ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/WorkspaceFileTargetHandle.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public String getMemento() throws CoreException {
7676
}
7777

7878
@Override
79-
public void save(ITargetDefinition definition) throws CoreException {
79+
void doSave(ITargetDefinition definition) throws CoreException {
8080
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
8181
((TargetDefinition) definition).write(outputStream);
8282
ByteArrayInputStream stream = new ByteArrayInputStream(outputStream.toByteArray());

ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/targetdefinition/TargetEditor.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import org.eclipse.pde.internal.core.PDEPreferencesManager;
6666
import org.eclipse.pde.internal.core.target.P2TargetUtils;
6767
import org.eclipse.pde.internal.core.target.TargetDefinitionPersistenceHelper;
68+
import org.eclipse.pde.internal.core.target.TargetPlatformService;
6869
import org.eclipse.pde.internal.core.target.WorkspaceFileTargetHandle;
6970
import org.eclipse.pde.internal.ui.IHelpContextIds;
7071
import org.eclipse.pde.internal.ui.PDEPlugin;
@@ -175,6 +176,7 @@ protected void pageChange(int newPageIndex) {
175176

176177
@Override
177178
public void doSave(IProgressMonitor monitor) {
179+
ITargetHandle handle = fInputHandler.getTarget().getHandle();
178180
fInputHandler.setSaving(true);
179181
if (!isActiveTabTextualEditor()) {
180182
markStale();
@@ -184,6 +186,8 @@ public void doSave(IProgressMonitor monitor) {
184186
fDirty = false;
185187
editorDirtyStateChanged();
186188
fInputHandler.setSaving(false);
189+
190+
TargetPlatformService.scheduleEvent(TargetEvents.TOPIC_TARGET_SAVED, handle);
187191
}
188192

189193
@Override
@@ -286,6 +290,16 @@ public void dispose() {
286290
super.dispose();
287291
}
288292

293+
@Override
294+
public <T> T getAdapter(Class<T> adapter) {
295+
if (adapter.equals(ITargetHandle.class)) {
296+
ITargetDefinition target = getTarget();
297+
if (target != null) {
298+
return adapter.cast(target.getHandle());
299+
}
300+
}
301+
return super.getAdapter(adapter);
302+
}
289303
/**
290304
* Returns the target model backing this editor
291305
* @return target model

0 commit comments

Comments
 (0)