Skip to content

Commit

Permalink
Provide TARGET_SAVED and TARGET_DELETED events
Browse files Browse the repository at this point in the history
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
  • Loading branch information
estepper authored and HannesWell committed Nov 10, 2024
1 parent 5cac9e2 commit c5b22c3
Show file tree
Hide file tree
Showing 9 changed files with 115 additions and 9 deletions.
22 changes: 22 additions & 0 deletions ui/org.eclipse.pde.core/.settings/.api_filters
Original file line number Diff line number Diff line change
@@ -1,5 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<component id="org.eclipse.pde.core" version="2">
<resource path="META-INF/MANIFEST.MF">
<filter id="926941240">
<message_arguments>
<message_argument value="3.20.0"/>
<message_argument value="3.19.0"/>
</message_arguments>
</filter>
</resource>
<resource path="src/org/eclipse/pde/core/target/TargetEvents.java" type="org.eclipse.pde.core.target.TargetEvents">
<filter id="336658481">
<message_arguments>
<message_argument value="org.eclipse.pde.core.target.TargetEvents"/>
<message_argument value="TOPIC_TARGET_DELETED"/>
</message_arguments>
</filter>
<filter id="336658481">
<message_arguments>
<message_argument value="org.eclipse.pde.core.target.TargetEvents"/>
<message_argument value="TOPIC_TARGET_SAVED"/>
</message_arguments>
</filter>
</resource>
<resource path="src/org/eclipse/pde/internal/core/project/BundleProjectService.java" type="org.eclipse.pde.internal.core.project.BundleProjectService">
<filter comment="Platform Team allows use of bundle importers for PDE import from source repository" id="640712815">
<message_arguments>
Expand Down
3 changes: 2 additions & 1 deletion ui/org.eclipse.pde.core/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %name
Bundle-SymbolicName: org.eclipse.pde.core; singleton:=true
Bundle-Version: 3.19.100.qualifier
Bundle-Version: 3.20.0.qualifier
Bundle-Activator: org.eclipse.pde.internal.core.PDECore
Bundle-Vendor: %provider-name
Bundle-Localization: plugin
Expand Down Expand Up @@ -101,6 +101,7 @@ Import-Package: aQute.bnd.build;version="[4.4.0,5.0.0)",
org.eclipse.equinox.internal.p2.publisher.eclipse,
org.eclipse.equinox.p2.publisher,
org.eclipse.equinox.p2.publisher.eclipse,
org.osgi.service.event;version="[1.4.0,2.0.0)";resolution:=optional,
org.osgi.service.repository;version="[1.1.0,2.0.0)",
org.osgi.util.promise;version="[1.3.0,2.0.0)"
Require-Bundle:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,28 +12,84 @@
********************************************************************************/
package org.eclipse.pde.core.target;

import org.eclipse.e4.core.services.events.IEventBroker;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;

