Skip to content

Commit f5ff5a1

Browse files
committed
- code cleanup for log/exception handling
- print server started
1 parent 9cbdb09 commit f5ff5a1

7 files changed

Lines changed: 106 additions & 96 deletions

File tree

modules/jooby-mcp/src/main/java/io/jooby/internal/mcp/transport/AbstractMcpTransportProvider.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
public abstract class AbstractMcpTransportProvider implements McpServerTransportProvider {
2323

2424
protected final Logger log = LoggerFactory.getLogger(getClass());
25-
2625
protected final McpJsonMapper mcpJsonMapper;
2726
protected final McpTransportContextExtractor<Context> contextExtractor;
2827
protected final ConcurrentHashMap<String, McpServerSession> sessions = new ConcurrentHashMap<>();
@@ -62,7 +61,7 @@ public Mono<Void> notifyClients(String method, Object params) {
6261
.doOnError(
6362
e ->
6463
log.error(
65-
"Failed to send message to {} session {}: {}",
64+
"Failed to send a message to {} session {}: {}",
6665
transportName(),
6766
session.getId(),
6867
e.getMessage()))

modules/jooby-mcp/src/main/java/io/jooby/internal/mcp/transport/SseTransportProvider.java

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public SseTransportProvider(
3030
McpTransportContextExtractor<Context> contextExtractor) {
3131
super(mcpJsonMapper, contextExtractor);
3232
this.messageEndpoint = serverConfig.getMessageEndpoint();
33-
String sseEndpoint = serverConfig.getSseEndpoint();
33+
var sseEndpoint = serverConfig.getSseEndpoint();
3434

3535
app.head(sseEndpoint, ctx -> StatusCode.OK).produces(TEXT_EVENT_STREAM);
3636
app.sse(sseEndpoint, this::handleSseConnection);
@@ -43,9 +43,9 @@ protected String transportName() {
4343
}
4444

4545
private void handleSseConnection(ServerSentEmitter sse) {
46-
JoobyMcpSessionTransport transport = new JoobyMcpSessionTransport(mcpJsonMapper, sse);
47-
McpServerSession session = sessionFactory.create(transport);
48-
String sessionId = session.getId();
46+
var transport = new JoobyMcpSessionTransport(mcpJsonMapper, sse);
47+
var session = sessionFactory.create(transport);
48+
var sessionId = session.getId();
4949

5050
log.debug("New SSE connection established. Session ID: {}", sessionId);
5151
sessions.put(sessionId, session);
@@ -76,8 +76,8 @@ private Object handleMessage(Context ctx) {
7676
.build();
7777
}
7878

79-
String sessionId = ctx.query(SESSION_ID_KEY).value();
80-
McpServerSession session = sessions.get(sessionId);
79+
var sessionId = ctx.query(SESSION_ID_KEY).value();
80+
var session = sessions.get(sessionId);
8181

8282
if (session == null) {
8383
ctx.setResponseCode(StatusCode.NOT_FOUND);
@@ -87,24 +87,23 @@ private Object handleMessage(Context ctx) {
8787
}
8888

8989
try {
90-
McpTransportContext transportContext = this.contextExtractor.extract(ctx);
90+
var transportContext = this.contextExtractor.extract(ctx);
9191
var body = ctx.body().value();
92-
McpSchema.JSONRPCMessage message =
93-
McpSchema.deserializeJsonRpcMessage(this.mcpJsonMapper, body);
92+
var message = McpSchema.deserializeJsonRpcMessage(this.mcpJsonMapper, body);
9493

9594
return session
9695
.handle(message)
9796
.contextWrite(reactorCtx -> reactorCtx.put(McpTransportContext.KEY, transportContext))
9897
.then(Mono.just((Object) StatusCode.OK))
9998
.onErrorResume(
10099
error -> {
101-
log.error("Error processing message: {}", error.getMessage());
100+
log.error("Error processing message", error);
102101
return Mono.just(StatusCode.OK);
103102
})
104103
.switchIfEmpty(Mono.just((Object) StatusCode.OK))
105104
.block();
106105
} catch (IOException | IllegalArgumentException e) {
107-
log.error("Failed to deserialize message: {}", e.getMessage());
106+
log.error("Failed to deserialize a message", e);
108107
return McpError.builder(McpSchema.ErrorCodes.PARSE_ERROR)
109108
.message("Invalid message format")
110109
.build();
@@ -124,10 +123,10 @@ public Mono<Void> sendMessage(McpSchema.JSONRPCMessage message) {
124123
return Mono.fromRunnable(
125124
() -> {
126125
try {
127-
String jsonText = mcpJsonMapper.writeValueAsString(message);
126+
var jsonText = mcpJsonMapper.writeValueAsString(message);
128127
sse.send(new ServerSentMessage(jsonText).setEvent(MESSAGE_EVENT_TYPE));
129128
} catch (Exception e) {
130-
log.error("Failed to send message: {}", e.getMessage());
129+
log.error("Failed to send a message", e);
131130
sse.send(SSE_ERROR_EVENT, e.getMessage());
132131
}
133132
});

modules/jooby-mcp/src/main/java/io/jooby/internal/mcp/transport/StatelessTransportProvider.java

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,7 @@
3535
*/
3636
@SuppressWarnings("PMD")
3737
public class StatelessTransportProvider implements McpStatelessServerTransport {
38-
39-
private static final Logger LOG = LoggerFactory.getLogger(StatelessTransportProvider.class);
40-
38+
private final Logger log = LoggerFactory.getLogger(getClass());
4139
private McpStatelessServerHandler mcpHandler;
4240
private final McpJsonMapper mcpJsonMapper;
4341
private final McpTransportContextExtractor<Context> contextExtractor;
@@ -66,26 +64,23 @@ private Object handlePost(Context ctx) {
6664
return SendError.invalidAcceptHeader(ctx, List.of(TEXT_EVENT_STREAM, MediaType.json));
6765
}
6866

69-
McpTransportContext transportContext = this.contextExtractor.extract(ctx);
67+
var transportContext = this.contextExtractor.extract(ctx);
7068
try {
7169
var body = ctx.body().valueOrNull();
7270
if (body == null) {
7371
return SendError.error(
7472
ctx, StatusCode.BAD_REQUEST, INVALID_REQUEST, "Request body is missing");
7573
}
76-
McpSchema.JSONRPCMessage message = McpSchema.deserializeJsonRpcMessage(mcpJsonMapper, body);
74+
var message = McpSchema.deserializeJsonRpcMessage(mcpJsonMapper, body);
7775

7876
if (message instanceof McpSchema.JSONRPCRequest jsonrpcRequest) {
7977
try {
80-
McpSchema.JSONRPCResponse jsonrpcResponse =
81-
this.mcpHandler
82-
.handleRequest(transportContext, jsonrpcRequest)
83-
.contextWrite(
84-
reactorCtx -> reactorCtx.put(McpTransportContext.KEY, transportContext))
85-
.block();
86-
return jsonrpcResponse;
78+
return this.mcpHandler
79+
.handleRequest(transportContext, jsonrpcRequest)
80+
.contextWrite(reactorCtx -> reactorCtx.put(McpTransportContext.KEY, transportContext))
81+
.block();
8782
} catch (Exception e) {
88-
LOG.error("Failed to handle request.", e);
83+
log.error("Failed to handle request", e);
8984
return SendError.internalError(ctx);
9085
}
9186
} else if (message instanceof McpSchema.JSONRPCNotification jsonrpcNotification) {
@@ -96,17 +91,17 @@ private Object handlePost(Context ctx) {
9691
.block();
9792
return StatusCode.ACCEPTED;
9893
} catch (Exception e) {
99-
LOG.error("Failed to handle notification", e);
94+
log.error("Failed to handle notification", e);
10095
return SendError.internalError(ctx);
10196
}
10297
} else {
10398
return SendError.badRequest(ctx, "The server accepts either requests or notifications");
10499
}
105100
} catch (IllegalArgumentException | IOException e) {
106-
LOG.error("Failed to deserialize message.", e);
101+
log.error("Failed to deserialize a message", e);
107102
return SendError.badRequest(ctx, "Invalid message format");
108103
} catch (Exception e) {
109-
LOG.error("Unexpected error handling message.", e);
104+
log.error("Unexpected error handling message", e);
110105
return SendError.internalError(ctx);
111106
}
112107
}

0 commit comments

Comments
 (0)