blob: d3748194ac38f1973a92fa9b0e609dea7eaceac3 [file] [log] [blame]
/**********************************************************************************
* Copyright (c) 2011 Mia-Software.
* 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:
* Nicolas Guyomar (Mia-Software) - Bug 333652 Extension point offering the possibility to declare an EPackage browser
* Nicolas Bros (Mia-Software) - Bug 335218 - Extension point for registering EObject, EPackage, model editor
* Laurent Pichierri (Soft-Maint) - Bug 371204 - Compatibility with Helios
***********************************************************************************/
package org.eclipse.emf.facet.util.emf.core.internal.registry;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
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.Platform;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.facet.util.core.Logger;
import org.eclipse.emf.facet.util.emf.core.IBrowserRegistry;
import org.eclipse.emf.facet.util.emf.core.IEObjectBrowserOpener;
import org.eclipse.emf.facet.util.emf.core.IEPackageBrowserOpener;
import org.eclipse.emf.facet.util.emf.core.IResourceBrowserOpener;
import org.eclipse.emf.facet.util.emf.core.internal.Activator;
import org.eclipse.emf.facet.util.emf.core.internal.preferences.PreferenceConstants;
/** A registry for the EObject, EPackage, and Resource browser opener extension point. */
public class BrowserRegistry implements IBrowserRegistry {
private static final String EXTENSION_POINT_RESOURCE_VIEWER_ELT = "resourceViewer"; //$NON-NLS-1$
private static final String EXTENSION_POINT_EOBJECT_VIEWER_ELT = "eObjectViewer"; //$NON-NLS-1$
private static final String EXTENSION_POINT_EPACKAGE_VIEWER_ELT = "ePackageViewer"; //$NON-NLS-1$
private final List<IEPackageBrowserOpener> epackageBrowserOpeners;
private final List<IEObjectBrowserOpener> eobjectBrowserOpeners;
private final List<IResourceBrowserOpener> resourceBrowserOpeners;
public static final String EXTENSION_POINT_MODEL_VIEWER_ID = "org.eclipse.emf.facet.util.emf.core.modelViewer"; //$NON-NLS-1$
public static final String CLASS = "class"; //$NON-NLS-1$
public BrowserRegistry() {
this.epackageBrowserOpeners = new ArrayList<IEPackageBrowserOpener>();
this.eobjectBrowserOpeners = new ArrayList<IEObjectBrowserOpener>();
this.resourceBrowserOpeners = new ArrayList<IResourceBrowserOpener>();
IExtensionRegistry registry = Platform.getExtensionRegistry();
IExtensionPoint extensionPoint = registry
.getExtensionPoint(BrowserRegistry.EXTENSION_POINT_MODEL_VIEWER_ID);
if (extensionPoint != null) {
for (IExtension ext : extensionPoint.getExtensions()) {
for (IConfigurationElement configElt : ext.getConfigurationElements()) {
String kind = configElt.getName();
String classID = configElt.getAttribute(BrowserRegistry.CLASS);
try {
if (classID != null) {
if (kind.equals(BrowserRegistry.EXTENSION_POINT_EPACKAGE_VIEWER_ELT)) {
this.epackageBrowserOpeners.add((IEPackageBrowserOpener) configElt
.createExecutableExtension(BrowserRegistry.CLASS));
} else if (kind
.equals(BrowserRegistry.EXTENSION_POINT_EOBJECT_VIEWER_ELT)) {
this.eobjectBrowserOpeners.add((IEObjectBrowserOpener) configElt
.createExecutableExtension(BrowserRegistry.CLASS));
} else if (kind
.equals(BrowserRegistry.EXTENSION_POINT_RESOURCE_VIEWER_ELT)) {
this.resourceBrowserOpeners.add((IResourceBrowserOpener) configElt
.createExecutableExtension(BrowserRegistry.CLASS));
}
}
} catch (CoreException e) {
Logger.logError(e, Activator.getDefault());
}
}
}
} else {
Logger.logError(
"Extension point not found: " + BrowserRegistry.EXTENSION_POINT_MODEL_VIEWER_ID, //$NON-NLS-1$
Activator.getDefault());
}
}
public void browseEPackage(final EPackage ePackage) {
if (ePackage == null) {
throw new IllegalArgumentException();
}
IEPackageBrowserOpener opener = getDefaultEPackageBrowserOpener();
if (opener != null) {
opener.openEPackage(ePackage);
} else {
Logger.logWarning(
"No epackage browser opener is registered to open ePackage " + ePackage.getNsURI(), Activator.getDefault()); //$NON-NLS-1$
}
}
public void browseResource(final Resource resource) {
if (resource == null) {
throw new IllegalArgumentException();
}
IResourceBrowserOpener opener = getDefaultResourceBrowserOpener();
if (opener != null) {
opener.openResource(resource);
} else {
Logger.logWarning(
"No resource browser opener is registered to open " + resource.getURI(), Activator.getDefault()); //$NON-NLS-1$
}
}
public void browseEObject(final EObject eObject) {
if (eObject == null) {
throw new IllegalArgumentException();
}
IEObjectBrowserOpener opener = getDefaultEObjectBrowserOpener();
if (opener != null) {
opener.openEObject(eObject);
} else {
Logger.logWarning(
"No eobject browser opener is registered to open " + eObject.toString(), Activator.getDefault()); //$NON-NLS-1$
}
}
public List<IEPackageBrowserOpener> getAllRegisteredEPackageBrowsers() {
return Collections.unmodifiableList(this.epackageBrowserOpeners);
}
public List<IEObjectBrowserOpener> getAllRegisteredEObjectBrowsers() {
return Collections.unmodifiableList(this.eobjectBrowserOpeners);
}
public List<IResourceBrowserOpener> getAllRegisteredResourceBrowsers() {
return Collections.unmodifiableList(this.resourceBrowserOpeners);
}
/**
* @return the default EPackage browser opener, can be null
*/
public IEPackageBrowserOpener getDefaultEPackageBrowserOpener() {
IEclipsePreferences preferenceNode = new InstanceScope().getNode(Activator.PLUGIN_ID);
String className = preferenceNode.get(PreferenceConstants.P_DEFAULT_EPACKAGE_VIEWER, null);
if (className != null) {
for (IEPackageBrowserOpener ePackageBrowserFactory : this.epackageBrowserOpeners) {
if (ePackageBrowserFactory.getClass().getName().equals(className)) {
return ePackageBrowserFactory;
}
}
}
// By default return the first editor registered through the extension
// point org.eclipse.emf.facet.util.emf.core.modelViewer
if (!this.epackageBrowserOpeners.isEmpty()) {
return this.epackageBrowserOpeners.get(0);
}
return null;
}
/**
* @return the default EObject browser opener, can be null
*/
public IEObjectBrowserOpener getDefaultEObjectBrowserOpener() {
IEclipsePreferences preferenceNode = new InstanceScope().getNode(Activator.PLUGIN_ID);
String className = preferenceNode.get(PreferenceConstants.P_DEFAULT_EOBJECT_VIEWER, null);
if (className != null) {
for (IEObjectBrowserOpener eObjectBrowserFactory : this.eobjectBrowserOpeners) {
if (eObjectBrowserFactory.getClass().getName().equals(className)) {
return eObjectBrowserFactory;
}
}
}
// By default return the first editor registered through the extension
// point org.eclipse.emf.facet.util.emf.core.modelViewer
if (!this.eobjectBrowserOpeners.isEmpty()) {
return this.eobjectBrowserOpeners.get(0);
}
return null;
}
/**
* @return the default Resource browser opener, can be <code>null</code>
*/
public IResourceBrowserOpener getDefaultResourceBrowserOpener() {
IEclipsePreferences preferenceNode = new InstanceScope().getNode(Activator.PLUGIN_ID);
String className = preferenceNode.get(PreferenceConstants.P_DEFAULT_RESOURCE_VIEWER, null);
if (className != null) {
for (IResourceBrowserOpener resourceBrowserOpener : this.resourceBrowserOpeners) {
if (resourceBrowserOpener.getClass().getName().equals(className)) {
return resourceBrowserOpener;
}
}
}
// By default return the first editor registered through the extension
// point org.eclipse.emf.facet.util.emf.core.modelViewer
if (!this.resourceBrowserOpeners.isEmpty()) {
return this.resourceBrowserOpeners.get(0);
}
return null;
}
}