| /******************************************************************************* |
| * Copyright (c) 2001, 2005 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 |
| * Jens Lukowski/Innoopract - initial renaming/restructuring |
| * |
| *******************************************************************************/ |
| package org.eclipse.wst.sse.core.internal.modelhandler; |
| |
| import java.util.List; |
| import java.util.Vector; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IConfigurationElement; |
| import org.eclipse.core.runtime.IExtensionPoint; |
| import org.eclipse.core.runtime.IExtensionRegistry; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.wst.sse.core.internal.SSECorePlugin; |
| import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IDocumentTypeHandler; |
| import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory; |
| |
| |
| /** |
| * |
| * Clients can make use of IExecutableExtension to handle the optional adapter |
| * class and key. Typically, many clients use a typical pattern of providing |
| * an adapter class and key in their null argument constructor anyway, so |
| * they'd only have to use IExecutableExtension if the factory was for more |
| * than one. |
| */ |
| public class PluginContributedFactoryReader { |
| // protected final String ATTR_ADAPTERKEY = "adapterKeyClass"; |
| // //$NON-NLS-1$ |
| // protected final String ATTR_REGISTERADAPTER = "registerAdapters"; |
| // //$NON-NLS-1$ |
| private static PluginContributedFactoryReader reader = null; |
| |
| public synchronized static PluginContributedFactoryReader getInstance() { |
| if (reader == null) { |
| reader = new PluginContributedFactoryReader(); |
| } |
| return reader; |
| } |
| |
| protected final String ATTR_CLASS = "class"; //$NON-NLS-1$ |
| protected final String ATTR_CONTENTTYPE = "contentTypeIdentiferId"; //$NON-NLS-1$ |
| |
| protected final String EXTENSION_POINT_ID = "contentTypeFactoryContribution"; //$NON-NLS-1$ |
| protected final String TAG_NAME = "factory"; //$NON-NLS-1$ |
| |
| protected PluginContributedFactoryReader() { |
| super(); |
| } |
| |
| public List getFactories(IDocumentTypeHandler handler) { |
| return loadRegistry(handler.getId()); |
| } |
| |
| public List getFactories(String type) { |
| return loadRegistry(type); |
| } |
| |
| protected INodeAdapterFactory loadFactoryFromConfigurationElement(IConfigurationElement element, Object requesterType) { |
| INodeAdapterFactory factory = null; |
| if (element.getName().equals(TAG_NAME)) { |
| String contentType = element.getAttribute(ATTR_CONTENTTYPE); |
| if (!requesterType.equals(contentType)) |
| return null; |
| String className = element.getAttribute(ATTR_CLASS); |
| // String adapterKeyClass = element.getAttribute(ATTR_ADAPTERKEY); |
| // String registerAdapters = |
| // element.getAttribute(ATTR_REGISTERADAPTER); |
| |
| // if className is null, then no one defined the extension point |
| // for adapter factories |
| if (className != null) { |
| try { |
| factory = (INodeAdapterFactory) element.createExecutableExtension(ATTR_CLASS); |
| } catch (CoreException e) { |
| // if an error occurs here, its probably that the plugin |
| // could not be found/loaded |
| org.eclipse.wst.sse.core.internal.Logger.logException("Could not find class: " + className, e); //$NON-NLS-1$ |
| } catch (Exception e) { |
| // if an error occurs here, its probably that the plugin |
| // could not be found/loaded -- but in any case we just |
| // want |
| // to log the error and continue running and best we can. |
| org.eclipse.wst.sse.core.internal.Logger.logException("Could not find class: " + className, e); //$NON-NLS-1$ |
| } |
| // if (plugin != null) { |
| // factory = oldAttributesCode(element, factory, className, |
| // plugin); |
| // |
| } |
| } |
| |
| return factory; |
| } |
| |
| protected List loadRegistry(Object contentType) { |
| List factoryList = null; // new Vector(); |
| IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry(); |
| IExtensionPoint point = extensionRegistry.getExtensionPoint(SSECorePlugin.ID, EXTENSION_POINT_ID); |
| if (point != null) { |
| IConfigurationElement[] elements = point.getConfigurationElements(); |
| if (elements.length > 0) { |
| // this is called a lot, so don't create vector unless really |
| // needed |
| // TODO: could eventually cache in a hashtable, or something, |
| // to avoid repeat processing |
| factoryList = new Vector(); |
| for (int i = 0; i < elements.length; i++) { |
| INodeAdapterFactory factory = loadFactoryFromConfigurationElement(elements[i], contentType); |
| if (factory != null) |
| factoryList.add(factory); |
| } |
| } |
| } |
| return factoryList; |
| } |
| } |