/*
* 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.jdbc.ui.wizards;
import java.util.Collection;
import java.util.Iterator;
import java.util.Properties;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.datatools.connectivity.IConnectionProfile;
import org.eclipse.datatools.connectivity.drivers.jdbc.IJDBCDriverDefinitionConstants;
import org.eclipse.emf.ecore.EObject;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.workspace.ModelResource;
import org.teiid.designer.core.workspace.ModelUtil;
import org.teiid.designer.core.workspace.ModelWorkspaceException;
import org.teiid.designer.datatools.DatatoolsPlugin;
import org.teiid.designer.datatools.JdbcTranslatorHelper;
import org.teiid.designer.datatools.connection.ConnectionInfoHelper;
import org.teiid.designer.datatools.connection.IConnectionInfoProvider;
import org.teiid.designer.jdbc.JdbcSource;
import org.teiid.designer.jdbc.ui.InternalModelerJdbcUiPluginConstants;
import org.teiid.designer.type.IDataTypeManagerService.DataSourceTypes;
/**
*
*
* @since 8.0
*/
public class JDBCConnectionInfoProvider extends ConnectionInfoHelper implements IConnectionInfoProvider {
// The constants used by DTP JDBC ConnectionProfiles
public static final String SAVE_PWD_KEY = "org.eclipse.datatools.connectivity.db.savePWD"; //$NON-NLS-1$
public static final String DRIVER_DEFN_TYPE_KEY = "org.eclipse.datatools.connectivity.drivers.defnType"; //$NON-NLS-1$
public static final String USERNAME_KEY = "org.eclipse.datatools.connectivity.db.username"; //$NON-NLS-1$
public static final String DRIVER_CLASS_KEY = "org.eclipse.datatools.connectivity.db.driverClass"; //$NON-NLS-1$
public static final String DRIVER_DEFN_ID_KEY = "org.eclipse.datatools.connectivity.db.driverDefinitionID"; //$NON-NLS-1$
public static final String DATABASE_NAME_KEY = "org.eclipse.datatools.connectivity.db.databaseName"; //$NON-NLS-1$
public static final String PASSWORD_KEY = "org.eclipse.datatools.connectivity.db.password"; //$NON-NLS-1$
public static final String URL_KEY = "org.eclipse.datatools.connectivity.db.URL"; //$NON-NLS-1$
public static final String VERSION_KEY = "org.eclipse.datatools.connectivity.db.version"; //$NON-NLS-1$
public static final String VENDOR_KEY = "org.eclipse.datatools.connectivity.db.vendor"; //$NON-NLS-1$
// the constants used by the Teiid JDBC datasources
String DRIVER_CLASS = "driver-class"; //$NON-NLS-1$
String VENDOR = "vendor"; //$NON-NLS-1$
String VERSION = "version"; //$NON-NLS-1$
String DATABASE_NAME = "databaseName"; //$NON-NLS-1$
String URL = "connection-url"; //$NON-NLS-1$
String USERNAME = "user-name"; //$NON-NLS-1$
String PASSWORD = "password"; //$NON-NLS-1$
String JARLIST = "jarList"; //$NON-NLS-1$
String UNKNOWN = "unknown"; //$NON-NLS-1$
/**
* These are the property keys used for the jdbc source settings of physical models that were created in the legacy MMX JDBC
* Import Wizard
*/
public static final String JDBC_IMPORT_DRIVER_CLASS = "com.metamatrix.modeler.jdbc.JdbcSource.driverClass"; //$NON-NLS-1$
public static final String JDBC_IMPORT_URL = "com.metamatrix.modeler.jdbc.JdbcSource.url"; //$NON-NLS-1$
public static final String JDBC_IMPORT_USERNAME = "com.metamatrix.modeler.jdbc.JdbcSource.username"; //$NON-NLS-1$
public static final String JDBC_IMPORT_DRIVER_NAME = "com.metamatrix.modeler.jdbc.JdbcSource.driverName"; //$NON-NLS-1$
/**
* {@inheritDoc}
*
* @see org.teiid.designer.datatools.connection.ConnectionInfoHelper#setConnectionInfo(org.teiid.designer.core.workspace.ModelResource,
* org.eclipse.datatools.connectivity.IConnectionProfile)
*/
@Override
public void setConnectionInfo( ModelResource modelResource,
IConnectionProfile connectionProfile ) {
CoreArgCheck.isNotNull(modelResource, "modelResource"); //$NON-NLS-1$
CoreArgCheck.isNotNull(connectionProfile, "connectionProfile"); //$NON-NLS-1$
try {
Properties connectionProps = getCommonProfileProperties(connectionProfile);
connectionProps.put(CONNECTION_NAMESPACE + PROFILE_ID_KEY, connectionProfile.getProviderId());
Properties baseProps = connectionProfile.getBaseProperties();
String driverClassName = null;
boolean enoughProps = true;
if (baseProps.get(DRIVER_CLASS_KEY) != null) {
driverClassName = baseProps.get(DRIVER_CLASS_KEY).toString();
connectionProps.put(CONNECTION_NAMESPACE + DRIVER_CLASS, baseProps.get(DRIVER_CLASS_KEY));
} else {
enoughProps = false;
}
if (baseProps.get(URL_KEY) != null) {
connectionProps.put(CONNECTION_NAMESPACE + URL, baseProps.get(URL_KEY));
} else {
enoughProps = false;
}
if (baseProps.get(USERNAME_KEY) != null) {
connectionProps.put(CONNECTION_NAMESPACE + USERNAME, baseProps.get(USERNAME_KEY));
} else {
enoughProps = false;
}
// if (baseProps.get(PASSWORD_KEY) != null) {
// connectionProps.put(CONNECTION_NAMESPACE + PASSWORD, baseProps.get(PASSWORD_KEY));
// }
if (baseProps.get(JARLIST) != null) {
connectionProps.put(CONNECTION_NAMESPACE + JARLIST, baseProps.get(JARLIST));
} else {
enoughProps = false;
}
if (!enoughProps) {
throw new ModelWorkspaceException(
InternalModelerJdbcUiPluginConstants.Util.getString("JDBCConnectionInfoProvider.notEnoughConnectionProviders", //$NON-NLS-1$
modelResource.getItemName()));
}
// Remove old connection properties
getHelper().removeProperties(modelResource, CONNECTION_PROFILE_NAMESPACE);
getHelper().removeProperties(modelResource, CONNECTION_NAMESPACE);
getHelper().removeProperties(modelResource, TRANSLATOR_NAMESPACE);
getHelper().removeProperties(modelResource, JDBCCONNECTION_NAMESPACE);
// Add JDBC translator
String translatorName = JdbcTranslatorHelper.getTranslator(connectionProfile);
// If could not determine specific translator, try match using driver name
if(translatorName.equals("jdbc-simple")) { //$NON-NLS-1$
translatorName = JdbcTranslatorHelper.getTranslatorFromDriverName(driverClassName);
}
connectionProps.put(TRANSLATOR_NAMESPACE + TRANSLATOR_NAME_KEY, translatorName);
// Add new connection properties
getHelper().setProperties(modelResource, connectionProps);
} catch (ModelWorkspaceException e) {
DatatoolsPlugin.Util.log(IStatus.ERROR,
e,
DatatoolsPlugin.Util.getString("errorSettingConnectionProfilePropertiesForModelResource", //$NON-NLS-1$
modelResource.getItemName()));
}
}
/**
* {@inheritDoc}
*
* @see org.teiid.designer.datatools.connection.IConnectionInfoProvider#getTeiidRelatedProperties(org.eclipse.datatools.connectivity.IConnectionProfile)
*/
@Override
public Properties getTeiidRelatedProperties( IConnectionProfile connectionProfile ) {
Properties connectionProps = new Properties();
Properties baseProps = connectionProfile.getBaseProperties();
if (baseProps.get(DRIVER_CLASS) != null) {
connectionProps.put(DRIVER_CLASS, baseProps.get(DRIVER_CLASS));
} else if( baseProps.get(DRIVER_CLASS_KEY) != null) {
connectionProps.put(DRIVER_CLASS, baseProps.get(DRIVER_CLASS_KEY));
}
if (baseProps.get(URL) != null) {
connectionProps.put(URL, baseProps.get(URL));
} else if (baseProps.get(URL_KEY) != null) {
connectionProps.put(URL, baseProps.get(URL_KEY));
}
if (baseProps.get(USERNAME) != null) {
connectionProps.put(USERNAME, baseProps.get(USERNAME));
} else if (baseProps.get(USERNAME_KEY) != null) {
connectionProps.put(USERNAME, baseProps.get(USERNAME_KEY));
}
if (baseProps.get(PASSWORD) != null) {
connectionProps.put(PASSWORD, baseProps.get(PASSWORD));
} else if (baseProps.get(PASSWORD_KEY) != null) {
connectionProps.put(PASSWORD, baseProps.get(PASSWORD_KEY));
}
if (baseProps.get(JARLIST) != null) {
connectionProps.put(JARLIST, baseProps.get(JARLIST));
}
return connectionProps;
}
/**
* @param resource
* @return the JdbcSource object
* @throws ModelWorkspaceException
*/
private JdbcSource findJdbcSource( final IResource resource ) throws ModelWorkspaceException {
ModelResource mr = ModelUtil.getModelResource((IFile)resource, true);
if (mr != null) {
Collection allEObjects = mr.getEObjects();
for (Iterator iter = allEObjects.iterator(); iter.hasNext();) {
EObject nextEObject = (EObject)iter.next();
if (nextEObject instanceof JdbcSource) {
return (JdbcSource)nextEObject;
}
}
} else {
throw new ModelWorkspaceException(
InternalModelerJdbcUiPluginConstants.Util.getString("JDBCConnectionInfoProvider.errorFindingModelResourceForModelFile", //$NON-NLS-1$
resource.getName()));
}
return null;
}
/**
* Get a set of property name to values for JDBC connection properties in a model's JdbcSource object. These properties are
* "legacy" properties and should be treated as deprecated and may or may not exist.
*
* @param modelResource the model resource containing the JDBC properties being requested
* @return properties, the JDBC connection properties (never <code>null</code> but maybe empty)
* @throws ModelWorkspaceException
* @since 5.0
*/
public Properties getModelJdbcConnectionProperties( ModelResource modelResource ) throws ModelWorkspaceException {
CoreArgCheck.isNotNull(modelResource, "modelResource"); //$NON-NLS-1$
Properties result = new Properties();
if (ModelUtil.isPhysical(modelResource.getEmfResource())) {
JdbcSource jdbcSource = findJdbcSource(modelResource.getCorrespondingResource());
if (jdbcSource != null) {
if (jdbcSource.getDriverClass() != null) {
result.put(DRIVER_CLASS, jdbcSource.getDriverClass());
}
if (jdbcSource.getUrl() != null) {
result.put(URL, jdbcSource.getUrl());
}
if (jdbcSource.getUsername() != null) {
result.put(USERNAME, jdbcSource.getUsername());
}
if (jdbcSource.getPassword() != null) {
result.put(PASSWORD, jdbcSource.getPassword());
}
} else {
}
}
return result;
}
/**
* {@inheritDoc}
*
* @see org.teiid.designer.datatools.connection.IConnectionInfoHelper#getPasswordPropertyKey()
*/
@Override
public String getPasswordPropertyKey() {
return IJDBCDriverDefinitionConstants.PASSWORD_PROP_ID;
}
/**
* {@inheritDoc}
*
* @see org.teiid.designer.datatools.connection.IConnectionInfoHelper#getDataSourcePasswordPropertyKey()
*/
@Override
public String getDataSourcePasswordPropertyKey() {
return PASSWORD;
}
/**
* {@inheritDoc}
*
* @see org.teiid.designer.datatools.connection.IConnectionInfoProvider#getDataSourceType()
*/
@Override
public String getDataSourceType() {
return ModelerCore.getTeiidDataTypeManagerService().getDataSourceType(DataSourceTypes.JDBC);
}
@Override
public boolean requiresPassword(IConnectionProfile connectionProfile) {
return true;
}
}