Skip to content

Commit 1c87c37

Browse files
committed
Add MariaDB service detection and replace MySQL JDBC prefix
Update MySqlJdbcUrlCreator to add MariaDB schemes, tags and labels Update MySqlJdbcUrlCreator to override createJdbcUrl from AbstractJdbcUrlCreator Update MySqlJdbcUrlCreator to add detection of MariaDB service based on CF environment tags, labels and MariaDB uri Conditionally update the JDBC URL that was either generated or obtained from the CF Service if the current driver class name matches the MariaDB driver and any of the specific MariaDB detection cases Overload existsByLabelStartsWith method in CfService to allow checking if one of many labels matches the CF service label
1 parent a71880a commit 1c87c37

2 files changed

Lines changed: 79 additions & 39 deletions

File tree

java-cfenv-jdbc/src/main/java/io/pivotal/cfenv/jdbc/MySqlJdbcUrlCreator.java

Lines changed: 63 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -23,48 +23,72 @@
2323
* @author Mark Pollack
2424
*/
2525
public class MySqlJdbcUrlCreator extends AbstractJdbcUrlCreator {
26+
public static final String MYSQL_SCHEME = "mysql";
27+
public static final String MARIADB_SCHEME = "mariadb";
28+
public static final String[] MYSQL_SCHEMES = new String[]{MYSQL_SCHEME, MARIADB_SCHEME};
29+
public static final String MYSQL_TAG = "mysql";
30+
public static final String MARIADB_TAG = "mariadb";
31+
public static final String[] MYSQL_TAGS = new String[]{MYSQL_TAG, MARIADB_TAG};
32+
public static final String MYSQL_LABEL = "mysql";
33+
public static final String MARIADB_LABEL = "mariadb";
34+
public static final String[] MYSQL_LABELS = new String[]{MYSQL_LABEL, MARIADB_LABEL};
35+
public static final String MYSQL_DRIVER_CLASS_NAME = "com.mysql.cj.jdbc.Driver";
36+
public static final String MARIADB_DRIVER_CLASS_NAME = "org.mariadb.jdbc.Driver";
2637

27-
public static final String MYSQL_SCHEME = "mysql";
38+
@Override
39+
public boolean isDatabaseService(CfService cfService) {
40+
return jdbcUrlMatchesScheme(cfService, MYSQL_SCHEMES)
41+
|| cfService.existsByTagIgnoreCase(MYSQL_TAGS)
42+
|| cfService.existsByLabelStartsWith(MYSQL_LABELS)
43+
|| cfService.existsByUriSchemeStartsWith(MYSQL_SCHEMES)
44+
|| cfService.existsByCredentialsContainsUriField(MYSQL_SCHEMES);
45+
}
2846

29-
public static final String MYSQL_TAG = "mysql";
47+
private boolean isMariaDbService(CfService cfService) {
48+
return jdbcUrlMatchesScheme(cfService, MARIADB_SCHEME)
49+
|| cfService.existsByTagIgnoreCase(MARIADB_TAG)
50+
|| cfService.existsByLabelStartsWith(MARIADB_LABEL)
51+
|| cfService.existsByUriSchemeStartsWith(MARIADB_SCHEME)
52+
|| cfService.existsByCredentialsContainsUriField(MARIADB_SCHEME);
53+
}
3054

31-
public static final String MYSQL_LABEL = "mysql";
55+
@Override
56+
public String getDriverClassName() {
57+
String driverClassNameToUse;
58+
try {
59+
driverClassNameToUse = MARIADB_DRIVER_CLASS_NAME;
60+
Class.forName(driverClassNameToUse, false, getClass().getClassLoader());
61+
}
62+
catch (ClassNotFoundException e) {
63+
try {
64+
driverClassNameToUse = MYSQL_DRIVER_CLASS_NAME;
65+
Class.forName(driverClassNameToUse, false, getClass().getClassLoader());
66+
}
67+
catch (ClassNotFoundException e2) {
68+
return null;
69+
}
70+
}
71+
return driverClassNameToUse;
72+
}
3273

33-
@Override
34-
public boolean isDatabaseService(CfService cfService) {
35-
if (jdbcUrlMatchesScheme(cfService, MYSQL_SCHEME)
36-
|| cfService.existsByTagIgnoreCase(MYSQL_TAG)
37-
|| cfService.existsByLabelStartsWith(MYSQL_LABEL)
38-
|| cfService.existsByUriSchemeStartsWith(MYSQL_SCHEME)
39-
|| cfService.existsByCredentialsContainsUriField(MYSQL_SCHEME)) {
40-
return true;
41-
}
42-
return false;
43-
}
44-
45-
@Override
46-
public String getDriverClassName() {
47-
String driverClassNameToUse = null;
48-
try {
49-
driverClassNameToUse = "org.mariadb.jdbc.Driver";
50-
Class.forName(driverClassNameToUse, false, getClass().getClassLoader());
51-
} catch (ClassNotFoundException e) {
52-
try {
53-
driverClassNameToUse = "com.mysql.cj.jdbc.Driver";
54-
Class.forName(driverClassNameToUse, false, getClass().getClassLoader());
55-
} catch (ClassNotFoundException e2) {
56-
return null;
57-
}
58-
}
59-
return driverClassNameToUse;
60-
}
61-
62-
@Override
63-
public String buildJdbcUrlFromUriField(CfCredentials cfCredentials) {
64-
UriInfo uriInfo = cfCredentials.getUriInfo(MYSQL_SCHEME);
65-
return String.format("%s%s://%s%s/%s%s%s", JDBC_PREFIX, MYSQL_SCHEME,
66-
uriInfo.getHost(), uriInfo.formatPort(), uriInfo.getPath(),
67-
uriInfo.formatUserNameAndPasswordQuery(), uriInfo.formatQuery());
68-
}
74+
@Override
75+
public String createJdbcUrl(CfService cfService) {
76+
CfCredentials cfCredentials = cfService.getCredentials();
77+
String jdbcUrl = (String) cfCredentials.getMap().get("jdbcUrl");
78+
if (jdbcUrl == null) {
79+
jdbcUrl = buildJdbcUrlFromUriField(cfCredentials);
80+
}
81+
if (isMariaDbService(cfService) && getDriverClassName().equals(MARIADB_DRIVER_CLASS_NAME)) {
82+
jdbcUrl = jdbcUrl.replaceFirst("^(jdbc:mysql)", "jdbc:mariadb");
83+
}
84+
return jdbcUrl;
85+
}
6986

87+
@Override
88+
public String buildJdbcUrlFromUriField(CfCredentials cfCredentials) {
89+
UriInfo uriInfo = cfCredentials.getUriInfo(MYSQL_SCHEME);
90+
return String.format("%s%s://%s%s/%s%s%s", JDBC_PREFIX, MYSQL_SCHEME,
91+
uriInfo.getHost(), uriInfo.formatPort(), uriInfo.getPath(),
92+
uriInfo.formatUserNameAndPasswordQuery(), uriInfo.formatQuery());
93+
}
7094
}

java-cfenv/src/main/java/io/pivotal/cfenv/core/CfService.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,4 +185,20 @@ public boolean existsByLabelStartsWith(String label) {
185185
return false;
186186
}
187187

188+
/**
189+
* @param labels Strings to search for as a prefix in the service label
190+
* @return whether any of the provided labels starts with the service label
191+
*/
192+
public boolean existsByLabelStartsWith(String... labels) {
193+
String cfLabel = this.getLabel();
194+
if (labels != null && cfLabel != null && !cfLabel.isEmpty()){
195+
for (String labelToMatch : labels){
196+
if (labelToMatch.startsWith(cfLabel)){
197+
return true;
198+
}
199+
}
200+
}
201+
return false;
202+
}
203+
188204
}

0 commit comments

Comments
 (0)