From 87175f14e9e0904cb0a87599a1841c6c29b0a2ca Mon Sep 17 00:00:00 2001 From: vipinbhatt Date: Mon, 7 Oct 2024 11:10:38 +0530 Subject: [PATCH 1/6] Enable TLS Support (DTS - Specific) --- .../cdap/plugin/oracle/OracleConnector.java | 2 +- .../plugin/oracle/OracleConnectorConfig.java | 16 ++++-- .../cdap/plugin/oracle/OracleConstants.java | 52 +++++++++++++++++-- .../io/cdap/plugin/oracle/OracleSource.java | 6 +-- .../oracle/OracleFailedConnectionTest.java | 2 +- 5 files changed, 65 insertions(+), 13 deletions(-) diff --git a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConnector.java b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConnector.java index bc7907b26..3d2f7399a 100644 --- a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConnector.java +++ b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConnector.java @@ -126,7 +126,7 @@ protected String getConnectionString(@Nullable String database) { return config.getConnectionString(); } return OracleConstants.getConnectionString(config.getConnectionType(), - config.getHost(), config.getPort(), database); + config.getHost(), config.getPort(), database, config.getSSlMode()); } @Override diff --git a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConnectorConfig.java b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConnectorConfig.java index a60476bd5..b0c8930ed 100644 --- a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConnectorConfig.java +++ b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConnectorConfig.java @@ -43,12 +43,12 @@ public OracleConnectorConfig(String host, int port, String user, String password public OracleConnectorConfig(String host, int port, String user, String password, String jdbcPluginName, String connectionArguments, String connectionType, String database) { - this(host, port, user, password, jdbcPluginName, connectionArguments, connectionType, database, null); + this(host, port, user, password, jdbcPluginName, connectionArguments, connectionType, database, null, null); } public OracleConnectorConfig(String host, int port, String user, String password, String jdbcPluginName, String connectionArguments, String connectionType, String database, - String role) { + String role, String useSSL) { this.host = host; this.port = port; @@ -59,11 +59,12 @@ public OracleConnectorConfig(String host, int port, String user, String password this.connectionType = connectionType; this.database = database; this.role = role; + this.useSSL = useSSL; } @Override public String getConnectionString() { - return OracleConstants.getConnectionString(connectionType, host, getPort(), database); + return OracleConstants.getConnectionString(connectionType, host, getPort(), database, useSSL); } @Name(OracleConstants.CONNECTION_TYPE) @@ -86,6 +87,11 @@ public String getConnectionString() { @Nullable private String transactionIsolationLevel; + @Name(OracleConstants.USE_SSL) + @Description("Turns on SSL encryption. Connection will fail if SSL is not available") + @Nullable + public String useSSL; + @Override protected int getDefaultPort() { return 1521; @@ -103,6 +109,10 @@ public String getDatabase() { return database; } + public String getSSlMode() { + return useSSL; + } + @Override public Properties getConnectionArgumentsProperties() { Properties prop = super.getConnectionArgumentsProperties(); diff --git a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java index ec44d7b94..ddcd7bd68 100644 --- a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java +++ b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java @@ -27,8 +27,9 @@ private OracleConstants() { } public static final String PLUGIN_NAME = "Oracle"; - public static final String ORACLE_CONNECTION_STRING_SID_FORMAT = "jdbc:oracle:thin:@%s:%s:%s"; - public static final String ORACLE_CONNECTION_STRING_SERVICE_NAME_FORMAT = "jdbc:oracle:thin:@//%s:%s/%s"; + // Updating connection strings to accept protocol (e.g., jdbc:oracle:thin:@://:/) + public static final String ORACLE_CONNECTION_STRING_SID_FORMAT = "jdbc:oracle:thin:@%s:%s:%s/%s"; + public static final String ORACLE_CONNECTION_STRING_SERVICE_NAME_FORMAT = "jdbc:oracle:thin:@%s://%s:%s/%s"; public static final String ORACLE_CONNECTION_STRING_TNS_FORMAT = "jdbc:oracle:thin:@%s"; public static final String DEFAULT_BATCH_VALUE = "defaultBatchValue"; public static final String DEFAULT_ROW_PREFETCH = "defaultRowPrefetch"; @@ -36,8 +37,10 @@ private OracleConstants() { public static final String CONNECTION_TYPE = "connectionType"; public static final String ROLE = "role"; public static final String NAME_DATABASE = "database"; - public static final String TNS_CONNECTION_TYPE = "TNS"; + public static final String TNS_CONNECTION_TYPE = "tns"; public static final String TRANSACTION_ISOLATION_LEVEL = "transactionIsolationLevel"; + public static final String USE_SSL = "useSSL"; + public static final String DEFAULT_CONNECTION_PROTOCOL = "tcp"; /** * Returns the Connection String for the given ConnectionType. @@ -57,9 +60,48 @@ public static String getConnectionString(String connectionType, } if (OracleConstants.SERVICE_CONNECTION_TYPE.equalsIgnoreCase(connectionType)) { return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SERVICE_NAME_FORMAT, - host, port, database); + DEFAULT_CONNECTION_PROTOCOL, host, port, database); } return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SID_FORMAT, - host, port, database); + DEFAULT_CONNECTION_PROTOCOL, host, port, database); + } + + /** + * Constructs the Oracle connection string based on the provided connection type, host, port, and database. + * If SSL is enabled, the connection protocol will be "tcps" instead of "tcp". + * + * @param connectionType TNS/Service/SID + * @param host Host name of the oracle server + * @param port Port of the oracle server + * @param database Database to connect to + * @param useSSL Whether SSL/TLS is required(YES/NO) + * @return Connection String based on the given parameters and connection type. + */ + public static String getConnectionString(String connectionType, + @Nullable String host, + @Nullable int port, + String database, + @Nullable String useSSL) { + // Use protocol as "tcps" when SSL is requested or else use "tcp". + String connectionProtocol; + if (useSSL != null && useSSL.equalsIgnoreCase("yes")) { + connectionProtocol = "tcps"; + } else { + connectionProtocol = "tcp"; + } + + switch (connectionType.toLowerCase()) { + case OracleConstants.TNS_CONNECTION_TYPE: + // TNS connection doesn't require protocol + return String.format(OracleConstants.ORACLE_CONNECTION_STRING_TNS_FORMAT, database); + case OracleConstants.SERVICE_CONNECTION_TYPE: + // Service connection uses protocol, host, port, and database + return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SERVICE_NAME_FORMAT, + connectionProtocol, host, port, database); + default: + // Default to SID format if no matching case is found + return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SID_FORMAT, + connectionProtocol, host, port, database); + } } } diff --git a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleSource.java b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleSource.java index eca7e2532..7bfea6789 100644 --- a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleSource.java +++ b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleSource.java @@ -117,9 +117,9 @@ public OracleSourceConfig(String host, int port, String user, String password, S String connectionArguments, String connectionType, String database, String role, int defaultBatchValue, int defaultRowPrefetch, String importQuery, Integer numSplits, int fetchSize, - String boundingQuery, String splitBy) { + String boundingQuery, String splitBy, String useSSL) { this.connection = new OracleConnectorConfig(host, port, user, password, jdbcPluginName, connectionArguments, - connectionType, database, role); + connectionType, database, role, useSSL); this.defaultBatchValue = defaultBatchValue; this.defaultRowPrefetch = defaultRowPrefetch; this.fetchSize = fetchSize; @@ -132,7 +132,7 @@ public OracleSourceConfig(String host, int port, String user, String password, S @Override public String getConnectionString() { return OracleConstants.getConnectionString(connection.getConnectionType(), connection.getHost(), - connection.getPort(), connection.getDatabase()); + connection.getPort(), connection.getDatabase(), connection.getSSlMode()); } @Override diff --git a/oracle-plugin/src/test/java/io/cdap/plugin/oracle/OracleFailedConnectionTest.java b/oracle-plugin/src/test/java/io/cdap/plugin/oracle/OracleFailedConnectionTest.java index a2c9bcd5e..edcb18473 100644 --- a/oracle-plugin/src/test/java/io/cdap/plugin/oracle/OracleFailedConnectionTest.java +++ b/oracle-plugin/src/test/java/io/cdap/plugin/oracle/OracleFailedConnectionTest.java @@ -31,7 +31,7 @@ public void test() throws ClassNotFoundException, IOException { new OracleConnectorConfig("localhost", 1521, "username", "password", "jdbc", "", "database")); super.test(JDBC_DRIVER_CLASS_NAME, connector, "Failed to create connection to database via connection string:" + - " jdbc:oracle:thin:@localhost:1521:database and arguments: " + + " jdbc:oracle:thin:@tcp:localhost:1521/database and arguments: " + "{user=username, oracle.jdbc.timezoneAsRegion=false, " + "internal_logon=normal}. Error: ConnectException: Connection " + "refused."); From 8d62fb9cc4a75433d844f5e5285e0dcd690ea88b Mon Sep 17 00:00:00 2001 From: vipinbhatt Date: Thu, 10 Oct 2024 19:23:16 +0530 Subject: [PATCH 2/6] Hide useSSL Field from UI and fix unit test failure --- .../plugin/oracle/OracleConnectorConfig.java | 6 +++--- .../cdap/plugin/oracle/OracleConstants.java | 4 ++-- .../io/cdap/plugin/oracle/OracleSource.java | 2 +- .../oracle/OracleFailedConnectionTest.java | 3 ++- oracle-plugin/widgets/Oracle-batchsink.json | 20 +++++++++++++++++++ oracle-plugin/widgets/Oracle-batchsource.json | 20 +++++++++++++++++++ 6 files changed, 48 insertions(+), 7 deletions(-) diff --git a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConnectorConfig.java b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConnectorConfig.java index b0c8930ed..5c1516ac2 100644 --- a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConnectorConfig.java +++ b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConnectorConfig.java @@ -48,7 +48,7 @@ public OracleConnectorConfig(String host, int port, String user, String password public OracleConnectorConfig(String host, int port, String user, String password, String jdbcPluginName, String connectionArguments, String connectionType, String database, - String role, String useSSL) { + String role, Boolean useSSL) { this.host = host; this.port = port; @@ -90,7 +90,7 @@ public String getConnectionString() { @Name(OracleConstants.USE_SSL) @Description("Turns on SSL encryption. Connection will fail if SSL is not available") @Nullable - public String useSSL; + public Boolean useSSL; @Override protected int getDefaultPort() { @@ -109,7 +109,7 @@ public String getDatabase() { return database; } - public String getSSlMode() { + public Boolean getSSlMode() { return useSSL; } diff --git a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java index ddcd7bd68..03eaae279 100644 --- a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java +++ b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java @@ -81,10 +81,10 @@ public static String getConnectionString(String connectionType, @Nullable String host, @Nullable int port, String database, - @Nullable String useSSL) { + @Nullable Boolean useSSL) { // Use protocol as "tcps" when SSL is requested or else use "tcp". String connectionProtocol; - if (useSSL != null && useSSL.equalsIgnoreCase("yes")) { + if (useSSL != null && useSSL) { connectionProtocol = "tcps"; } else { connectionProtocol = "tcp"; diff --git a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleSource.java b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleSource.java index 7bfea6789..6df62e63e 100644 --- a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleSource.java +++ b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleSource.java @@ -117,7 +117,7 @@ public OracleSourceConfig(String host, int port, String user, String password, S String connectionArguments, String connectionType, String database, String role, int defaultBatchValue, int defaultRowPrefetch, String importQuery, Integer numSplits, int fetchSize, - String boundingQuery, String splitBy, String useSSL) { + String boundingQuery, String splitBy, Boolean useSSL) { this.connection = new OracleConnectorConfig(host, port, user, password, jdbcPluginName, connectionArguments, connectionType, database, role, useSSL); this.defaultBatchValue = defaultBatchValue; diff --git a/oracle-plugin/src/test/java/io/cdap/plugin/oracle/OracleFailedConnectionTest.java b/oracle-plugin/src/test/java/io/cdap/plugin/oracle/OracleFailedConnectionTest.java index edcb18473..b99031a0d 100644 --- a/oracle-plugin/src/test/java/io/cdap/plugin/oracle/OracleFailedConnectionTest.java +++ b/oracle-plugin/src/test/java/io/cdap/plugin/oracle/OracleFailedConnectionTest.java @@ -28,7 +28,8 @@ public class OracleFailedConnectionTest extends DBSpecificFailedConnectionTest { public void test() throws ClassNotFoundException, IOException { OracleConnector connector = new OracleConnector( - new OracleConnectorConfig("localhost", 1521, "username", "password", "jdbc", "", "database")); + new OracleConnectorConfig("localhost", 1521, "username", "password", "jdbc", "", + "SID", "database")); super.test(JDBC_DRIVER_CLASS_NAME, connector, "Failed to create connection to database via connection string:" + " jdbc:oracle:thin:@tcp:localhost:1521/database and arguments: " + diff --git a/oracle-plugin/widgets/Oracle-batchsink.json b/oracle-plugin/widgets/Oracle-batchsink.json index 30d5b345f..8d6168780 100644 --- a/oracle-plugin/widgets/Oracle-batchsink.json +++ b/oracle-plugin/widgets/Oracle-batchsink.json @@ -100,6 +100,26 @@ "default": "TRANSACTION_SERIALIZABLE" } }, + { + "widget-type": "hidden", + "label": "TLS Encryption", + "name": "useSSL", + "description": "Enable TLS encryption (true/false)", + "widget-attributes": { + "layout": "inline", + "default": "false", + "options": [ + { + "id": "true", + "label": "true" + }, + { + "id": "false", + "label": "false" + } + ] + } + }, { "name": "connectionType", "label": "Connection Type", diff --git a/oracle-plugin/widgets/Oracle-batchsource.json b/oracle-plugin/widgets/Oracle-batchsource.json index 0fc0a5285..5eca20cc4 100644 --- a/oracle-plugin/widgets/Oracle-batchsource.json +++ b/oracle-plugin/widgets/Oracle-batchsource.json @@ -100,6 +100,26 @@ "default": "TRANSACTION_SERIALIZABLE" } }, + { + "widget-type": "hidden", + "label": "TLS Encryption", + "name": "useSSL", + "description": "Enable TLS encryption (true/false)", + "widget-attributes": { + "layout": "inline", + "default": "false", + "options": [ + { + "id": "true", + "label": "true" + }, + { + "id": "false", + "label": "false" + } + ] + } + }, { "name": "connectionType", "label": "Connection Type", From b68ec933ff27ff2a1ade2c578727113604803367 Mon Sep 17 00:00:00 2001 From: vipinbhatt Date: Fri, 11 Oct 2024 11:32:27 +0530 Subject: [PATCH 3/6] Handle null case for SSl mode and Update connector json --- .../io/cdap/plugin/oracle/OracleAction.java | 2 +- .../plugin/oracle/OracleConnectorConfig.java | 3 ++- .../cdap/plugin/oracle/OracleConstants.java | 25 ------------------- .../cdap/plugin/oracle/OraclePostAction.java | 2 +- oracle-plugin/widgets/Oracle-connector.json | 20 +++++++++++++++ 5 files changed, 24 insertions(+), 28 deletions(-) diff --git a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleAction.java b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleAction.java index 9b5331d11..d698e17da 100644 --- a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleAction.java +++ b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleAction.java @@ -57,7 +57,7 @@ public static class OracleActionConfig extends DBSpecificQueryConfig { @Override public String getConnectionString() { - return OracleConstants.getConnectionString(this.connectionType, host, port, database); + return OracleConstants.getConnectionString(this.connectionType, host, port, database, null); } @Override diff --git a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConnectorConfig.java b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConnectorConfig.java index 5c1516ac2..10022364a 100644 --- a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConnectorConfig.java +++ b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConnectorConfig.java @@ -110,7 +110,8 @@ public String getDatabase() { } public Boolean getSSlMode() { - return useSSL; + // return false if useSSL is null, otherwise return its value + return useSSL != null && useSSL; } @Override diff --git a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java index 03eaae279..89f3806cb 100644 --- a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java +++ b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java @@ -40,31 +40,6 @@ private OracleConstants() { public static final String TNS_CONNECTION_TYPE = "tns"; public static final String TRANSACTION_ISOLATION_LEVEL = "transactionIsolationLevel"; public static final String USE_SSL = "useSSL"; - public static final String DEFAULT_CONNECTION_PROTOCOL = "tcp"; - - /** - * Returns the Connection String for the given ConnectionType. - * - * @param connectionType TNS/Service/SID - * @param host Host name of the oracle server - * @param port Port of the oracle server - * @param database Database to connect to - * @return Connection String based on the given ConnectionType - */ - public static String getConnectionString(String connectionType, - @Nullable String host, - @Nullable int port, - String database) { - if (OracleConstants.TNS_CONNECTION_TYPE.equalsIgnoreCase(connectionType)) { - return String.format(OracleConstants.ORACLE_CONNECTION_STRING_TNS_FORMAT, database); - } - if (OracleConstants.SERVICE_CONNECTION_TYPE.equalsIgnoreCase(connectionType)) { - return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SERVICE_NAME_FORMAT, - DEFAULT_CONNECTION_PROTOCOL, host, port, database); - } - return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SID_FORMAT, - DEFAULT_CONNECTION_PROTOCOL, host, port, database); - } /** * Constructs the Oracle connection string based on the provided connection type, host, port, and database. diff --git a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OraclePostAction.java b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OraclePostAction.java index 4862aebfa..e11e455c1 100644 --- a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OraclePostAction.java +++ b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OraclePostAction.java @@ -57,7 +57,7 @@ public static class OracleQueryActionConfig extends DBSpecificQueryActionConfig @Override public String getConnectionString() { - return OracleConstants.getConnectionString(this.connectionType, host, port, database); + return OracleConstants.getConnectionString(this.connectionType, host, port, database, null); } @Override diff --git a/oracle-plugin/widgets/Oracle-connector.json b/oracle-plugin/widgets/Oracle-connector.json index 46f006c9c..628027caf 100644 --- a/oracle-plugin/widgets/Oracle-connector.json +++ b/oracle-plugin/widgets/Oracle-connector.json @@ -109,6 +109,26 @@ ], "default": "TRANSACTION_SERIALIZABLE" } + }, + { + "widget-type": "hidden", + "label": "TLS Encryption", + "name": "useSSL", + "description": "Enable TLS encryption (true/false)", + "widget-attributes": { + "layout": "inline", + "default": "false", + "options": [ + { + "id": "true", + "label": "true" + }, + { + "id": "false", + "label": "false" + } + ] + } } ] }, From b31e53c08a5d67793ec914efcfefe270c5e3a434 Mon Sep 17 00:00:00 2001 From: vipinbhatt Date: Tue, 15 Oct 2024 14:48:26 +0530 Subject: [PATCH 4/6] Separate Connection String Formats. --- .../cdap/plugin/oracle/OracleConstants.java | 24 ++++++++++++++----- .../oracle/OracleFailedConnectionTest.java | 2 +- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java index 89f3806cb..f918dea1e 100644 --- a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java +++ b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java @@ -27,9 +27,12 @@ private OracleConstants() { } public static final String PLUGIN_NAME = "Oracle"; - // Updating connection strings to accept protocol (e.g., jdbc:oracle:thin:@://:/) - public static final String ORACLE_CONNECTION_STRING_SID_FORMAT = "jdbc:oracle:thin:@%s:%s:%s/%s"; - public static final String ORACLE_CONNECTION_STRING_SERVICE_NAME_FORMAT = "jdbc:oracle:thin:@%s://%s:%s/%s"; + public static final String ORACLE_CONNECTION_STRING_SID_FORMAT = "jdbc:oracle:thin:@%s:%s:%s"; + public static final String ORACLE_CONNECTION_STRING_SERVICE_NAME_FORMAT = "jdbc:oracle:thin:@//%s:%s/%s"; + // Connection formats to accept protocol (e.g., jdbc:oracle:thin:@://:/) + public static final String ORACLE_CONNECTION_STRING_SID_FORMAT_WITH_PROTOCOL = "jdbc:oracle:thin:@%s:%s:%s/%s"; + public static final String ORACLE_CONNECTION_STRING_SERVICE_NAME_FORMAT_WITH_PROTOCOL = + "jdbc:oracle:thin:@%s://%s:%s/%s"; public static final String ORACLE_CONNECTION_STRING_TNS_FORMAT = "jdbc:oracle:thin:@%s"; public static final String DEFAULT_BATCH_VALUE = "defaultBatchValue"; public static final String DEFAULT_ROW_PREFETCH = "defaultRowPrefetch"; @@ -59,8 +62,10 @@ public static String getConnectionString(String connectionType, @Nullable Boolean useSSL) { // Use protocol as "tcps" when SSL is requested or else use "tcp". String connectionProtocol; + boolean isSSLEnabled = false; if (useSSL != null && useSSL) { connectionProtocol = "tcps"; + isSSLEnabled = true; } else { connectionProtocol = "tcp"; } @@ -70,13 +75,20 @@ public static String getConnectionString(String connectionType, // TNS connection doesn't require protocol return String.format(OracleConstants.ORACLE_CONNECTION_STRING_TNS_FORMAT, database); case OracleConstants.SERVICE_CONNECTION_TYPE: - // Service connection uses protocol, host, port, and database + if (isSSLEnabled) { + return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SERVICE_NAME_FORMAT_WITH_PROTOCOL, + connectionProtocol, host, port, database); + } return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SERVICE_NAME_FORMAT, - connectionProtocol, host, port, database); + host, port, database); default: // Default to SID format if no matching case is found + if (isSSLEnabled) { + return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SID_FORMAT_WITH_PROTOCOL, + connectionProtocol, host, port, database); + } return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SID_FORMAT, - connectionProtocol, host, port, database); + host, port, database); } } } diff --git a/oracle-plugin/src/test/java/io/cdap/plugin/oracle/OracleFailedConnectionTest.java b/oracle-plugin/src/test/java/io/cdap/plugin/oracle/OracleFailedConnectionTest.java index b99031a0d..7ec6f3844 100644 --- a/oracle-plugin/src/test/java/io/cdap/plugin/oracle/OracleFailedConnectionTest.java +++ b/oracle-plugin/src/test/java/io/cdap/plugin/oracle/OracleFailedConnectionTest.java @@ -32,7 +32,7 @@ public void test() throws ClassNotFoundException, IOException { "SID", "database")); super.test(JDBC_DRIVER_CLASS_NAME, connector, "Failed to create connection to database via connection string:" + - " jdbc:oracle:thin:@tcp:localhost:1521/database and arguments: " + + " jdbc:oracle:thin:@localhost:1521:database and arguments: " + "{user=username, oracle.jdbc.timezoneAsRegion=false, " + "internal_logon=normal}. Error: ConnectException: Connection " + "refused."); From 7dc9a6c7f9d409c8f3debe71085df9d10ecaeb0a Mon Sep 17 00:00:00 2001 From: vipinbhatt Date: Tue, 15 Oct 2024 22:07:55 +0530 Subject: [PATCH 5/6] Add separate utility methods to get connection string. --- .../cdap/plugin/oracle/OracleConstants.java | 65 +++++++++++++++---- 1 file changed, 52 insertions(+), 13 deletions(-) diff --git a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java index f918dea1e..dc38f80ac 100644 --- a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java +++ b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java @@ -75,20 +75,59 @@ public static String getConnectionString(String connectionType, // TNS connection doesn't require protocol return String.format(OracleConstants.ORACLE_CONNECTION_STRING_TNS_FORMAT, database); case OracleConstants.SERVICE_CONNECTION_TYPE: - if (isSSLEnabled) { - return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SERVICE_NAME_FORMAT_WITH_PROTOCOL, - connectionProtocol, host, port, database); - } - return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SERVICE_NAME_FORMAT, - host, port, database); + // Create connection string for SERVICE type. + return getConnectionStringWithService(host, port, database, connectionProtocol, isSSLEnabled); default: - // Default to SID format if no matching case is found - if (isSSLEnabled) { - return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SID_FORMAT_WITH_PROTOCOL, - connectionProtocol, host, port, database); - } - return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SID_FORMAT, - host, port, database); + // Default to SID format if no matching case is found. + return getConnectionStringWithSID(host, port, database, connectionProtocol, isSSLEnabled); } } + + /** + * Constructs the connection string for a SERVICE connection type. + * + * @param host Host name of the Oracle server. + * @param port Port of the Oracle server. + * @param database Database name to connect to. + * @param connectionProtocol Protocol to use for the connection ("tcp" or "tcps"). + * @param isSSLEnabled Indicates if SSL is enabled. + * @return Formatted connection string for a SERVICE connection. + */ + private static String getConnectionStringWithService(@Nullable String host, + @Nullable int port, + String database, + String connectionProtocol, + boolean isSSLEnabled) { + // Choose the appropriate format based on whether SSL is enabled. + if (isSSLEnabled) { + return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SERVICE_NAME_FORMAT_WITH_PROTOCOL, + connectionProtocol, host, port, database); + } + return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SERVICE_NAME_FORMAT, + host, port, database); + } + + /** + * Constructs the connection string for a SID connection type. + * + * @param host Host name of the Oracle server. + * @param port Port of the Oracle server. + * @param database Database name to connect to. + * @param connectionProtocol Protocol to use for the connection ("tcp" or "tcps"). + * @param isSSLEnabled Indicates if SSL is enabled. + * @return Formatted connection string for a SID connection. + */ + private static String getConnectionStringWithSID(@Nullable String host, + @Nullable int port, + String database, + String connectionProtocol, + boolean isSSLEnabled) { + // Choose the appropriate format based on whether SSL is enabled. + if (isSSLEnabled) { + return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SID_FORMAT_WITH_PROTOCOL, + connectionProtocol, host, port, database); + } + return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SID_FORMAT, + host, port, database); + } } From ae5d1c94c098d8c6007a11c61ab2455277d09db5 Mon Sep 17 00:00:00 2001 From: vipinbhatt Date: Thu, 17 Oct 2024 01:43:13 +0530 Subject: [PATCH 6/6] Run tests with TestRunner.java --- oracle-plugin/src/e2e-test/features/oracle/Datatype.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oracle-plugin/src/e2e-test/features/oracle/Datatype.feature b/oracle-plugin/src/e2e-test/features/oracle/Datatype.feature index d19e77d85..35fa84dd6 100644 --- a/oracle-plugin/src/e2e-test/features/oracle/Datatype.feature +++ b/oracle-plugin/src/e2e-test/features/oracle/Datatype.feature @@ -17,7 +17,7 @@ @Oracle Feature: Oracle - Verify Oracle source data transfer for multiple datatypes @ORACLE_SOURCE_DATATYPES_TEST @ORACLE_TARGET_DATATYPES_TEST @Oracle_Required - # Oracle Sanity test to transfer table data containing multiple datatypes + # Oracle sanity test to transfer table data containing multiple datatypes Scenario: To verify data is getting transferred from Oracle to Oracle successfully Given Open Datafusion Project to configure pipeline When Expand Plugin group in the LHS plugins list: "Source"