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(); } }