/* * 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.datatools.connection; import java.util.Properties; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.datatools.connectivity.ICategory; import org.eclipse.datatools.connectivity.IConnectionProfile; import org.teiid.designer.core.workspace.ModelResource; import org.teiid.designer.datatools.DatatoolsPlugin; /** * Create instances of <code>IConnectionInfoProvider</code>. * * @since 8.0 */ public class ConnectionInfoProviderFactory { private static final String EXTENSION = "org.teiid.designer.datatools.ConnectionInfoProvider"; //$NON-NLS-1$ private static final String PROFILE_ATTRIBUTE = "profile"; //$NON-NLS-1$ private static final String CATEGORY_ATTRIBUTE = "category"; //$NON-NLS-1$ private static final String CLASS_ATTRIBUTE = "class"; //$NON-NLS-1$ private static final ConnectionInfoProviderFactory INSTANCE = new ConnectionInfoProviderFactory(); private IConnectionInfoHelper helper = new ConnectionInfoHelper(); public static ConnectionInfoProviderFactory getInstance() { return INSTANCE; } public IConnectionInfoProvider getProvider( IConnectionProfile profile ) { String instanceID = profile.getProviderId(); IConnectionInfoProvider result = getProviderFromProfileID(instanceID); if (null == result) { IConnectionProfile parent = profile.getParentProfile(); if (null != parent) { return getProvider(parent); } } if (null == result) { result = getProvider(profile.getCategory()); } return result; } /** * @param profileID the id of a <code>IConnectionProfile</code> * @return the <code>IConnectionInfoProvider</code> for the <code>IConnectionProfile</code>. Can be null if there is no * <code>IConnectionInfoProvider</code> registered for that profileID. */ public IConnectionInfoProvider getProviderFromProfileID( String instanceID ) { IConnectionInfoProvider helper = null; IExtensionRegistry reg = Platform.getExtensionRegistry(); IConfigurationElement[] extensions = reg.getConfigurationElementsFor(EXTENSION); for (int i = 0; i < extensions.length; i++) { IConfigurationElement element = extensions[i]; if (instanceID.equals(element.getAttribute(PROFILE_ATTRIBUTE))) { try { helper = (IConnectionInfoProvider)element.createExecutableExtension(CLASS_ATTRIBUTE); break; } catch (Exception e) { DatatoolsPlugin.Util.log(IStatus.ERROR, e.getMessage()); } } } return helper; } private IConnectionInfoProvider getProvider( ICategory category ) { String instanceID = category.getId(); IConnectionInfoProvider result = getProviderFromCategoryID(instanceID); if (null == result) { ICategory parent = category.getParent(); if (null != parent) { return getProvider(parent); } } return result; } private IConnectionInfoProvider getProviderFromCategoryID( String categoryId ) { IConnectionInfoProvider helper = null; IExtensionRegistry reg = Platform.getExtensionRegistry(); IConfigurationElement[] extensions = reg.getConfigurationElementsFor(EXTENSION); for (int i = 0; i < extensions.length; i++) { IConfigurationElement element = extensions[i]; if (categoryId.equals(element.getAttribute(CATEGORY_ATTRIBUTE))) { try { helper = (IConnectionInfoProvider)element.createExecutableExtension(CLASS_ATTRIBUTE); break; } catch (Exception e) { DatatoolsPlugin.Util.log(IStatus.ERROR, e.getMessage()); } } } return helper; } /** * @param modeResource a <code>ModelResource</code> with connection information. * @return the <code>IConnectionInfoProvider</code> for the <code>IConnectionProfile</code>. Can be null if there is no * <code>IConnectionInfoProvider</code> registered for that profileID. */ public IConnectionInfoProvider getProvider( ModelResource modelResource ) throws Exception { IConnectionInfoProvider result = null; if (!helper.hasConnectionInfo(modelResource)) { throw new Exception(DatatoolsPlugin.Util.getString("ConnectionInfoProviderFactory.noConnectionInfoInModel", modelResource.getItemName())); //$NON-NLS-1$ } IConnectionProfile profile = helper.getConnectionProfile(modelResource); if (null == profile) { throw new Exception(DatatoolsPlugin.Util.getString("ConnectionInfoProviderFactory.noConnectionProfileInModel", modelResource.getItemName())); //$NON-NLS-1$ } result = getProvider(profile); if (null == result) { ICategory category = profile.getCategory(); if (null == category) { throw new Exception(DatatoolsPlugin.Util.getString("ConnectionInfoProviderFactory.noCategoryForProfile", profile.getName())); //$NON-NLS-1$ } result = getProvider(category); } return result; } /** * @param modeResource a <code>ModelResource</code> with connection information. * @return if a connection provider can be discovered for a model resource */ public boolean hasProvider( ModelResource modelResource ) throws Exception { if (!helper.hasConnectionInfo(modelResource)) { return false; } IConnectionProfile profile = helper.getConnectionProfile(modelResource); if (null == profile) { return false; } IConnectionInfoProvider result = getProvider(profile); if (null == result) { ICategory category = profile.getCategory(); if (null == category) { return false; } result = getProvider(category); } return result != null; } public IConnectionInfoProvider getProvider( Properties props ) { IConnectionInfoProvider result = null; String providerID = props.getProperty(IConnectionInfoHelper.CONNECTION_PROFILE_NAMESPACE + IConnectionInfoHelper.PROFILE_PROVIDER_ID_KEY); result = getProviderFromProfileID(providerID); if (null == result) { String categoryID = props.getProperty(IConnectionInfoHelper.CONNECTION_PROFILE_NAMESPACE + IConnectionInfoHelper.CATEGORY_ID_KEY); result = getProviderFromCategoryID(categoryID); } return result; } }