package copyto.ui.internal.services;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.ui.AbstractSourceProvider;
import org.eclipse.ui.ISources;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceRegistration;
import osgiutils.services.DefaultCollectionServiceRunnable;
import osgiutils.services.Services;
import copyto.core.Target;
import copyto.core.TargetDescriptor;
import copyto.core.TargetService;
import copyto.core.TargetServiceListener;
/**
* Source provider for copyto.
*
* <p>
* Available variables: <code>
* coptyo.targets
* </code>
*
* @author <a href="mailto:phil.kursawe@gmail.com">Philipp Kursawe</a>
*
*/
public class SourceProviderImpl extends AbstractSourceProvider implements
TargetServiceListener {
private static final String COPYTO_TARGETS = "copyto.targets"; //$NON-NLS-1$
private final ServiceRegistration serviceRegistration;
/**
* Creates the service provider and registers it as a TargetServiceListener.
*/
public SourceProviderImpl() {
serviceRegistration = FrameworkUtil.getBundle(getClass())
.getBundleContext().registerService(
TargetServiceListener.class.getName(), this, null);
}
public void dispose() {
if (serviceRegistration != null) {
serviceRegistration.unregister();
}
}
@SuppressWarnings("rawtypes")
public Map getCurrentState() {
final Map<String, Object> state = new HashMap<String, Object>();
state.put(COPYTO_TARGETS, getTargets());
return state;
}
public String[] getProvidedSourceNames() {
return new String[] { COPYTO_TARGETS };
}
public void targetsChanged(final Collection<Target> changedTargets) {
fireSourceChanged(ISources.WORKBENCH, COPYTO_TARGETS, getTargets());
}
private Collection<TargetDescriptor> getTargets() {
return Services.run(TargetService.class,
new DefaultCollectionServiceRunnable<TargetService, TargetDescriptor>() {
public Collection<TargetDescriptor> run(final TargetService service) {
return service.findAll();
}
});
}
}