Skip to content

Commit 29e00fb

Browse files
authored
Merge pull request #139 from Dokyeongyun/ft-220202-connInfoViewRefactoring
Ft 220202 conn info view refactoring
2 parents 54cf2ab + 122b5c9 commit 29e00fb

11 files changed

+261
-115
lines changed

src/main/java/root/javafx/Controller/SettingMenuController.java

Lines changed: 18 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@
4747
import root.core.repository.constracts.PropertyRepository;
4848
import root.core.repository.implement.PropertyRepositoryImpl;
4949
import root.javafx.CustomView.ConnectionInfoVBox;
50-
import root.javafx.CustomView.DBConnectionInfoAnchorPane;
51-
import root.javafx.CustomView.ServerConnectionInfoAnchorPane;
50+
import root.javafx.CustomView.DBConnInfoControl;
51+
import root.javafx.CustomView.ServerConnInfoControl;
5252
import root.utils.AlertUtils;
5353
import root.utils.PropertiesUtils;
5454

@@ -281,17 +281,20 @@ private void loadMonitoringConfigFile(String filePath) {
281281
*
282282
* @param e
283283
*/
284+
@SuppressWarnings("unchecked")
284285
public void saveConnInfoSettings(ActionEvent e) {
285286
// TODO 입력값 검사
286287

287288
String configFilePath = fileChooserText.getText();
288289

289-
ConnectionInfoVBox dbConnVBox = (ConnectionInfoVBox) connInfoVBox.lookup("#dbConnVBox");
290+
ConnectionInfoVBox<JdbcConnectionInfo> dbConnVBox = (ConnectionInfoVBox<JdbcConnectionInfo>) connInfoVBox
291+
.lookup("#dbConnVBox");
290292
dbConnVBox.saveConnInfoSettings(configFilePath);
291-
292-
ConnectionInfoVBox serverConnVBox = (ConnectionInfoVBox) connInfoVBox.lookup("#serverConnVBox");
293+
294+
ConnectionInfoVBox<JschConnectionInfo> serverConnVBox = (ConnectionInfoVBox<JschConnectionInfo>) connInfoVBox
295+
.lookup("#serverConnVBox");
293296
serverConnVBox.saveConnInfoSettings(configFilePath);
294-
297+
295298
// 설정파일 ReLoading
296299
loadSelectedConfigFile(configFilePath);
297300
}
@@ -455,61 +458,40 @@ private void createMonitoringElements(VBox rootVBox, String[] monitoringElements
455458
/**
456459
* [설정] - 설정파일을 불러온 후, 동적 UI를 생성한다.
457460
*/
461+
@SuppressWarnings("unchecked")
458462
private void createSettingDynamicElements() {
459463

460464
jdbcConnInfoList = PropertiesUtils.getJdbcConnectionMap();
461465
jschConnInfoList = PropertiesUtils.getJschConnectionMap();
462466
alcMap = PropertiesUtils.getAlertLogCommandMap();
463467

464-
ConnectionInfoVBox dbConnVBox = null;
468+
ConnectionInfoVBox<JdbcConnectionInfo> dbConnVBox = null;
465469
if (connInfoVBox.lookup("#dbConnVBox") != null) {
466-
dbConnVBox = (ConnectionInfoVBox) connInfoVBox.lookup("#dbConnVBox");
470+
dbConnVBox = (ConnectionInfoVBox<JdbcConnectionInfo>) connInfoVBox.lookup("#dbConnVBox");
467471
dbConnVBox.clearConnInfoMap();
468472
} else {
469473
// DB 접속정보 UI
470-
dbConnVBox = new ConnectionInfoVBox(DBConnectionInfoAnchorPane.class);
474+
dbConnVBox = new ConnectionInfoVBox<>(new DBConnInfoControl());
471475
dbConnVBox.setMenuTitle("DB 접속정보", FontAwesomeIcon.DATABASE);
472476
dbConnVBox.setId("dbConnVBox");
473477
connInfoVBox.getChildren().add(dbConnVBox);
474478
}
475479

476-
if (jdbcConnInfoList.size() == 0) {
477-
DBConnectionInfoAnchorPane dbConnAP = new DBConnectionInfoAnchorPane();
478-
dbConnAP.init();
479-
dbConnAP.setInitialValue(new JdbcConnectionInfo());
480-
dbConnVBox.addConnectionInfoAP(1, dbConnAP);
481-
} else {
482-
for (JdbcConnectionInfo jdbc : jdbcConnInfoList) {
483-
DBConnectionInfoAnchorPane dbConnAP = new DBConnectionInfoAnchorPane();
484-
dbConnAP.init();
485-
dbConnAP.setInitialValue(jdbc);
486-
dbConnVBox.addConnectionInfoAP(1, dbConnAP);
487-
}
488-
}
480+
dbConnVBox.addConnInfoList(jdbcConnInfoList);
489481

490-
ConnectionInfoVBox serverConnVBox = null;
482+
ConnectionInfoVBox<JschConnectionInfo> serverConnVBox = null;
491483
if(connInfoVBox.lookup("#serverConnVBox") != null) {
492-
serverConnVBox = (ConnectionInfoVBox) connInfoVBox.lookup("#serverConnVBox");
484+
serverConnVBox = (ConnectionInfoVBox<JschConnectionInfo>) connInfoVBox.lookup("#serverConnVBox");
493485
serverConnVBox.clearConnInfoMap();
494486
} else {
495487
// Server 접속정보 UI
496-
serverConnVBox = new ConnectionInfoVBox(ServerConnectionInfoAnchorPane.class);
488+
serverConnVBox = new ConnectionInfoVBox<>(new ServerConnInfoControl());
497489
serverConnVBox.setMenuTitle("서버 접속정보", FontAwesomeIcon.SERVER);
498490
serverConnVBox.setId("serverConnVBox");
499491
connInfoVBox.getChildren().add(serverConnVBox);
500492
}
501493

502-
if (jschConnInfoList.size() == 0) {
503-
ServerConnectionInfoAnchorPane serverConnAP = new ServerConnectionInfoAnchorPane();
504-
serverConnAP.setInitialValue(new JschConnectionInfo());
505-
serverConnVBox.addConnectionInfoAP(1, serverConnAP);
506-
} else {
507-
for (JschConnectionInfo jsch : jschConnInfoList) {
508-
ServerConnectionInfoAnchorPane serverConnAP = new ServerConnectionInfoAnchorPane();
509-
serverConnAP.setInitialValue(jsch);
510-
serverConnVBox.addConnectionInfoAP(1, serverConnAP);
511-
}
512-
}
494+
serverConnVBox.addConnInfoList(jschConnInfoList);
513495

514496
// [설정] - [모니터링 여부 설정]
515497
reloadingMonitoringSetting("");
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package root.javafx.CustomView;
2+
3+
import java.util.Collection;
4+
5+
import root.javafx.CustomView.ConnectionInfoVBox.StatefulAP;
6+
import root.javafx.Service.ConnectionTestService;
7+
8+
public interface ConnInfoControl<T> {
9+
10+
void save(String configFilePath, Collection<StatefulAP> statefulAP);
11+
12+
ConnectionTestService getConnectionTestService(ConnectionInfoAP curAP);
13+
14+
ConnectionInfoAP getNewConnInfoAP();
15+
16+
ConnectionInfoAP getConnInfoAP(T connInfo);
17+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package root.javafx.CustomView;
2+
3+
import javafx.scene.layout.AnchorPane;
4+
5+
public class ConnectionInfoAP extends AnchorPane {
6+
7+
}

src/main/java/root/javafx/CustomView/ConnectionInfoVBox.java

Lines changed: 42 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import java.io.IOException;
44
import java.util.Collections;
5-
import java.util.HashMap;
5+
import java.util.List;
66
import java.util.Map;
77
import java.util.stream.Collectors;
88

@@ -18,26 +18,17 @@
1818
import javafx.scene.Node;
1919
import javafx.scene.control.Alert.AlertType;
2020
import javafx.scene.control.Label;
21-
import javafx.scene.control.PasswordField;
22-
import javafx.scene.control.TextField;
2321
import javafx.scene.layout.AnchorPane;
2422
import javafx.scene.layout.StackPane;
2523
import javafx.scene.layout.VBox;
2624
import javafx.scene.paint.Paint;
2725
import javafx.scene.text.Text;
2826
import lombok.AllArgsConstructor;
2927
import lombok.Data;
30-
import root.core.domain.JdbcConnectionInfo;
31-
import root.core.domain.JschConnectionInfo;
32-
import root.core.repository.constracts.PropertyRepository;
33-
import root.core.repository.implement.PropertyRepositoryImpl;
34-
import root.javafx.Service.DatabaseConnectService;
28+
import root.javafx.Service.ConnectionTestService;
3529
import root.utils.AlertUtils;
3630

37-
public class ConnectionInfoVBox extends VBox {
38-
39-
/* Dependency Injection */
40-
private PropertyRepository propertyRepository = PropertyRepositoryImpl.getInstance();
31+
public class ConnectionInfoVBox<T> extends VBox {
4132

4233
@FXML
4334
Label menuTitleLB;
@@ -68,15 +59,16 @@ public class ConnectionInfoVBox extends VBox {
6859

6960
@FXML
7061
JFXButton nextConnInfoBtn;
71-
72-
private Class<? extends AnchorPane> childAPClazz;
62+
63+
private ConnInfoControl<T> connInfoControl;
7364

7465
private ConnInfoAPMap connInfoAPMap = new ConnInfoAPMap();
7566

7667
private long connInfoIdx = -1;
7768

78-
public ConnectionInfoVBox(Class<? extends AnchorPane> childAPClazz) {
79-
this.childAPClazz = childAPClazz;
69+
public ConnectionInfoVBox(ConnInfoControl<T> connInfoControl) {
70+
this.connInfoControl = connInfoControl;
71+
8072
try {
8173
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/ConnectionInfoVBox.fxml"));
8274
loader.setController(this);
@@ -93,7 +85,7 @@ public void clearConnInfoMap() {
9385
}
9486

9587
public void addConnectionInfoAP(int type, Node connInfoAP) {
96-
long newIdx = connInfoAPMap.put(new StatefulAP(type, (AnchorPane) connInfoAP));
88+
long newIdx = connInfoAPMap.put(new StatefulAP(type, (ConnectionInfoAP) connInfoAP));
9789
connInfoAP.setId(String.valueOf(newIdx));
9890
connInfoStackPane.getChildren().add(connInfoAP);
9991

@@ -108,78 +100,56 @@ public void addConnectionInfoAP(int type, Node connInfoAP) {
108100
}
109101
}
110102

111-
// TODO 다형성을 이용해 클래스 타입체크 제거하기
112103
public void saveConnInfoSettings(String configFilePath) {
113-
if (childAPClazz == DBConnectionInfoAnchorPane.class) {
114-
Map<String, JdbcConnectionInfo> config = new HashMap<>();
115-
116-
for (StatefulAP childAP : this.connInfoAPMap.getActiveAPs().values()) {
117-
DBConnectionInfoAnchorPane dbConnAP = (DBConnectionInfoAnchorPane) childAP.getAp();
118-
JdbcConnectionInfo jdbc = dbConnAP.getInputValues();
119-
config.put(jdbc.getJdbcDBName().toUpperCase(), jdbc);
120-
}
121-
propertyRepository.saveDBConnectionInfo(configFilePath, config);
122-
} else {
123-
Map<String, JschConnectionInfo> config = new HashMap<>();
124-
125-
for (StatefulAP childAP : this.connInfoAPMap.getActiveAPs().values()) {
126-
ServerConnectionInfoAnchorPane serverConnAP = (ServerConnectionInfoAnchorPane) childAP.getAp();
127-
JschConnectionInfo jsch = serverConnAP.getInputValues();
128-
config.put(jsch.getServerName().toUpperCase(), jsch);
129-
}
130-
propertyRepository.saveServerConnectionInfo(configFilePath, config);
104+
connInfoControl.save(configFilePath, this.connInfoAPMap.getActiveAPs().values());
105+
}
106+
107+
public void addConnInfoList(List<T> connInfoList) {
108+
if (connInfoList.isEmpty()) {
109+
addConnectionInfoAP(2, connInfoControl.getNewConnInfoAP());
110+
return;
111+
}
112+
113+
for(T connInfo : connInfoList) {
114+
ConnectionInfoAP connInfoAP = connInfoControl.getConnInfoAP(connInfo);
115+
addConnectionInfoAP(1, connInfoAP);
131116
}
132117
}
133118

134119
/* Button Click Listener */
135120

136121
public void testConnection(ActionEvent e) {
137-
if (childAPClazz == DBConnectionInfoAnchorPane.class) {
122+
123+
// 현재 AP에 작성된 접속정보를 이용해 연결 테스트
124+
ConnectionInfoAP curAP = connInfoAPMap.get(connInfoIdx).getAp();
125+
126+
ConnectionTestService testService = connInfoControl.getConnectionTestService(curAP);
127+
128+
if (testService != null) {
138129
// 아이콘 변경
139130
setConnectionBtnIcon(4);
140131

141-
AnchorPane curAP = connInfoAPMap.get(connInfoIdx).getAp();
142-
143-
String jdbcUrl = ((TextField) curAP.lookup("#urlTF")).getText();
144-
String jdbcId = ((TextField) curAP.lookup("#userTF")).getText();
145-
String jdbcPw = ((PasswordField) curAP.lookup("#passwordPF")).getText();
146-
147-
// TODO JdbcDriver, Validation Query 하드코딩 변경 - DBMS에 따라 다르게 해야 함
148-
JdbcConnectionInfo jdbc = new JdbcConnectionInfo("oracle.jdbc.driver.OracleDriver", jdbcUrl, jdbcId, jdbcPw,
149-
"SELECT 1 FROM DUAL", 1);
150-
151-
DatabaseConnectService dbConnService = new DatabaseConnectService(jdbc);
152-
dbConnService.setOnSucceeded(s -> {
153-
AlertUtils.showAlert(AlertType.INFORMATION, "DB 연동테스트",
154-
String.format(DatabaseConnectService.SUCCESS_MSG, jdbc.getJdbcUrl(), jdbc.getJdbcDriver()));
132+
// 성공시 콜백 이벤트 설정
133+
testService.setOnSucceeded(s -> {
134+
testService.alertSucceed();
155135
setConnectionBtnIcon(2);
156136
});
157-
158-
dbConnService.setOnFailed(f -> {
159-
AlertUtils.showAlert(AlertType.ERROR, "DB 연동테스트",
160-
String.format(DatabaseConnectService.FAIL_MSG, jdbc.getJdbcUrl(), jdbc.getJdbcDriver()));
137+
138+
// 실패시 콜백 이벤트 설정
139+
testService.setOnFailed(f -> {
140+
testService.alertFailed();
161141
setConnectionBtnIcon(3);
162142
});
163143

164-
dbConnService.start();
165-
} else if (childAPClazz == ServerConnectionInfoAnchorPane.class) {
166-
144+
// 연결테스트 시작
145+
testService.start();
146+
} else {
147+
AlertUtils.showAlert(AlertType.ERROR, "연결 테스트", "연결 테스트를 수행하기 위한 정보가 부족합니다.\n접속정보를 입력해주세요.");
167148
}
168149
}
169150

170151
public void addNewConnInfo(ActionEvent e) {
171-
if (childAPClazz == DBConnectionInfoAnchorPane.class) {
172-
DBConnectionInfoAnchorPane dbConnAP = new DBConnectionInfoAnchorPane();
173-
dbConnAP.init();
174-
dbConnAP.setInitialValue(new JdbcConnectionInfo());
175-
addConnectionInfoAP(2, dbConnAP);
176-
177-
} else if (childAPClazz == ServerConnectionInfoAnchorPane.class) {
178-
ServerConnectionInfoAnchorPane serverConnAP = new ServerConnectionInfoAnchorPane();
179-
serverConnAP.setInitialValue(new JschConnectionInfo());
180-
addConnectionInfoAP(2, serverConnAP);
181-
182-
}
152+
addConnectionInfoAP(2, connInfoControl.getNewConnInfoAP());
183153
}
184154

185155
public void removeConnInfo(ActionEvent e) {
@@ -220,7 +190,6 @@ public void setMenuTitle(String menuTitle, FontAwesomeIcon menuIcon) {
220190
menuIconIV.setIcon(menuIcon);
221191
}
222192

223-
224193
// When connectionInfo index changed, this method always will be invoked.
225194
private void bringFrontConnInfoAnchorPane(long index) {
226195
connInfoIdx = index;
@@ -288,9 +257,9 @@ private void setButtonsDisable(boolean disabled) {
288257

289258
@AllArgsConstructor
290259
@Data
291-
private static class StatefulAP {
260+
public static class StatefulAP {
292261
private int status; // 1: 기존, 2: 신규, 3: 제거
293-
private AnchorPane ap;
262+
private ConnectionInfoAP ap;
294263
}
295264

296265
private static class ConnInfoAPMap {
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package root.javafx.CustomView;
2+
3+
import java.util.Collection;
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
7+
import javafx.scene.control.PasswordField;
8+
import javafx.scene.control.TextField;
9+
import root.core.domain.JdbcConnectionInfo;
10+
import root.core.repository.constracts.PropertyRepository;
11+
import root.core.repository.implement.PropertyRepositoryImpl;
12+
import root.javafx.CustomView.ConnectionInfoVBox.StatefulAP;
13+
import root.javafx.Service.ConnectionTestService;
14+
import root.javafx.Service.DatabaseConnectService;
15+
16+
public class DBConnInfoControl implements ConnInfoControl<JdbcConnectionInfo> {
17+
18+
/* Dependency Injection */
19+
private PropertyRepository propertyRepository = PropertyRepositoryImpl.getInstance();
20+
21+
@Override
22+
public void save(String configFilePath, Collection<StatefulAP> statefulAP) {
23+
24+
Map<String, JdbcConnectionInfo> config = new HashMap<>();
25+
26+
for (StatefulAP childAP : statefulAP) {
27+
DBConnectionInfoAnchorPane dbConnAP = (DBConnectionInfoAnchorPane) childAP.getAp();
28+
JdbcConnectionInfo jdbc = dbConnAP.getInputValues();
29+
config.put(jdbc.getJdbcDBName().toUpperCase(), jdbc);
30+
}
31+
propertyRepository.saveDBConnectionInfo(configFilePath, config);
32+
}
33+
34+
@Override
35+
public ConnectionTestService getConnectionTestService(ConnectionInfoAP curAP) {
36+
String jdbcUrl = ((TextField) curAP.lookup("#urlTF")).getText();
37+
String jdbcId = ((TextField) curAP.lookup("#userTF")).getText();
38+
String jdbcPw = ((PasswordField) curAP.lookup("#passwordPF")).getText();
39+
40+
// TODO JdbcDriver, Validation Query 하드코딩 변경 - DBMS에 따라 다르게 해야 함
41+
JdbcConnectionInfo jdbc = new JdbcConnectionInfo("oracle.jdbc.driver.OracleDriver", jdbcUrl, jdbcId, jdbcPw,
42+
"SELECT 1 FROM DUAL", 1);
43+
return new DatabaseConnectService(jdbc);
44+
}
45+
46+
@Override
47+
public ConnectionInfoAP getNewConnInfoAP() {
48+
DBConnectionInfoAnchorPane dbConnAP = new DBConnectionInfoAnchorPane();
49+
dbConnAP.init();
50+
dbConnAP.setInitialValue(new JdbcConnectionInfo());
51+
return dbConnAP;
52+
}
53+
54+
@Override
55+
public ConnectionInfoAP getConnInfoAP(JdbcConnectionInfo connInfo) {
56+
DBConnectionInfoAnchorPane dbConnAP = new DBConnectionInfoAnchorPane();
57+
dbConnAP.init();
58+
dbConnAP.setInitialValue(connInfo);
59+
return dbConnAP;
60+
}
61+
}

0 commit comments

Comments
 (0)