/**
* Copyright (c) 2002-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 - Initial API and implementation
*/
package org.eclipse.emf.edit;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.StringTokenizer;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.EMFPlugin;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.util.ResourceLocator;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.plugin.RegistryReader;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.IChildCreationExtender;
import org.osgi.framework.BundleActivator;
/**
* The <b>Plugin</b> for the model EMF.Edit library.
* EMF must run
* within an Eclipse workbench,
* within a headless Eclipse workspace,
* or just stand-alone as part of some other application.
* To support this, all resource access should be directed to the resource locator,
* which can redirect the service as appropriate to the runtime.
* During stand-alone invocation no plugin initialization takes place.
* In this case, emf.edit.resources.jar must be on the CLASSPATH.
* @see #INSTANCE
*/
public final class EMFEditPlugin extends EMFPlugin
{
/**
* The singleton instance of the plugin.
*/
public static final EMFEditPlugin INSTANCE = new EMFEditPlugin();
/**
* The one instance of this class.
*/
private static Implementation plugin;
/**
* Creates the singleton instance.
*/
private EMFEditPlugin()
{
super(new ResourceLocator[] {});
}
/*
* Javadoc copied from base class.
*/
@Override
public ResourceLocator getPluginResourceLocator()
{
return plugin;
}
/**
* The singleton instance of an {@link ComposedAdapterFactory.Descriptor.Registry item provider adapter factory registry}.
*/
private static ComposedAdapterFactory.Descriptor.Registry.Impl composedAdapterFactoryDescriptorRegistry;
/**
* Returns a populated instance of an {@link ComposedAdapterFactory.Descriptor.Registry item provider adapter factory registry}.
* @return a populated instance of an item provider adapter factory registry.
*/
public static ComposedAdapterFactory.Descriptor.Registry getComposedAdapterFactoryDescriptorRegistry()
{
if (composedAdapterFactoryDescriptorRegistry == null)
{
composedAdapterFactoryDescriptorRegistry =
new ComposedAdapterFactory.Descriptor.Registry.Impl(null)
{
private static final long serialVersionUID = 1L;
@Override
public ComposedAdapterFactory.Descriptor delegatedGetDescriptor(Collection<?> types)
{
List<Object> stringTypes = new ArrayList<Object>(types.size());
for (Object key : types)
{
if (key instanceof EPackage)
{
stringTypes.add(((EPackage)key).getNsURI());
}
else if (key instanceof Package)
{
stringTypes.add(((Package)key).getName());
}
else if (key instanceof Class<?>)
{
stringTypes.add(((Class<?>)key).getName());
}
else
{
return null;
}
}
ComposedAdapterFactory.Descriptor descriptor = (ComposedAdapterFactory.Descriptor)get(stringTypes);
if (descriptor != null)
{
put(types, descriptor);
return descriptor;
}
return super.delegatedGetDescriptor(types);
}
};
if (INSTANCE.getPluginResourceLocator() instanceof EclipsePlugin)
{
RegistryReader registryReader =
new RegistryReader(Platform.getExtensionRegistry(), INSTANCE.getSymbolicName(), "itemProviderAdapterFactories")
{
@Override
protected boolean readElement(IConfigurationElement element, boolean add)
{
if (element.getName().equals("factory"))
{
String packageURI = element.getAttribute("uri");
String className = element.getAttribute("class");
String supportedTypes = element.getAttribute("supportedTypes");
if (packageURI == null)
{
logMissingAttribute(element, "uri");
}
else if (className == null)
{
logMissingAttribute(element, "class");
}
else if (supportedTypes == null)
{
logMissingAttribute(element, "supportedTypes");
}
class PluginAdapterFactoryDescriptor extends PluginClassDescriptor implements ComposedAdapterFactory.Descriptor
{
public PluginAdapterFactoryDescriptor(IConfigurationElement element, String attributeName)
{
super(element, attributeName);
}
public AdapterFactory createAdapterFactory()
{
return (AdapterFactory)createInstance();
}
}
for (StringTokenizer stringTokenizer = new StringTokenizer(supportedTypes); stringTokenizer.hasMoreTokens(); )
{
String supportedType = stringTokenizer.nextToken();
List<Object> key = new ArrayList<Object>();
key.add(packageURI);
key.add(supportedType);
if (add)
{
composedAdapterFactoryDescriptorRegistry.put(key, new PluginAdapterFactoryDescriptor(element, "class"));
}
else
{
composedAdapterFactoryDescriptorRegistry.remove(key);
}
}
return true;
}
return false;
}
};
registryReader.readRegistry();
}
}
return composedAdapterFactoryDescriptorRegistry;
}
/**
* The singleton instance of a {@link IChildCreationExtender.Descriptor.Registry child creation extender registry}.
*/
private static IChildCreationExtender.Descriptor.Registry.Impl childCreationExtenderDescriptorRegistry;
/**
* Returns a populated instance of a {@link IChildCreationExtender.Descriptor.Registry child creation extender registry}.
* @return a populated instance of child creation extender registry.
*/
public static IChildCreationExtender.Descriptor.Registry getChildCreationExtenderDescriptorRegistry()
{
if (childCreationExtenderDescriptorRegistry == null)
{
childCreationExtenderDescriptorRegistry =
new IChildCreationExtender.Descriptor.Registry.Impl(null)
{
private static final long serialVersionUID = 1L;
@Override
public Collection<IChildCreationExtender.Descriptor> delegatedGetDescriptors(String namespace)
{
Collection<IChildCreationExtender.Descriptor> descriptors = get(namespace);
return descriptors != null ? descriptors : super.delegatedGetDescriptors(namespace);
}
};
if (INSTANCE.getPluginResourceLocator() instanceof EclipsePlugin)
{
RegistryReader registryReader =
new RegistryReader(Platform.getExtensionRegistry(), INSTANCE.getSymbolicName(), "childCreationExtenders")
{
@Override
protected boolean readElement(IConfigurationElement element, boolean add)
{
if (element.getName().equals("extender"))
{
String packageURI = element.getAttribute("uri");
String className = element.getAttribute("class");
if (packageURI == null)
{
logMissingAttribute(element, "uri");
}
else if (className == null)
{
logMissingAttribute(element, "class");
}
class PluginChildCreationExtenderDescriptor extends PluginClassDescriptor implements IChildCreationExtender.Descriptor
{
protected String contributor;
public PluginChildCreationExtenderDescriptor(IConfigurationElement element, String attributeName)
{
super(element, attributeName);
contributor = element.getContributor().getName();
}
public IChildCreationExtender createChildCreationExtender()
{
return (IChildCreationExtender)createInstance();
}
public boolean matches(IConfigurationElement element)
{
return element.getContributor().getName().equals(contributor);
}
}
Collection<IChildCreationExtender.Descriptor> collection = childCreationExtenderDescriptorRegistry.get(packageURI);
if (add)
{
if (collection == null)
{
childCreationExtenderDescriptorRegistry.put(packageURI, collection = new ArrayList<IChildCreationExtender.Descriptor>());
}
collection.add(new PluginChildCreationExtenderDescriptor(element, "class"));
}
else if (collection != null)
{
for (IChildCreationExtender.Descriptor descriptor : collection)
{
if (descriptor instanceof PluginChildCreationExtenderDescriptor && ((PluginChildCreationExtenderDescriptor)descriptor).matches(element))
{
collection.remove(descriptor);
break;
}
}
}
return true;
}
return false;
}
};
registryReader.readRegistry();
}
}
return childCreationExtenderDescriptorRegistry;
}
/**
* Returns the singleton instance of the Eclipse plugin.
* @return the singleton instance.
*/
public static Implementation getPlugin()
{
return plugin;
}
/**
* The actual implementation of the Eclipse <b>Plugin</b>.
*/
public static class Implementation extends EclipsePlugin
{
/**
* Creates an instance.
*/
public Implementation()
{
super();
// Remember the static instance.
//
plugin = this;
}
/**
* @since 2.10
*/
public static class Activator extends EMFPlugin.OSGiDelegatingBundleActivator
{
@Override
protected BundleActivator createBundle()
{
return new Implementation();
}
}
}
}