/*******************************************************************************
* Copyright (c) 2012 BundleMaker Project Team
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Nils Hartmann - initial API and implementation
******************************************************************************/
package org.bundlemaker.core.ui.event;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.bundlemaker.core.resource.IModuleAwareBundleMakerProject;
import org.bundlemaker.core.ui.event.internal.BundleMakerProjectOpenedEvent;
import org.bundlemaker.core.ui.event.selection.internal.Activator;
import org.eclipse.core.runtime.Assert;
import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;
/**
* Allows clients to fire several BundleMaker UI Events.
*
* <p>
* Since we cannot inject DS components into Eclipse components (like Handlers) we need to have a singleton instance
* that is statically accessible.
*
* <p>
* To get an instance of this class, use {@link #instance()} method
*
* @noextend This class is not intended to be subclassed by clients. Clients must not create instances of this class
*
*
* @author Nils Hartmann (nils@nilshartmann.net)
*
*/
public abstract class Events {
/**
* @return the single instance of this class
*/
public static Events instance() {
return Activator.getDefault().getEvents();
}
/**
* Dispatches a {@link IBundleMakerProjectOpenedEvent} to all registered
* {@link IBundleMakerProjectOpenedEventListener listeners}
*
* @param bundleMakerProject
* the project that has been opened. Must not be null.
*/
public void fireProjectOpened(IModuleAwareBundleMakerProject bundleMakerProject) {
Assert.isNotNull(bundleMakerProject);
// get registered listener
List<IBundleMakerProjectOpenedEventListener> listeners = getServices(IBundleMakerProjectOpenedEventListener.class);
if (listeners.isEmpty()) {
// no listener registered
return;
}
// create event
final BundleMakerProjectOpenedEvent event = new BundleMakerProjectOpenedEvent(bundleMakerProject);
// notify listeners
for (IBundleMakerProjectOpenedEventListener listener : listeners) {
listener.bundleMakerProjectOpened(event);
}
}
@SuppressWarnings("unchecked")
protected <T> List<T> getServices(Class<T> type) {
ServiceTracker serviceTracker = new ServiceTracker(getBundleContext(), type.getName(), null);
serviceTracker.open();
try {
Object[] services = serviceTracker.getServices();
if (services == null) {
return Collections.emptyList();
}
return (List<T>) Arrays.asList(services);
} finally {
serviceTracker.close();
}
}
protected abstract BundleContext getBundleContext();
}