Skip to content

Commit

Permalink
Creates an abstract extension registry
Browse files Browse the repository at this point in the history
* Factors out the common functionality of the Teiid Runtime Registry into
  an abstract class that can be extended by similar registry implementations
  • Loading branch information
Paul Richardson committed Jun 10, 2013
1 parent 3a65537 commit 1165869
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 38 deletions.
1 change: 1 addition & 0 deletions plugins/org.teiid.designer.spi/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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 <K>
* @param <V>
*/
public abstract class AbstractExtensionRegistry<K, V> {

private static final String CLASS_ATTRIBUTE_ID = "class"; //$NON-NLS-1$

private Map<K, V> extensions = new HashMap<K, V>();

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<K> getRegisteredKeys() {
return Collections.unmodifiableCollection(extensions.keySet());
}

/**
* @return all the registered extensions
*/
public Collection<V> getRegistered() {
return Collections.unmodifiableCollection(extensions.values());
}

protected Collection<Map.Entry<K, V>> getRegisteredEntries() {
return Collections.unmodifiableCollection(extensions.entrySet());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -30,14 +26,12 @@
/**
* @since 8.0
*/
public class TeiidRuntimeRegistry {
public class TeiidRuntimeRegistry extends AbstractExtensionRegistry<ITeiidServerVersion, IExecutionAdminFactory> {

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$
Expand All @@ -47,9 +41,7 @@ public class TeiidRuntimeRegistry {
private static final String MICRO_ATTRIBUTE_ID = "micro"; //$NON-NLS-1$

private static TeiidRuntimeRegistry registry;

private Map<ITeiidServerVersion, IExecutionAdminFactory> factories = new HashMap<ITeiidServerVersion, IExecutionAdminFactory>();


/**
* Get the singleton instance of this registry
*
Expand All @@ -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
*
Expand Down Expand Up @@ -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<ITeiidServerVersion, IExecutionAdminFactory> entry : factories.entrySet()) {
for (Map.Entry<ITeiidServerVersion, IExecutionAdminFactory> entry : getRegisteredEntries()) {
ITeiidServerVersion entryVersion = entry.getKey();

if (serverVersion.compareTo(entryVersion))
Expand All @@ -177,7 +164,6 @@ private IExecutionAdminFactory search(ITeiidServerVersion serverVersion) {
* @return unmodifiable collection
*/
public Collection<ITeiidServerVersion> getRegisteredServerVersions() {
List<ITeiidServerVersion> versions = new ArrayList<ITeiidServerVersion>(factories.keySet());
return Collections.unmodifiableCollection(versions);
return getRegisteredKeys();
}
}

0 comments on commit 1165869

Please sign in to comment.