blob: c070e2dfc717fd51fe52961d19b71ba7f25df99e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2017 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
* René Brandstetter - Bug 419749 - [Workbench] [e4 Workbench] - Remove the deprecated PackageAdmin
******************************************************************************/
package org.eclipse.e4.ui.internal.workbench;
import static org.eclipse.e4.ui.internal.workbench.Policy.DEBUG;
import static org.eclipse.e4.ui.internal.workbench.Policy.DEBUG_CMDS;
import static org.eclipse.e4.ui.internal.workbench.Policy.DEBUG_CMDS_FLAG;
import static org.eclipse.e4.ui.internal.workbench.Policy.DEBUG_CONTEXTS;
import static org.eclipse.e4.ui.internal.workbench.Policy.DEBUG_CONTEXTS_FLAG;
import static org.eclipse.e4.ui.internal.workbench.Policy.DEBUG_CONTEXTS_VERBOSE;
import static org.eclipse.e4.ui.internal.workbench.Policy.DEBUG_CONTEXTS_VERBOSE_FLAG;
import static org.eclipse.e4.ui.internal.workbench.Policy.DEBUG_FLAG;
import static org.eclipse.e4.ui.internal.workbench.Policy.DEBUG_FOCUS;
import static org.eclipse.e4.ui.internal.workbench.Policy.DEBUG_FOCUS_FLAG;
import static org.eclipse.e4.ui.internal.workbench.Policy.DEBUG_MENUS;
import static org.eclipse.e4.ui.internal.workbench.Policy.DEBUG_MENUS_FLAG;
import static org.eclipse.e4.ui.internal.workbench.Policy.DEBUG_RENDERER;
import static org.eclipse.e4.ui.internal.workbench.Policy.DEBUG_RENDERER_FLAG;
import static org.eclipse.e4.ui.internal.workbench.Policy.DEBUG_WORKBENCH;
import static org.eclipse.e4.ui.internal.workbench.Policy.DEBUG_WORKBENCH_FLAG;
import static org.eclipse.e4.ui.internal.workbench.Policy.TRACE;
import static org.eclipse.e4.ui.internal.workbench.Policy.TRACE_FLAG;
import java.util.Hashtable;
import java.util.List;
import org.eclipse.osgi.service.datalocation.Location;
import org.eclipse.osgi.service.debug.DebugOptions;
import org.eclipse.osgi.service.debug.DebugOptionsListener;
import org.eclipse.osgi.service.debug.DebugTrace;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.service.log.LogService;
import org.osgi.util.tracker.BundleTracker;
import org.osgi.util.tracker.ServiceTracker;
/**
* BundleActivator to access the required OSGi services.
*/
public class Activator implements BundleActivator, DebugOptionsListener {
/**
* The bundle symbolic name.
*/
public static final String PI_WORKBENCH = "org.eclipse.e4.ui.workbench"; //$NON-NLS-1$
private static Activator activator;
private BundleContext context;
private ServiceTracker<Location, Location> locationTracker;
private ServiceTracker<DebugOptions, DebugOptions> debugTracker;
private ServiceTracker<LogService, LogService> logTracker;
/** Tracks all bundles which are in the state: RESOLVED, STARTING, ACTIVE or STOPPING. */
private BundleTracker<List<Bundle>> resolvedBundles;
/** A BundleTrackerCustomizer which is able to resolve a bundle to the a symbolic name. */
private final BundleFinder bundleFinder = new BundleFinder();
private DebugTrace trace;
/**
* Get the default activator.
*
* @return a BundleActivator
*/
public static Activator getDefault() {
return activator;
}
/**
* @return the bundle object
*/
public Bundle getBundle() {
return context.getBundle();
}
/**
* @param bundleName
* the bundle symbolic name
* @return A bundle if found, or <code>null</code>
*/
public Bundle getBundleForName(String bundleName) {
return bundleFinder.findBundle(bundleName);
}
/**
* @return this bundles context
*/
public BundleContext getContext() {
return context;
}
@Override
public void start(BundleContext context) throws Exception {
activator = this;
this.context = context;
Hashtable<String, String> props = new Hashtable<>(2);
props.put(DebugOptions.LISTENER_SYMBOLICNAME, PI_WORKBENCH);
context.registerService(DebugOptionsListener.class, this, props);
// track required bundles
resolvedBundles = new BundleTracker<>(context, Bundle.RESOLVED
| Bundle.STARTING | Bundle.ACTIVE | Bundle.STOPPING, bundleFinder);
resolvedBundles.open();
}
@Override
public void stop(BundleContext context) throws Exception {
if (locationTracker != null) {
locationTracker.close();
locationTracker = null;
}
if (debugTracker != null) {
trace = null;
debugTracker.close();
debugTracker = null;
}
if (logTracker != null) {
logTracker.close();
logTracker = null;
}
if (resolvedBundles != null) {
// the close of the BundleTracker will also remove all entries form the BundleFinder
resolvedBundles.close();
resolvedBundles = null;
}
}
@Override
public void optionsChanged(DebugOptions options) {
trace = options.newDebugTrace(PI_WORKBENCH);
DEBUG = options.getBooleanOption(PI_WORKBENCH + DEBUG_FLAG, false);
TRACE = options.getBooleanOption(PI_WORKBENCH + TRACE_FLAG, false);
DEBUG_CMDS = options.getBooleanOption(PI_WORKBENCH + DEBUG_CMDS_FLAG, false);
DEBUG_FOCUS = options.getBooleanOption(PI_WORKBENCH + DEBUG_FOCUS_FLAG, false);
DEBUG_CONTEXTS = options.getBooleanOption(PI_WORKBENCH + DEBUG_CONTEXTS_FLAG, false);
DEBUG_CONTEXTS_VERBOSE = options.getBooleanOption(PI_WORKBENCH + DEBUG_CONTEXTS_VERBOSE_FLAG, false);
DEBUG_MENUS = options.getBooleanOption(PI_WORKBENCH + DEBUG_MENUS_FLAG, false);
DEBUG_RENDERER = options.getBooleanOption(PI_WORKBENCH + DEBUG_RENDERER_FLAG, false);
DEBUG_WORKBENCH = options.getBooleanOption(PI_WORKBENCH + DEBUG_WORKBENCH_FLAG, false);
}
public DebugTrace getTrace() {
return trace;
}
public static void trace(String option, String msg, Throwable error) {
activator.getTrace().trace(option, msg, error);
}
public LogService getLogService() {
LogService logService = null;
if (logTracker != null) {
logService = logTracker.getService();
} else {
if (context != null) {
logTracker = new ServiceTracker<>(context,
LogService.class.getName(), null);
logTracker.open();
logService = logTracker.getService();
}
}
if (logService == null) {
throw new IllegalStateException("No LogService is available."); //$NON-NLS-1$
}
return logService;
}
/**
* @param level
* one from {@code LogService} constants
* @param message
* @see LogService#LOG_ERROR
* @see LogService#LOG_WARNING
* @see LogService#LOG_INFO
* @see LogService#LOG_DEBUG
*/
public static void log(int level, String message) {
LogService logService = activator.getLogService();
if (logService != null) {
logService.log(level, message);
}
}
/**
* @param level
* one from {@code LogService} constants
* @param message
* @param exception
* @see LogService#LOG_ERROR
* @see LogService#LOG_WARNING
* @see LogService#LOG_INFO
* @see LogService#LOG_DEBUG
*/
public static void log(int level, String message, Throwable exception) {
LogService logService = activator.getLogService();
if (logService != null) {
logService.log(level, message, exception);
}
}
}