From 1165869d6487e1ac039629dba36bdfd2c7fb9c2d Mon Sep 17 00:00:00 2001
From: Paul Richardson
Date: Tue, 4 Jun 2013 11:28:26 +0100
Subject: [PATCH] Creates an abstract extension registry
* Factors out the common functionality of the Teiid Runtime Registry into
an abstract class that can be extended by similar registry implementations
---
.../META-INF/MANIFEST.MF | 1 +
.../registry/AbstractExtensionRegistry.java | 85 +++++++++++++++++++
.../registry/TeiidRuntimeRegistry.java | 62 ++++++--------
3 files changed, 110 insertions(+), 38 deletions(-)
create mode 100644 plugins/org.teiid.designer.spi/src/org/teiid/designer/registry/AbstractExtensionRegistry.java
diff --git a/plugins/org.teiid.designer.spi/META-INF/MANIFEST.MF b/plugins/org.teiid.designer.spi/META-INF/MANIFEST.MF
index 290c28950b..988cb2719a 100644
--- a/plugins/org.teiid.designer.spi/META-INF/MANIFEST.MF
+++ b/plugins/org.teiid.designer.spi/META-INF/MANIFEST.MF
@@ -21,6 +21,7 @@ Export-Package: org.teiid.datatools.connectivity.spi,
org.teiid.designer.query.sql.lang.util,
org.teiid.designer.query.sql.proc,
org.teiid.designer.query.sql.symbol,
+ org.teiid.designer.registry,
org.teiid.designer.runtime.connection.spi,
org.teiid.designer.runtime.registry,
org.teiid.designer.runtime.spi,
diff --git a/plugins/org.teiid.designer.spi/src/org/teiid/designer/registry/AbstractExtensionRegistry.java b/plugins/org.teiid.designer.spi/src/org/teiid/designer/registry/AbstractExtensionRegistry.java
new file mode 100644
index 0000000000..836943edc0
--- /dev/null
+++ b/plugins/org.teiid.designer.spi/src/org/teiid/designer/registry/AbstractExtensionRegistry.java
@@ -0,0 +1,85 @@
+/*
+ * JBoss, Home of Professional Open Source.
+*
+* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
+*
+* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
+*/
+package org.teiid.designer.registry;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+
+/**
+ * @param
+ * @param
+ */
+public abstract class AbstractExtensionRegistry {
+
+ private static final String CLASS_ATTRIBUTE_ID = "class"; //$NON-NLS-1$
+
+ private Map extensions = new HashMap();
+
+ private String extPointId;
+
+ private String elementId;
+
+ protected AbstractExtensionRegistry(String extPointId, String elementId) throws Exception {
+ this.extPointId = extPointId;
+ this.elementId = elementId;
+ load();
+ }
+
+ private void load() throws Exception {
+ IExtensionRegistry extRegistry = Platform.getExtensionRegistry();
+ IConfigurationElement[] extensions = extRegistry.getConfigurationElementsFor(extPointId);
+
+ for (IConfigurationElement element : extensions) {
+ if (elementId != null && !elementId.equals(element.getName()))
+ continue;
+
+ V extension = (V) element.createExecutableExtension(CLASS_ATTRIBUTE_ID);
+ register(element, extension);
+ }
+ }
+
+ protected abstract void register(IConfigurationElement configurationElement, V extension);
+
+ protected void register(K key, V value) {
+ extensions.put(key, value);
+ }
+
+ /**
+ * Get a register value applicable for the given key
+ *
+ * @param key
+ *
+ * @return instance of V
+ */
+ public V getRegistered(K key) {
+ return extensions.get(key);
+ }
+
+ /**
+ * @return all the registered keys
+ */
+ public Collection getRegisteredKeys() {
+ return Collections.unmodifiableCollection(extensions.keySet());
+ }
+
+ /**
+ * @return all the registered extensions
+ */
+ public Collection getRegistered() {
+ return Collections.unmodifiableCollection(extensions.values());
+ }
+
+ protected Collection> getRegisteredEntries() {
+ return Collections.unmodifiableCollection(extensions.entrySet());
+ }
+}
diff --git a/plugins/org.teiid.designer.spi/src/org/teiid/designer/runtime/registry/TeiidRuntimeRegistry.java b/plugins/org.teiid.designer.spi/src/org/teiid/designer/runtime/registry/TeiidRuntimeRegistry.java
index f6bda34636..d788e3c09a 100644
--- a/plugins/org.teiid.designer.spi/src/org/teiid/designer/runtime/registry/TeiidRuntimeRegistry.java
+++ b/plugins/org.teiid.designer.spi/src/org/teiid/designer/runtime/registry/TeiidRuntimeRegistry.java
@@ -10,16 +10,12 @@
import java.sql.Driver;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
import org.eclipse.osgi.util.NLS;
import org.teiid.designer.Messages;
import org.teiid.designer.query.IQueryService;
+import org.teiid.designer.registry.AbstractExtensionRegistry;
import org.teiid.designer.runtime.spi.IExecutionAdmin;
import org.teiid.designer.runtime.spi.IExecutionAdminFactory;
import org.teiid.designer.runtime.spi.ITeiidServer;
@@ -30,14 +26,12 @@
/**
* @since 8.0
*/
-public class TeiidRuntimeRegistry {
+public class TeiidRuntimeRegistry extends AbstractExtensionRegistry {
private static final String EXT_POINT_ID = "org.teiid.designer.spi.teiidRuntimeClient"; //$NON-NLS-1$
private static final String FACTORY_ID = "runtimeFactory"; //$NON-NLS-1$
-
- private static final String CLASS_ATTRIBUTE_ID = "class"; //$NON-NLS-1$
-
+
private static final String VERSION_ELEMENT_ID = "version"; //$NON-NLS-1$
private static final String MAJOR_ATTRIBUTE_ID = "major"; //$NON-NLS-1$
@@ -47,9 +41,7 @@ public class TeiidRuntimeRegistry {
private static final String MICRO_ATTRIBUTE_ID = "micro"; //$NON-NLS-1$
private static TeiidRuntimeRegistry registry;
-
- private Map factories = new HashMap();
-
+
/**
* Get the singleton instance of this registry
*
@@ -60,33 +52,28 @@ public class TeiidRuntimeRegistry {
public static TeiidRuntimeRegistry getInstance() throws Exception {
if (registry == null) {
registry = new TeiidRuntimeRegistry();
- registry.load();
}
-
+
return registry;
}
-
- private void load() throws Exception {
- IExtensionRegistry extRegistry = Platform.getExtensionRegistry();
- IConfigurationElement[] extensions = extRegistry.getConfigurationElementsFor(EXT_POINT_ID);
- for (IConfigurationElement element : extensions) {
- if (! FACTORY_ID.equals(element.getName()))
- continue;
-
- IExecutionAdminFactory factory = (IExecutionAdminFactory) element.createExecutableExtension(CLASS_ATTRIBUTE_ID);
-
- IConfigurationElement[] versions = element.getChildren(VERSION_ELEMENT_ID);
- for (IConfigurationElement version : versions) {
- String major = version.getAttribute(MAJOR_ATTRIBUTE_ID);
- String minor = version.getAttribute(MINOR_ATTRIBUTE_ID);
- String micro = version.getAttribute(MICRO_ATTRIBUTE_ID);
-
- ITeiidServerVersion serverVersion = new TeiidServerVersion(major, minor, micro);
- factories.put(serverVersion, factory);
- }
+
+ private TeiidRuntimeRegistry() throws Exception {
+ super(EXT_POINT_ID, FACTORY_ID);
+ }
+
+ @Override
+ protected void register(IConfigurationElement configurationElement, IExecutionAdminFactory adminFactory) {
+ IConfigurationElement[] versions = configurationElement.getChildren(VERSION_ELEMENT_ID);
+ for (IConfigurationElement version : versions) {
+ String major = version.getAttribute(MAJOR_ATTRIBUTE_ID);
+ String minor = version.getAttribute(MINOR_ATTRIBUTE_ID);
+ String micro = version.getAttribute(MICRO_ATTRIBUTE_ID);
+
+ ITeiidServerVersion serverVersion = new TeiidServerVersion(major, minor, micro);
+ register(serverVersion, adminFactory);
}
}
-
+
/**
* Get an {@link IExecutionAdmin} applicable for the given server
*
@@ -157,11 +144,11 @@ public IQueryService getQueryService(ITeiidServerVersion teiidServerVersion) thr
*/
private IExecutionAdminFactory search(ITeiidServerVersion serverVersion) {
- IExecutionAdminFactory factory = factories.get(serverVersion);
+ IExecutionAdminFactory factory = getRegistered(serverVersion);
if (factory != null)
return factory;
- for (Map.Entry entry : factories.entrySet()) {
+ for (Map.Entry entry : getRegisteredEntries()) {
ITeiidServerVersion entryVersion = entry.getKey();
if (serverVersion.compareTo(entryVersion))
@@ -177,7 +164,6 @@ private IExecutionAdminFactory search(ITeiidServerVersion serverVersion) {
* @return unmodifiable collection
*/
public Collection getRegisteredServerVersions() {
- List versions = new ArrayList(factories.keySet());
- return Collections.unmodifiableCollection(versions);
+ return getRegisteredKeys();
}
}