diff --git a/year4/semester2/CT414/assignments/assignment1/code/src/client/ApplicationClient.java b/year4/semester2/CT414/assignments/assignment1/code/src/client/ApplicationClient.java new file mode 100644 index 00000000..9f60a632 --- /dev/null +++ b/year4/semester2/CT414/assignments/assignment1/code/src/client/ApplicationClient.java @@ -0,0 +1,61 @@ +package client; + +import interfaces.ApplicationForm; +import interfaces.ApplicationHandler; + +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; +import java.util.Scanner; + +public class ApplicationClient { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + try { + // connect to registry + Registry registry = LocateRegistry.getRegistry("localhost", 1099); + System.out.println("Connected to RMI Registry"); + + // look up application handler in registry + ApplicationHandler handler = (ApplicationHandler) registry.lookup("ApplicationHandler"); + System.out.println("ApplicationHandler found in registry"); + + // login + System.out.println("Enter your username\n> "); + String username = scanner.nextLine(); + + System.out.println("Enter your password\n> "); + String password = scanner.nextLine(); + + long sessionID = handler.login(username, password); + System.out.println("Successfully logged in with session ID: " + sessionID); + + // download application form + ApplicationForm form = handler.downloadApplicationForm(sessionID); + System.out.println("Successfully downloaded application form"); + + // print form info + System.out.println("------ FORM INFORMATION ------"); + System.out.println(form.getFormInfo()); + System.out.println("Number of questions to be answered: " + form.getTotalQuestions()); + System.out.println("------------------------------"); + + // answer questiosn + for (int i = 0; i < form.getTotalQuestions(); i++) { + System.out.println("Q" + i + ": " + form.getQuestion(i)); + System.out.println("A> "); + form.answerQuestion(i, scanner.nextLine()); + } + System.out.println("Form filled successfully."); + + // submit form + handler.submitApplicationForm(sessionID, form); + System.out.println("Successfully submitted application form."); + + } catch (Exception e) { + e.printStackTrace(); + } finally { + scanner.close(); + } + } +} diff --git a/year4/semester2/CT414/assignments/assignment1/code/src/implementations/ApplicationFormV1.java b/year4/semester2/CT414/assignments/assignment1/code/src/implementations/ApplicationFormV1.java index c1ce4da6..4c4f1803 100644 --- a/year4/semester2/CT414/assignments/assignment1/code/src/implementations/ApplicationFormV1.java +++ b/year4/semester2/CT414/assignments/assignment1/code/src/implementations/ApplicationFormV1.java @@ -43,6 +43,11 @@ public class ApplicationFormV1 implements ApplicationForm { answers[questionNumber] = answer; } + @Override + public String getName() throws RemoteException { + return answers[0]; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/year4/semester2/CT414/assignments/assignment1/code/src/implementations/ApplicationHandlerImpl.java b/year4/semester2/CT414/assignments/assignment1/code/src/implementations/ApplicationHandlerImpl.java new file mode 100644 index 00000000..43d7e365 --- /dev/null +++ b/year4/semester2/CT414/assignments/assignment1/code/src/implementations/ApplicationHandlerImpl.java @@ -0,0 +1,55 @@ +package implementations; +import exceptions.InvalidCredentialsException; +import exceptions.InvalidSessionIDException; +import interfaces.*; + +import java.rmi.RemoteException; +import java.util.ArrayList; +import java.io.*; + +public class ApplicationHandlerImpl implements ApplicationHandler { + private ArrayList sessions = new ArrayList(); + + @Override + public long login(String username, String password) throws RemoteException, InvalidCredentialsException { + // hardcoded username and password (great practice for security) + if (username.equals("admin") && password.equals("admin")) { + long sessionId = System.currentTimeMillis(); // use current time as session id + sessions.add(sessionId); + + System.out.println("User " + username + " logged in with session ID: " + sessionId); + + return sessionId; + } else { + throw new InvalidCredentialsException("Invalid username or password."); + } + } + + @Override + public ApplicationForm downloadApplicationForm(long sessionID) throws RemoteException, InvalidSessionIDException { + if (sessions.contains(sessionID)) { + System.out.println("Returning application form for session ID: " + sessionID); + return new ApplicationFormV1(); + } else { + throw new InvalidSessionIDException("Invalid session ID."); + } + } + + @Override + public void submitApplicationForm(long sessionID, ApplicationForm applicationForm) throws RemoteException, InvalidSessionIDException { + if (sessions.contains(sessionID)) { + String filename = applicationForm.getName().replace("\\s", "_") + ".txt"; + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) { + System.out.println("Saving application form to file: " + filename); + writer.write(applicationForm.toString()); + System.out.println("Successfully saved application form to file: " + filename); + } catch (IOException e) { + System.out.println("Failed to save application form to file:" + filename); + e.printStackTrace(); + } + } else { + throw new InvalidSessionIDException("Invalid session ID."); + } + } +} diff --git a/year4/semester2/CT414/assignments/assignment1/code/src/interfaces/ApplicationForm.java b/year4/semester2/CT414/assignments/assignment1/code/src/interfaces/ApplicationForm.java index 22db0ee0..3519b61d 100644 --- a/year4/semester2/CT414/assignments/assignment1/code/src/interfaces/ApplicationForm.java +++ b/year4/semester2/CT414/assignments/assignment1/code/src/interfaces/ApplicationForm.java @@ -15,4 +15,7 @@ public interface ApplicationForm extends Remote { // method to provide a String answer to a question based off its questionNumber void answerQuestion(int questionNumber, String answer) throws RemoteException, IllegalArgumentException; + + // method to return the applicant's name, for use in naming application files + String getName() throws RemoteException; } diff --git a/year4/semester2/CT414/assignments/assignment1/code/src/run.sh b/year4/semester2/CT414/assignments/assignment1/code/src/run.sh new file mode 100755 index 00000000..837cdd1b --- /dev/null +++ b/year4/semester2/CT414/assignments/assignment1/code/src/run.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +src_path="/home/andrew/edu/year4/semester2/CT414/assignments/assignment1/code/src" + +# compile code +javac -d . server/*.java client/*.java interfaces/*.java implementations/*.java  + +# start rmi registry +rmiregistry -J-Djava.rmi.server.codebase=file:$src_path & +trap "kill $! 2>/dev/null" EXIT + +# start server +java -cp $src_path -Djava.rmi.server.codebase=file:$src_path/ server.ApplicationServer & +trap "kill $! 2>/dev/null" EXIT diff --git a/year4/semester2/CT414/assignments/assignment1/code/src/server/ApplicationServer.java b/year4/semester2/CT414/assignments/assignment1/code/src/server/ApplicationServer.java new file mode 100644 index 00000000..a7cceddd --- /dev/null +++ b/year4/semester2/CT414/assignments/assignment1/code/src/server/ApplicationServer.java @@ -0,0 +1,31 @@ +package server; + +import implementations.ApplicationHandlerImpl; + +import java.rmi.Naming; +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; +import java.rmi.server.UnicastRemoteObject; + +public class ApplicationServer { + public static void main(String[] args) { + try { + // start RMI registry + Registry registry = LocateRegistry.getRegistry(); + + // create applicationhandlerstub and bind it + ApplicationHandlerImpl applicationHandler = new ApplicationHandlerImpl(); + System.out.println("Instance of ApplicationHandlerImpl created"); + + ApplicationHandlerImpl stub = (ApplicationHandlerImpl) UnicastRemoteObject.exportObject(applicationHandler, 0); + Naming.rebind("ApplicationHandler", stub); + System.out.println("Name rebind completed"); + + System.out.println("Application Server up and running"); + } + catch (Exception e) { + System.out.println("Failed to start server"); + e.printStackTrace(); + } + } +}