Edit server-side code to conform to checkstyle rules #181
@@ -4,18 +4,21 @@ import ch.unibas.dmi.dbis.cs108.casono.server.network.NetworkManager;
|
|||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.DisconnectEvent;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.DisconnectEvent;
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus;
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionManager;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionManager;
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
/**
|
/** Application class for starting the server. */
|
||||||
* Application class for starting the server.
|
|
||||||
*/
|
|
||||||
public class ServerApp {
|
public class ServerApp {
|
||||||
public static void start(String arg) {
|
public static void start(String arg) {
|
||||||
int port = Integer.parseInt(arg);
|
int port = Integer.parseInt(arg);
|
||||||
System.out.println("You've selected the server. It will accept connections at port " + port);
|
|
||||||
|
Logger logger = LogManager.getLogger(ServerApp.class);
|
||||||
|
logger.info("Starting server at port {}", port);
|
||||||
|
|
||||||
EventBus eventBus = new EventBus();
|
EventBus eventBus = new EventBus();
|
||||||
SessionManager sessionManager = new SessionManager();
|
SessionManager sessionManager = new SessionManager();
|
||||||
eventBus.subscribe(DisconnectEvent.class, event -> sessionManager.removeSession(event.sessionId()));
|
eventBus.subscribe(
|
||||||
|
DisconnectEvent.class, event -> sessionManager.removeSession(event.sessionId()));
|
||||||
NetworkManager networkManager = new NetworkManager(port, sessionManager, eventBus);
|
NetworkManager networkManager = new NetworkManager(port, sessionManager, eventBus);
|
||||||
networkManager.start();
|
networkManager.start();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,21 +1,17 @@
|
|||||||
package ch.unibas.dmi.dbis.cs108.casono.server.network;
|
package ch.unibas.dmi.dbis.cs108.casono.server.network;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.ServerSocket;
|
|
||||||
import java.net.Socket;
|
|
||||||
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
|
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.DisconnectEvent;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.DisconnectEvent;
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus;
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.Session;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.Session;
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionManager;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionManager;
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TcpTransport;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TcpTransport;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.ServerSocket;
|
||||||
|
import java.net.Socket;
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
/**
|
/** Creates and manages the server socket. Accepts new incoming connections and creates sessions. */
|
||||||
* Creates and manages the server socket. Accepts new incoming connections and creates sessions.
|
|
||||||
*/
|
|
||||||
public class NetworkManager implements Runnable {
|
public class NetworkManager implements Runnable {
|
||||||
private Integer port;
|
private Integer port;
|
||||||
private Logger logger;
|
private Logger logger;
|
||||||
@@ -27,9 +23,9 @@ public class NetworkManager implements Runnable {
|
|||||||
/**
|
/**
|
||||||
* Creates a new NetworkManager with the given port, session manager, and event bus.
|
* Creates a new NetworkManager with the given port, session manager, and event bus.
|
||||||
*
|
*
|
||||||
* @param port the port to listen on
|
* @param port the port to listen on
|
||||||
* @param sessionManager the session manager to use
|
* @param sessionManager the session manager to use
|
||||||
* @param eventBus the event bus for events
|
* @param eventBus the event bus for events
|
||||||
*/
|
*/
|
||||||
public NetworkManager(Integer port, SessionManager sessionManager, EventBus eventBus) {
|
public NetworkManager(Integer port, SessionManager sessionManager, EventBus eventBus) {
|
||||||
this.port = port;
|
this.port = port;
|
||||||
@@ -41,11 +37,9 @@ public class NetworkManager implements Runnable {
|
|||||||
this.eventBus.subscribe(DisconnectEvent.class, event -> clientDisconnected(event));
|
this.eventBus.subscribe(DisconnectEvent.class, event -> clientDisconnected(event));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** Starts the internal thread to accept new connections. */
|
||||||
* Starts the internal thread to accept new connections.
|
|
||||||
*/
|
|
||||||
public void start() {
|
public void start() {
|
||||||
logger.debug("Starting server at port " + port);
|
logger.debug("Starting at port {}", port);
|
||||||
thread.start();
|
thread.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,19 +49,17 @@ public class NetworkManager implements Runnable {
|
|||||||
* @param event the disconnect event
|
* @param event the disconnect event
|
||||||
*/
|
*/
|
||||||
public void clientDisconnected(DisconnectEvent event) {
|
public void clientDisconnected(DisconnectEvent event) {
|
||||||
logger.info("Session " + event.sessionId().value() + " disconnected adhasghd");
|
logger.info("Session {} disconnected", event.sessionId().value());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** Runs the network manager loop, accepting connections. */
|
||||||
* Runs the network manager loop, accepting connections.
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
try (ServerSocket serverSocket = new ServerSocket(port)) {
|
try (ServerSocket serverSocket = new ServerSocket(port)) {
|
||||||
while (running) {
|
while (running) {
|
||||||
Socket clientSocket = serverSocket.accept();
|
Socket clientSocket = serverSocket.accept();
|
||||||
|
|
||||||
System.out.println("Accepted connection from " + clientSocket.getRemoteSocketAddress());
|
logger.debug("Accepted connection from {}", clientSocket.getRemoteSocketAddress());
|
||||||
|
|
||||||
Session session = new Session(new TcpTransport(clientSocket), eventBus);
|
Session session = new Session(new TcpTransport(clientSocket), eventBus);
|
||||||
sessionManager.addSession(session);
|
sessionManager.addSession(session);
|
||||||
|
|||||||
+1
-3
@@ -2,7 +2,5 @@ package ch.unibas.dmi.dbis.cs108.casono.server.network.events;
|
|||||||
|
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionId;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionId;
|
||||||
|
|
||||||
/**
|
/** Represents a disconnect event for a session. */
|
||||||
* Represents a disconnect event for a session.
|
|
||||||
*/
|
|
||||||
public record DisconnectEvent(SessionId sessionId) implements Event {}
|
public record DisconnectEvent(SessionId sessionId) implements Event {}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
package ch.unibas.dmi.dbis.cs108.casono.server.network.events;
|
package ch.unibas.dmi.dbis.cs108.casono.server.network.events;
|
||||||
|
|
||||||
/**
|
/** Marker interface for events in the event bus system. */
|
||||||
* Marker interface for events in the event bus system.
|
|
||||||
*/
|
|
||||||
interface Event {}
|
interface Event {}
|
||||||
|
|||||||
@@ -7,9 +7,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
/**
|
/** A simple event bus for publishing and subscribing to events. */
|
||||||
* A simple event bus for publishing and subscribing to events.
|
|
||||||
*/
|
|
||||||
public class EventBus {
|
public class EventBus {
|
||||||
private final Map<Class<?>, List<Consumer<Object>>> handlers = new ConcurrentHashMap<>();
|
private final Map<Class<?>, List<Consumer<Object>>> handlers = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
@@ -17,9 +15,11 @@ public class EventBus {
|
|||||||
* Subscribes a handler to a specific event type.
|
* Subscribes a handler to a specific event type.
|
||||||
*
|
*
|
||||||
* @param eventType the class of the event to subscribe to
|
* @param eventType the class of the event to subscribe to
|
||||||
* @param handler the consumer to handle the event
|
* @param handler the consumer to handle the event
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked") // This cast is safe, because handlers only get passed the type they subscribed to
|
@SuppressWarnings(
|
||||||
|
"unchecked") // This cast is safe, because handlers only get passed the type they
|
||||||
|
// subscribed to
|
||||||
public <T extends Event> void subscribe(Class<T> eventType, Consumer<T> handler) {
|
public <T extends Event> void subscribe(Class<T> eventType, Consumer<T> handler) {
|
||||||
handlers.computeIfAbsent(eventType, k -> new CopyOnWriteArrayList<>())
|
handlers.computeIfAbsent(eventType, k -> new CopyOnWriteArrayList<>())
|
||||||
.add((Consumer<Object>) (Consumer<?>) handler);
|
.add((Consumer<Object>) (Consumer<?>) handler);
|
||||||
|
|||||||
@@ -1,17 +1,14 @@
|
|||||||
package ch.unibas.dmi.dbis.cs108.casono.server.network.sessions;
|
package ch.unibas.dmi.dbis.cs108.casono.server.network.sessions;
|
||||||
|
|
||||||
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.DisconnectEvent;
|
||||||
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus;
|
||||||
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TransportLayer;
|
||||||
import java.io.EOFException;
|
import java.io.EOFException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.DisconnectEvent;
|
/** Represents a client session in the network server. */
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus;
|
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TransportLayer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents a client session in the network server.
|
|
||||||
*/
|
|
||||||
public class Session implements Runnable {
|
public class Session implements Runnable {
|
||||||
private SessionId id;
|
private SessionId id;
|
||||||
private Thread thread;
|
private Thread thread;
|
||||||
@@ -19,12 +16,12 @@ public class Session implements Runnable {
|
|||||||
private Logger logger;
|
private Logger logger;
|
||||||
private Boolean running;
|
private Boolean running;
|
||||||
private EventBus eventBus;
|
private EventBus eventBus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new Session with the given transport and event bus.
|
* Creates a new Session with the given transport and event bus.
|
||||||
*
|
*
|
||||||
* @param transport the transport layer for communication
|
* @param transport the transport layer for communication
|
||||||
* @param eventBus the event bus for publishing events
|
* @param eventBus the event bus for publishing events
|
||||||
* @throws IOException if an I/O error occurs during initialization
|
* @throws IOException if an I/O error occurs during initialization
|
||||||
*/
|
*/
|
||||||
public Session(TransportLayer transport, EventBus eventBus) throws IOException {
|
public Session(TransportLayer transport, EventBus eventBus) throws IOException {
|
||||||
@@ -47,9 +44,7 @@ public class Session implements Runnable {
|
|||||||
return this.id;
|
return this.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** Starts the session thread. */
|
||||||
* Starts the session thread.
|
|
||||||
*/
|
|
||||||
public void start() {
|
public void start() {
|
||||||
thread.start();
|
thread.start();
|
||||||
}
|
}
|
||||||
@@ -64,14 +59,12 @@ public class Session implements Runnable {
|
|||||||
this.running = false;
|
this.running = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** Runs the session loop, reading from the transport. */
|
||||||
* Runs the session loop, reading from the transport.
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
while (running) {
|
while (running) {
|
||||||
try {
|
try {
|
||||||
System.out.println("Recieved: " + transport.read());
|
logger.debug("Recieved: {}", transport.read());
|
||||||
} catch (EOFException e) {
|
} catch (EOFException e) {
|
||||||
logger.info("Client disconnected");
|
logger.info("Client disconnected");
|
||||||
eventBus.publish(new DisconnectEvent(id));
|
eventBus.publish(new DisconnectEvent(id));
|
||||||
|
|||||||
+2
-6
@@ -2,15 +2,11 @@ package ch.unibas.dmi.dbis.cs108.casono.server.network.sessions;
|
|||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/** Represents a unique identifier for a session. */
|
||||||
* Represents a unique identifier for a session.
|
|
||||||
*/
|
|
||||||
public class SessionId {
|
public class SessionId {
|
||||||
private final UUID value;
|
private final UUID value;
|
||||||
|
|
||||||
/**
|
/** Creates a new SessionId with a randomly generated UUID. */
|
||||||
* Creates a new SessionId with a randomly generated UUID.
|
|
||||||
*/
|
|
||||||
public SessionId() {
|
public SessionId() {
|
||||||
this.value = UUID.randomUUID();
|
this.value = UUID.randomUUID();
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-8
@@ -3,15 +3,11 @@ package ch.unibas.dmi.dbis.cs108.casono.server.network.sessions;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
/**
|
/** Manages active sessions in the server. */
|
||||||
* Manages active sessions in the server.
|
|
||||||
*/
|
|
||||||
public class SessionManager {
|
public class SessionManager {
|
||||||
private Map<SessionId, Session> sessions;
|
private Map<SessionId, Session> sessions;
|
||||||
|
|
||||||
/**
|
/** Constructs a new SessionManager. */
|
||||||
* Constructs a new SessionManager.
|
|
||||||
*/
|
|
||||||
public SessionManager() {
|
public SessionManager() {
|
||||||
this.sessions = new ConcurrentHashMap<>();
|
this.sessions = new ConcurrentHashMap<>();
|
||||||
}
|
}
|
||||||
@@ -23,7 +19,6 @@ public class SessionManager {
|
|||||||
*/
|
*/
|
||||||
public void addSession(Session session) {
|
public void addSession(Session session) {
|
||||||
sessions.put(session.getId(), session);
|
sessions.put(session.getId(), session);
|
||||||
System.out.println("Added session " + session.getId().value() + " to session manager");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -33,7 +28,6 @@ public class SessionManager {
|
|||||||
* @return the removed session, or null if not found
|
* @return the removed session, or null if not found
|
||||||
*/
|
*/
|
||||||
public Session removeSession(SessionId id) {
|
public Session removeSession(SessionId id) {
|
||||||
System.out.println("Removed session " + id.value() + " from session manager");
|
|
||||||
return sessions.remove(id);
|
return sessions.remove(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-4
@@ -6,9 +6,7 @@ import java.io.IOException;
|
|||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
/**
|
/** Implements TCP-based transport layer for network communication. */
|
||||||
* Implements TCP-based transport layer for network communication.
|
|
||||||
*/
|
|
||||||
public class TcpTransport implements TransportLayer {
|
public class TcpTransport implements TransportLayer {
|
||||||
private Socket socket;
|
private Socket socket;
|
||||||
private DataInputStream in;
|
private DataInputStream in;
|
||||||
@@ -49,7 +47,7 @@ public class TcpTransport implements TransportLayer {
|
|||||||
byte[] rawPayload = payload.getBytes(StandardCharsets.UTF_8);
|
byte[] rawPayload = payload.getBytes(StandardCharsets.UTF_8);
|
||||||
out.writeInt(rawPayload.length);
|
out.writeInt(rawPayload.length);
|
||||||
out.write(rawPayload);
|
out.write(rawPayload);
|
||||||
out.flush();
|
out.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+1
-3
@@ -2,9 +2,7 @@ package ch.unibas.dmi.dbis.cs108.casono.server.network.transport;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/** Interface for transport layer implementations. */
|
||||||
* Interface for transport layer implementations.
|
|
||||||
*/
|
|
||||||
public interface TransportLayer {
|
public interface TransportLayer {
|
||||||
/**
|
/**
|
||||||
* Reads data from the transport layer.
|
* Reads data from the transport layer.
|
||||||
|
|||||||
Reference in New Issue
Block a user