/*******************************************************************************
* Copyright (c) 2010, 2011 Tasktop Technologies 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:
* Tasktop Technologies - initial API and implementation
* Itema AS - bug 330064 notification filtering and model persistence
*******************************************************************************/
package org.eclipse.mylyn.internal.commons.notifications.ui;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
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.IExtensionRegistry;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.osgi.util.NLS;
import org.eclipse.ui.statushandlers.StatusManager;
/**
* @author Steffen Pingel
* @author Torkild U. Resheim
*/
public class NotificationsExtensionReader {
private static boolean errorLogged = false;
static List<NotificationSinkDescriptor> sinks;
private static Collection<NotificationCategory> categories;
/**
* Returns a list of notification categories, each containing their belonging notification events. Once initialised
* the same list will be returned upon subsequent calls of this method.
*
* @return a list of notification categories.
* @see NotificationModel#save(org.eclipse.ui.IMemento)
* @see NotificationModel#load(org.eclipse.ui.IMemento)
*/
public static Collection<NotificationCategory> getCategories() {
if (categories != null) {
return categories;
}
HashMap<String, NotificationCategory> categoryById = new HashMap<String, NotificationCategory>();
MultiStatus result = new MultiStatus(NotificationsPlugin.ID_PLUGIN, 0,
"Notifcation extensions failed to load", null); //$NON-NLS-1$
IExtensionRegistry registry = Platform.getExtensionRegistry();
IExtensionPoint repositoriesExtensionPoint = registry.getExtensionPoint(NotificationsPlugin.ID_PLUGIN
+ ".notifications"); //$NON-NLS-1$
IExtension[] extensions = repositoriesExtensionPoint.getExtensions();
for (IExtension extension : extensions) {
IConfigurationElement[] elements = extension.getConfigurationElements();
for (IConfigurationElement element : elements) {
if ("category".equals(element.getName())) { //$NON-NLS-1$
NotificationCategory category = new NotificationCategory(element);
IStatus status = category.validate();
if (status.isOK()) {
categoryById.put(category.getId(), category);
} else {
result.add(status);
}
}
}
for (IConfigurationElement element : elements) {
if ("event".equals(element.getName())) { //$NON-NLS-1$
NotificationEvent event = new NotificationEvent(element);
IStatus status = event.validate();
if (status.isOK()) {
NotificationCategory category = categoryById.get(event.getCategoryId());
if (category != null) {
category.addEvent(event);
} else {
result.add(new Status(
IStatus.ERROR,
NotificationsPlugin.ID_PLUGIN,
NLS.bind(
"Extension {0} contributed by {1} specify unknown category ''{2}''", new String[] { element.getNamespaceIdentifier(), element.getContributor().getName(), event.getCategoryId() }))); //NON-NLS-1$ //$NON-NLS-1$
}
} else {
result.add(status);
}
}
}
}
if (!result.isOK() && !errorLogged) {
StatusManager.getManager().handle(result);
errorLogged = true;
}
categories = categoryById.values();
return categories;
}
public static List<NotificationSinkDescriptor> getSinks() {
if (sinks != null) {
return sinks;
}
sinks = new ArrayList<NotificationSinkDescriptor>();
MultiStatus result = new MultiStatus(NotificationsPlugin.ID_PLUGIN, 0,
"Notifcation extensions failed to load", null); //$NON-NLS-1$
IExtensionRegistry registry = Platform.getExtensionRegistry();
IExtensionPoint repositoriesExtensionPoint = registry.getExtensionPoint(NotificationsPlugin.ID_PLUGIN
+ ".notifications"); //$NON-NLS-1$
IExtension[] extensions = repositoriesExtensionPoint.getExtensions();
for (IExtension extension : extensions) {
IConfigurationElement[] elements = extension.getConfigurationElements();
for (IConfigurationElement element : elements) {
if ("sink".equals(element.getName())) { //$NON-NLS-1$
NotificationSinkDescriptor descriptor = new NotificationSinkDescriptor(element);
IStatus status = descriptor.validate();
if (status.isOK()) {
sinks.add(descriptor);
} else {
result.add(status);
}
}
}
}
if (!result.isOK()) {
StatusManager.getManager().handle(result);
}
return sinks;
}
}