Skip to content

Commit 2415f8b

Browse files
committed
14th commit - search field and filters.
1 parent fc9506b commit 2415f8b

3 files changed

Lines changed: 179 additions & 81 deletions

File tree

src/main/java/com/project/authapi/system_log_analyzer/controller/MainWindowFXController.java

Lines changed: 78 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,34 @@
2222

2323
@Controller
2424
public class MainWindowFXController {
25+
// TOP
2526
@FXML private Label totalLabel;
2627
@FXML private Label eventsLabel;
2728
@FXML private Label warningsLabel;
2829
@FXML private Label frequentLabel;
29-
30+
// Search bar
31+
@FXML private TextField searchField;
32+
@FXML private Label filteredCountLabel;
33+
@FXML private CheckBox filterInfo;
34+
@FXML private CheckBox filterWarn;
35+
@FXML private CheckBox filterError;
36+
// table
3037
@FXML private TableView<LogEvent> logTable;
3138
@FXML private TableColumn<LogEvent, String> timeColumn;
3239
@FXML private TableColumn<LogEvent, String> eventColumn;
3340
@FXML private TableColumn<LogEvent, String> descriptionColumn;
3441
@FXML private TableColumn<LogEvent, String> sourceColumn;
35-
42+
// under table
3643
@FXML private Button refreshButton;
37-
3844
@FXML private Label loadingLabel;
39-
45+
// injections from backend
4046
@Autowired FileLoggerService fileLoggerService;
4147
@Autowired private WindowsEventExporter exporter;
4248
@Autowired private WindowsEventParser parser;
43-
49+
@Autowired private appConfig appConfig;
50+
// local vars
4451
private List<LogEvent> logs;
45-
@Autowired
46-
private appConfig appConfig;
52+
4753

4854
@FXML
4955
public void initialize() {
@@ -52,7 +58,7 @@ public void initialize() {
5258
sourceColumn.setCellValueFactory(new PropertyValueFactory<>("source"));
5359
timeColumn.setCellValueFactory(new PropertyValueFactory<>("timestamp"));
5460
timeColumn.setPrefWidth(150);
55-
eventColumn.setPrefWidth(60);
61+
eventColumn.setPrefWidth(90);
5662
descriptionColumn.setPrefWidth(604.0);
5763
sourceColumn.setPrefWidth(200);
5864

@@ -215,4 +221,68 @@ protected List<LogEvent> call() throws Exception {
215221

216222
new Thread(task).start();
217223
}
224+
@FXML
225+
public void onSearchChanged() {
226+
applyFilters();
227+
}
228+
229+
@FXML
230+
public void onClearFilters() {
231+
searchField.clear();
232+
filterInfo.setSelected(false);
233+
filterWarn.setSelected(false);
234+
filterError.setSelected(false);
235+
236+
applyFilters();
237+
}
238+
239+
@FXML
240+
public void onFilterChanged() {
241+
applyFilters();
242+
}
243+
244+
// Helper method for filters
245+
private void applyFilters() {
246+
if (logs == null) return;
247+
248+
String input = searchField.getText().toLowerCase().trim();
249+
250+
// input correctness check
251+
input = input.replaceAll("[<>]", ""); // No scripts
252+
input = input.replaceAll("\\p{Cntrl}", "");
253+
254+
String safeInput = input;
255+
256+
boolean info = filterInfo.isSelected();
257+
boolean warn = filterWarn.isSelected();
258+
boolean error = filterError.isSelected();
259+
260+
List<LogEvent> filtered = logs.stream().filter( log -> {
261+
if (info || warn || error) {
262+
LogLevel lvl = log.getLevel();
263+
if (lvl == LogLevel.info && !info) return false;
264+
if (lvl == LogLevel.warn && !warn) return false;
265+
if (lvl == LogLevel.error && !error) return false;
266+
267+
if (lvl == LogLevel.debug || lvl == LogLevel.unknown) return false;
268+
}
269+
270+
if (!safeInput.isEmpty()) {
271+
String combined = (
272+
log.getMessage() + " " +
273+
log.getSource() + " " +
274+
log.getLevel() + " " +
275+
log.getTimestamp()
276+
).toLowerCase();
277+
278+
if (!combined.contains(safeInput)) return false;
279+
}
280+
281+
return true;
282+
283+
}).toList();
284+
logTable.getItems().setAll(filtered);
285+
filteredCountLabel.setText("Showing: " + filtered.size() + " / " + logs.size() + " entries");
286+
}
287+
218288
}

src/main/java/com/project/authapi/system_log_analyzer/system/AppShutdownHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public AppShutdownHandler(FileLoggerService fileLoggerService, FileReportExporte
2323
@EventListener(ContextClosedEvent.class)
2424
public void onShutdown() {
2525
try {
26-
System.out.println("AppShutdownHandler - Application is shutting down — flushing logs and exporting report...");
26+
System.out.println("AppShutdownHandler - Application is shutting down! Flushing logs and exporting report...");
2727

2828
fileLoggerService.flushLogToMainFile();
2929

src/main/resources/MainWindow.fxml

Lines changed: 100 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,103 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22

33
<?import javafx.geometry.Insets?>
4-
<?import javafx.scene.control.Button?>
5-
<?import javafx.scene.control.Label?>
6-
<?import javafx.scene.control.TableColumn?>
7-
<?import javafx.scene.control.TableView?>
8-
<?import javafx.scene.layout.VBox?>
9-
<?import javafx.scene.text.Font?>
10-
11-
<?import javafx.scene.control.ProgressIndicator?>
12-
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="675.0" prefWidth="1100.0" xmlns="http://javafx.com/javafx/25" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.project.authapi.system_log_analyzer.controller.MainWindowFXController">
13-
<children>
14-
<Label fx:id="totalLabel" text="Total number of log entries processed:">
15-
<VBox.margin>
16-
<Insets left="20.0" top="20.0" />
17-
</VBox.margin>
18-
<font>
19-
<Font size="14.0" />
20-
</font>
21-
</Label>
22-
<Label fx:id="eventsLabel" text="Number of error events:">
23-
<VBox.margin>
24-
<Insets left="20.0" top="10.0" />
25-
</VBox.margin>
26-
<font>
27-
<Font size="14.0" />
28-
</font>
29-
</Label>
30-
<Label fx:id="warningsLabel" text="Number of warning events:">
31-
<VBox.margin>
32-
<Insets left="20.0" top="10.0" />
33-
</VBox.margin>
34-
<font>
35-
<Font size="14.0" />
36-
</font>
37-
</Label>
38-
<Label fx:id="frequentLabel" text="Most frequent event type:">
39-
<font>
40-
<Font size="14.0" />
41-
</font>
42-
<VBox.margin>
43-
<Insets left="20.0" top="10.0" />
44-
</VBox.margin>
45-
</Label>
46-
<TableView fx:id="logTable" prefHeight="457.0" prefWidth="1059.0">
47-
<columns>
48-
<TableColumn fx:id="timeColumn" prefWidth="84.0" text="Time" />
49-
<TableColumn fx:id="eventColumn" prefWidth="179.0" text="Event" />
50-
<TableColumn fx:id="descriptionColumn" prefWidth="604.0" text="Description" />
51-
<TableColumn fx:id="sourceColumn" minWidth="0.0" prefWidth="198.0" text="Source" />
52-
</columns>
53-
<VBox.margin>
54-
<Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
55-
</VBox.margin>
56-
<opaqueInsets>
57-
<Insets />
58-
</opaqueInsets>
59-
</TableView>
60-
<Button fx:id="refreshButton" alignment="CENTER" mnemonicParsing="false" onAction="#onRefreshClick" prefHeight="35.0" prefWidth="100.0" text="Refresh" textAlignment="CENTER">
61-
<VBox.margin>
62-
<Insets bottom="5.0" left="500.0" right="500.0" />
63-
</VBox.margin>
64-
</Button>
65-
<Label fx:id="loadingLabel"
66-
text=""
67-
alignment="CENTER"
68-
maxWidth="Infinity"
69-
style="-fx-alignment: center;">
70-
<VBox.margin>
71-
<Insets bottom="10.0" />
72-
</VBox.margin>
73-
</Label>
74-
</children>
75-
</VBox>
4+
<?import javafx.scene.control.*?>
5+
<?import javafx.scene.layout.*?>
6+
7+
<?import javafx.geometry.Insets?>
8+
<?import javafx.scene.control.*?>
9+
<?import javafx.scene.layout.*?>
10+
11+
<BorderPane xmlns="http://javafx.com/javafx/25"
12+
xmlns:fx="http://javafx.com/fxml/1"
13+
fx:controller="com.project.authapi.system_log_analyzer.controller.MainWindowFXController">
14+
15+
<!-- top of scene -->
16+
<top>
17+
<VBox spacing="10">
18+
<BorderPane.margin>
19+
<Insets top="20" left="20" right="20"/>
20+
</BorderPane.margin>
21+
22+
<!-- Statistics -->
23+
<GridPane hgap="40" vgap="10">
24+
<columnConstraints>
25+
<ColumnConstraints percentWidth="50"/>
26+
<ColumnConstraints percentWidth="50"/>
27+
</columnConstraints>
28+
29+
<children>
30+
<Label fx:id="totalLabel" GridPane.rowIndex="0" GridPane.columnIndex="0"/>
31+
<Label fx:id="eventsLabel" GridPane.rowIndex="0" GridPane.columnIndex="1"/>
32+
<Label fx:id="warningsLabel" GridPane.rowIndex="1" GridPane.columnIndex="0"/>
33+
<Label fx:id="frequentLabel" GridPane.rowIndex="1" GridPane.columnIndex="1"/>
34+
</children>
35+
</GridPane>
36+
37+
<Separator/>
38+
39+
<!-- Filters -->
40+
<VBox spacing="10" alignment="CENTER">
41+
42+
<HBox spacing="10" alignment="CENTER">
43+
<TextField fx:id="searchField"
44+
promptText="Search..."
45+
onKeyReleased="#onSearchChanged"
46+
HBox.hgrow="ALWAYS"/>
47+
48+
<Button text="Clear" onAction="#onClearFilters"/>
49+
50+
<Label fx:id="filteredCountLabel"
51+
text="Showing: 0 / 0 entries"
52+
style="-fx-font-size: 13;"/>
53+
</HBox>
54+
55+
<HBox alignment="CENTER" spacing="20">
56+
<CheckBox fx:id="filterInfo" text="INFO" onAction="#onFilterChanged"/>
57+
<CheckBox fx:id="filterWarn" text="WARN" onAction="#onFilterChanged"/>
58+
<CheckBox fx:id="filterError" text="ERROR" onAction="#onFilterChanged"/>
59+
</HBox>
60+
61+
<Separator/>
62+
63+
</VBox>
64+
65+
</VBox>
66+
</top>
67+
68+
<!-- CENTER -->
69+
<center>
70+
<TableView fx:id="logTable">
71+
<BorderPane.margin>
72+
<Insets top="20" bottom="20" left="20" right="20"/>
73+
</BorderPane.margin>
74+
75+
<columns>
76+
<TableColumn fx:id="timeColumn" prefWidth="150" text="Time"/>
77+
<TableColumn fx:id="eventColumn" prefWidth="100" text="Event"/>
78+
<TableColumn fx:id="descriptionColumn" prefWidth="600" text="Description"/>
79+
<TableColumn fx:id="sourceColumn" prefWidth="200" text="Source"/>
80+
</columns>
81+
</TableView>
82+
</center>
83+
84+
<!-- Under table -->
85+
<bottom>
86+
<HBox spacing="10" alignment="CENTER">
87+
<BorderPane.margin>
88+
<Insets top="20" left="20" right="20" bottom="20"/>
89+
</BorderPane.margin>
90+
91+
<Button fx:id="refreshButton"
92+
text="Refresh"
93+
prefWidth="120" prefHeight="35"
94+
onAction="#onRefreshClick"/>
95+
96+
<Label fx:id="loadingLabel"
97+
text=""
98+
style="-fx-alignment: center;"/>
99+
</HBox>
100+
</bottom>
101+
102+
</BorderPane>
103+

0 commit comments

Comments
 (0)