/* * 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.oracle.tools.sqldeveloper; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.ext.import_config.wizards.ConfigImportWizardPage; import org.jkiss.dbeaver.ext.import_config.wizards.ImportConnectionInfo; import org.jkiss.dbeaver.ext.import_config.wizards.ImportData; import org.jkiss.dbeaver.ext.import_config.wizards.ImportDriverInfo; import org.jkiss.dbeaver.ext.oracle.Activator; import org.jkiss.dbeaver.ext.oracle.model.OracleConstants; import org.jkiss.dbeaver.ext.oracle.model.dict.OracleConnectionType; import org.jkiss.dbeaver.utils.RuntimeUtils; import org.jkiss.utils.CommonUtils; import org.jkiss.utils.xml.XMLException; import org.jkiss.utils.xml.XMLUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; import java.io.File; import java.io.FilenameFilter; import java.util.LinkedHashMap; import java.util.Map; public class ConfigImportWizardPageSqlDeveloper extends ConfigImportWizardPage { public static final String SQLD_HOME_FOLDER = "SQL Developer"; public static final String SQLD_CONFIG_FILE = "connections.xml"; public static final String SQLD_SYSCONFIG_FOLDER = "system"; public static final String SQLD_CONNECTIONS_FOLDER = "o.jdeveloper.db.connection."; private final ImportDriverInfo oraDriver; protected ConfigImportWizardPageSqlDeveloper() { super("SQLDeveloper"); setTitle("SQL Developer"); setDescription("Import Oracle SQL Developer connections"); setImageDescriptor(Activator.getImageDescriptor("icons/sqldeveloper_big.png")); oraDriver = new ImportDriverInfo(null, "Oracle", "jdbc:oracle:thin:@{host}[:{port}]/{database}", "oracle.jdbc.OracleDriver"); } @Override protected void loadConnections(ImportData importData) throws DBException { importData.addDriver(oraDriver); File homeFolder = RuntimeUtils.getUserHomeDir(); File sqlDevHome = new File(homeFolder, "AppData/Roaming/" + SQLD_HOME_FOLDER); if (!sqlDevHome.exists()) { sqlDevHome = new File(homeFolder, "Application Data/" + SQLD_HOME_FOLDER); if (!sqlDevHome.exists()) { sqlDevHome = new File(homeFolder, ".sqldeveloper"); // On Linux if (!sqlDevHome.exists()) { throw new DBException("SQL Developer installation not found"); } } } final File[] sysConfFolders = sqlDevHome.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.contains(SQLD_SYSCONFIG_FOLDER); } }); if (sysConfFolders == null || sysConfFolders.length == 0) { throw new DBException("SQL Developer config not found"); } for (File sysConfFolder : sysConfFolders) { final File[] connectionFolders = sysConfFolder.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.contains(SQLD_CONNECTIONS_FOLDER); } }); if (connectionFolders == null || connectionFolders.length != 1) { continue; } final File connectionFolder = connectionFolders[0]; final File connectionsFile = new File(connectionFolder, SQLD_CONFIG_FILE); if (!connectionsFile.exists()) { continue; } parseConnections(connectionsFile, importData); } } private void parseConnections(File connectionsFile, ImportData importData) throws DBException { try { Document configDocument = XMLUtils.parseDocument(connectionsFile); for (Element refElement : XMLUtils.getChildElementList(configDocument.getDocumentElement(), "Reference")) { final String conName = refElement.getAttribute("name"); if (CommonUtils.isEmpty(conName)) { continue; } final Map<String, String> propsMap = new LinkedHashMap<>(); final Element refAddressesElement = XMLUtils.getChildElement(refElement, "RefAddresses"); if (refAddressesElement != null) { for (Element refAddr : XMLUtils.getChildElementList(refAddressesElement, "StringRefAddr")) { String addrType = refAddr.getAttribute("addrType"); String addrContent = XMLUtils.getChildElementBody(refAddr, "Contents"); if (!CommonUtils.isEmpty(addrType) && !CommonUtils.isEmpty(addrContent)) { propsMap.put(addrType, addrContent); } } } String host = propsMap.get("hostname"); String port = propsMap.get("port"); String sid = propsMap.get("sid"); String serviceName = propsMap.get("serviceName"); String user = propsMap.get("user"); String role = propsMap.get("role"); String osAuth = propsMap.get("OS_AUTHENTICATION"); String url = propsMap.get("customUrl"); if (CommonUtils.isEmpty(host) && CommonUtils.isEmpty(url)) { continue; } String dbName = CommonUtils.isEmpty(sid) ? serviceName : sid; ImportConnectionInfo connectionInfo = new ImportConnectionInfo(oraDriver, null, conName, url, host, port, dbName, user, null); if (!CommonUtils.isEmpty(sid)) { connectionInfo.setProviderProperty(OracleConstants.PROP_SID_SERVICE, OracleConnectionType.SID.name()); } else if (!CommonUtils.isEmpty(serviceName)) { connectionInfo.setProviderProperty(OracleConstants.PROP_SID_SERVICE, OracleConnectionType.SERVICE.name()); } if (CommonUtils.toBoolean(osAuth)) { connectionInfo.setUser(OracleConstants.OS_AUTH_USER_NAME); } if (!CommonUtils.isEmpty(role)) { connectionInfo.setProviderProperty(OracleConstants.PROP_INTERNAL_LOGON, role); } importData.addConnection(connectionInfo); } } catch (XMLException e) { throw new DBException("Configuration parse error: " + e.getMessage()); } } }