Skip to content

Commit 874f83e

Browse files
Merge branch 'eclipse-pde:master' into master
2 parents c468206 + ef694eb commit 874f83e

File tree

12 files changed

+138
-116
lines changed

12 files changed

+138
-116
lines changed

apitools/org.eclipse.pde.api.tools/forceQualifierUpdate.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ https://github.com/eclipse-platform/eclipse.platform.releng.aggregator/issues/11
77
Comparator errors in I20230906-0400
88
https://github.com/eclipse-platform/eclipse.platform.releng.aggregator/issues/1378
99
https://github.com/eclipse-platform/eclipse.platform.releng.aggregator/issues/1781
10-
https://github.com/eclipse-platform/eclipse.platform.releng.aggregator/issues/1923
10+
https://github.com/eclipse-platform/eclipse.platform.releng.aggregator/issues/1923
11+
Comparator errors in I20241106-1800/ - Expected due to https://github.com/eclipse-jdt/eclipse.jdt.core/pull/3254

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: 26 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,14 @@
3333
import java.util.Map;
3434
import java.util.Objects;
3535
import java.util.Set;
36-
import java.util.concurrent.ConcurrentLinkedQueue;
3736
import java.util.concurrent.atomic.AtomicReference;
3837
import java.util.stream.Collectors;
3938
import java.util.stream.IntStream;
4039
import java.util.stream.Stream;
4140

