Skip to content

Commit 40dfe1e

Browse files
committed
ui refactoring
1 parent 61d4ffc commit 40dfe1e

File tree

8 files changed

+286
-98
lines changed

8 files changed

+286
-98
lines changed

src/main/java/me/vzhilin/dbtree/db/ContextCache.java

Lines changed: 53 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,32 @@ public ContextCache() {
2222
.build(new CacheLoader<ContextKey, DbContext>() {
2323
@Override
2424
public DbContext load(ContextKey dsKey) throws Exception {
25-
return new DbContext(dsKey.driverClazz, dsKey.jdbcUrl, dsKey.login, dsKey.password, dsKey.pattern, dsKey.schemas);
25+
return new DbContext(dsKey.driverClazz, dsKey.host, dsKey.port, dsKey.database, dsKey.login, dsKey.password, dsKey.pattern, dsKey.schemas);
2626
}
2727
});
2828
}
2929

30-
public DbContext getContext(String driverClazz, String jdbcUrl, String login, String password, String pattern, Set<String> schemas) throws ExecutionException {
31-
ContextKey key = new ContextKey(driverClazz, jdbcUrl, login, password, pattern, schemas);
30+
public DbContext getContext(
31+
String driverClazz,
32+
String host,
33+
String port,
34+
String database,
35+
String login,
36+
String password,
37+
String pattern,
38+
Set<String> schemas) throws ExecutionException {
39+
40+
ContextKey key = new ContextKey(
41+
driverClazz,
42+
host,
43+
port,
44+
database,
45+
login,
46+
password,
47+
pattern,
48+
schemas
49+
);
50+
3251
DbContext dbContext = cache.get(key);
3352
try {
3453
if (dbContext != null && dbContext.getConnection().isClosed()) {
@@ -42,22 +61,42 @@ public DbContext getContext(String driverClazz, String jdbcUrl, String login, St
4261
return dbContext;
4362
}
4463

45-
public DbContext getIfPresent(String driverClazz, String jdbcUrl, String login, String password, String pattern, Set<String> schemas) {
46-
ContextKey key = new ContextKey(driverClazz, jdbcUrl, login, password, pattern, schemas);
64+
public DbContext getIfPresent(String driverClazz,
65+
String host,
66+
String port,
67+
String database,
68+
String login,
69+
String password,
70+
String pattern,
71+
Set<String> schemas) {
72+
73+
ContextKey key = new ContextKey(driverClazz, host, port, database, login, password, pattern, schemas);
4774
return cache.getIfPresent(key);
4875
}
4976

5077
private final static class ContextKey {
5178
private final String driverClazz;
52-
private final String jdbcUrl;
79+
private final String host;
80+
private final String port;
81+
private final String database;
5382
private final String login;
5483
private final String password;
5584
private final String pattern;
5685
private final Set<String> schemas;
5786

58-
public ContextKey(String driverClazz, String jdbcUrl, String login, String password, String pattern, Set<String> schemas) {
87+
public ContextKey(String driverClazz,
88+
String host,
89+
String port,
90+
String database,
91+
String login,
92+
String password,
93+
String pattern,
94+
Set<String> schemas) {
95+
5996
this.driverClazz = driverClazz;
60-
this.jdbcUrl = jdbcUrl;
97+
this.host = host;
98+
this.port = port;
99+
this.database = database;
61100
this.login = login;
62101
this.password = password;
63102
this.pattern = pattern;
@@ -70,16 +109,17 @@ public boolean equals(Object o) {
70109
if (o == null || getClass() != o.getClass()) return false;
71110
ContextKey that = (ContextKey) o;
72111
return driverClazz.equals(that.driverClazz) &&
73-
jdbcUrl.equals(that.jdbcUrl) &&
112+
host.equals(that.host) &&
113+
port.equals(that.port) &&
114+
database.equals(that.database) &&
74115
login.equals(that.login) &&
75-
password.equals(that.password) &&
76-
pattern.equals(that.pattern) &&
77-
schemas.equals(that.schemas);
116+
Objects.equals(pattern, that.pattern) &&
117+
Objects.equals(schemas, that.schemas);
78118
}
79119

80120
@Override
81121
public int hashCode() {
82-
return Objects.hash(driverClazz, jdbcUrl, login, password, pattern, schemas);
122+
return Objects.hash(driverClazz, host, port, database, login, pattern, schemas);
83123
}
84124
}
85125
}

src/main/java/me/vzhilin/dbtree/db/DbContext.java

Lines changed: 49 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import java.sql.Connection;
1717
import java.sql.SQLException;
1818
import java.util.Collections;
19+
import java.util.HashMap;
20+
import java.util.Map;
1921
import java.util.Set;
2022
import java.util.regex.Pattern;
2123

@@ -25,11 +27,34 @@ public final class DbContext implements Closeable {
2527
private final Catalog catalog;
2628
private final QueryRunner runner;
2729
private final static Pattern MATCH_ANY = Pattern.compile(".*");
30+
private final static Map<String, DatabaseInfo> DATABASES = new HashMap<>();
31+
32+
static {
33+
DATABASES.put("org.postgresql.Driver", new DatabaseInfo(
34+
"jdbc:postgresql://%s:%s:%s", new PostgresqlAdapter(), "5432"
35+
));
36+
37+
DATABASES.put("oracle.jdbc.OracleDriver", new DatabaseInfo(
38+
"jdbc:oracle:thin:@%s:%s:%s", new OracleDatabaseAdapter(), "1521"
39+
));
40+
41+
DATABASES.put("org.mariadb.jdbc.Driver", new DatabaseInfo(
42+
"jdbc:mariadb://%s:%s:%s", new MariadbDatabaseAdapter(), "3306"
43+
));
44+
}
45+
46+
public DbContext(String driverClazz,
47+
String host,
48+
String port,
49+
String database,
50+
String login,
51+
String password,
52+
String pattern,
53+
Set<String> schemas) throws SQLException {
2854

29-
public DbContext(String driverClazz, String jdbcUrl, String login, String password, String pattern, Set<String> schemas) throws SQLException {
3055
BasicDataSource ds = new BasicDataSource();
3156
ds.setDriverClassName(driverClazz);
32-
ds.setUrl(jdbcUrl);
57+
ds.setUrl(getUrl(driverClazz, host, port, database));
3358
ds.setUsername(login);
3459
ds.setPassword(password);
3560
connection = ds.getConnection();
@@ -43,6 +68,10 @@ public DbContext(String driverClazz, String jdbcUrl, String login, String passwo
4368
catalog = factory.getLoader(ds).load(ds, new PatternTableFilter(schemas, compiledPattern));
4469
}
4570

71+
private String getUrl(String driverClazz, String host, String port, String database) {
72+
return DATABASES.get(driverClazz).getUrl(host, port, database);
73+
}
74+
4675
private Set<String> chooseSchemas(Set<String> schemas) throws SQLException {
4776
if (schemas.isEmpty()) {
4877
schemas = Collections.singleton(adapter.defaultSchema(connection));
@@ -51,15 +80,7 @@ private Set<String> chooseSchemas(Set<String> schemas) throws SQLException {
5180
}
5281

5382
private DatabaseAdapter chooseAdapter(String driverClazz) {
54-
switch (driverClazz) {
55-
case "org.postgresql.Driver":
56-
return new PostgresqlAdapter();
57-
case "oracle.jdbc.OracleDriver":
58-
return new OracleDatabaseAdapter();
59-
case "org.mariadb.jdbc.Driver":
60-
return new MariadbDatabaseAdapter();
61-
}
62-
throw new RuntimeException("unsupported driver: " + driverClazz);
83+
return DATABASES.get(driverClazz).adapter;
6384
}
6485

6586
public DatabaseAdapter getAdapter() {
@@ -142,4 +163,21 @@ public boolean acceptColumn(String schema, String table, String column) {
142163
return true;
143164
}
144165
}
166+
167+
private final static class DatabaseInfo {
168+
private final String jdbcUrl;
169+
private final DatabaseAdapter adapter;
170+
private final String defaultPort;
171+
172+
public DatabaseInfo(String jdbcUrl, DatabaseAdapter adapter, String defaultPort) {
173+
this.jdbcUrl = jdbcUrl;
174+
this.adapter = adapter;
175+
this.defaultPort = defaultPort;
176+
}
177+
178+
public String getUrl(String host, String port, String database) {
179+
boolean portIsBlank = port == null || port.isEmpty();
180+
return String.format(jdbcUrl, host, portIsBlank ? defaultPort : port, database);
181+
}
182+
}
145183
}

src/main/java/me/vzhilin/dbtree/ui/ApplicationContext.java

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,21 +49,45 @@ public synchronized QueryContext newQueryContext(String connectionName) throws E
4949
}
5050

5151
String driverClass = connection.getDriverClass();
52-
String jdbcUrl = connection.getJdbcUrl();
52+
String host = connection.getHost();
53+
String port = connection.getPort();
54+
String database = connection.getDatabase();
5355
String name = connection.getUsername();
5456
String pass = connection.getPassword();
5557
String pattern = connection.getTableNamePattern();
5658
Set<String> schemas = connection.getSchemas();
57-
queryContext = new QueryContext(contextCache.getContext(driverClass, jdbcUrl, name, pass, pattern, schemas), connection);
59+
60+
DbContext context = contextCache.getContext(driverClass, host, port, database, name, pass, pattern, schemas);
61+
queryContext = new QueryContext(context, connection);
5862
return queryContext;
5963
}
6064

61-
public DbContext newQueryContext(String driverClazz, String jdbcUrlText, String usernameText, String password, String pattern, Set<String> schemas) throws ExecutionException {
62-
return contextCache.getContext(driverClazz, jdbcUrlText, usernameText, password, pattern, schemas);
65+
public DbContext newQueryContext(String driverClazz,
66+
String host,
67+
String port,
68+
String database,
69+
String usernameText,
70+
String password,
71+
String pattern,
72+
Set<String> schemas) throws ExecutionException {
73+
74+
return contextCache.getContext(driverClazz,
75+
host,
76+
port,
77+
database,
78+
usernameText,
79+
password,
80+
pattern,
81+
schemas);
6382
}
6483

65-
public DbContext getIfPresent(String driverClazz, String jdbcUrlText, String usernameText, String password, String pattern, Set<String> schemas) {
66-
return contextCache.getIfPresent(driverClazz, jdbcUrlText, usernameText, password, pattern, schemas);
84+
public DbContext getIfPresent(String driverClazz,
85+
String host,
86+
String port,
87+
String database,
88+
String usernameText, String password, String pattern, Set<String> schemas) {
89+
90+
return contextCache.getIfPresent(driverClazz, host, port, database, usernameText, password, pattern, schemas);
6791
}
6892

6993
public synchronized Logger getLogger() {

src/main/java/me/vzhilin/dbtree/ui/conf/ConnectionSettings.java

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,13 @@ public final class ConnectionSettings {
1717
private final StringProperty driverClass = new SimpleStringProperty();
1818

1919
/** Адрес подключения */
20-
private final StringProperty jdbcUrl = new SimpleStringProperty();
20+
private final StringProperty host = new SimpleStringProperty();
21+
22+
/** connection port */
23+
private final StringProperty port = new SimpleStringProperty();
24+
25+
/** database name */
26+
private final StringProperty database = new SimpleStringProperty();
2127

2228
/** Имя пользователя */
2329
private final StringProperty username = new SimpleStringProperty();
@@ -42,7 +48,9 @@ public ConnectionSettings() {
4248
public ConnectionSettings(ConnectionSettings cs) {
4349
connectionName.set(cs.getConnectionName());
4450
driverClass.set(cs.getDriverClass());
45-
jdbcUrl.set(cs.getJdbcUrl());
51+
host.set(cs.getHost());
52+
port.set(cs.getPort());
53+
database.set(cs.getDatabase());
4654
username.set(cs.getUsername());
4755
password.set(cs.getPassword());
4856
tableNamePatternProperty.set(cs.getTableNamePattern());
@@ -55,6 +63,30 @@ public ConnectionSettings(ConnectionSettings cs) {
5563
lookupableColumns.putAll(cs.lookupableColumns);
5664
}
5765

66+
public String getHost() {
67+
return host.get();
68+
}
69+
70+
public StringProperty hostProperty() {
71+
return host;
72+
}
73+
74+
public String getPort() {
75+
return port.get();
76+
}
77+
78+
public StringProperty portProperty() {
79+
return port;
80+
}
81+
82+
public String getDatabase() {
83+
return database.get();
84+
}
85+
86+
public StringProperty databaseProperty() {
87+
return database;
88+
}
89+
5890
/**
5991
* schema --> Table --> column --> isEnabled
6092
* @return
@@ -84,14 +116,6 @@ public StringProperty driverClassProperty() {
84116
return driverClass;
85117
}
86118

87-
public String getJdbcUrl() {
88-
return jdbcUrl.get();
89-
}
90-
91-
public StringProperty jdbcUrlProperty() {
92-
return jdbcUrl;
93-
}
94-
95119
public String getUsername() {
96120
return username.get();
97121
}

src/main/java/me/vzhilin/dbtree/ui/conf/Settings.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public ObservableList<ConnectionSettings> getConnections() {
3737
return connections.get();
3838
}
3939

40-
public double getDividerPosition() {
40+
public Double getDividerPosition() {
4141
return dividerPosition.get();
4242
}
4343

@@ -191,6 +191,14 @@ public void setSettingsWindowHeight(int height) {
191191
settingsWindow.height = height;
192192
}
193193

194+
public void setSettingsWindow(Dimensions settingsWindow) {
195+
this.settingsWindow = settingsWindow;
196+
}
197+
198+
public void setMainWindow(Dimensions mainWindow) {
199+
this.mainWindow = mainWindow;
200+
}
201+
194202
public static class Dimensions {
195203
public int width;
196204
public int height;

src/main/java/me/vzhilin/dbtree/ui/conf/SettingsCopy.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ public class SettingsCopy {
2020
public SettingsCopy(Settings original) {
2121
this.original = original;
2222
this.copy = new Settings();
23+
this.copy.setSettingsWindow(original.getSettingsWindow());
24+
this.copy.setMainWindow(original.getMainWindow());
25+
this.copy.dividerPositionProperty().setValue(original.getDividerPosition());
2326

2427
for (ConnectionSettings cs: original.getConnections()) {
2528
ConnectionSettings newCs = new ConnectionSettings(cs);
@@ -82,7 +85,9 @@ public void accept(TableKey tableKey, Template template) {
8285
private void writeConnection(ConnectionSettings orig, ConnectionSettings modif) {
8386
orig.connectionNameProperty().set(modif.getConnectionName());
8487
orig.driverClassProperty().set(modif.getDriverClass());
85-
orig.jdbcUrlProperty().set(modif.getJdbcUrl());
88+
orig.hostProperty().set(modif.getHost());
89+
orig.portProperty().set(modif.getPort());
90+
orig.databaseProperty().set(modif.getDatabase());
8691
orig.usernameProperty().set(modif.getUsername());
8792
orig.passwordProperty().set(modif.getPassword());
8893
orig.tableNamePatternProperty().set(modif.getTableNamePattern());

0 commit comments

Comments
 (0)