package com.codeaffine.example.rwt.osgi.ui.platform;
import org.eclipse.rwt.RWT;
import org.eclipse.rwt.lifecycle.UICallBack;
import org.eclipse.rwt.service.SessionStoreEvent;
import org.eclipse.rwt.service.SessionStoreListener;
import org.eclipse.swt.widgets.Display;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;
import com.codeaffine.example.rwt.osgi.ui.platform.internal.UIContributorTrackerService;
import com.codeaffine.example.rwt.osgi.ui.platform.internal.UIContributorTrackerService.Tracker;
public class UIContributorTracker {
final Display display;
final UIContributorTrackerService trackerService;
final TrackerImpl tracker;
class TrackerImpl implements Tracker {
@Override
public void removedService( final ServiceReference<UIContributorFactory> reference,
final UIContributor service )
{
if( !display.isDisposed() ) {
display.asyncExec( new Runnable() {
@Override
public void run() {
if( canRun( reference ) ) {
UIContributorTracker.this.removedService( reference, service );
}
}
} );
}
}
@Override
public void addingService( final ServiceReference<UIContributorFactory> reference,
final UIContributor service )
{
if( !display.isDisposed() ) {
display.asyncExec( new Runnable() {
@Override
public void run() {
if( canRun( reference ) ) {
UIContributorTracker.this.addingService( reference, service );
}
}
} );
}
}
boolean canRun( final ServiceReference<UIContributorFactory> reference ) {
return display.getThread() == Thread.currentThread()
&& ConfiguratorTracker.matches( reference );
}
}
private class UIContributorTrackerServiceTracker
extends ServiceTracker<UIContributorTrackerService, UIContributorTrackerService>
{
UIContributorTrackerServiceTracker() {
super( getBundleContext(), UIContributorTrackerService.class, null );
}
}
public UIContributorTracker() {
display = Display.getDefault();
int hashCode = display.hashCode();
UICallBack.activate( String.valueOf( hashCode ) );
trackerService = getTrackerService();
tracker = new TrackerImpl();
trackerService.addTracker( tracker );
closeOnSessionTimeout();
}
private UIContributorTrackerService getTrackerService() {
UIContributorTrackerServiceTracker tracker = new UIContributorTrackerServiceTracker();
tracker.open();
UIContributorTrackerService result = tracker.getService();
tracker.close();
return result;
}
public void removedService( ServiceReference<UIContributorFactory> reference,
UIContributor service )
{
// subclasses may override
}
public void addingService( ServiceReference<UIContributorFactory> reference,
UIContributor service )
{
// subclasses may override
}
private boolean closeOnSessionTimeout() {
return RWT.getSessionStore().addSessionStoreListener( new SessionStoreListener() {
private static final long serialVersionUID = 1L;
@Override
public void beforeDestroy( SessionStoreEvent event ) {
trackerService.removeTracker( tracker );
UICallBack.deactivate( String.valueOf( display.hashCode() ) );
}
} );
}
static BundleContext getBundleContext() {
return FrameworkUtil.getBundle( UIContributorTracker.class ).getBundleContext();
}
}