4241
import org.eclipse.core.resources.IFile;
4342
import org.eclipse.core.resources.IResource;
44-
import org.eclipse.core.resources.IResourceProxy;
45-
import org.eclipse.core.resources.IResourceProxyVisitor;
4643
import org.eclipse.core.resources.ResourcesPlugin;
47-
import org.eclipse.core.runtime.Assert;
4844
import org.eclipse.core.runtime.CoreException;
4945
import org.eclipse.core.runtime.IConfigurationElement;
5046
import org.eclipse.core.runtime.IPath;
@@ -100,44 +96,14 @@ public class TargetPlatformService implements ITargetPlatformService {
10096
* The target definition currently being used as the target platform for
10197
* the workspace.
10298
*/
103-
private final AtomicReference<ITargetDefinition> fWorkspaceTarget;
99+
private final AtomicReference<ITargetDefinition> fWorkspaceTarget = new AtomicReference<>();
104100

105101
/**
106102
* vm arguments for default target
107103
*/
108104
private StringBuilder fVMArguments;
109105

110-
private final EventDispatcher eventSendingJob;
111-
112-
/**
113-
* Collects target files in the workspace
114-
*/
115-
static class ResourceProxyVisitor implements IResourceProxyVisitor {
116-
117-
private final List<IResource> fList;
118-
119-
protected ResourceProxyVisitor(List<IResource> list) {
120-
fList = list;
121-
}
122-
123-
/**
124-
* @see org.eclipse.core.resources.IResourceProxyVisitor#visit(org.eclipse.core.resources.IResourceProxy)
125-
*/
126-
@Override
127-
public boolean visit(IResourceProxy proxy) {
128-
if (proxy.getType() == IResource.FILE) {
129-
if (ICoreConstants.TARGET_FILE_EXTENSION.equalsIgnoreCase(IPath.fromOSString(proxy.getName()).getFileExtension())) {
130-
fList.add(proxy.requestResource());
131-
}
132-
return false;
133-
}
134-
return true;
135-
}
136-
}
137-
138106
private TargetPlatformService() {
139-
fWorkspaceTarget = new AtomicReference<>();
140-
eventSendingJob = new EventDispatcher("Sending 'workspace target changed' event", TargetPlatformService.class); //$NON-NLS-1$
141107
}
142108

143109
/**
@@ -160,6 +126,7 @@ public void deleteTarget(ITargetHandle handle) throws CoreException {
160126
}
161127
((AbstractTargetHandle) handle).delete();
162128
TargetPlatformHelper.getTargetDefinitionMap().remove(handle);
129+
scheduleEvent(TargetEvents.TOPIC_TARGET_DELETED, handle);
163130
}
164131

165132
@Override
@@ -271,21 +238,23 @@ private List<ITargetHandle> findLocalTargetDefinitions() {
271238
* @return all target definition handles in the workspace
272239
*/
273240
private List<WorkspaceFileTargetHandle> findWorkspaceTargetDefinitions() {
274-
List<IResource> files = new ArrayList<>(10);
275-
ResourceProxyVisitor visitor = new ResourceProxyVisitor(files);
241+
List<IFile> files = new ArrayList<>(10);
276242
try {
277-
ResourcesPlugin.getWorkspace().getRoot().accept(visitor, IResource.NONE);
243+
ResourcesPlugin.getWorkspace().getRoot().accept(proxy -> {
244+
if (proxy.getType() == IResource.FILE) {
245+
if (ICoreConstants.TARGET_FILE_EXTENSION
246+
.equalsIgnoreCase(IPath.fromOSString(proxy.getName()).getFileExtension())) {
247+
files.add((IFile) proxy.requestResource());
248+
}
249+
return false;
250+
}
251+
return true;
252+
}, IResource.NONE);
278253
} catch (CoreException e) {
279254
PDECore.log(e);
280-
return new ArrayList<>(0);
255+
return List.of();
281256
}
282-
Iterator<IResource> iter = files.iterator();
283-
List<WorkspaceFileTargetHandle> handles = new ArrayList<>(files.size());
284-
while (iter.hasNext()) {
285-
IFile file = (IFile) iter.next();
286-
handles.add(new WorkspaceFileTargetHandle(file));
287-
}
288-
return handles;
257+
return files.stream().map(WorkspaceFileTargetHandle::new).toList();
289258
}
290259

291260
@Override
@@ -361,71 +330,24 @@ public synchronized ITargetDefinition getWorkspaceTargetDefinition() throws Core
361330
*/
362331
public void setWorkspaceTargetDefinition(ITargetDefinition target, boolean asyncEvents) {
363332
ITargetDefinition oldTarget = fWorkspaceTarget.getAndSet(target);
364-
boolean changed = !Objects.equals(oldTarget, target);
365-
if (changed) {
366-
if (asyncEvents) {
367-
eventSendingJob.schedule(target);
368-
} else {
369-
notifyTargetChanged(target);
370-
}
333+
if (!Objects.equals(oldTarget, target)) {
334+
notifyEvent(TargetEvents.TOPIC_WORKSPACE_TARGET_CHANGED, target, asyncEvents);
371335
}
372336
}
373337

374-
static void notifyTargetChanged(ITargetDefinition target) {
338+
public static void scheduleEvent(String topic, Object data) {
339+
notifyEvent(topic, data, true);
340+
}
341+
342+
private static void notifyEvent(String topic, Object data, boolean asyncEvents) {
375343
IEclipseContext context = EclipseContextFactory.getServiceContext(PDECore.getDefault().getBundleContext());
376344
IEventBroker broker = context.get(IEventBroker.class);
377345
if (broker != null) {
378-
broker.send(TargetEvents.TOPIC_WORKSPACE_TARGET_CHANGED, target);
379-
}
380-
}
381-
382-
static class EventDispatcher extends Job {
383-
384-
private final ConcurrentLinkedQueue<ITargetDefinition> queue;
385-
private final Object myFamily;
386-
387-
/**
388-
* @param jobName
389-
* descriptive job name
390-
* @param family
391-
* non null object to control this job execution
392-
**/
393-
public EventDispatcher(String jobName, Object family) {
394-
super(jobName);
395-
Assert.isNotNull(family);
396-
this.myFamily = family;
397-
this.queue = new ConcurrentLinkedQueue<>();
398-
setSystem(true);
399-
}
400-
401-
@Override
402-
public boolean belongsTo(Object family) {
403-
return myFamily == family;
404-
}
405-
406-
@Override
407-
protected IStatus run(IProgressMonitor monitor) {
408-
ITargetDefinition target;
409-
while ((target = queue.poll()) != null && !monitor.isCanceled()) {
410-
notifyTargetChanged(target);
411-
}
412-
if (!queue.isEmpty() && !monitor.isCanceled()) {
413-
// in case actions got faster scheduled then processed
414-
schedule();
415-
}
416-
if (monitor.isCanceled()) {
417-
queue.clear();
418-
return Status.CANCEL_STATUS;
346+
if (asyncEvents) {
347+
broker.post(topic, data);
348+
} else {
349+
broker.send(topic, data);
419350
}
420-
return Status.OK_STATUS;
421-
}
422-
423-
/**
424-
* Enqueue a task asynchronously.
425-
**/
426-
public void schedule(ITargetDefinition target) {
427-
queue.offer(target);
428-
schedule(); // will reschedule if already running
429351
}
430352
}
431353

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());

0 commit comments

Comments
 (0)