Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java198
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;
+ }
+}

Back to the top