From 629549d50fa8a89fcb3ae1c834cdcd6379d1daec Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 23 Jan 2025 01:26:41 +0000 Subject: [PATCH] [CT414]: Add Assignment 1 --- .../assignments/assignment1/code/.gitignore | 32 ++++++++ .../InvalidCredentialsException.java | 13 +++ .../exceptions/InvalidSessionIDException.java | 13 +++ .../implementations/ApplicationFormV1.java | 57 +++++++++++++ .../code/src/interfaces/ApplicationForm.java | 18 +++++ .../src/interfaces/ApplicationHandler.java | 14 ++++ .../assignment1/latex/CT414-Assignment-01.pdf | Bin 0 -> 20739 bytes .../assignment1/latex/CT414-Assignment-01.tex | 76 ++++++++++++++++++ .../assignments/assignment1/specification.md | 19 +++++ 9 files changed, 242 insertions(+) create mode 100644 year4/semester2/CT414/assignments/assignment1/code/.gitignore create mode 100644 year4/semester2/CT414/assignments/assignment1/code/src/exceptions/InvalidCredentialsException.java create mode 100644 year4/semester2/CT414/assignments/assignment1/code/src/exceptions/InvalidSessionIDException.java create mode 100644 year4/semester2/CT414/assignments/assignment1/code/src/implementations/ApplicationFormV1.java create mode 100644 year4/semester2/CT414/assignments/assignment1/code/src/interfaces/ApplicationForm.java create mode 100644 year4/semester2/CT414/assignments/assignment1/code/src/interfaces/ApplicationHandler.java create mode 100644 year4/semester2/CT414/assignments/assignment1/latex/CT414-Assignment-01.pdf create mode 100644 year4/semester2/CT414/assignments/assignment1/latex/CT414-Assignment-01.tex create mode 100644 year4/semester2/CT414/assignments/assignment1/specification.md diff --git a/year4/semester2/CT414/assignments/assignment1/code/.gitignore b/year4/semester2/CT414/assignments/assignment1/code/.gitignore new file mode 100644 index 00000000..23e58aca --- /dev/null +++ b/year4/semester2/CT414/assignments/assignment1/code/.gitignore @@ -0,0 +1,32 @@ +### IntelliJ IDEA ### +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ +.idea/ + +### Mac OS ### +.DS_Store + +code.iml diff --git a/year4/semester2/CT414/assignments/assignment1/code/src/exceptions/InvalidCredentialsException.java b/year4/semester2/CT414/assignments/assignment1/code/src/exceptions/InvalidCredentialsException.java new file mode 100644 index 00000000..bec1d03d --- /dev/null +++ b/year4/semester2/CT414/assignments/assignment1/code/src/exceptions/InvalidCredentialsException.java @@ -0,0 +1,13 @@ +package exceptions; + +import java.rmi.RemoteException; + +public class InvalidCredentialsException extends RemoteException { + public InvalidCredentialsException() { + super("Invalid username or password."); + } + + public InvalidCredentialsException(String message) { + super(message); + } +} diff --git a/year4/semester2/CT414/assignments/assignment1/code/src/exceptions/InvalidSessionIDException.java b/year4/semester2/CT414/assignments/assignment1/code/src/exceptions/InvalidSessionIDException.java new file mode 100644 index 00000000..2d60f8f9 --- /dev/null +++ b/year4/semester2/CT414/assignments/assignment1/code/src/exceptions/InvalidSessionIDException.java @@ -0,0 +1,13 @@ +package exceptions; + +import java.rmi.RemoteException; + +public class InvalidSessionIDException extends RemoteException { + public InvalidSessionIDException() { + super("Invalid or expired session ID."); + } + + public InvalidSessionIDException(String message) { + super(message); + } +} diff --git a/year4/semester2/CT414/assignments/assignment1/code/src/implementations/ApplicationFormV1.java b/year4/semester2/CT414/assignments/assignment1/code/src/implementations/ApplicationFormV1.java new file mode 100644 index 00000000..c1ce4da6 --- /dev/null +++ b/year4/semester2/CT414/assignments/assignment1/code/src/implementations/ApplicationFormV1.java @@ -0,0 +1,57 @@ +package implementations; + +import interfaces.*; +import java.util.*; +import java.rmi.*; + +public class ApplicationFormV1 implements ApplicationForm { + private String formInfo = "University of Galway Application Form - Version 1"; + private String[] questions = new String[5]; + private String[] answers = new String[5]; + + public ApplicationFormV1() { + questions[0] = "What is your full name?"; + questions[1] = "What is your address?"; + questions[2] = "What is your e-mail address?"; + questions[3] = "What is your contact number?"; + questions[4] = "Provide a personal statement (e.g., additional details about yourself, a summary of your existing qualifications or results)."; + } + + @Override + public String getFormInfo() throws RemoteException { + return formInfo; + } + + @Override + public int getTotalQuestions() throws RemoteException { + return questions.length; + } + + @Override + public String getQuestion(int questionNumber) throws RemoteException, IllegalArgumentException { + if (questionNumber < 0 || questionNumber > questions.length) { + throw new IllegalArgumentException("Invalid question number: " + questionNumber); + } + return questions[questionNumber]; + } + + @Override + public void answerQuestion(int questionNumber, String answer) throws RemoteException, IllegalArgumentException { + if (questionNumber < 0 || questionNumber > questions.length) { + throw new IllegalArgumentException("Invalid question number: " + questionNumber); + } + answers[questionNumber] = answer; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < questions.length; i++) { + sb.append("Q").append(i).append(": ").append(questions[i]).append("\n"); + sb.append("A").append(i).append(": ").append(answers[i]).append("\n\n"); + } + + return sb.toString(); + } +} diff --git a/year4/semester2/CT414/assignments/assignment1/code/src/interfaces/ApplicationForm.java b/year4/semester2/CT414/assignments/assignment1/code/src/interfaces/ApplicationForm.java new file mode 100644 index 00000000..22db0ee0 --- /dev/null +++ b/year4/semester2/CT414/assignments/assignment1/code/src/interfaces/ApplicationForm.java @@ -0,0 +1,18 @@ +package interfaces; + +import java.rmi.*; + +public interface ApplicationForm extends Remote { + + // method to retrieve general information about the form + String getFormInfo() throws RemoteException; + + // method to retrieve the total number of questions in the application form + int getTotalQuestions() throws RemoteException; + + // method to retrieve a specific question based on its number + String getQuestion(int questionNumber) throws RemoteException, IllegalArgumentException; + + // method to provide a String answer to a question based off its questionNumber + void answerQuestion(int questionNumber, String answer) throws RemoteException, IllegalArgumentException; +} diff --git a/year4/semester2/CT414/assignments/assignment1/code/src/interfaces/ApplicationHandler.java b/year4/semester2/CT414/assignments/assignment1/code/src/interfaces/ApplicationHandler.java new file mode 100644 index 00000000..7cd5551c --- /dev/null +++ b/year4/semester2/CT414/assignments/assignment1/code/src/interfaces/ApplicationHandler.java @@ -0,0 +1,14 @@ +package interfaces; + +import exceptions.InvalidCredentialsException; +import exceptions.InvalidSessionIDException; + +import java.rmi.*; + +public interface ApplicationHandler extends Remote { + long login(String username, String password) throws RemoteException, InvalidCredentialsException; + + ApplicationForm downloadApplicationForm(long sessionID) throws RemoteException, InvalidSessionIDException; + + void submitApplicationForm(long sessionID, ApplicationForm applicationForm) throws RemoteException, InvalidSessionIDException; +} diff --git a/year4/semester2/CT414/assignments/assignment1/latex/CT414-Assignment-01.pdf b/year4/semester2/CT414/assignments/assignment1/latex/CT414-Assignment-01.pdf new file mode 100644 index 0000000000000000000000000000000000000000..398042b0df96f3c7503a27486b987c92a804b0e2 GIT binary patch literal 20739 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 literal 0 HcmV?d00001 diff --git a/year4/semester2/CT414/assignments/assignment1/latex/CT414-Assignment-01.tex b/year4/semester2/CT414/assignments/assignment1/latex/CT414-Assignment-01.tex new file mode 100644 index 00000000..3fa9c3d3 --- /dev/null +++ b/year4/semester2/CT414/assignments/assignment1/latex/CT414-Assignment-01.tex @@ -0,0 +1,76 @@ +%! TeX program = lualatex +\documentclass[a4paper]{article} + +% packages +\usepackage{microtype} % Slightly tweak font spacing for aesthetics +\usepackage[english]{babel} % Language hyphenation and typographical rules +\usepackage[final, colorlinks = true, urlcolor = black, linkcolor = black]{hyperref} +\usepackage{changepage} % adjust margins on the fly + +\usepackage{fontspec} +\setmainfont{EB Garamond} +\setmonofont[Scale=MatchLowercase]{Deja Vu Sans Mono} + +\usepackage{minted} +\usemintedstyle{algol_nu} +\usepackage{xcolor} + +\usepackage{pgfplots} +\pgfplotsset{width=\textwidth,compat=1.9} + +\usepackage{caption} +\newenvironment{code}{\captionsetup{type=listing}}{} +\captionsetup[listing]{skip=0pt} +\setlength{\abovecaptionskip}{5pt} +\setlength{\belowcaptionskip}{5pt} + +\usepackage[yyyymmdd]{datetime} +\renewcommand{\dateseparator}{--} + +\usepackage{titlesec} +% \titleformat{\section}{\LARGE\bfseries}{}{}{}[\titlerule] +% \titleformat{\subsection}{\Large\bfseries}{}{0em}{} +% \titlespacing{\subsection}{0em}{-0.7em}{0em} +% +% \titleformat{\subsubsection}{\large\bfseries}{}{0em}{$\bullet$ } +% \titlespacing{\subsubsection}{1em}{-0.7em}{0em} + +% margins +\addtolength{\hoffset}{-2.25cm} +\addtolength{\textwidth}{4.5cm} +\addtolength{\voffset}{-3.25cm} +\addtolength{\textheight}{5cm} +\setlength{\parskip}{0pt} +\setlength{\parindent}{0in} +% \setcounter{secnumdepth}{0} + +\begin{document} +\hrule \medskip +\begin{minipage}{0.295\textwidth} + \raggedright + \footnotesize + \begin{tabular}{@{}l l} + Name: & Andrew Hayes \\ + Student ID: & 21321503 \\ + E-mail: & \href{mailto://a.hayes18@universityofgalway.ie}{\texttt{a.hayes18@universityofgalway.ie}} \\ + \end{tabular} +\end{minipage} +\begin{minipage}{0.4\textwidth} + \centering + \vspace{0.4em} + \LARGE + \textsc{ct414} \\ +\end{minipage} +\begin{minipage}{0.295\textwidth} + \raggedleft + \today +\end{minipage} +\medskip\hrule +\begin{center} + \normalsize + Assignment 1: Java RMI +\end{center} +\hrule + + +\end{document} diff --git a/year4/semester2/CT414/assignments/assignment1/specification.md b/year4/semester2/CT414/assignments/assignment1/specification.md new file mode 100644 index 00000000..8cbe30ff --- /dev/null +++ b/year4/semester2/CT414/assignments/assignment1/specification.md @@ -0,0 +1,19 @@ +# Problem Description +You are required to implement an Internet based College Course application system for the University using Java RMI. The server allows a client to login and retrieve an ApplicationForm object that will then be completed on the client side. The client can then submit the completed ApplicationForm object back to the server for validation and processing. The design of the system makes it possible for new ApplicationForm implementation classes to be easily added to the server in the future, making the system very flexible. + +# Implementation Details +The answer should include full source code for the following Java interfaces and classes: +- ApplicationHandler.java - this Java interface provides remote methods for user login, based on a username and password, downloading an Application Form and submitting a completed Application Form. If sucessful, the login method returns a long integer value that must be passed to the other two server methods as a session identifier. The methods to download and upload an Application Form object should use the interface type ApplicationForm as described next. Provide suitable exception handling for the remote methods to catch possible issues with parameters or method invocation e.g. InvalidCredentials, InvalidSessionID etc. +- ApplicationForm.java - this Java interface provides methods for retrieving and answering questions. The interface should have a method to retrieve general information about the application form and a method to return the total number of questions to be answered. It should also have methods to retrieve and answer questions, based on the question number, it only needs to support text type questions and answers. +- ApplicationFormV1.java - this Java class should provide an implementation of the ApplicationForm interface. It should include questions that allow the following information about the applicant to be included in a completed application form: name, address, email and contact number of the applicant. It should also have a question that allows an applicant to provide a personal statement e.g. this could be used to include additional details about the applicant and a summary of their existing qualifications or results. +- ApplicationHandlerImpl.java - this Java class should provide the implementation of the ApplicationHandler interface, an instance of this class will be created by the mainline server code. A single valid username and password can be hardcoded into the server for the purposes of implementing the login method. The implementation method to download an ApplicationForm therefore just needs to return an instance of the ApplicationFormV1 class. The CourseServer implementation method to upload a completed ApplicationForm should just save the completed form, in a suitable text format, to a file. For this purpose, the implementation class can include an appropriate toString() method. The filename used should be based on the first name and second name provided in the ApplicationForm. +- ApplicationServer.java - this Java class should provide the mainline server code. This should create an instance of the ApplicationHandlerImpl class and then register this with the RMIRegistry so that it can be located and used by the client code. +- ApplicationClient.java - this Java class should provide the client code. This can done as a simple command line client program that will interact with the server as follows: (i) Login to the server. (ii) Download an ApplicationForm object. (iii) Call methods on the ApplicationForm, as required to complete the form. (iv) Submit the completed Application Form back to the sever. +Completing the Assignment + +There are two main programming tasks. The first is to complete the implementation of the remote methods in the ApplicationHandlerImpl class, the second is to write the client program that can use and interact with the server i.e. it logs into the server to get an access token, it then downloads an ApplicationForm object, completes the form and then finally submits the ApplicationForm object back to the server. For the purposes of completing this assignment you can create just one ApplicationFormV1 object for testing purposes. Also, the server only needs to implement the remote interfaces provided i.e. there is no need to do any further processing on a completed ApplicationForm after it has been uploaded to the server other than to save a copy of the submission as a text file on the server. You do not need to implement a GUI or any interactive features for the client program, it can be done as a simple command line program that calls methods on the server and on an ApplicationForm object after it has been downloaded to the client. You should include some debug related print commands in both the client and server programs for testing and verification purposes. + +# Submission Details + +When completed you should submit copies of the source code you have written for the assignment as well as a document describing how you tested the application, the document should include screen shots showing evidence of the application running and the testing that was carried out. Please combine all the source code files and the related document (PDF or MS Word format only) into a single ZIP file for submission. All submissions should be done via Canvas and if you submit more than one attempt then only the final attempt will be marked. You can work on this assignment individually or in groups of no more than two students. In the case of a group submission only one member of the group needs to submit the assignment on Canvas, but please ensure that the ID number for both students is clearly indicated in the submission. +