5
5
6
6
import java .util .Objects ;
7
7
8
+ import java .util .concurrent .ConcurrentHashMap ;
9
+ import org .jboss .logmanager .LogContext ;
10
+
8
11
import io .vertx .core .Handler ;
9
12
import io .vertx .core .http .HttpMethod ;
10
13
import io .vertx .core .http .HttpServerRequest ;
18
21
public class LoggerHandler implements Handler <RoutingContext > {
19
22
private static final String LOGGER_NAME_PARAM = "loggerName" ;
20
23
private static final String LOGGER_LEVEL_PARAM = "loggerLevel" ;
24
+ private static final String LOGGER_DURATION = "duration" ;
25
+
26
+ private final ConcurrentHashMap <String , Long > activeTimers = new ConcurrentHashMap <>();
27
+
21
28
22
29
/**
23
30
* Handles incoming HTTP requests by delegating to appropriate method handlers.
@@ -33,7 +40,7 @@ public void handle(RoutingContext routingContext) {
33
40
if (GET == method ) {
34
41
handleGet (request , response );
35
42
} else if (POST == method ) {
36
- handlePost (request , response );
43
+ handlePost (request , response , routingContext );
37
44
} else {
38
45
response .setStatusCode (405 ).end (); // Method not allowed
39
46
}
@@ -64,7 +71,7 @@ private void handleGet(HttpServerRequest request, HttpServerResponse response) {
64
71
* @param request The HTTP request
65
72
* @param response The HTTP response
66
73
*/
67
- private void handlePost (HttpServerRequest request , HttpServerResponse response ) {
74
+ private void handlePost (HttpServerRequest request , HttpServerResponse response , RoutingContext routingContext ) {
68
75
String contentType = request .getHeader ("Content-Type" );
69
76
if (!"application/x-www-form-urlencoded" .equals (contentType )) {
70
77
response .setStatusCode (415 ).end ();
@@ -73,6 +80,12 @@ private void handlePost(HttpServerRequest request, HttpServerResponse response)
73
80
74
81
String loggerName = request .getFormAttribute (LOGGER_NAME_PARAM );
75
82
String loggerLevel = request .getFormAttribute (LOGGER_LEVEL_PARAM );
83
+ String loggerDuration = request .getFormAttribute (LOGGER_DURATION );
84
+
85
+ if (loggerDuration != null && !loggerDuration .isEmpty ()) {
86
+ handleTemporaryPost (loggerName , loggerLevel , loggerDuration , routingContext , response );
87
+ return ;
88
+ }
76
89
77
90
if (loggerLevel == null || loggerLevel .isEmpty ()) {
78
91
LogController .updateLogLevel (loggerName , null );
@@ -82,4 +95,59 @@ private void handlePost(HttpServerRequest request, HttpServerResponse response)
82
95
83
96
response .setStatusCode (201 ).end ();
84
97
}
85
- }
98
+
99
+ private void handleTemporaryPost (
100
+ String loggerName ,
101
+ String loggerLevel ,
102
+ String loggerDuration ,
103
+ RoutingContext routingContext ,
104
+ HttpServerResponse response ) {
105
+
106
+ if (loggerLevel == null || !LogController .LEVELS .contains (loggerLevel .toUpperCase ())) {
107
+ response .setStatusCode (400 ).end ("Invalid Logger level" );
108
+ return ;
109
+ }
110
+
111
+ if (!LogController .doesLoggerExist (loggerName )) {
112
+ response .setStatusCode (404 ).end ("Logger '" + loggerName + "' not found." );
113
+ return ;
114
+ }
115
+
116
+ int durationSeconds ;
117
+
118
+ try {
119
+ durationSeconds = Integer .parseInt (loggerDuration );
120
+ } catch (NumberFormatException e ) {
121
+ response .setStatusCode (400 ).end ("Invalid duration" );
122
+ return ;
123
+ }
124
+
125
+ if (durationSeconds <= 0 ) {
126
+ response .setStatusCode (400 ).end ("Duration must be positive" );
127
+ return ;
128
+ }
129
+
130
+ String oldLevel = LogController .getConfiguredLogLevel (
131
+ LogContext .getLogContext ().getLogger (loggerName ));
132
+
133
+ if (oldLevel != null && oldLevel .equalsIgnoreCase (loggerLevel )) {
134
+ response .setStatusCode (200 ).end ("Log level already set to " + loggerLevel );
135
+ return ;
136
+ }
137
+
138
+ LogController .updateLogLevel (loggerName , loggerLevel );
139
+
140
+ Long previousTimerId = activeTimers .put (loggerName , null );
141
+ if (previousTimerId != null ) {
142
+ routingContext .vertx ().cancelTimer (previousTimerId );
143
+ }
144
+
145
+ long timerId = routingContext .vertx ().setTimer (durationSeconds * 1000L , id -> {
146
+ LogController .updateLogLevel (loggerName , oldLevel );
147
+ activeTimers .remove (loggerName , id );
148
+ });
149
+
150
+ activeTimers .put (loggerName , timerId );
151
+ response .setStatusCode (201 ).end ("Temporary log level set for " + durationSeconds + " seconds" );
152
+ }
153
+ }
0 commit comments