/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.ext.generic;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.ext.generic.model.meta.GenericMetaModel;
import org.jkiss.dbeaver.ext.generic.model.meta.GenericMetaModelDescriptor;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.connection.DBPConnectionConfiguration;
import org.jkiss.dbeaver.model.connection.DBPDriver;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSourceProvider;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.registry.driver.DriverDescriptor;
import org.jkiss.utils.CommonUtils;
import java.util.HashMap;
import java.util.Map;
public class GenericDataSourceProvider extends JDBCDataSourceProvider {
private final Map<String, GenericMetaModelDescriptor> metaModels = new HashMap<>();
private static final String EXTENSION_ID = "org.jkiss.dbeaver.generic.meta";
public GenericDataSourceProvider()
{
metaModels.put(GenericConstants.META_MODEL_STANDARD, new GenericMetaModelDescriptor());
IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
IConfigurationElement[] extElements = extensionRegistry.getConfigurationElementsFor(EXTENSION_ID);
for (IConfigurationElement ext : extElements) {
GenericMetaModelDescriptor metaModel = new GenericMetaModelDescriptor(ext);
metaModels.put(metaModel.getId(), metaModel);
for (String driverClass : metaModel.getDriverClass()) {
metaModels.put(driverClass, metaModel);
}
}
}
@Override
public long getFeatures()
{
return FEATURE_CATALOGS | FEATURE_SCHEMAS;
}
@Override
public String getConnectionURL(DBPDriver driver, DBPConnectionConfiguration connectionInfo)
{
try {
String urlTemplate = driver.getSampleURL();
if (CommonUtils.isEmptyTrimmed(urlTemplate)) {
return connectionInfo.getUrl();
}
DriverDescriptor.MetaURL metaURL = DriverDescriptor.parseSampleURL(urlTemplate);
StringBuilder url = new StringBuilder();
for (String component : metaURL.getUrlComponents()) {
String newComponent = component;
if (!CommonUtils.isEmpty(connectionInfo.getHostName())) {
newComponent = newComponent.replace(makePropPattern(DriverDescriptor.PROP_HOST), connectionInfo.getHostName());
}
if (!CommonUtils.isEmpty(connectionInfo.getHostPort())) {
newComponent = newComponent.replace(makePropPattern(DriverDescriptor.PROP_PORT), connectionInfo.getHostPort());
}
if (!CommonUtils.isEmpty(connectionInfo.getServerName())) {
newComponent = newComponent.replace(makePropPattern(DriverDescriptor.PROP_SERVER), connectionInfo.getServerName());
}
if (!CommonUtils.isEmpty(connectionInfo.getDatabaseName())) {
newComponent = newComponent.replace(makePropPattern(DriverDescriptor.PROP_DATABASE), connectionInfo.getDatabaseName());
newComponent = newComponent.replace(makePropPattern(DriverDescriptor.PROP_FOLDER), connectionInfo.getDatabaseName());
newComponent = newComponent.replace(makePropPattern(DriverDescriptor.PROP_FILE), connectionInfo.getDatabaseName());
}
newComponent = newComponent.replace(makePropPattern(DriverDescriptor.PROP_USER), CommonUtils.notEmpty(connectionInfo.getUserName()));
newComponent = newComponent.replace(makePropPattern(DriverDescriptor.PROP_PASSWORD), CommonUtils.notEmpty(connectionInfo.getUserPassword()));
if (newComponent.startsWith("[")) { //$NON-NLS-1$
if (!newComponent.equals(component)) {
url.append(newComponent.substring(1, newComponent.length() - 1));
}
} else {
url.append(newComponent);
}
}
return url.toString();
} catch (DBException e) {
log.error(e);
return null;
}
}
@NotNull
@Override
public DBPDataSource openDataSource(
@NotNull DBRProgressMonitor monitor,
@NotNull DBPDataSourceContainer container)
throws DBException
{
GenericMetaModelDescriptor metaModel = null;
Object metaModelId = container.getDriver().getDriverParameter(GenericConstants.PARAM_META_MODEL);
if (metaModelId != null && !GenericConstants.META_MODEL_STANDARD.equals(metaModelId)) {
metaModel = metaModels.get(metaModelId.toString());
if (metaModel == null) {
log.warn("Meta model '" + metaModelId + "' not recognized. Default one will be used");
}
}
if (metaModel == null) {
// Try to get model by driver class
metaModel = metaModels.get(container.getDriver().getDriverClassName());
}
if (metaModel == null) {
metaModel = getStandardMetaModel();
}
GenericMetaModel metaModelInstance = metaModel.getInstance();
return metaModelInstance.createDataSource(monitor, container);
}
protected GenericMetaModelDescriptor getStandardMetaModel() {
return metaModels.get(GenericConstants.META_MODEL_STANDARD);
}
private static String makePropPattern(String prop)
{
return "{" + prop + "}"; //$NON-NLS-1$ //$NON-NLS-2$
}
}