Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Connection string parsing refactoring
  • Loading branch information
viniciusam committed Jun 17, 2017
commit 66c12315034a95885a74c95f02eb960c61e47603
10 changes: 6 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,14 @@ You can download development versions on [Bintray](https://bintray.com/viniciusa
* ~~When using reporters for Sonar or Coveralls client needs to be invoked from project's root directory.~~

## Usage
utplsql run user/password@database [-p=(ut_path|ut_paths)] [-f=format [-o=output_file] [-s] ...]
utplsql run user/pass@[[host][:port]/]db [-p=(ut_path|ut_paths)] [-f=format [-o=output_file] [-s] ...]

```
user - username to connect as.
password - password of the user.
database - database to connect to.
user - Username to connect as.
password - Password of the user.
host - Server address, defaults to 127.0.0.1.
port - Server port, defaults to 1521.
db - Database to connect to.
-p=suite_path(s) - A suite path or a comma separated list of suite paths for unit test to be executed.
The path(s) can be in one of the following formats:
schema[.package[.procedure]]
Expand Down
102 changes: 67 additions & 35 deletions src/main/java/io/github/utplsql/cli/ConnectionInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,103 +5,135 @@
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* Created by Vinicius on 21/04/2017.
*/
public class ConnectionInfo {

/**
* Regex pattern to match following connection strings:
* user/[email protected]:1521/db
* user/[email protected]/db
* user/pass@db
*/
private static final String CONNSTR_PATTERN =
"^(?<user>[0-9a-z]+)/(?<pass>[0-9a-z]+)" +
"(?:(?:@(?<host>[^:/]+)?(?::(?<port>[0-9]+))?(?:/(?<db1>[0-9a-z]+))$)|(?:@(?<db2>[0-9a-z]+)$))";

private static final String DEFAULT_HOST = "127.0.0.1";
private static final int DEFAULT_PORT = 1521;

private String user;
private String password;
private String host;
private int port;
private String db;
private String database;

public ConnectionInfo() {
}
public ConnectionInfo() {}

public Connection getConnection() throws SQLException {
return DriverManager.getConnection(getConnectionUrl(), getUser(), getPassword());
}

public ConnectionInfo parseConnectionString(String connectionString) throws ParameterException {
Pattern p = Pattern.compile(CONNSTR_PATTERN);
Matcher m = p.matcher(connectionString);
public ConnectionInfo parseConnectionString(String connectionString)
throws ParameterException, IllegalArgumentException {

if (connectionString == null || connectionString.isEmpty())
throw invalidConnectionString();

if (!m.matches())
throw new ParameterException("Invalid connection string!");
int i = connectionString.lastIndexOf("@");
if (i == -1)
throw invalidConnectionString();

this.setUser(m.group("user"));
this.setPassword(m.group("pass"));
this.setHost(m.group("host") != null ? m.group("host") : DEFAULT_HOST);
this.setPort(m.group("port") != null ? Integer.parseInt(m.group("port")) : DEFAULT_PORT);
this.setDb(m.group("db1") != null ? m.group("db1") : m.group("db2"));
String credentials = connectionString.substring(0, i);
String host = connectionString.substring(i+1);
parseCredentials(credentials);
parseHost(host);

return this;
}

private void parseCredentials(String str) throws ParameterException, IllegalArgumentException {
int barIdx = str.indexOf("/");

if (barIdx == -1 || str.length() == 1)
throw invalidConnectionString();

this.setUser(str.substring(0, barIdx));
this.setPassword(str.substring(barIdx+1));
}

private void parseHost(String str) throws ParameterException, IllegalArgumentException {
if (str == null || str.isEmpty())
throw invalidConnectionString();

int colonIdx = str.indexOf(":");
int barIdx = str.indexOf("/");

if (colonIdx != -1 && barIdx != -1) {
setHost(str.substring(0, colonIdx));
setPort(Integer.parseInt(str.substring(colonIdx + 1, barIdx)));
setDatabase(str.substring(barIdx + 1));
}
else
if (colonIdx == -1 && barIdx != -1) {
setHost(str.substring(0, barIdx));
setPort(DEFAULT_PORT);
setDatabase(str.substring(barIdx + 1));
}
else
if (colonIdx != -1) {
throw invalidConnectionString();
}
else {
setHost(DEFAULT_HOST);
setPort(DEFAULT_PORT);
setDatabase(str);
}
}

private ParameterException invalidConnectionString() {
return new ParameterException("Invalid connection string.");
}

public String getUser() {
return user;
}

public void setUser(String user) {
private void setUser(String user) {
this.user = user;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
private void setPassword(String password) {
this.password = password;
}

public String getHost() {
return host;
}

public void setHost(String host) {
private void setHost(String host) {
this.host = host;
}

public int getPort() {
return port;
}

public void setPort(int port) {
private void setPort(int port) {
this.port = port;
}

public String getDb() {
return db;
public String getDatabase() {
return database;
}

public void setDb(String db) {
this.db = db;
private void setDatabase(String database) {
this.database = database;
}

public String getConnectionUrl() {
return String.format("jdbc:oracle:thin:@//%s:%d/%s", getHost(), getPort(), getDb());
return String.format("jdbc:oracle:thin:@//%s:%d/%s", getHost(), getPort(), getDatabase());
}

@Override
public String toString() {
return String.format("%s@%s:%d/%s", getUser(), getHost(), getPort(), getDb());
return String.format("%s@%s:%d/%s", getUser(), getHost(), getPort(), getDatabase());
}

}
54 changes: 31 additions & 23 deletions src/test/java/io/github/utplsql/cli/ConnectionInfoTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,23 @@ public class ConnectionInfoTest {

/**
* Regex pattern to match following connection strings:
* user/pass@127.0.0.1:1521/db
* user/pass@127.0.0.1/db
* user/pass@host:port/db
* user/pass@host/db
* user/pass@db
* user/pass
*/

@Test
public void connectionStr_Full() {
try {
ConnectionInfo ci = new ConnectionInfo().parseConnectionString("user/pass@localhost:3000/db");
Assert.assertEquals("user", ci.getUser());
Assert.assertEquals("pass", ci.getPassword());
Assert.assertEquals("localhost", ci.getHost());
ConnectionInfo ci = new ConnectionInfo()
.parseConnectionString("my_user/p@[email protected]:3000/db_1.acme.com");
Assert.assertEquals("my_user", ci.getUser());
Assert.assertEquals("p@ss!", ci.getPassword());
Assert.assertEquals("some.server.123-abc.com", ci.getHost());
Assert.assertEquals(3000, ci.getPort());
Assert.assertEquals("db", ci.getDb());
Assert.assertEquals("user@localhost:3000/db", ci.toString());
Assert.assertEquals("jdbc:oracle:thin:@//localhost:3000/db", ci.getConnectionUrl());
Assert.assertEquals("db_1.acme.com", ci.getDatabase());
Assert.assertEquals("[email protected]:3000/db_1.acme.com", ci.toString());
Assert.assertEquals("jdbc:oracle:thin:@//some.server.123-abc.com:3000/db_1.acme.com", ci.getConnectionUrl());
} catch (Exception e) {
Assert.fail(e.getMessage());
}
Expand All @@ -36,14 +36,15 @@ public void connectionStr_Full() {
@Test
public void connectionStr_WithoutPort() {
try {
ConnectionInfo ci = new ConnectionInfo().parseConnectionString("user/pass@localhost/db");
Assert.assertEquals("user", ci.getUser());
Assert.assertEquals("pass", ci.getPassword());
Assert.assertEquals("localhost", ci.getHost());
ConnectionInfo ci = new ConnectionInfo()
.parseConnectionString("my_user/p@[email protected]/db_1.acme.com");
Assert.assertEquals("my_user", ci.getUser());
Assert.assertEquals("p@ss!", ci.getPassword());
Assert.assertEquals("some.server.123-abc.com", ci.getHost());
Assert.assertEquals(1521, ci.getPort());
Assert.assertEquals("db", ci.getDb());
Assert.assertEquals("user@localhost:1521/db", ci.toString());
Assert.assertEquals("jdbc:oracle:thin:@//localhost:1521/db", ci.getConnectionUrl());
Assert.assertEquals("db_1.acme.com", ci.getDatabase());
Assert.assertEquals("[email protected]:1521/db_1.acme.com", ci.toString());
Assert.assertEquals("jdbc:oracle:thin:@//some.server.123-abc.com:1521/db_1.acme.com", ci.getConnectionUrl());
} catch (Exception e) {
Assert.fail(e.getMessage());
}
Expand All @@ -52,14 +53,15 @@ public void connectionStr_WithoutPort() {
@Test
public void connectionStr_WithoutHostAndPort() {
try {
ConnectionInfo ci = new ConnectionInfo().parseConnectionString("user/pass@db");
Assert.assertEquals("user", ci.getUser());
Assert.assertEquals("pass", ci.getPassword());
ConnectionInfo ci = new ConnectionInfo()
.parseConnectionString("my_user/p@[email protected]/db_1.acme.com");
Assert.assertEquals("my_user", ci.getUser());
Assert.assertEquals("p@ss!", ci.getPassword());
Assert.assertEquals("127.0.0.1", ci.getHost());
Assert.assertEquals(1521, ci.getPort());
Assert.assertEquals("db", ci.getDb());
Assert.assertEquals("user@127.0.0.1:1521/db", ci.toString());
Assert.assertEquals("jdbc:oracle:thin:@//127.0.0.1:1521/db", ci.getConnectionUrl());
Assert.assertEquals("db_1.acme.com", ci.getDatabase());
Assert.assertEquals("my_user@127.0.0.1:1521/db_1.acme.com", ci.toString());
Assert.assertEquals("jdbc:oracle:thin:@//127.0.0.1:1521/db_1.acme.com", ci.getConnectionUrl());
} catch (Exception e) {
Assert.fail(e.getMessage());
}
Expand All @@ -68,7 +70,13 @@ public void connectionStr_WithoutHostAndPort() {
@Test
public void connectionStr_Invalid() {
try {
new ConnectionInfo().parseConnectionString("user/pass@");
new ConnectionInfo().parseConnectionString("user/pass");
new ConnectionInfo().parseConnectionString("user/@");
new ConnectionInfo().parseConnectionString("/pass@");
new ConnectionInfo().parseConnectionString("/@");
new ConnectionInfo().parseConnectionString("@");
new ConnectionInfo().parseConnectionString("@db");
Assert.fail();
} catch (ParameterException ignored) {}
}
Expand Down