Skip to content

Commit f70dd59

Browse files
authored
Throw an exception when Oracle connection parameters are ambiguous (GoogleCloudPlatform#453)
- fix incorrect nullability annotation - check that no other connection flags are used with url
1 parent 8116ed1 commit f70dd59

3 files changed

Lines changed: 56 additions & 26 deletions

File tree

dumper/app/src/main/java/com/google/edwmigration/dumper/application/dumper/ConnectorArguments.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,7 @@ public String getUri() {
568568
return getOptions().valueOf(optionUri);
569569
}
570570

571-
@Nonnull
571+
@CheckForNull
572572
public String getHost() {
573573
return getOptions().valueOf(optionHost);
574574
}

dumper/app/src/main/java/com/google/edwmigration/dumper/application/dumper/connector/oracle/AbstractOracleConnector.java

Lines changed: 50 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@
1616
*/
1717
package com.google.edwmigration.dumper.application.dumper.connector.oracle;
1818

19+
import static com.google.edwmigration.dumper.application.dumper.ConnectorArguments.OPT_HOST;
20+
import static com.google.edwmigration.dumper.application.dumper.ConnectorArguments.OPT_ORACLE_SERVICE;
21+
import static com.google.edwmigration.dumper.application.dumper.ConnectorArguments.OPT_ORACLE_SID;
22+
import static com.google.edwmigration.dumper.application.dumper.ConnectorArguments.OPT_PORT;
23+
import static com.google.edwmigration.dumper.application.dumper.ConnectorArguments.OPT_URI;
24+
1925
import com.google.edwmigration.dumper.application.dumper.ConnectorArguments;
2026
import com.google.edwmigration.dumper.application.dumper.MetadataDumperUsageException;
2127
import com.google.edwmigration.dumper.application.dumper.annotations.RespectsArgumentDriverRequired;
@@ -142,20 +148,6 @@ String getFormatName() {
142148
return connectorScope.formatName();
143149
}
144150

145-
private static boolean isOracleSid(ConnectorArguments arguments)
146-
throws MetadataDumperUsageException {
147-
String service = arguments.getOracleServicename();
148-
String sid = arguments.getOracleSID();
149-
if (sid != null && service == null) {
150-
return true;
151-
} else if (sid == null && service != null) {
152-
return false;
153-
} else {
154-
throw new MetadataDumperUsageException(
155-
"Provide either -oracle-service or -oracle-sid for oracle dumper");
156-
}
157-
}
158-
159151
@Nonnull
160152
@Override
161153
public Handle open(@Nonnull ConnectorArguments arguments) throws Exception {
@@ -190,15 +182,50 @@ Properties buildProperties(@Nonnull ConnectorArguments arguments) {
190182
// jdbc:oracle:thin:<TNSName> (from 10.2.0.1.0)
191183
static String buildUrl(ConnectorArguments arguments) {
192184
String url = arguments.getUri();
193-
if (url == null) {
194-
String host = arguments.getHost();
195-
int port = arguments.getPort(OPT_PORT_DEFAULT);
196-
if (isOracleSid(arguments)) {
197-
url = "jdbc:oracle:thin:@" + host + ":" + port + ":" + arguments.getOracleSID();
198-
} else {
199-
url = "jdbc:oracle:thin:@//" + host + ":" + port + "/" + arguments.getOracleServicename();
200-
}
185+
String host = arguments.getHost();
186+
int port = arguments.getPort(OPT_PORT_DEFAULT);
187+
if (url != null) {
188+
checkNonUriFlags(arguments);
189+
return url;
190+
}
191+
checkServiceAndSid(arguments);
192+
if (arguments.getOracleSID() != null) {
193+
return "jdbc:oracle:thin:@" + host + ":" + port + ":" + arguments.getOracleSID();
194+
} else {
195+
return "jdbc:oracle:thin:@//" + host + ":" + port + "/" + arguments.getOracleServicename();
201196
}
202-
return url;
197+
}
198+
199+
private static void checkNonUriFlags(ConnectorArguments arguments) {
200+
if (arguments.getHost() != null) {
201+
throw extraFlagProvided(OPT_HOST);
202+
} else if (arguments.getPort() != null) {
203+
throw extraFlagProvided(OPT_PORT);
204+
} else if (arguments.getOracleServicename() != null) {
205+
throw extraFlagProvided(OPT_ORACLE_SERVICE);
206+
} else if (arguments.getOracleSID() != null) {
207+
throw extraFlagProvided(OPT_ORACLE_SID);
208+
}
209+
}
210+
211+
private static void checkServiceAndSid(ConnectorArguments arguments) {
212+
boolean hasService = arguments.getOracleServicename() != null;
213+
boolean hasSid = arguments.getOracleSID() != null;
214+
if ((!hasService && !hasSid) || (hasService && hasSid)) {
215+
String message =
216+
String.format(
217+
"Provide either --%s or --%s for oracle dumper", OPT_ORACLE_SERVICE, OPT_ORACLE_SID);
218+
throw new MetadataDumperUsageException(message);
219+
}
220+
}
221+
222+
private static MetadataDumperUsageException extraFlagProvided(String flagName) {
223+
String[] sentences =
224+
new String[] {
225+
String.format("Both the --%s and --%s flags were provided.", OPT_URI, flagName),
226+
String.format("If the --%s value is valid, please omit --%s.", OPT_URI, flagName),
227+
String.format("If all connection parameters are provided, please omit the --%s", OPT_URI)
228+
};
229+
return new MetadataDumperUsageException(String.join(" ", sentences));
203230
}
204231
}

dumper/app/src/test/java/com/google/edwmigration/dumper/application/dumper/connector/oracle/AbstractOracleConnectorTest.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ public void buildUrl_serviceNameAndSidBothProvided_throwsException() {
6161

6262
// Assert
6363
assertEquals(
64-
"Provide either -oracle-service or -oracle-sid for oracle dumper", exception.getMessage());
64+
"Provide either --oracle-service or --oracle-sid for oracle dumper",
65+
exception.getMessage());
6566
}
6667

6768
@Test
@@ -74,7 +75,8 @@ public void buildUrl_serviceNameAndSidBothNull_throwsException() {
7475

7576
// Assert
7677
assertEquals(
77-
"Provide either -oracle-service or -oracle-sid for oracle dumper", exception.getMessage());
78+
"Provide either --oracle-service or --oracle-sid for oracle dumper",
79+
exception.getMessage());
7880
}
7981

8082
@Test
@@ -121,6 +123,7 @@ public void buildUrl_customArguments_containsCustomValues() {
121123
@Test
122124
public void buildUrl_providedUrl_success() {
123125
String argumentUrl = "jdbc:oracle:thin:@localhost:1521:ORCLPDB1";
126+
when(arguments.getPort()).thenReturn(null);
124127
when(arguments.getUri()).thenReturn(argumentUrl);
125128

126129
// Act

0 commit comments

Comments
 (0)