11package root .javafx .Controller ;
22
33import java .io .IOException ;
4- import java .util .ArrayList ;
5- import java .util .HashMap ;
4+ import java .util .Collections ;
5+ import java .util .Date ;
6+ import java .util .LinkedHashMap ;
67import java .util .List ;
78import java .util .Map ;
89
910import de .jensd .fx .glyphs .fontawesome .FontAwesomeIcon ;
1011import de .jensd .fx .glyphs .fontawesome .FontAwesomeIconView ;
11- import javafx .collections . FXCollections ;
12+ import javafx .event . ActionEvent ;
1213import javafx .fxml .FXML ;
1314import javafx .fxml .FXMLLoader ;
1415import javafx .scene .control .Label ;
1516import javafx .scene .layout .AnchorPane ;
16- import javafx .scene .layout .HBox ;
1717import javafx .scene .layout .StackPane ;
18- import javafx .scene .text .Font ;
19- import root .core .domain .ASMDiskUsage ;
20- import root .core .domain .ArchiveUsage ;
18+ import lombok .AllArgsConstructor ;
19+ import lombok .Data ;
2120import root .core .domain .MonitoringResult ;
22- import root .core .domain .OSDiskUsage ;
23- import root .core .domain .TableSpaceUsage ;
2421import root .core .domain .enums .UsageUIType ;
25- import root .javafx .CustomView .MonitoringTableView ;
26- import root .javafx .CustomView .MonitoringTableViewFactory ;
22+ import root .javafx .CustomView .MonitoringTableViewContainer ;
2723import root .javafx .DI .DependencyInjection ;
24+ import root .utils .DateUtils ;
2825
29- public class MonitoringResultTableViewAP extends AnchorPane {
26+ public class MonitoringTableViewPagingBox extends AnchorPane {
27+
28+ @ FXML
29+ private FontAwesomeIconView iconView ;
3030
3131 @ FXML
3232 private Label aliasLabel ;
@@ -37,79 +37,178 @@ public class MonitoringResultTableViewAP extends AnchorPane {
3737 @ FXML
3838 private StackPane tableViewSP ;
3939
40- @ FXML
41- private HBox tableViewHBox ;
42-
43- private static final Map <Class <? extends MonitoringResult >, String > titleMap = new HashMap <>();
44- static {
45- titleMap .put (ArchiveUsage .class , "Archive 사용량" );
46- titleMap .put (TableSpaceUsage .class , "TableSpace 사용량" );
47- titleMap .put (ASMDiskUsage .class , "ASM Disk 사용량" );
48- titleMap .put (OSDiskUsage .class , "OS Disk 사용량" );
49- }
50-
51- private Map <Class <? extends MonitoringResult >, MonitoringTableView <? extends MonitoringResult >> tableViewMap = new HashMap <>();
52-
53- private Map <Class <? extends MonitoringResult >, List <Object >> tableDataListMap = new HashMap <>();
40+ private Map <AliasInfo , MonitoringTableViewContainer > tableViewContainerMap = new LinkedHashMap <>();
5441
55- public MonitoringResultTableViewAP ( ) {
42+ public MonitoringTableViewPagingBox ( String monitoringType ) {
5643 try {
57- FXMLLoader loader = DependencyInjection .getLoader ("/fxml/MonitoringResultTableViewAP .fxml" );
44+ FXMLLoader loader = DependencyInjection .getLoader ("/fxml/MonitoringTableViewPagingBox .fxml" );
5845 loader .setController (this );
5946 loader .setRoot (this );
6047 loader .load ();
6148 } catch (IOException e ) {
6249 e .printStackTrace ();
6350 }
51+ iconView .setIcon (monitoringType .equals ("DB" ) ? FontAwesomeIcon .DATABASE : FontAwesomeIcon .SERVER );
52+ setMonitoringTimeLabel (new Date ());
6453 }
6554
6655 /**
67- * 모니터링 결과 TableView를 추가한다 .
56+ * Alias별로 모니터링 TableView를 나열할 컨테이너를 생성한다 .
6857 *
58+ * @param alias
6959 * @param type
7060 */
71- private void addMonitoringTableView (Class <? extends MonitoringResult > type , UsageUIType usageUIType ) {
72- AnchorPane tableViewWrapper = new AnchorPane ();
73- tableViewWrapper .setMinWidth (350 );
74-
75- Label titleLabel = new Label ();
76- titleLabel .setText (titleMap .get (type ));
77- titleLabel .setFont (Font .font ("Noto Sans Korean Regular" ));
78-
79- FontAwesomeIconView icon = new FontAwesomeIconView (FontAwesomeIcon .ASTERISK , "9" );
80- titleLabel .setGraphic (icon );
81-
82- AnchorPane .setTopAnchor (titleLabel , 0.0 );
83- AnchorPane .setLeftAnchor (titleLabel , 0.0 );
84- AnchorPane .setRightAnchor (titleLabel , 0.0 );
85-
86- MonitoringTableView <? extends MonitoringResult > tableView = MonitoringTableViewFactory .create (type , usageUIType );
87- AnchorPane .setTopAnchor (tableView , 20.0 );
88- AnchorPane .setLeftAnchor (tableView , 0.0 );
89- AnchorPane .setRightAnchor (tableView , 0.0 );
90- AnchorPane .setBottomAnchor (tableView , 0.0 );
91- tableViewMap .put (type , tableView );
92-
93- tableViewWrapper .getChildren ().addAll (titleLabel , tableView );
94- tableViewHBox .getChildren ().add (tableViewWrapper );
95- }
96-
97- @ SuppressWarnings ("unchecked" )
98- public <T extends MonitoringResult > void setTableData (String alias , Class <T > type , List <T > dataList ,
99- UsageUIType usageUIType ) {
100- List <Object > list = tableDataListMap .get (type );
101- if (list == null ) {
102- list = new ArrayList <>();
61+ public void addMonitoringTableViewContainer (String alias , Class <? extends MonitoringResult > type ) {
62+ if (tableViewContainerMap .get (findAliasInfoByAlias (alias )) == null ) {
63+ MonitoringTableViewContainer container = new MonitoringTableViewContainer ();
64+ tableViewContainerMap .put (new AliasInfo (alias , findLastAliasInfoIndex () + 1 ), container );
65+ tableViewSP .getChildren ().add (container );
10366 }
10467
105- list .clear ();
106- list .addAll (dataList );
68+ MonitoringTableViewContainer container = tableViewContainerMap .get (findAliasInfoByAlias (alias ));
69+ container .addMonitoringTableView (type );
70+ container .setUsageUIType (type , UsageUIType .NUMERIC ); // default
71+ tableViewContainerMap .put (findAliasInfoByAlias (alias ), container );
72+ }
73+
74+ /**
75+ * 모니터링 결과 TableView의 사용량 컬럼의 UI 타입을 설정한다.
76+ *
77+ * @param alias
78+ * @param type
79+ * @param uiType
80+ */
81+ public void setMonitoringTableViewUsageUIType (String alias , Class <? extends MonitoringResult > type ,
82+ UsageUIType uiType ) {
83+ tableViewContainerMap .get (findAliasInfoByAlias (alias )).setUsageUIType (type , uiType );
84+ }
85+
86+ /**
87+ * 모니터링 결과 TableView에 데이터셋을 설정한다.
88+ *
89+ * @param <T>
90+ * @param alias
91+ * @param type
92+ * @param dataList
93+ */
94+ public <T extends MonitoringResult > void setMonitoringTableViewData (String alias , Class <T > type , List <T > dataList ) {
95+ tableViewContainerMap .get (findAliasInfoByAlias (alias )).setTableData (type , dataList );
96+ showTableViewContainer (alias );
97+ }
98+
99+ /**
100+ * 특정 Alias의 TableViewContainer를 맨 앞으로 가져오고 라벨을 변경한다.
101+ *
102+ * @param alias
103+ */
104+ private void showTableViewContainer (String alias ) {
105+ setAliasLabel (alias );
106+ tableViewContainerMap .get (findAliasInfoByAlias (alias )).toFront ();
107+ }
108+
109+ /**
110+ * Alias Label의 텍스트를 설정한다.
111+ *
112+ * @param alias
113+ */
114+ private void setAliasLabel (String alias ) {
115+ aliasLabel .setText (alias );
116+ }
117+
118+ /**
119+ * Monitoring Time Label의 텍스트를 설정한다.
120+ *
121+ * @param time
122+ */
123+ public void setMonitoringTimeLabel (Date time ) {
124+ monitoringTimeLabel .setText (DateUtils .format (time , "yyyy-MM-dd HH:mm:ss" ));
125+ }
126+
127+ private AliasInfo findAliasInfoByAlias (String alias ) {
128+ return tableViewContainerMap .keySet ()
129+ .stream ()
130+ .filter (info -> info .getAlias ().equals (alias ))
131+ .findFirst ()
132+ .orElse (null );
133+ }
134+
135+ private AliasInfo findAliasInfoByIndex (int index ) {
136+ return tableViewContainerMap .keySet ()
137+ .stream ()
138+ .filter (info -> info .getIndex () == index )
139+ .findFirst ()
140+ .orElse (null );
141+ }
107142
108- if (tableViewMap .get (type ) == null ) {
109- addMonitoringTableView (type , usageUIType );
143+ private int findAliasInfoIndex (String alias ) {
144+ return findAliasInfoByAlias (alias ).getIndex ();
145+ }
146+
147+ private int findFirstAliasInfoIndex () {
148+ return tableViewContainerMap .keySet ()
149+ .stream ()
150+ .sorted ()
151+ .map (info -> info .getIndex ())
152+ .findFirst ()
153+ .orElse (-1 );
154+ }
155+
156+ private int findLastAliasInfoIndex () {
157+ return tableViewContainerMap .keySet ()
158+ .stream ()
159+ .sorted (Collections .reverseOrder ())
160+ .map (info -> info .getIndex ())
161+ .findFirst ()
162+ .orElse (-1 );
163+ }
164+
165+ private int findPrevAliasInfoIndex (int curIndex ) {
166+ return tableViewContainerMap .keySet ()
167+ .stream ()
168+ .filter (info -> info .getIndex () < curIndex )
169+ .sorted (Collections .reverseOrder ())
170+ .map (info -> info .getIndex ())
171+ .findFirst ()
172+ .orElse (-1 );
173+ }
174+
175+ private int findNextAliasInfoIndex (int curIndex ) {
176+ return tableViewContainerMap .keySet ()
177+ .stream ()
178+ .filter (info -> info .getIndex () > curIndex )
179+ .sorted ()
180+ .map (info -> info .getIndex ())
181+ .findFirst ()
182+ .orElse (-1 );
183+ }
184+
185+ public void prevContainer (ActionEvent e ) {
186+ int curIndex = findAliasInfoIndex (aliasLabel .getText ());
187+ int prevIndex = findPrevAliasInfoIndex (curIndex );
188+ if (prevIndex == -1 ) {
189+ prevIndex = findLastAliasInfoIndex ();
110190 }
191+ showTableViewContainer (findAliasInfoByIndex (prevIndex ).getAlias ());
192+ }
193+
194+ public void nextContainer (ActionEvent e ) {
195+ int curIndex = findAliasInfoIndex (aliasLabel .getText ());
196+ int nextIndex = findNextAliasInfoIndex (curIndex );
197+ if (nextIndex == -1 ) {
198+ nextIndex = findFirstAliasInfoIndex ();
199+ }
200+ showTableViewContainer (findAliasInfoByIndex (nextIndex ).getAlias ());
201+ }
202+
203+ @ AllArgsConstructor
204+ @ Data
205+ private static class AliasInfo implements Comparable <AliasInfo > {
206+ String alias ;
207+ int index ;
111208
112- MonitoringTableView <T > tableView = (MonitoringTableView <T >) tableViewMap .get (type );
113- tableView .setItems (FXCollections .observableArrayList (dataList ));
209+ @ Override
210+ public int compareTo (AliasInfo o ) {
211+ return this .index - o .index ;
212+ }
114213 }
115214}
0 commit comments