blob: 7d2e2dd23a49402a3936109b01a3e54c2e284077 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}