From b3a3ab71bdd33eb9abe8926327d217f8b1d65986 Mon Sep 17 00:00:00 2001 From: Sriman Achanta <68172138+srimanachanta@users.noreply.github.com> Date: Thu, 5 Oct 2023 18:22:56 -0400 Subject: [PATCH] Javalin v5 bump (#930) --- photon-server/build.gradle | 4 +- .../server/CameraSocketHandler.java | 13 +++-- .../server/DataSocketHandler.java | 17 ++++--- .../photonvision/server/RequestHandler.java | 26 ++++++---- .../java/org/photonvision/server/Server.java | 51 ++++++++++--------- 5 files changed, 62 insertions(+), 49 deletions(-) diff --git a/photon-server/build.gradle b/photon-server/build.gradle index c51d290311..6b1a5bf5ec 100644 --- a/photon-server/build.gradle +++ b/photon-server/build.gradle @@ -34,7 +34,7 @@ dependencies { implementation project(':photon-core') implementation project(':photon-targeting') - implementation "io.javalin:javalin:4.2.0" + implementation "io.javalin:javalin:5.6.2" implementation wpilibTools.deps.wpilibJava("wpiutil") implementation wpilibTools.deps.wpilibJava("wpimath") @@ -46,7 +46,7 @@ dependencies { implementation "org.msgpack:msgpack-core:0.9.0" implementation "org.msgpack:jackson-dataformat-msgpack:0.9.0" - implementation "org.slf4j:slf4j-simple:1.8.0-beta4" + implementation "org.slf4j:slf4j-simple:2.0.7" } shadowJar { diff --git a/photon-server/src/main/java/org/photonvision/server/CameraSocketHandler.java b/photon-server/src/main/java/org/photonvision/server/CameraSocketHandler.java index 940ea050c9..d93f9a9e44 100644 --- a/photon-server/src/main/java/org/photonvision/server/CameraSocketHandler.java +++ b/photon-server/src/main/java/org/photonvision/server/CameraSocketHandler.java @@ -25,6 +25,8 @@ import io.javalin.websocket.WsConnectContext; import io.javalin.websocket.WsContext; import io.javalin.websocket.WsMessageContext; +import java.net.InetSocketAddress; +import java.time.Duration; import java.util.HashMap; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -56,16 +58,17 @@ private CameraSocketHandler() { } public void onConnect(WsConnectContext context) { - context.session.setIdleTimeout(Long.MAX_VALUE); // TODO: determine better value - var insa = context.session.getRemote().getInetSocketAddress(); - var host = insa.getAddress().toString() + ":" + insa.getPort(); + context.session.setIdleTimeout( + Duration.ofMillis(Long.MAX_VALUE)); // TODO: determine better value + var remote = (InetSocketAddress) context.session.getRemoteAddress(); + var host = remote.getAddress().toString() + ":" + remote.getPort(); logger.info("New camera websocket connection from " + host); users.add(context); } protected void onClose(WsCloseContext context) { - var insa = context.session.getRemote().getInetSocketAddress(); - var host = insa.getAddress().toString() + ":" + insa.getPort(); + var remote = (InetSocketAddress) context.session.getRemoteAddress(); + var host = remote.getAddress().toString() + ":" + remote.getPort(); var reason = context.reason() != null ? context.reason() : "Connection closed by client"; logger.info("Closing camera websocket connection from " + host + " for reason: " + reason); svsManager.removeSubscription(context); diff --git a/photon-server/src/main/java/org/photonvision/server/DataSocketHandler.java b/photon-server/src/main/java/org/photonvision/server/DataSocketHandler.java index 847deb9138..19fc18f937 100644 --- a/photon-server/src/main/java/org/photonvision/server/DataSocketHandler.java +++ b/photon-server/src/main/java/org/photonvision/server/DataSocketHandler.java @@ -25,7 +25,9 @@ import io.javalin.websocket.WsConnectContext; import io.javalin.websocket.WsContext; import java.io.IOException; +import java.net.InetSocketAddress; import java.nio.ByteBuffer; +import java.time.Duration; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -68,9 +70,10 @@ private DataSocketHandler() { } public void onConnect(WsConnectContext context) { - context.session.setIdleTimeout(Long.MAX_VALUE); // TODO: determine better value - var insa = context.session.getRemote().getInetSocketAddress(); - var host = insa.getAddress().toString() + ":" + insa.getPort(); + context.session.setIdleTimeout( + Duration.ofMillis(Long.MAX_VALUE)); // TODO: determine better value + var remote = (InetSocketAddress) context.session.getRemoteAddress(); + var host = remote.getAddress().toString() + ":" + remote.getPort(); logger.info("New websocket connection from " + host); users.add(context); dcService.publishEvent( @@ -79,8 +82,8 @@ public void onConnect(WsConnectContext context) { } protected void onClose(WsCloseContext context) { - var insa = context.session.getRemote().getInetSocketAddress(); - var host = insa.getAddress().toString() + ":" + insa.getPort(); + var remote = (InetSocketAddress) context.session.getRemoteAddress(); + var host = remote.getAddress().toString() + ":" + remote.getPort(); var reason = context.reason() != null ? context.reason() : "Connection closed by client"; logger.info("Closing websocket connection from " + host + " for reason: " + reason); users.remove(context); @@ -332,9 +335,9 @@ public void broadcastMessage(Object message, WsContext userToSkip) sendMessage(message, user); } } else { - var skipUserPort = userToSkip.session.getRemote().getInetSocketAddress().getPort(); + var skipUserPort = ((InetSocketAddress) userToSkip.session.getRemoteAddress()).getPort(); for (WsContext user : users) { - var userPort = user.session.getRemote().getInetSocketAddress().getPort(); + var userPort = ((InetSocketAddress) user.session.getRemoteAddress()).getPort(); if (userPort != skipUserPort) { sendMessage(message, user); } diff --git a/photon-server/src/main/java/org/photonvision/server/RequestHandler.java b/photon-server/src/main/java/org/photonvision/server/RequestHandler.java index 798fa2241d..c255748195 100644 --- a/photon-server/src/main/java/org/photonvision/server/RequestHandler.java +++ b/photon-server/src/main/java/org/photonvision/server/RequestHandler.java @@ -69,7 +69,7 @@ public static void onSettingsImportRequest(Context ctx) { return; } - if (!file.getExtension().contains("zip")) { + if (!file.extension().contains("zip")) { ctx.status(400); ctx.result( "The uploaded file was not of type 'zip'. The uploaded file should be a .zip file."); @@ -132,7 +132,7 @@ public static void onHardwareConfigRequest(Context ctx) { return; } - if (!file.getExtension().contains("json")) { + if (!file.extension().contains("json")) { ctx.status(400); ctx.result( "The uploaded file was not of type 'json'. The uploaded file should be a .json file."); @@ -174,7 +174,7 @@ public static void onHardwareSettingsRequest(Context ctx) { return; } - if (!file.getExtension().contains("json")) { + if (!file.extension().contains("json")) { ctx.status(400); ctx.result( "The uploaded file was not of type 'json'. The uploaded file should be a .json file."); @@ -216,7 +216,7 @@ public static void onNetworkConfigRequest(Context ctx) { return; } - if (!file.getExtension().contains("json")) { + if (!file.extension().contains("json")) { ctx.status(400); ctx.result( "The uploaded file was not of type 'json'. The uploaded file should be a .json file."); @@ -258,7 +258,7 @@ public static void onOfflineUpdateRequest(Context ctx) { return; } - if (!file.getExtension().contains("jar")) { + if (!file.extension().contains("jar")) { ctx.status(400); ctx.result( "The uploaded file was not of type 'jar'. The uploaded file should be a .jar file."); @@ -273,7 +273,7 @@ public static void onOfflineUpdateRequest(Context ctx) { File targetFile = new File(filePath.toString()); var stream = new FileOutputStream(targetFile); - file.getContent().transferTo(stream); + file.content().transferTo(stream); stream.close(); ctx.status(200); @@ -492,14 +492,20 @@ public static void onMetricsPublishRequest(Context ctx) { */ private static Optional handleTempFileCreation(UploadedFile file) { var tempFilePath = - new File(Path.of(System.getProperty("java.io.tmpdir"), file.getFilename()).toString()); - tempFilePath.getParentFile().mkdirs(); + new File(Path.of(System.getProperty("java.io.tmpdir"), file.filename()).toString()); + boolean makeDirsRes = tempFilePath.getParentFile().mkdirs(); + + if (!makeDirsRes) { + logger.error( + "There was an error while uploading " + file.filename() + " to the temp folder!"); + return Optional.empty(); + } try { - FileUtils.copyInputStreamToFile(file.getContent(), tempFilePath); + FileUtils.copyInputStreamToFile(file.content(), tempFilePath); } catch (IOException e) { logger.error( - "There was an error while uploading " + file.getFilename() + " to the temp folder!"); + "There was an error while uploading " + file.filename() + " to the temp folder!"); return Optional.empty(); } diff --git a/photon-server/src/main/java/org/photonvision/server/Server.java b/photon-server/src/main/java/org/photonvision/server/Server.java index 7a025d2b6e..724459e14f 100644 --- a/photon-server/src/main/java/org/photonvision/server/Server.java +++ b/photon-server/src/main/java/org/photonvision/server/Server.java @@ -18,7 +18,8 @@ package org.photonvision.server; import io.javalin.Javalin; -import io.javalin.http.staticfiles.Location; +import io.javalin.plugin.bundled.CorsPluginConfig; +import java.net.InetSocketAddress; import java.util.StringJoiner; import org.photonvision.common.logging.LogGroup; import org.photonvision.common.logging.Logger; @@ -27,45 +28,45 @@ public class Server { private static final Logger logger = new Logger(Server.class, LogGroup.WebServer); public static void start(int port) { - Javalin app = + var app = Javalin.create( - config -> { - config.showJavalinBanner = false; - config.addStaticFiles("web", Location.CLASSPATH); - config.enableCorsForAllOrigins(); + javalinConfig -> { + javalinConfig.showJavalinBanner = false; + javalinConfig.staticFiles.add("web"); + javalinConfig.plugins.enableCors( + corsContainer -> { + corsContainer.add(CorsPluginConfig::anyHost); + }); - config.requestLogger( + javalinConfig.requestLogger.http( (ctx, ms) -> { StringJoiner joiner = new StringJoiner(" ") .add("Handled HTTP request of type") - .add(ctx.req.getMethod()) + .add(ctx.req().getMethod()) .add("from endpoint") .add(ctx.path()) .add("for host") - .add(ctx.req.getRemoteHost()) + .add(ctx.req().getRemoteHost()) .add("in") .add(ms.toString()) .add("ms"); logger.debug(joiner.toString()); }); - - config.wsLogger( - ws -> - ws.onMessage( - ctx -> logger.debug("Got WebSockets message: " + ctx.message()))); - - config.wsLogger( - ws -> - ws.onBinaryMessage( - ctx -> - logger.trace( - () -> { - var insa = ctx.session.getRemote().getInetSocketAddress(); - var host = insa.getAddress().toString() + ":" + insa.getPort(); - return "Got WebSockets binary message from host " + host; - }))); + javalinConfig.requestLogger.ws( + ws -> { + ws.onMessage(ctx -> logger.debug("Got WebSockets message: " + ctx.message())); + ws.onBinaryMessage( + ctx -> + logger.trace( + () -> { + var remote = (InetSocketAddress) ctx.session.getRemoteAddress(); + var host = + remote.getAddress().toString() + ":" + remote.getPort(); + return "Got WebSockets binary message from host: " + host; + })); + }); }); /*Web Socket Events for Data Exchange */