Skip to content

Commit b885b5d

Browse files
authored
NIFI-15755: Improve JDBC URL Validation messaging (#11051)
1 parent 2820e51 commit b885b5d

File tree

4 files changed

+70
-0
lines changed

4 files changed

+70
-0
lines changed

nifi-extension-bundles/nifi-standard-services/nifi-dbcp-service-api/src/main/java/org/apache/nifi/dbcp/ConnectionUrlValidator.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
* Database Connection URL Validator supports system attribute expressions and evaluates URL formatting
2828
*/
2929
public class ConnectionUrlValidator implements Validator {
30+
private static final String JDBC_URL_PREFIX = "jdbc:";
3031
private static final Set<String> UNSUPPORTED_SCHEMES = Collections.singleton("jdbc:h2");
3132

3233
@Override
@@ -42,6 +43,9 @@ public ValidationResult validate(final String subject, final String input, final
4243
if (isUrlUnsupported(url)) {
4344
builder.valid(false);
4445
builder.explanation(String.format("Connection URL contains an unsupported scheme %s", UNSUPPORTED_SCHEMES));
46+
} else if (!isJdbcUrl(url)) {
47+
builder.valid(false);
48+
builder.explanation("Connection URL must start with '%s'".formatted(JDBC_URL_PREFIX));
4549
} else {
4650
builder.valid(true);
4751
builder.explanation("Connection URL is valid");
@@ -51,6 +55,10 @@ public ValidationResult validate(final String subject, final String input, final
5155
return builder.build();
5256
}
5357

58+
private boolean isJdbcUrl(final String url) {
59+
return url.regionMatches(true, 0, JDBC_URL_PREFIX, 0, JDBC_URL_PREFIX.length());
60+
}
61+
5462
private boolean isUrlUnsupported(final String url) {
5563
boolean unsupported = false;
5664

nifi-extension-bundles/nifi-standard-services/nifi-dbcp-service-api/src/test/java/org/apache/nifi/dbcp/ConnectionUrlValidatorTest.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,12 @@ class ConnectionUrlValidatorTest {
4343

4444
private static final String VENDOR_URL = "jdbc:vendor";
4545

46+
private static final String NON_JDBC_URL = "http://localhost:3306/database";
47+
48+
private static final String NON_JDBC_PLAIN_STRING = "not-a-jdbc-url";
49+
50+
private static final String UPPERCASE_JDBC_URL = "JDBC:VENDOR://localhost:5432/db";
51+
4652
private ValidationContext validationContext;
4753

4854
private ConnectionUrlValidator validator;
@@ -63,6 +69,14 @@ void testValidateEmpty() {
6369
assertFalse(result.isValid());
6470
}
6571

72+
@Test
73+
void testValidateNull() {
74+
final ValidationResult result = validator.validate(SUBJECT, null, validationContext);
75+
76+
assertNotNull(result);
77+
assertFalse(result.isValid());
78+
}
79+
6680
@Test
6781
void testValidateUnsupportedUrl() {
6882
final ValidationResult result = validator.validate(SUBJECT, UNSUPPORTED_URL, validationContext);
@@ -94,4 +108,28 @@ void testValidateSupportedUrl() {
94108
assertNotNull(result);
95109
assertTrue(result.isValid());
96110
}
111+
112+
@Test
113+
void testValidateNonJdbcUrl() {
114+
final ValidationResult result = validator.validate(SUBJECT, NON_JDBC_URL, validationContext);
115+
116+
assertNotNull(result);
117+
assertFalse(result.isValid());
118+
}
119+
120+
@Test
121+
void testValidateNonJdbcPlainString() {
122+
final ValidationResult result = validator.validate(SUBJECT, NON_JDBC_PLAIN_STRING, validationContext);
123+
124+
assertNotNull(result);
125+
assertFalse(result.isValid());
126+
}
127+
128+
@Test
129+
void testValidateUppercaseJdbcUrl() {
130+
final ValidationResult result = validator.validate(SUBJECT, UPPERCASE_JDBC_URL, validationContext);
131+
132+
assertNotNull(result);
133+
assertTrue(result.isValid());
134+
}
97135
}

nifi-extension-bundles/nifi-standard-services/nifi-dbcp-service-bundle/nifi-dbcp-service/src/test/java/org/apache/nifi/dbcp/DBCPServiceTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ public class DBCPServiceTest {
6969

7070
private static final String INVALID_CONNECTION_URL = "jdbc:h2";
7171

72+
private static final String NON_JDBC_URL = "http://localhost:3306/database";
73+
7274
private static final String DRIVER_CLASS = "org.hsqldb.jdbc.JDBCDriver";
7375
private static final String CONNECTION_URL_FORMAT = "jdbc:hsqldb:file:%s";
7476

@@ -97,6 +99,14 @@ public void testConnectionUrlInvalid() {
9799
runner.assertNotValid(service);
98100
}
99101

102+
@Test
103+
public void testConnectionUrlNonJdbc() {
104+
runner.assertValid(service);
105+
106+
runner.setProperty(service, DBCPProperties.DATABASE_URL, NON_JDBC_URL);
107+
runner.assertNotValid(service);
108+
}
109+
100110
@Test
101111
public void testNotValidWithNegativeMinIdleProperty() {
102112
runner.setProperty(service, DBCPProperties.MIN_IDLE, "-1");

nifi-extension-bundles/nifi-standard-services/nifi-dbcp-service-bundle/nifi-hikari-dbcp-service/src/test/java/org/apache/nifi/dbcp/HikariCPConnectionPoolTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ public class HikariCPConnectionPoolTest {
4949

5050
private static final String INVALID_CONNECTION_URL = "jdbc:h2";
5151

52+
private static final String NON_JDBC_URL = "http://localhost:3306/database";
53+
5254
private static final String DB_DRIVERNAME_VALUE = "jdbc:mock";
5355

5456
private static final String MAX_WAIT_TIME_VALUE = "5 s";
@@ -72,6 +74,18 @@ public void testConnectionUrlInvalid() throws InitializationException {
7274
runner.assertNotValid(service);
7375
}
7476

77+
@Test
78+
public void testConnectionUrlNonJdbc() throws InitializationException {
79+
final HikariCPConnectionPool service = new HikariCPConnectionPool();
80+
81+
runner.addControllerService(SERVICE_ID, service);
82+
setDatabaseProperties(service);
83+
runner.assertValid(service);
84+
85+
runner.setProperty(service, HikariCPConnectionPool.DATABASE_URL, NON_JDBC_URL);
86+
runner.assertNotValid(service);
87+
}
88+
7589
@Test
7690
public void testMissingPropertyValues() throws InitializationException {
7791
final HikariCPConnectionPool service = new HikariCPConnectionPool();

0 commit comments

Comments
 (0)