diff options
Diffstat (limited to 'core/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ModelManagerPluginRegistryReader.java')
-rw-r--r-- | core/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ModelManagerPluginRegistryReader.java | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/core/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ModelManagerPluginRegistryReader.java b/core/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ModelManagerPluginRegistryReader.java new file mode 100644 index 0000000000..2b9025fdd2 --- /dev/null +++ b/core/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ModelManagerPluginRegistryReader.java @@ -0,0 +1,198 @@ +/******************************************************************************* + * 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; + +import java.lang.reflect.InvocationTargetException; +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.ltk.modelhandler.IDocumentTypeHandler; +import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory; +import org.osgi.framework.Bundle; + + +public class ModelManagerPluginRegistryReader { + private static ModelManagerPluginRegistryReader reader = null; + + public synchronized static ModelManagerPluginRegistryReader getInstance() { + if (reader == null) { + reader = new ModelManagerPluginRegistryReader(); + } + return reader; + } + + protected final String ATTR_ADAPTERKEY = "adapterKeyClass"; //$NON-NLS-1$ + protected final String ATTR_CLASS = "class"; //$NON-NLS-1$ + protected final String ATTR_CONTENTTYPE = "type"; //$NON-NLS-1$ + protected final String ATTR_REGISTERADAPTER = "registerAdapters"; //$NON-NLS-1$ + + protected final String EXTENSION_POINT_ID = "adaptOnCreateFactory"; //$NON-NLS-1$ + protected final String TAG_NAME = "AdaptOnCreateFactory"; //$NON-NLS-1$ + + /** + * XMLEditorPluginRegistryReader constructor comment. + */ + protected ModelManagerPluginRegistryReader() { + 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 (!contentType.equals(requesterType)) + 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) { + String name = element.getDeclaringExtension().getNamespace(); + Bundle bundle = null; + try { + bundle = Platform.getBundle(name); + } + catch (Exception e) { + // if an error occurs here, its probably that the plugin + // could not be found/loaded + Logger.logException("Could not find bundle: " + name, e); //$NON-NLS-1$ + + } + if (bundle != null) { + boolean useExtendedConstructor = false; + boolean doRegisterAdapters = false; + Object adapterKey = null; + + if (registerAdapters != null && registerAdapters.length() > 0 && Boolean.valueOf(registerAdapters).booleanValue()) { + doRegisterAdapters = true; + } + if (adapterKeyClass != null) { + try { + Class aClass = null; + // aClass = classLoader != null ? + // classLoader.loadClass(adapterKeyClass) : + // Class.forName(adapterKeyClass); + if (bundle.getState() != Bundle.UNINSTALLED) { + aClass = bundle.loadClass(adapterKeyClass); + } + else { + aClass = Class.forName(adapterKeyClass); + } + if (aClass != null) { + useExtendedConstructor = true; + adapterKey = aClass; + } + else { + adapterKey = adapterKeyClass; + } + } + catch (Exception anyErrors) { + adapterKey = adapterKeyClass; + } + } + + try { + Class theClass = null; + // Class theClass = classLoader != null ? + // classLoader.loadClass(className) : + // Class.forName(className); + if (bundle.getState() != Bundle.UNINSTALLED) { + theClass = bundle.loadClass(className); + } + else { + theClass = Class.forName(className); + } + if (useExtendedConstructor) { + java.lang.reflect.Constructor[] ctors = theClass.getConstructors(); + for (int i = 0; i < ctors.length; i++) { + Class[] paramTypes = ctors[i].getParameterTypes(); + if (ctors[i].isAccessible() && paramTypes.length == 2 && paramTypes[0].equals(Object.class) && paramTypes[1].equals(boolean.class)) { + try { + factory = (INodeAdapterFactory) ctors[i].newInstance(new Object[]{adapterKey, new Boolean(doRegisterAdapters)}); + } + catch (IllegalAccessException e) { + // log for now, unless we find reason + // not to + Logger.log(Logger.INFO, e.getMessage()); + } + catch (IllegalArgumentException e) { + // log for now, unless we find reason + // not to + Logger.log(Logger.INFO, e.getMessage()); + } + catch (InstantiationException e) { + // log for now, unless we find reason + // not to + Logger.log(Logger.INFO, e.getMessage()); + } + catch (InvocationTargetException e) { + // log for now, unless we find reason + // not to + Logger.log(Logger.INFO, e.getMessage()); + } + catch (ExceptionInInitializerError e) { + // log or now, unless we find reason + // not to + Logger.log(Logger.INFO, e.getMessage()); + } + } + } + } + if (factory == null) { + factory = (INodeAdapterFactory) element.createExecutableExtension(ATTR_CLASS); + } + } + catch (ClassNotFoundException e) { + // log or now, unless we find reason not to + Logger.log(Logger.INFO, e.getMessage()); + } + catch (CoreException e) { + // log or now, unless we find reason not to + Logger.log(Logger.INFO, e.getMessage()); + } + } + } + } + return factory; + } + + protected List loadRegistry(Object contentType) { + List factoryList = new Vector(); + IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry(); + IExtensionPoint point = extensionRegistry.getExtensionPoint(SSECorePlugin.ID, EXTENSION_POINT_ID); + if (point != null) { + IConfigurationElement[] elements = point.getConfigurationElements(); + for (int i = 0; i < elements.length; i++) { + INodeAdapterFactory factory = loadFactoryFromConfigurationElement(elements[i], contentType); + if (factory != null) + factoryList.add(factory); + } + } + return factoryList; + } +} |