blob: cc1d4c0ec233ba973660283e70bce2742b090273 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 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.activities;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.expressions.Expression;
import org.eclipse.core.expressions.ExpressionConverter;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionDelta;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IRegistryChangeEvent;
import org.eclipse.core.runtime.IRegistryChangeListener;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
import org.eclipse.ui.internal.util.ConfigurationElementMemento;
import org.eclipse.ui.statushandlers.StatusManager;
final class ExtensionActivityRegistry extends AbstractActivityRegistry {
private List activityRequirementBindingDefinitions;
private List activityDefinitions;
private List activityPatternBindingDefinitions;
private List categoryActivityBindingDefinitions;
private List categoryDefinitions;
private List defaultEnabledActivities;
private IExtensionRegistry extensionRegistry;
ExtensionActivityRegistry(IExtensionRegistry extensionRegistry) {
if (extensionRegistry == null) {
throw new NullPointerException();
}
this.extensionRegistry = extensionRegistry;
this.extensionRegistry
.addRegistryChangeListener(new IRegistryChangeListener() {
public void registryChanged(
IRegistryChangeEvent registryChangeEvent) {
IExtensionDelta[] extensionDeltas = registryChangeEvent
.getExtensionDeltas(Persistence.PACKAGE_PREFIX,
Persistence.PACKAGE_BASE);
if (extensionDeltas.length != 0) {
try {
load();
} catch (IOException eIO) {
}
}
}
});
try {
load();
} catch (IOException eIO) {
}
}
private String getNamespace(IConfigurationElement configurationElement) {
String namespace = null;
if (configurationElement != null) {
IExtension extension = configurationElement.getDeclaringExtension();
if (extension != null) {
namespace = extension.getNamespace();
}
}
return namespace;
}
private void load() throws IOException {
if (activityRequirementBindingDefinitions == null) {
activityRequirementBindingDefinitions = new ArrayList();
} else {
activityRequirementBindingDefinitions.clear();
}
if (activityDefinitions == null) {
activityDefinitions = new ArrayList();
} else {
activityDefinitions.clear();
}
if (activityPatternBindingDefinitions == null) {
activityPatternBindingDefinitions = new ArrayList();
} else {
activityPatternBindingDefinitions.clear();
}
if (categoryActivityBindingDefinitions == null) {
categoryActivityBindingDefinitions = new ArrayList();
} else {
categoryActivityBindingDefinitions.clear();
}
if (categoryDefinitions == null) {
categoryDefinitions = new ArrayList();
} else {
categoryDefinitions.clear();
}
if (defaultEnabledActivities == null) {
defaultEnabledActivities = new ArrayList();
} else {
defaultEnabledActivities.clear();
}
IConfigurationElement[] configurationElements = extensionRegistry
.getConfigurationElementsFor(Persistence.PACKAGE_FULL);
for (int i = 0; i < configurationElements.length; i++) {
IConfigurationElement configurationElement = configurationElements[i];
String name = configurationElement.getName();
if (Persistence.TAG_ACTIVITY_REQUIREMENT_BINDING.equals(name)) {
readActivityRequirementBindingDefinition(configurationElement);
} else if (Persistence.TAG_ACTIVITY.equals(name)) {
readActivityDefinition(configurationElement);
} else if (Persistence.TAG_ACTIVITY_PATTERN_BINDING.equals(name)) {
readActivityPatternBindingDefinition(configurationElement);
} else if (Persistence.TAG_CATEGORY_ACTIVITY_BINDING.equals(name)) {
readCategoryActivityBindingDefinition(configurationElement);
} else if (Persistence.TAG_CATEGORY.equals(name)) {
readCategoryDefinition(configurationElement);
} else if (Persistence.TAG_DEFAULT_ENABLEMENT.equals(name)) {
readDefaultEnablement(configurationElement);
}
}
boolean activityRegistryChanged = false;
if (!activityRequirementBindingDefinitions
.equals(super.activityRequirementBindingDefinitions)) {
super.activityRequirementBindingDefinitions = Collections
.unmodifiableList(activityRequirementBindingDefinitions);
activityRegistryChanged = true;
}
if (!activityDefinitions.equals(super.activityDefinitions)) {
super.activityDefinitions = Collections
.unmodifiableList(activityDefinitions);
activityRegistryChanged = true;
}
if (!activityPatternBindingDefinitions
.equals(super.activityPatternBindingDefinitions)) {
super.activityPatternBindingDefinitions = Collections
.unmodifiableList(activityPatternBindingDefinitions);
activityRegistryChanged = true;
}
if (!categoryActivityBindingDefinitions
.equals(super.categoryActivityBindingDefinitions)) {
super.categoryActivityBindingDefinitions = Collections
.unmodifiableList(categoryActivityBindingDefinitions);
activityRegistryChanged = true;
}
if (!categoryDefinitions.equals(super.categoryDefinitions)) {
super.categoryDefinitions = Collections
.unmodifiableList(categoryDefinitions);
activityRegistryChanged = true;
}
if (!defaultEnabledActivities.equals(super.defaultEnabledActivities)) {
super.defaultEnabledActivities = Collections
.unmodifiableList(defaultEnabledActivities);
activityRegistryChanged = true;
}
if (activityRegistryChanged) {
fireActivityRegistryChanged();
}
}
private void readDefaultEnablement(
IConfigurationElement configurationElement) {
String enabledActivity = Persistence
.readDefaultEnablement(new ConfigurationElementMemento(
configurationElement));
if (enabledActivity != null) {
defaultEnabledActivities.add(enabledActivity);
}
}
private void readActivityRequirementBindingDefinition(
IConfigurationElement configurationElement) {
ActivityRequirementBindingDefinition activityRequirementBindingDefinition = Persistence
.readActivityRequirementBindingDefinition(
new ConfigurationElementMemento(configurationElement),
getNamespace(configurationElement));
if (activityRequirementBindingDefinition != null) {
activityRequirementBindingDefinitions
.add(activityRequirementBindingDefinition);
}
}
private void readActivityDefinition(
IConfigurationElement configurationElement) {
ActivityDefinition activityDefinition = Persistence
.readActivityDefinition(new ConfigurationElementMemento(
configurationElement),
getNamespace(configurationElement));
if (activityDefinition != null) {
// this is not ideal, but core expressions takes an
// IConfigurationElement or a w3c dom Document
IConfigurationElement[] enabledWhen = configurationElement
.getChildren(IWorkbenchRegistryConstants.TAG_ENABLED_WHEN);
if (enabledWhen.length == 1) {
IConfigurationElement[] expElement = enabledWhen[0]
.getChildren();
if (expElement.length == 1) {
try {
Expression expression = ExpressionConverter
.getDefault().perform(expElement[0]);
activityDefinition.setEnabledWhen(expression);
} catch (CoreException e) {
StatusManager.getManager().handle(e, WorkbenchPlugin.PI_WORKBENCH);
}
}
}
activityDefinitions.add(activityDefinition);
}
}
private void readActivityPatternBindingDefinition(
IConfigurationElement configurationElement) {
ActivityPatternBindingDefinition activityPatternBindingDefinition = Persistence
.readActivityPatternBindingDefinition(
new ConfigurationElementMemento(configurationElement),
getNamespace(configurationElement));
if (activityPatternBindingDefinition != null) {
activityPatternBindingDefinitions
.add(activityPatternBindingDefinition);
}
}
private void readCategoryActivityBindingDefinition(
IConfigurationElement configurationElement) {
CategoryActivityBindingDefinition categoryActivityBindingDefinition = Persistence
.readCategoryActivityBindingDefinition(
new ConfigurationElementMemento(configurationElement),
getNamespace(configurationElement));
if (categoryActivityBindingDefinition != null) {
categoryActivityBindingDefinitions
.add(categoryActivityBindingDefinition);
}
}
private void readCategoryDefinition(
IConfigurationElement configurationElement) {
CategoryDefinition categoryDefinition = Persistence
.readCategoryDefinition(new ConfigurationElementMemento(
configurationElement),
getNamespace(configurationElement));
if (categoryDefinition != null) {
categoryDefinitions.add(categoryDefinition);
}
}
}