blob: 19492481767176ec74908e0c3938de7dcb5c8dec [file] [log] [blame]
/****************************************************************************
* Copyright (c) 2014 Composent, Inc. and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* Contributors: Composent, Inc. - initial API and implementation
*
* SPDX-License-Identifier: EPL-2.0
*****************************************************************************/
package org.eclipse.ecf.core.util;
import org.eclipse.core.runtime.*;
import org.eclipse.ecf.internal.core.identity.Activator;
import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;
/**
* @since 3.4
*/
public class ExtensionRegistryRunnable implements ISafeRunnable {
private BundleContext context;
public ExtensionRegistryRunnable(BundleContext ctxt) {
this.context = ctxt;
}
/**
* @since 3.8
*/
protected BundleContext getContext() {
return this.context;
}
protected void runWithoutRegistry() throws Exception {
// by default do nothing
}
protected void runWithRegistry(IExtensionRegistry registry) throws Exception {
// by default do nothing
}
protected void logWarning(Throwable exception) {
Activator a = Activator.getDefault();
if (a != null)
a.log(new Status(IStatus.WARNING, Activator.PLUGIN_ID, IStatus.WARNING, "Warning: code cannot be run", //$NON-NLS-1$
exception));
}
public void run() throws Exception {
try {
runWithRegistry(getExtensionRegistry());
} catch (NoClassDefFoundError e) {
runWithoutRegistry();
}
}
private IExtensionRegistry getExtensionRegistry() {
if (context == null)
return null;
@SuppressWarnings({ "rawtypes", "unchecked" })
ServiceTracker extensionRegistryTracker = new ServiceTracker(context, IExtensionRegistry.class.getName(), null);
extensionRegistryTracker.open();
IExtensionRegistry result = (IExtensionRegistry) extensionRegistryTracker.getService();
extensionRegistryTracker.close();
return result;
}
public void handleException(Throwable exception) {
logWarning(exception);
}
}