/**
* Target events and event topic definitions
* Target events and event topic definitions.
*
* <p>
* The following code is an example of to subscribe to the
* {@link #TOPIC_TARGET_SAVED} event:
* </p>
*
* <pre>
* EventHandler eventHandler = event -> {
* if (event.getProperty(IEventBroker.DATA) instanceof ITargetHandle handle) {
* // Work with the target handle...
* }
* };
* IEclipseContext context = EclipseContextFactory.getServiceContext(bundleContext);
* IEventBroker broker = context.get(IEventBroker.class);
* if (broker != null) {
* broker.subscribe(TargetEvents.TOPIC_TARGET_SAVED, eventHandler);
* // Do not forget to unsubscribe later!
* }
* </pre>
*
* @see ITargetPlatformService
* @see IEventBroker#subscribe(String, EventHandler)
* @see IEventBroker#subscribe(String, String, EventHandler, boolean)
* @see IEventBroker#unsubscribe(EventHandler)
* @since 3.13
*/
public class TargetEvents {

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

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

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

/**
* Sent when a target is saved.
* <p>
* The {@link IEventBroker#DATA data} {@link Event#getProperty(String) event
* property} of events with this topic is the saved {@link ITargetHandle}.
* </p>
*
* @see ITargetPlatformService#saveTargetDefinition(ITargetDefinition)
* @see IEventBroker
* @since 3.20
*/
public static final String TOPIC_TARGET_SAVED = TOPIC_BASE + "/targetSaved"; //$NON-NLS-1$

/**
* Sent when a target is deleted.
* <p>
* The {@link IEventBroker#DATA data} {@link Event#getProperty(String) event
* property} of events with this topic is the deleted {@link ITargetHandle}.
* </p>
*
* @see ITargetPlatformService#deleteTarget(ITargetHandle)
* @since 3.20
*/
public static final String TOPIC_TARGET_DELETED = TOPIC_BASE + "/targetDeleted"; //$NON-NLS-1$
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.eclipse.core.runtime.CoreException;
import org.eclipse.pde.core.target.ITargetDefinition;
import org.eclipse.pde.core.target.ITargetHandle;
import org.eclipse.pde.core.target.TargetEvents;

/**
* Common implementation of target handles.
Expand Down Expand Up @@ -53,11 +54,17 @@ public ITargetDefinition getTargetDefinition() throws CoreException {
*/
abstract void delete() throws CoreException;

public final void save(ITargetDefinition definition) throws CoreException {
doSave(definition);
TargetPlatformService service = (TargetPlatformService) TargetPlatformService.getDefault();
service.scheduleEvent(TargetEvents.TOPIC_TARGET_SAVED, definition.getHandle());
}

/**
* Saves the definition to underlying storage.
*
* @param definition target to save
* @throws CoreException on failure
*/
abstract void save(ITargetDefinition definition) throws CoreException;
abstract void doSave(ITargetDefinition definition) throws CoreException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ protected InputStream getInputStream() throws CoreException {


@Override
void save(ITargetDefinition definition) throws CoreException {
void doSave(ITargetDefinition definition) throws CoreException {
try (OutputStream stream = new BufferedOutputStream(new FileOutputStream(fFile))) {
((TargetDefinition) definition).write(stream);
} catch (IOException e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ protected OutputStream getOutputStream() throws CoreException {
}

@Override
void save(ITargetDefinition definition) throws CoreException {
void doSave(ITargetDefinition definition) throws CoreException {
try (OutputStream stream = getOutputStream()) {
((TargetDefinition) definition).write(stream);
} catch (IOException e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ public void deleteTarget(ITargetHandle handle) throws CoreException {
}
((AbstractTargetHandle) handle).delete();
TargetPlatformHelper.getTargetDefinitionMap().remove(handle);
scheduleEvent(TargetEvents.TOPIC_TARGET_DELETED, handle);
}

@Override
Expand Down Expand Up @@ -334,6 +335,10 @@ public void setWorkspaceTargetDefinition(ITargetDefinition target, boolean async
}
}

public static void scheduleEvent(String topic, Object data) {
notifyEvent(topic, data, true);
}

private static void notifyEvent(String topic, Object data, boolean asyncEvents) {
IEclipseContext context = EclipseContextFactory.getServiceContext(PDECore.getDefault().getBundleContext());
IEventBroker broker = context.get(IEventBroker.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public String getMemento() throws CoreException {
}

@Override
public void save(ITargetDefinition definition) throws CoreException {
void doSave(ITargetDefinition definition) throws CoreException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
((TargetDefinition) definition).write(outputStream);
ByteArrayInputStream stream = new ByteArrayInputStream(outputStream.toByteArray());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
import org.eclipse.pde.internal.core.PDEPreferencesManager;
import org.eclipse.pde.internal.core.target.P2TargetUtils;
import org.eclipse.pde.internal.core.target.TargetDefinitionPersistenceHelper;
import org.eclipse.pde.internal.core.target.TargetPlatformService;
import org.eclipse.pde.internal.core.target.WorkspaceFileTargetHandle;
import org.eclipse.pde.internal.ui.IHelpContextIds;
import org.eclipse.pde.internal.ui.PDEPlugin;
Expand Down Expand Up @@ -175,6 +176,7 @@ protected void pageChange(int newPageIndex) {

@Override
public void doSave(IProgressMonitor monitor) {
ITargetHandle handle = fInputHandler.getTarget().getHandle();
fInputHandler.setSaving(true);
if (!isActiveTabTextualEditor()) {
markStale();
Expand All @@ -184,6 +186,9 @@ public void doSave(IProgressMonitor monitor) {
fDirty = false;
editorDirtyStateChanged();
fInputHandler.setSaving(false);

TargetPlatformService service = (TargetPlatformService) TargetPlatformService.getDefault();
service.scheduleEvent(TargetEvents.TOPIC_TARGET_SAVED, handle);
}

@Override
Expand Down Expand Up @@ -286,6 +291,16 @@ public void dispose() {
super.dispose();
}

@Override
public <T> T getAdapter(Class<T> adapter) {
if (adapter.equals(ITargetHandle.class)) {
ITargetDefinition target = getTarget();
if (target != null) {
return adapter.cast(target.getHandle());
}
}
return super.getAdapter(adapter);
}
/**
* Returns the target model backing this editor
* @return target model
Expand Down

0 comments on commit c5b22c3

Please sign in to comment.