blob: e783d58e59bf078a6c0ca5866dd903b46a1ae36d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2008 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
******************************************************************************/
package org.eclipse.ui.internal.statushandlers;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.dynamichelpers.ExtensionTracker;
import org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler;
import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.WorkbenchPlugin;
/**
* The registry of status handlers extensions.
*
* @since 3.3
*
*/
public class StatusHandlerRegistry implements IExtensionChangeHandler {
private static final String STATUSHANDLERS_POINT_NAME = "statusHandlers"; //$NON-NLS-1$
private static final String TAG_STATUSHANDLER = "statusHandler"; //$NON-NLS-1$
private static final String TAG_STATUSHANDLER_PRODUCTBINDING = "statusHandlerProductBinding"; //$NON-NLS-1$
private static final String STATUSHANDLER_ARG = "-statushandler"; //$NON-NLS-1$
private ArrayList statusHandlerDescriptors = new ArrayList();
private ArrayList productBindingDescriptors = new ArrayList();
private StatusHandlerDescriptorsMap statusHandlerDescriptorsMap;
private StatusHandlerDescriptor defaultHandlerDescriptor;
private static StatusHandlerRegistry instance;
/**
* Creates an instance of the class.
*/
private StatusHandlerRegistry() {
IExtensionTracker tracker = PlatformUI.getWorkbench()
.getExtensionTracker();
IExtensionPoint handlersPoint = Platform.getExtensionRegistry()
.getExtensionPoint(WorkbenchPlugin.PI_WORKBENCH,
STATUSHANDLERS_POINT_NAME);
IExtension[] extensions = handlersPoint.getExtensions();
statusHandlerDescriptorsMap = new StatusHandlerDescriptorsMap();
// initial population
for (int i = 0; i < extensions.length; i++) {
addExtension(tracker, extensions[i]);
}
tracker.registerHandler(this, ExtensionTracker
.createExtensionPointFilter(handlersPoint));
// registers on products ext. point to, needed
// for changing the default handler if product is changed
IExtensionPoint productsPoint = Platform.getExtensionRegistry()
.getExtensionPoint(Platform.PI_RUNTIME, Platform.PT_PRODUCT);
tracker.registerHandler(this, ExtensionTracker
.createExtensionPointFilter(productsPoint));
}
/**
* Returns StatusHandlerRegistry singleton instance.
*
* @return StatusHandlerRegistry instance
*/
public static StatusHandlerRegistry getDefault() {
if (instance == null) {
instance = new StatusHandlerRegistry();
}
return instance;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler#addExtension(org.eclipse.core.runtime.dynamichelpers.IExtensionTracker,
* org.eclipse.core.runtime.IExtension)
*/
public void addExtension(IExtensionTracker tracker, IExtension extension) {
IConfigurationElement[] configElements = extension
.getConfigurationElements();
for (int j = 0; j < configElements.length; j++) {
if (configElements[j].getName().equals(TAG_STATUSHANDLER)) {
StatusHandlerDescriptor descriptor = new StatusHandlerDescriptor(
configElements[j]);
tracker.registerObject(extension, descriptor,
IExtensionTracker.REF_STRONG);
statusHandlerDescriptors.add(descriptor);
} else if (configElements[j].getName().equals(
TAG_STATUSHANDLER_PRODUCTBINDING)) {
StatusHandlerProductBindingDescriptor descriptor = new StatusHandlerProductBindingDescriptor(
configElements[j]);
tracker.registerObject(extension, descriptor,
IExtensionTracker.REF_STRONG);
productBindingDescriptors.add(descriptor);
}
}
buildHandlersStructure();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler#removeExtension(org.eclipse.core.runtime.IExtension,
* java.lang.Object[])
*/
public void removeExtension(IExtension extension, Object[] objects) {
for (int i = 0; i < objects.length; i++) {
if (objects[i] instanceof StatusHandlerDescriptor) {
statusHandlerDescriptors.remove(objects[i]);
} else if (objects[i] instanceof StatusHandlerProductBindingDescriptor) {
productBindingDescriptors.remove(objects[i]);
}
}
buildHandlersStructure();
}
/**
* Returns the default product handler descriptor, or null if the product is
* not defined or there is no product binding
*
* @return the default handler
*/
public StatusHandlerDescriptor getDefaultHandlerDescriptor() {
return defaultHandlerDescriptor;
}
/**
* Returns a list of handler descriptors which should be used for statuses
* with given plugin id.
*
* @param pluginId
* @return list of handler descriptors
*/
public List getHandlerDescriptors(String pluginId) {
return statusHandlerDescriptorsMap.getHandlerDescriptors(pluginId);
}
/**
* Returns status handler descriptor for given id.
*
* @param statusHandlerId
* the id to get for
* @return the status handler descriptor
*/
public StatusHandlerDescriptor getHandlerDescriptor(String statusHandlerId) {
StatusHandlerDescriptor descriptor = null;
for (Iterator it = statusHandlerDescriptors.iterator(); it.hasNext();) {
descriptor = (StatusHandlerDescriptor) it.next();
if (descriptor.getId().equals(statusHandlerId)) {
return descriptor;
}
}
if (defaultHandlerDescriptor != null
&& defaultHandlerDescriptor.getId().equals(statusHandlerId)) {
return defaultHandlerDescriptor;
}
return null;
}
/**
* Disposes the registry.
*/
public void dispose() {
PlatformUI.getWorkbench().getExtensionTracker().unregisterHandler(this);
}
/**
* It is possible since Eclipse 3.5 to configure custom status handling
* using the -statushandler parameter.
*
* @return the id of the statushandler
* @since 3.5
*/
private String resolveUserStatusHandlerId(){
String[] parameters = Platform.getCommandLineArgs();
for(int i = 0; i < parameters.length - 1; i++){
if(STATUSHANDLER_ARG.equals(parameters[i])){
return parameters[i + 1];
}
}
return null;
}
/**
* Sets the default product handler descriptor if product exists and binding
* is defined and creates handler descriptors tree due to the prefix policy.
*/
private void buildHandlersStructure() {
statusHandlerDescriptorsMap.clear();
defaultHandlerDescriptor = null;
String productId = Platform.getProduct() != null ? Platform
.getProduct().getId() : null;
List allHandlers = new ArrayList();
String defaultHandlerId = resolveUserStatusHandlerId();
if (defaultHandlerId == null) {
// we look for product related statushandler if it was not passed as
// an argument to Eclipse
for (Iterator it = productBindingDescriptors.iterator(); it
.hasNext();) {
StatusHandlerProductBindingDescriptor descriptor = ((StatusHandlerProductBindingDescriptor) it
.next());
if (descriptor.getProductId().equals(productId)) {
defaultHandlerId = descriptor.getHandlerId();
}
}
}
for (Iterator it = statusHandlerDescriptors.iterator(); it.hasNext();) {
StatusHandlerDescriptor descriptor = ((StatusHandlerDescriptor) it
.next());
allHandlers.add(descriptor);
}
StatusHandlerDescriptor handlerDescriptor = null;
for (Iterator it = allHandlers.iterator(); it.hasNext();) {
handlerDescriptor = (StatusHandlerDescriptor) it.next();
if (handlerDescriptor.getId().equals(defaultHandlerId)) {
defaultHandlerDescriptor = handlerDescriptor;
} else {
statusHandlerDescriptorsMap
.addHandlerDescriptor(handlerDescriptor);
}
}
}
}