commit ae884760af9dca489a5689f91fd2ddd9c3a8e4bb parent 6fdb9a97f0181556cc20b9d09bf57d5b378359fc Author: Christos Margiolis <christos@margiolis.net> Date: Tue, 3 May 2022 18:22:38 +0300 java assignment Diffstat:
21 files changed, 444 insertions(+), 207 deletions(-)
diff --git a/c_distributed_sys/ex1/doc/doc.pdf b/c_distributed_sys/ex1/doc/doc.pdf Binary files differ. diff --git a/c_distributed_sys/ex1/doc/doc.tex b/c_distributed_sys/ex1/doc/doc.tex @@ -1,207 +0,0 @@ -\documentclass{article} -\usepackage[utf8]{inputenc} -\usepackage[greek,english]{babel} -\usepackage{alphabeta} -\usepackage{fancyhdr} -\usepackage{listings} -\usepackage{mathtools} -\usepackage{xcolor} -\usepackage{biblatex} -\usepackage[left=2cm,right=2cm]{geometry} - -\lstset { - basicstyle=\ttfamily, - columns=fullflexible, - breaklines=true, - keepspaces=true, - showstringspaces=false -} - -\title{Εργαστήριο Κατανεμημένων Συστημάτων - Εργασία 1} -\author{Χρήστος Μαργιώλης} -\date{Μάιος 2022} - -\begin{document} - -\begin{titlepage} - \maketitle - \begin{figure}[t!] - \begin{center} - \includegraphics[scale=0.3]{./res/uniwalogo.png} \\ - \Large - \textbf{Πανεπιστήμιο Δυτικής Αττικής} \\ - \large - Τμήμα Μηχανικών Πληροφορικής και Ηλεκτρονικών Υπολογιστών - \end{center} - \end{figure} -\end{titlepage} - -\renewcommand{\contentsname}{Περιεχόμενα} -\tableofcontents - -\section{Χρήση \lstinline{rpcgen}} - -Πριν γίνει η ανάπτυξη του client/server κώδικα, πρέπει να παραχθούν τα -απαραίτητα RPC αρχεία. Στο αρχείο \lstinline{rpc.x} δηλώνονται οι τα ονόματα -και οι δομές των Remote Procedure Calls. - -Παράγουμε τα client και server stubs (αρχεία στα οποία θα συμπληρωθεί ο -κώδικας), καθώς και το \lstinline{Makefile} για να είναι πιο εύκολη η -μεταγλώττιση: - -\begin{lstlisting} - $ rpcgen -Ss -C > rpc_server.c - $ rpcgen -Sc -C > rpc_client.c - $ rpcgen -Sm > Makefile.rpc -\end{lstlisting} - -Στο \lstinline{Makefile.rpc} κάνουμε μερικές αλλαγές ωστέ ο server να μην -τρέχει στο background, και στην μεταγλώττιση να περιέχονται τα -\lstinline{rpc_client.c} και \lstinline{rpc_server.c}: - -\begin{lstlisting}[language=make] - ... - TARGETS_SVC.c = rpc_server.c rpc_svc.c rpc_xdr.c - TARGETS_CLNT.c = rpc_client.c rpc_clnt.c rpc_xdr.c - ... - CFLAGS += -g -DRPC_SVC_FG - RPCGENFLAGS = -C -\end{lstlisting} - -\section{Εκτέλεση κώδικα} - -Το αρχείο \lstinline{sock_client.c} υλοποιεί τον client τον οποίο εκτελεί ο -χρήστης. Το \lstinline{rpc_client.c}, παρόλο που λέει "client", είναι ο server -με τον οποίο επικοινωνεί ο \lstinline{sock_client.c} και κάνει τις remote -κλήσεις στον \lstinline{rpc_server.c}, ο οποίος υλοποιεί τις συναρτήσεις των -RPC. - -Κάνουμε compile τους κώδικες: - -\begin{lstlisting} - $ make - make -f Makefile.rpc - rpcgen -C rpc.x - cc -O2 -pipe -g -DRPC_SVC_FG -c rpc_client.c -o rpc_client.o - cc -O2 -pipe -g -DRPC_SVC_FG -c rpc_clnt.c -o rpc_clnt.o - cc -O2 -pipe -g -DRPC_SVC_FG -c rpc_xdr.c -o rpc_xdr.o - cc -o rpc_client rpc_client.o rpc_clnt.o rpc_xdr.o -O2 -pipe -g -DRPC_SVC_FG - cc -O2 -pipe -g -DRPC_SVC_FG -c rpc_server.c -o rpc_server.o - cc -O2 -pipe -g -DRPC_SVC_FG -c rpc_svc.c -o rpc_svc.o - cc -o rpc_server rpc_server.o rpc_svc.o rpc_xdr.o -O2 -pipe -g -DRPC_SVC_FG - cc sock_client.c -o sock_client -\end{lstlisting} - -Τα τρία προγράμματα εκτελούνται ως εξής: -\begin{itemize} - \item \lstinline{./rpc_server} - \item \lstinline{./rpc_client [-b backlog] [-p port] hostname} - \item \lstinline{./sock_client [-p port] hostname} -\end{itemize} - -Πριν τρέξουμε οποιοδήποτε RPC πρόγραμμα, πρέπει να αρχίσουμε το -\lstinline{rpcbind(8)} service (για FreeBSD): - -\begin{lstlisting} - # service rpcbind start -\end{lstlisting} - -Αφού τρέξουμε τον server, μπορούμε να δούμε ότι τα Remote Procedure Calls -έχουνε εισαχθεί στον πίνακα RPC. Η εντολή \lstinline{rpcinfo(8)} τυπώνει -τον πίνακα: - -\begin{lstlisting} - $ ./rpc_server - $ rpcinfo - program version netid address service owner - 100000 4 tcp 0.0.0.0.0.111 rpcbind superuser - 100000 3 tcp 0.0.0.0.0.111 rpcbind superuser - 100000 2 tcp 0.0.0.0.0.111 rpcbind superuser - 100000 4 udp 0.0.0.0.0.111 rpcbind superuser - 100000 3 udp 0.0.0.0.0.111 rpcbind superuser - 100000 2 udp 0.0.0.0.0.111 rpcbind superuser - 100000 4 tcp6 ::.0.111 rpcbind superuser - 100000 3 tcp6 ::.0.111 rpcbind superuser - 100000 4 udp6 ::.0.111 rpcbind superuser - 100000 3 udp6 ::.0.111 rpcbind superuser - 100000 4 local /var/run/rpcbind.sock rpcbind superuser - 100000 3 local /var/run/rpcbind.sock rpcbind superuser - 100000 2 local /var/run/rpcbind.sock rpcbind superuser - 536870912 1 udp6 ::.161.100 - 1001 - 536870912 1 tcp6 ::.93.202 - 1001 - 536870912 1 udp 0.0.0.0.44.39 - 1001 - 536870912 1 tcp 0.0.0.0.219.61 - 1001 - 536870913 1 udp6 ::.161.100 - 1001 - 536870913 1 tcp6 ::.93.202 - 1001 - 536870913 1 udp 0.0.0.0.44.39 - 1001 - 536870913 1 tcp 0.0.0.0.219.61 - 1001 - 536870914 1 udp6 ::.161.100 - 1001 - 536870914 1 tcp6 ::.93.202 - 1001 - 536870914 1 udp 0.0.0.0.44.39 - 1001 - 536870914 1 tcp 0.0.0.0.219.61 - 1001 -\end{lstlisting} - -Οι γραμμές που ξεκινούν με 53687* είναι τα RPC που δημιούργησε ο -\lstinline{rpc_server}. - -\section{Ενδεικτικά τρεξίματα} - -Σε κάθε ενότητα έχω παραθέσει τα output των 3 προγραμμάτων στην τελική τους -κατάσταση. 'Ισως χρειαστεί λίγη μεγέθυνση... - -\subsection{Server και client στον ίδιο υπολογιστή} - -\includegraphics[width=\linewidth]{res/samepc.png} - -\subsection{Server και client σε διαφορετικές IP} - -Ο RPC server τώρα τρέχει σε FreeBSD Jail, το οποίο, αν και βρίσκεται στο ίδιο -τοπικό δίκτυο, έχει διαφορετική IP διεύθυνση. Ο RPC client και ο socket client -τρέχουν ακόμα στο τρέχουν ακόμα στον localhost. \\ - -\includegraphics[width=\linewidth]{res/jail.png} - -\subsection{Δοκιμή concurrency} - -Ο RPC server και client τρέχουν και οι δύο σε FreeBSD Jail, και αυτή τη φορά θα -δοκιμάσουμε να ελέγξουμε αν ο server είναι όντως concurrent. - -\includegraphics[width=\linewidth]{res/concur.png} - -\section{Κώδικας} - -Ο κώδικας είναι σχολιασμένος στα σημεία που θεωρώ ότι μπορεί να υπάρξει -σύχγηση, και όχι ακόμα και σε σημεία που είναι λίγο-πολύ ξεκάθαρο το τι -συμβαίνει. - -\subsection{\lstinline{rpc.x}} - -\lstinputlisting{../src/rpc.x} -\pagebreak - -\subsection{\lstinline{rpc_server.c}} - -\lstinputlisting[language=C]{../src/rpc_server.c} -\pagebreak - -\subsection{\lstinline{rpc_client.c}} - -\lstinputlisting[language=C]{../src/rpc_client.c} -\pagebreak - -\subsection{\lstinline{sock_client.c}} - -\lstinputlisting[language=C]{../src/sock_client.c} -\pagebreak - -\subsection{\lstinline{Makefile.rpc}} - -\lstinputlisting[language=make]{../src/Makefile.rpc} -\pagebreak - -\subsection{\lstinline{Makefile}} - -\lstinputlisting[language=make]{../src/Makefile} -\pagebreak - -\end{document} diff --git a/c_java_distributed_sys/ex1/doc/doc.pdf b/c_java_distributed_sys/ex1/doc/doc.pdf Binary files differ. diff --git a/c_java_distributed_sys/ex1/doc/doc.tex b/c_java_distributed_sys/ex1/doc/doc.tex @@ -0,0 +1,207 @@ +\documentclass{article} +\usepackage[utf8]{inputenc} +\usepackage[greek,english]{babel} +\usepackage{alphabeta} +\usepackage{fancyhdr} +\usepackage{listings} +\usepackage{mathtools} +\usepackage{xcolor} +\usepackage{biblatex} +\usepackage[left=2cm,right=2cm]{geometry} + +\lstset { + basicstyle=\ttfamily, + columns=fullflexible, + breaklines=true, + keepspaces=true, + showstringspaces=false +} + +\title{Εργαστήριο Κατανεμημένων Συστημάτων - Εργασία 1} +\author{Χρήστος Μαργιώλης -- 19390133} +\date{Μάιος 2022} + +\begin{document} + +\begin{titlepage} + \maketitle + \begin{figure}[t!] + \begin{center} + \includegraphics[scale=0.3]{./res/uniwalogo.png} \\ + \Large + \textbf{Πανεπιστήμιο Δυτικής Αττικής} \\ + \large + Τμήμα Μηχανικών Πληροφορικής και Ηλεκτρονικών Υπολογιστών + \end{center} + \end{figure} +\end{titlepage} + +\renewcommand{\contentsname}{Περιεχόμενα} +\tableofcontents + +\section{Χρήση \lstinline{rpcgen}} + +Πριν γίνει η ανάπτυξη του client/server κώδικα, πρέπει να παραχθούν τα +απαραίτητα RPC αρχεία. Στο αρχείο \lstinline{rpc.x} δηλώνονται τα ονόματα +και οι δομές των Remote Procedure Calls. + +Παράγουμε τα client και server stubs (αρχεία στα οποία θα συμπληρωθεί ο +κώδικας), καθώς και το \lstinline{Makefile} για να είναι πιο εύκολη η +μεταγλώττιση: + +\begin{lstlisting} + $ rpcgen -Ss -C > rpc_server.c + $ rpcgen -Sc -C > rpc_client.c + $ rpcgen -Sm > Makefile.rpc +\end{lstlisting} + +Στο \lstinline{Makefile.rpc} κάνουμε μερικές αλλαγές ωστέ ο server να μην +τρέχει στο background, και στην μεταγλώττιση να περιέχονται τα +\lstinline{rpc_client.c} και \lstinline{rpc_server.c}: + +\begin{lstlisting}[language=make] + ... + TARGETS_SVC.c = rpc_server.c rpc_svc.c rpc_xdr.c + TARGETS_CLNT.c = rpc_client.c rpc_clnt.c rpc_xdr.c + ... + CFLAGS += -g -DRPC_SVC_FG + RPCGENFLAGS = -C +\end{lstlisting} + +\section{Εκτέλεση κώδικα} + +Το αρχείο \lstinline{sock_client.c} υλοποιεί τον client τον οποίο εκτελεί ο +χρήστης. Το \lstinline{rpc_client.c}, παρόλο που λέει "client", είναι ο server +με τον οποίο επικοινωνεί ο \lstinline{sock_client.c} και κάνει τις remote +κλήσεις στον \lstinline{rpc_server.c}, ο οποίος υλοποιεί τις συναρτήσεις των +RPC. + +Κάνουμε compile τους κώδικες: + +\begin{lstlisting} + $ make + make -f Makefile.rpc + rpcgen -C rpc.x + cc -O2 -pipe -g -DRPC_SVC_FG -c rpc_client.c -o rpc_client.o + cc -O2 -pipe -g -DRPC_SVC_FG -c rpc_clnt.c -o rpc_clnt.o + cc -O2 -pipe -g -DRPC_SVC_FG -c rpc_xdr.c -o rpc_xdr.o + cc -o rpc_client rpc_client.o rpc_clnt.o rpc_xdr.o -O2 -pipe -g -DRPC_SVC_FG + cc -O2 -pipe -g -DRPC_SVC_FG -c rpc_server.c -o rpc_server.o + cc -O2 -pipe -g -DRPC_SVC_FG -c rpc_svc.c -o rpc_svc.o + cc -o rpc_server rpc_server.o rpc_svc.o rpc_xdr.o -O2 -pipe -g -DRPC_SVC_FG + cc sock_client.c -o sock_client +\end{lstlisting} + +Τα τρία προγράμματα εκτελούνται ως εξής: +\begin{itemize} + \item \lstinline{./rpc_server} + \item \lstinline{./rpc_client [-b backlog] [-p port] hostname} + \item \lstinline{./sock_client [-p port] hostname} +\end{itemize} + +Πριν τρέξουμε οποιοδήποτε RPC πρόγραμμα, πρέπει να αρχίσουμε το +\lstinline{rpcbind(8)} service (για FreeBSD): + +\begin{lstlisting} + # service rpcbind start +\end{lstlisting} + +Αφού τρέξουμε τον server, μπορούμε να δούμε ότι τα Remote Procedure Calls +έχουνε εισαχθεί στον πίνακα RPC. Η εντολή \lstinline{rpcinfo(8)} τυπώνει +τον πίνακα: + +\begin{lstlisting} + $ ./rpc_server + $ rpcinfo + program version netid address service owner + 100000 4 tcp 0.0.0.0.0.111 rpcbind superuser + 100000 3 tcp 0.0.0.0.0.111 rpcbind superuser + 100000 2 tcp 0.0.0.0.0.111 rpcbind superuser + 100000 4 udp 0.0.0.0.0.111 rpcbind superuser + 100000 3 udp 0.0.0.0.0.111 rpcbind superuser + 100000 2 udp 0.0.0.0.0.111 rpcbind superuser + 100000 4 tcp6 ::.0.111 rpcbind superuser + 100000 3 tcp6 ::.0.111 rpcbind superuser + 100000 4 udp6 ::.0.111 rpcbind superuser + 100000 3 udp6 ::.0.111 rpcbind superuser + 100000 4 local /var/run/rpcbind.sock rpcbind superuser + 100000 3 local /var/run/rpcbind.sock rpcbind superuser + 100000 2 local /var/run/rpcbind.sock rpcbind superuser + 536870912 1 udp6 ::.161.100 - 1001 + 536870912 1 tcp6 ::.93.202 - 1001 + 536870912 1 udp 0.0.0.0.44.39 - 1001 + 536870912 1 tcp 0.0.0.0.219.61 - 1001 + 536870913 1 udp6 ::.161.100 - 1001 + 536870913 1 tcp6 ::.93.202 - 1001 + 536870913 1 udp 0.0.0.0.44.39 - 1001 + 536870913 1 tcp 0.0.0.0.219.61 - 1001 + 536870914 1 udp6 ::.161.100 - 1001 + 536870914 1 tcp6 ::.93.202 - 1001 + 536870914 1 udp 0.0.0.0.44.39 - 1001 + 536870914 1 tcp 0.0.0.0.219.61 - 1001 +\end{lstlisting} + +Οι γραμμές που ξεκινούν με 53687* είναι τα RPC που δημιούργησε ο +\lstinline{rpc_server}. + +\section{Ενδεικτικά τρεξίματα} + +Σε κάθε ενότητα έχω παραθέσει τα output των 3 προγραμμάτων στην τελική τους +κατάσταση. 'Ισως χρειαστεί λίγη μεγέθυνση... + +\subsection{Server και client στον ίδιο υπολογιστή} + +\includegraphics[width=\linewidth]{res/samepc.png} + +\subsection{Server και client σε διαφορετικές IP} + +Ο RPC server τώρα τρέχει σε FreeBSD Jail, το οποίο, αν και βρίσκεται στο ίδιο +τοπικό δίκτυο, έχει διαφορετική IP διεύθυνση. Ο RPC client και ο socket client +τρέχουν ακόμα στο τρέχουν ακόμα στον localhost. \\ + +\includegraphics[width=\linewidth]{res/jail.png} + +\subsection{Δοκιμή concurrency} + +Ο RPC server και client τρέχουν και οι δύο σε FreeBSD Jail, και αυτή τη φορά θα +δοκιμάσουμε να ελέγξουμε αν ο server είναι όντως concurrent. + +\includegraphics[width=\linewidth]{res/concur.png} + +\section{Κώδικας} + +Ο κώδικας είναι σχολιασμένος στα σημεία που θεωρώ ότι μπορεί να υπάρξει +σύχγηση, και όχι ακόμα και σε σημεία που είναι λίγο-πολύ ξεκάθαρο το τι +συμβαίνει. + +\subsection{\lstinline{rpc.x}} + +\lstinputlisting{../src/rpc.x} +\pagebreak + +\subsection{\lstinline{rpc_server.c}} + +\lstinputlisting[language=C]{../src/rpc_server.c} +\pagebreak + +\subsection{\lstinline{rpc_client.c}} + +\lstinputlisting[language=C]{../src/rpc_client.c} +\pagebreak + +\subsection{\lstinline{sock_client.c}} + +\lstinputlisting[language=C]{../src/sock_client.c} +\pagebreak + +\subsection{\lstinline{Makefile.rpc}} + +\lstinputlisting[language=make]{../src/Makefile.rpc} +\pagebreak + +\subsection{\lstinline{Makefile}} + +\lstinputlisting[language=make]{../src/Makefile} +\pagebreak + +\end{document} diff --git a/c_distributed_sys/ex1/doc/doc.toc b/c_java_distributed_sys/ex1/doc/doc.toc diff --git a/c_distributed_sys/ex1/doc/res/concur.png b/c_java_distributed_sys/ex1/doc/res/concur.png Binary files differ. diff --git a/c_distributed_sys/ex1/doc/res/jail.png b/c_java_distributed_sys/ex1/doc/res/jail.png Binary files differ. diff --git a/c_distributed_sys/ex1/doc/res/samepc.png b/c_java_distributed_sys/ex1/doc/res/samepc.png Binary files differ. diff --git a/c_distributed_sys/ex1/doc/res/uniwalogo.png b/c_java_distributed_sys/ex1/doc/res/uniwalogo.png Binary files differ. diff --git a/c_distributed_sys/ex1/src/Makefile b/c_java_distributed_sys/ex1/src/Makefile diff --git a/c_distributed_sys/ex1/src/Makefile.rpc b/c_java_distributed_sys/ex1/src/Makefile.rpc diff --git a/c_distributed_sys/ex1/src/rpc.x b/c_java_distributed_sys/ex1/src/rpc.x diff --git a/c_distributed_sys/ex1/src/rpc_client.c b/c_java_distributed_sys/ex1/src/rpc_client.c diff --git a/c_distributed_sys/ex1/src/rpc_server.c b/c_java_distributed_sys/ex1/src/rpc_server.c diff --git a/c_distributed_sys/ex1/src/sock_client.c b/c_java_distributed_sys/ex1/src/sock_client.c diff --git a/c_java_distributed_sys/ex2/src/HRClient.java b/c_java_distributed_sys/ex2/src/HRClient.java @@ -0,0 +1,56 @@ +import java.rmi.Naming; +import java.rmi.RemoteException; +import java.rmi.NotBoundException; +import java.util.Scanner; + +public class HRClient { + public static void usage() { + System.err.println("usage: java HRClient list <hostname>"); + System.err.println(" java HRClient book <type> <number> <name> <hostname>"); + System.err.println(" java HRClient guests <hostname>"); + System.err.println(" java HRClient cancel <type> <number> <name> <hostname>"); + System.exit(1); + } + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + String str = ""; + + try { + if (args.length != 2 && args.length != 5) + usage(); + String host = args[args.length-1]; + HRInterface stub = (HRInterface)Naming.lookup(host); + + if (args[0].equals("list") && args.length == 2) + str = stub.list(); + else if (args[0].equals("book") && args.length == 5) { + str = stub.book(args[1], Integer.parseInt(args[2]), args[3]); + if (str.equals("fail: no rooms available")) { + System.out.println("the room is currently unavailable"); + System.out.print("do you want to be notified (y/n)? "); + if (sc.next().equals("y")) { + stub.addListSub(args[3], args[1]); + System.out.println("thank you"); + return; + } + } + } else if (args[0].equals("guests") && args.length == 2) + str = stub.guests(); + else if (args[0].equals("cancel") && args.length == 5) + str = stub.cancel(args[1], Integer.parseInt(args[2]), args[3]); + else + usage(); + } catch (RemoteException e) { + System.err.println("RemoteException: " + e.toString()); + } catch (NotBoundException e) { + System.err.println("NotBoundException: " + e.toString()); + } catch (IndexOutOfBoundsException e) { + usage(); + } catch (Exception e) { + System.err.println("Exception: " + e.toString()); + } + + System.out.println(str); + } +} diff --git a/c_java_distributed_sys/ex2/src/HRImpl.java b/c_java_distributed_sys/ex2/src/HRImpl.java @@ -0,0 +1,66 @@ +public class HRImpl implements HRInterface { + Room[] rooms = { + new Room("A", "single", 60, 25), + new Room("B", "double", 80, 40), + new Room("C", "twin", 90, 20), + new Room("D", "triple", 115, 15), + new Room("E", "quad", 140, 10), + }; + + public HRImpl() { + super(); + } + + public String list() { + String str = ""; + + for (Room r : rooms) + str += r.toString() + "\n"; + return str; + } + + public String book(String type, int num, String name) { + for (Room r : rooms) { + if (type.equals(r.type)) + return r.addGuest(name, num); + } + return fail(); + } + + public String guests() { + String str = ""; + int n = 0; + + for (Room r : rooms) + n += r.totalGuests(); + str += "total guests: " + n + "\n"; + for (Room r : rooms) { + str += r.toString() + "\n"; + if ((n = r.totalGuests()) != 0) + str += r.listGuests(); + } + return str; + } + + public String cancel(String type, int num, String name) { + for (Room r : rooms) { + if (type.equals(r.type)) + return r.removeReserv(name, num); + } + return fail(); + } + + public void addListSub(String name, String type) { + for (Room r : rooms) { + if (type.equals(r.type)) { + r.addSub(name); + break; + } + } + } + + private String fail() { + return "fail: room doesn't exist. available rooms types:\n" + + list(); + } +} diff --git a/c_java_distributed_sys/ex2/src/HRInterface.java b/c_java_distributed_sys/ex2/src/HRInterface.java @@ -0,0 +1,10 @@ +import java.rmi.Remote; +import java.rmi.RemoteException; + +public interface HRInterface extends Remote { + String list() throws RemoteException; + String book(String type, int num, String name) throws RemoteException; + String guests() throws RemoteException; + String cancel(String type, int num, String name) throws RemoteException; + void addListSub(String name, String type) throws RemoteException; +} diff --git a/c_java_distributed_sys/ex2/src/HRServer.java b/c_java_distributed_sys/ex2/src/HRServer.java @@ -0,0 +1,20 @@ +import java.rmi.registry.Registry; +import java.rmi.registry.LocateRegistry; +import java.rmi.RemoteException; +import java.rmi.server.UnicastRemoteObject; + +public class HRServer extends HRImpl { + public static void main(String[] args) { + try { + HRImpl impl = new HRImpl(); + HRInterface stub = (HRInterface)UnicastRemoteObject.exportObject(impl, 0); + Registry reg = LocateRegistry.getRegistry(); + + reg.bind("HRRegistry", stub); + System.out.println("server ready"); + } catch (Exception e) { + System.err.println("server exception: " + e.toString()); + e.printStackTrace(); + } + } +} diff --git a/c_java_distributed_sys/ex2/src/Room.java b/c_java_distributed_sys/ex2/src/Room.java @@ -0,0 +1,85 @@ +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +public class Room { + public String type; + public String desc; + public int price; + public int avail; + private HashMap<String, Integer> guests = new HashMap<String, Integer>(); + private ArrayList<String> listsubs = new ArrayList<String>(); + + public Room(String type, String desc, int price, int avail) { + this.type = type; + this.desc = desc; + this.price = price; + this.avail = avail; + } + + public String addGuest(String name, int num) { + if (num <= 0) + return "fail: cannot book <= 0 rooms"; + else if (avail - num >= 0) { + guests.put(name, guests.getOrDefault(name, 0) + num); + avail -= num; + return "success: " + num * price + "€"; + } else if (avail > 0) + return "fail: can only book " + avail + " rooms"; + else + return "fail: no rooms available"; + } + + public String removeReserv(String name, int num) { + String str = ""; + int n; + + if (!guests.containsKey(name)) + return "guest '" + name + "' doesn't exist"; + + /* make sure he doesn't cancel more than he has booked */ + if ((n = guests.get(name)) >= num) { + guests.put(name, n - num); + avail += num; + n -= num; + /* remove guest if he has 0 reservations */ + if (n == 0) { + guests.remove(name); + str += "success"; + } else + str += "success: " + n + " reservations left"; + str += notifySubs(name); + return str; + } else + return "fail: cannot remove more (" + num + + ") than booked (" + n + ")"; + } + + public String listGuests() { + String str = ""; + + for (Map.Entry<String, Integer> g : guests.entrySet()) + str += "\t" + g.getKey() + " (" + g.getValue() + ")\n"; + return str; + } + + public int totalGuests() { + return guests.size(); + } + + public void addSub(String name) { + listsubs.add(name); + } + + public String notifySubs(String name) { + if (listsubs.contains(name)) + return "\nnew " + avail + " rooms available!"; + else + return ""; + } + + public String toString() { + return avail + " " + type + " (" + desc + + ") rooms available - " + price + "€ per night"; + } +} diff --git a/lex_bison_compilers/part2/02_B1_PART_A3.pdf b/lex_bison_compilers/part2/02_B1_PART_A3.pdf Binary files differ.