some more logs, javadocs
This commit is contained in:
@@ -1,40 +1,60 @@
|
|||||||
package net.ayyalasomayajula.net;
|
package net.ayyalasomayajula.net;
|
||||||
|
|
||||||
import net.ayyalasomayajula.net.client.ClientConnect;
|
import net.ayyalasomayajula.net.client.ClientConnect;
|
||||||
|
import net.ayyalasomayajula.net.server.ServerDaemon;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.slf4j.LoggerFactoryFriend;
|
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
|
|
||||||
|
/**
|
||||||
public class ClientServerSelect extends JFrame{
|
* The ClientServerSelect class represents a graphical user interface (GUI) frame for selecting
|
||||||
|
* between a client or server connection. This class extends {@link JFrame} and contains two buttons:
|
||||||
|
* one to initiate the client and the other to start the server.
|
||||||
|
* The frame allows the user to choose whether they want to run the client or the server.
|
||||||
|
*/
|
||||||
|
public class ClientServerSelect extends JFrame {
|
||||||
private JButton serverButton;
|
private JButton serverButton;
|
||||||
private JButton clientButton;
|
private JButton clientButton;
|
||||||
private JPanel panel;
|
private JPanel panel;
|
||||||
private static final Logger logger = LoggerFactory.getLogger(ClientServerSelect.class);
|
private static final Logger logger = LoggerFactory.getLogger(ClientServerSelect.class);
|
||||||
|
|
||||||
public ClientServerSelect(){
|
/**
|
||||||
setContentPane(panel);
|
* Constructs a new {@code ClientServerSelect} frame, initializing the GUI components and
|
||||||
setSize(1024,1024);
|
* adding action listeners to the client and server buttons.
|
||||||
setVisible(true);
|
* <p>
|
||||||
|
* When the client button is clicked, the {@link ClientConnect} class is instantiated, and the
|
||||||
|
* frame is disposed. When the server button is clicked, a new thread is started to run the
|
||||||
|
* {@link ServerDaemon}, and the frame is disposed.
|
||||||
|
*/
|
||||||
|
public ClientServerSelect() {
|
||||||
|
setContentPane(panel); // Set the main panel for the JFrame
|
||||||
|
setSize(1024, 1024); // Set the size of the frame
|
||||||
|
setVisible(true); // Make the frame visible
|
||||||
|
|
||||||
|
// ActionListener for the client button
|
||||||
clientButton.addActionListener(new ActionListener() {
|
clientButton.addActionListener(new ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent actionEvent) {
|
public void actionPerformed(ActionEvent actionEvent) {
|
||||||
logger.info("Client button triggered.");
|
logger.info("Client button triggered.");
|
||||||
|
|
||||||
|
// Initialize the client connection
|
||||||
ClientConnect connector = new ClientConnect();
|
ClientConnect connector = new ClientConnect();
|
||||||
dispose();
|
dispose(); // Close the current window after client connection is initiated
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// ActionListener for the server button
|
||||||
serverButton.addActionListener(new ActionListener() {
|
serverButton.addActionListener(new ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent actionEvent) {
|
public void actionPerformed(ActionEvent actionEvent) {
|
||||||
logger.info("Server Button triggered");
|
logger.info("Server Button triggered");
|
||||||
dispose();
|
|
||||||
|
// Start the server daemon in a new thread
|
||||||
|
Thread offshoot = new Thread(new ServerDaemon());
|
||||||
|
offshoot.start();
|
||||||
|
dispose(); // Close the current window after the server is started
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,24 +7,41 @@ import javax.swing.*;
|
|||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
|
|
||||||
public class ClientConnect extends JFrame{
|
/**
|
||||||
|
* The ClientConnect class represents a graphical user interface (GUI) frame for capturing
|
||||||
|
* client connection details such as the hostname, port number, and authentication token.
|
||||||
|
* The user can input connection details and trigger a connection request using the provided button.
|
||||||
|
* This class extends {@link JFrame}.
|
||||||
|
*/
|
||||||
|
public class ClientConnect extends JFrame {
|
||||||
private JPanel panel;
|
private JPanel panel;
|
||||||
private JTextField hostname;
|
private JTextField hostname;
|
||||||
private JTextField portNumber;
|
private JTextField portNumber;
|
||||||
private JTextField authToken;
|
private JTextField authToken;
|
||||||
private JButton goButton;
|
private JButton goButton;
|
||||||
private static final Logger logger = LoggerFactory.getLogger(ClientConnect.class);
|
private static final Logger logger = LoggerFactory.getLogger(ClientConnect.class);
|
||||||
public ClientConnect(){
|
|
||||||
setTitle("Client Connection Details");
|
/**
|
||||||
setContentPane(panel);
|
* Constructs a new {@code ClientConnect} frame. It initializes the GUI components and
|
||||||
setSize(1024,1024);
|
* sets up an action listener for the connection button.
|
||||||
setVisible(true);
|
* <p>
|
||||||
|
* When the "Go" button is clicked, the connection request is triggered, and an informational
|
||||||
|
* log entry is made to record the action. The hostname, port, and auth token input fields
|
||||||
|
* capture the connection parameters.
|
||||||
|
*/
|
||||||
|
public ClientConnect() {
|
||||||
|
setTitle("Client Connection Details"); // Set the title of the frame
|
||||||
|
setContentPane(panel); // Set the main panel for the JFrame
|
||||||
|
setSize(1024, 1024); // Set the size of the frame
|
||||||
|
setVisible(true); // Make the frame visible
|
||||||
|
|
||||||
|
// ActionListener for the "Go" button
|
||||||
goButton.addActionListener(new ActionListener() {
|
goButton.addActionListener(new ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent actionEvent) {
|
public void actionPerformed(ActionEvent actionEvent) {
|
||||||
logger.info("Triggered a Connection request.");
|
logger.info("Triggered a Connection request.");
|
||||||
|
// Connection logic would go here (e.g., retrieve values and initiate connection)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,40 +3,78 @@ package net.ayyalasomayajula.net.server;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.*;
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.ServerSocket;
|
import java.net.ServerSocket;
|
||||||
|
import java.net.Socket;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.Scanner;
|
import java.util.Scanner;
|
||||||
|
import java.util.concurrent.LinkedBlockingDeque;
|
||||||
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public class ServerDaemon implements Runnable{
|
/**
|
||||||
|
* The ServerDaemon class implements a server daemon that listens for incoming client connections.
|
||||||
|
* It initializes a root path for storing data, creates necessary directories and files,
|
||||||
|
* and handles incoming socket connections using a thread pool for concurrency.
|
||||||
|
*/
|
||||||
|
public class ServerDaemon implements Runnable {
|
||||||
private static final Logger logger = LoggerFactory.getLogger(ServerDaemon.class);
|
private static final Logger logger = LoggerFactory.getLogger(ServerDaemon.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The entry point of the server daemon that sets up the server, initializes root paths,
|
||||||
|
* and listens for client connections.
|
||||||
|
* It also spawns a thread pool to handle incoming connections asynchronously.
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
System.out.println("Welcome to the Server Daemon.");
|
System.out.println("Welcome to the Server Daemon.");
|
||||||
System.out.println("What is the root path for all your data?");
|
System.out.println("What is the root path for all your data?");
|
||||||
System.out.println("prepare for the codebase to throw a RuntimeException if incorrectly formatted or error inducing data is submitted. This is a security feature.");
|
System.out.println("prepare for the codebase to throw a RuntimeException if incorrectly formatted or error inducing data is submitted. This is a security feature.");
|
||||||
|
|
||||||
Scanner sc = new Scanner(System.in);
|
Scanner sc = new Scanner(System.in);
|
||||||
Path path = new File(sc.nextLine().trim()).toPath();
|
Path path = new File(sc.nextLine().trim()).toPath();
|
||||||
logger.debug("Path received: {}", path.toString());
|
logger.debug("Path received: {}", path.toString());
|
||||||
if(!isRootPathInited(path)){
|
|
||||||
|
if (!isRootPathInited(path)) {
|
||||||
boolean success = initRootPath(path);
|
boolean success = initRootPath(path);
|
||||||
if(!success) throw new RuntimeException("Your Path is dysfunctional");
|
if (!success) throw new RuntimeException("Your Path is dysfunctional");
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
ServerSocket serverSocket = new ServerSocket(8475);
|
ServerSocket serverSocket = new ServerSocket(8475);
|
||||||
logger.info("Server to handle connections has been made at: {} on 0.0.0.0", serverSocket.getLocalPort());
|
logger.info("Server to handle connections has been made at: {} on 0.0.0.0", serverSocket.getLocalPort());
|
||||||
|
|
||||||
|
ThreadPoolExecutor tpe = new ThreadPoolExecutor(5, 10, 9999L, TimeUnit.HOURS, new LinkedBlockingDeque<Runnable>());
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
Socket socketToPass = serverSocket.accept();
|
||||||
|
logger.info("Received a connection");
|
||||||
|
tpe.submit(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
handleConnections(socketToPass);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean initRootPath(Path path){
|
/**
|
||||||
// create the lock file
|
* Initializes the root path by creating necessary directories and files.
|
||||||
|
* Specifically, it creates a lock file and a "patients" directory.
|
||||||
|
*
|
||||||
|
* @param path The root path to initialize.
|
||||||
|
* @return True if initialization is successful, false otherwise.
|
||||||
|
*/
|
||||||
|
private boolean initRootPath(Path path) {
|
||||||
|
// Create the lock file
|
||||||
String lockFile = "lock.lock"; // Set your desired file name
|
String lockFile = "lock.lock"; // Set your desired file name
|
||||||
|
|
||||||
// Combine the base path and file name
|
// Combine the base path and file name
|
||||||
@@ -51,7 +89,7 @@ public class ServerDaemon implements Runnable{
|
|||||||
|
|
||||||
// Create the file
|
// Create the file
|
||||||
if (file.createNewFile()) {
|
if (file.createNewFile()) {
|
||||||
System.out.println("File created: " + file.getName());
|
logger.info("File created: " + file.getName());
|
||||||
|
|
||||||
// Write a random byte to the file
|
// Write a random byte to the file
|
||||||
try (FileOutputStream fos = new FileOutputStream(file)) {
|
try (FileOutputStream fos = new FileOutputStream(file)) {
|
||||||
@@ -66,16 +104,22 @@ public class ServerDaemon implements Runnable{
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
System.err.println("An error occurred: " + e.getMessage());
|
System.err.println("An error occurred: " + e.getMessage());
|
||||||
}
|
}
|
||||||
// create patient dir
|
|
||||||
|
// Create patient directory
|
||||||
String patientEhrs = "patients/";
|
String patientEhrs = "patients/";
|
||||||
Path patientPath = path.resolve(patientEhrs);
|
Path patientPath = path.resolve(patientEhrs);
|
||||||
File dir = patientPath.toFile();
|
File dir = patientPath.toFile();
|
||||||
dir.mkdir();
|
dir.mkdir();
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the root path has already been initialized by checking if the lock file exists.
|
||||||
|
*
|
||||||
|
* @param path The root path to check.
|
||||||
|
* @return True if the lock file exists, false otherwise.
|
||||||
|
*/
|
||||||
private boolean isRootPathInited(Path path) {
|
private boolean isRootPathInited(Path path) {
|
||||||
// Create a File object from the given path and append "lock.lock"
|
// Create a File object from the given path and append "lock.lock"
|
||||||
File lockFile = path.resolve("lock.lock").toFile();
|
File lockFile = path.resolve("lock.lock").toFile();
|
||||||
@@ -83,4 +127,18 @@ public class ServerDaemon implements Runnable{
|
|||||||
// Check if the file exists and is a file (not a directory)
|
// Check if the file exists and is a file (not a directory)
|
||||||
return lockFile.exists() && lockFile.isFile();
|
return lockFile.exists() && lockFile.isFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles incoming socket connections. Currently, it sets up ObjectOutputStream
|
||||||
|
* and ObjectInputStream for communication but does not process the data.
|
||||||
|
*
|
||||||
|
* @param socket The socket for the incoming connection.
|
||||||
|
* @throws IOException If an I/O error occurs while setting up the streams.
|
||||||
|
*/
|
||||||
|
private void handleConnections(Socket socket) throws IOException {
|
||||||
|
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
|
||||||
|
ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
|
||||||
|
|
||||||
|
// Further processing can be added here
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user