diff --git a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/tools/sqldeveloper/ConfigImportWizardPageSqlDeveloper.java b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/tools/sqldeveloper/ConfigImportWizardPageSqlDeveloper.java index 2166d7d26f03c8fcf403d4a52627184f56194d5b..601c8ccfce70e0adb9215809cd6b75effed825ab 100644 --- a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/tools/sqldeveloper/ConfigImportWizardPageSqlDeveloper.java +++ b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/tools/sqldeveloper/ConfigImportWizardPageSqlDeveloper.java @@ -17,7 +17,11 @@ package org.jkiss.dbeaver.ext.oracle.tools.sqldeveloper; +import com.google.gson.*; +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.Log; 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; @@ -26,6 +30,7 @@ import org.jkiss.dbeaver.ext.oracle.Activator; import org.jkiss.dbeaver.ext.oracle.OracleMessages; import org.jkiss.dbeaver.ext.oracle.model.OracleConstants; import org.jkiss.dbeaver.ext.oracle.model.dict.OracleConnectionType; +import org.jkiss.dbeaver.model.data.json.JSONUtils; import org.jkiss.dbeaver.utils.RuntimeUtils; import org.jkiss.utils.CommonUtils; import org.jkiss.utils.xml.XMLException; @@ -33,24 +38,24 @@ 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; +import java.io.*; +import java.util.*; 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_CONFIG_JSON_FILE = "connections.json"; public static final String SQLD_SYSCONFIG_FOLDER = "system"; public static final String SQLD_CONNECTIONS_FOLDER = "o.jdeveloper.db.connection"; + private static final Log log = Log.getLog(ConfigImportWizardPageSqlDeveloper.class); + private final ImportDriverInfo oraDriver; - protected ConfigImportWizardPageSqlDeveloper() - { + protected ConfigImportWizardPageSqlDeveloper() { super("SQLDeveloper"); setTitle("SQL Developer"); setDescription("Import Oracle SQL Developer connections"); @@ -95,11 +100,182 @@ public class ConfigImportWizardPageSqlDeveloper extends ConfigImportWizardPage { continue; } final File connectionFolder = connectionFolders[0]; + final File connectionsJsonFile = new File(connectionFolder, SQLD_CONFIG_JSON_FILE); final File connectionsFile = new File(connectionFolder, SQLD_CONFIG_FILE); - if (!connectionsFile.exists()) { - continue; + if (connectionsFile.exists()) { + parseConnections(connectionsFile, importData); + } else if (connectionsJsonFile.exists()) { + parseJsonConnections(connectionsJsonFile, importData); + } + + } + } + + public static class ConnectionDescription { + @SerializedName("name") + private String name; + @SerializedName("type") + private String type; + @SerializedName("info") + private ConnectionInfo info; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public ConnectionInfo getInfo() { + return info; + } + + public void setInfo(ConnectionInfo info) { + this.info = info; + } + } + + public static class ConnectionList { + @SerializedName("connections") + private List connections = new ArrayList(); + + public List getConnections() { + return connections; + } + } + + public class ConnectionInfo { + @SerializedName("role") + private String role; + @SerializedName("hostname") + private String hostname; + @SerializedName("port") + private String port; + @SerializedName("sid") + private String sid; + @SerializedName("serviceName") + private String serviceName; + @SerializedName("user") + private String user; + @SerializedName("customUrl") + private String customUrl; + @SerializedName("OS_AUTHENTICATION") + private String OsAuth; + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + public String getHost() { + return hostname; + } + + public void setHost(String hostname) { + this.hostname = hostname; + } + + public String getPort() { + return port; + } + + public void setPort(String port) { + this.port = port; + } + + public String getSID() { + return sid; + } + + public void setSID(String sid) { + this.sid = sid; + } + + public String getServiceName() { + return serviceName; + } + + public void setServiceName(String serviceName) { + this.serviceName = serviceName; + } + + public String getUser() { + return user; + } + + public void setUser(String user) { + this.user = user; + } + + public String getUrl() { + return customUrl; + } + + public void setUrl(String customUrl) { + this.customUrl = customUrl; + } + + public String getOsAuth() { + return OsAuth; + } + + public void setOsAuth(String OS_AUTHENTICATION) { + this.OsAuth = OS_AUTHENTICATION; + } + + } + + private void parseJsonConnections(File connectionsFile, ImportData importData) throws JsonSyntaxException { + try { + Gson gson = new GsonBuilder().create(); + try (Reader br = new BufferedReader(new FileReader(connectionsFile))) { + ConnectionList connResult = gson.fromJson(br, ConnectionList.class); + for (ConnectionDescription conn : connResult.getConnections()) { + if (CommonUtils.isEmpty(conn.getName())) { + continue; + } + + ConnectionInfo info = conn.getInfo(); + + if (CommonUtils.isEmpty(info.getHost()) && CommonUtils.isEmpty(info.getUrl())) { + continue; + } + + String dbName = CommonUtils.isEmpty(info.getSID()) ? info.getServiceName() : info.getSID(); + + ImportConnectionInfo connectionInfo = new ImportConnectionInfo(oraDriver, null, conn.getName(), info.getUrl(), info.getHost(), info.getPort(), dbName, info.getHost(), null); + if (!CommonUtils.isEmpty(info.getSID())) { + connectionInfo.setProviderProperty(OracleConstants.PROP_SID_SERVICE, OracleConnectionType.SID.name()); + } else if (!CommonUtils.isEmpty(info.getServiceName())) { + connectionInfo.setProviderProperty(OracleConstants.PROP_SID_SERVICE, OracleConnectionType.SERVICE.name()); + } + if (CommonUtils.toBoolean(info.getOsAuth())) { + connectionInfo.setUser(OracleConstants.OS_AUTH_PROP); + } + if (!CommonUtils.isEmpty(info.getRole())) { + connectionInfo.setProviderProperty(OracleConstants.PROP_INTERNAL_LOGON, info.getRole()); + } + if (!CommonUtils.isEmpty(conn.getType())) { + connectionInfo.setProviderProperty(OracleConstants.PROP_CONNECTION_TYPE, conn.getType()); + } + + importData.addConnection(connectionInfo); + } } - parseConnections(connectionsFile, importData); + } catch (Exception e) { + log.error("Configuration parse error", e); } }