diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2024-11-23 13:51:12 -0500 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2024-11-23 13:51:12 -0500 |
| commit | 3c62b863509131e78c18ed13c6b83e4fc508848f (patch) | |
| tree | cf246e91da283edf704af936b9cef7eb8e09a6f8 /src/main/java/derms/replica/replica1/ResponderClientCLI.java | |
| parent | e3b72053e8b04f2df013da0d7d49fe33927461a9 (diff) | |
| download | soen423-3c62b863509131e78c18ed13c6b83e4fc508848f.zip | |
import replica code from assignment
Diffstat (limited to 'src/main/java/derms/replica/replica1/ResponderClientCLI.java')
| -rw-r--r-- | src/main/java/derms/replica/replica1/ResponderClientCLI.java | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/src/main/java/derms/replica/replica1/ResponderClientCLI.java b/src/main/java/derms/replica/replica1/ResponderClientCLI.java new file mode 100644 index 0000000..5bfbb11 --- /dev/null +++ b/src/main/java/derms/replica/replica1/ResponderClientCLI.java @@ -0,0 +1,151 @@ +package derms.replica.replica1; + +import java.net.MalformedURLException; +import java.net.UnknownHostException; + +public class ResponderClientCLI extends CLI { + public static final String usage = "Usage: java ResponderClientCLI <city> <id number>"; + + private final ResponderClient client; + + private ResponderClientCLI(City city, short idNum) { + client = new ResponderClient(city, idNum); + System.out.println("ID: "+client.id); + + commands.put("add", new Add()); + cmdDescriptions.add(new Description( + "add <resource ID> <resource name> <duration>", + "Add a resource to the server")); + + commands.put("remove", new Remove()); + cmdDescriptions.add(new Description( + "remove <resource ID> <duration>", + "Decrease the duration of a resource. If duration is negative, the tresource is removed entirely.")); + + commands.put("list", new List()); + cmdDescriptions.add(new Description( + "list <resource name>", + "List available resources.")); + + argDescriptions.add(new Description( + "<resource ID>", + "3-letter city code followed by 4-digit number.")); + argDescriptions.add(new Description( + "<resource name>", + "E.g., AMBULANCE.")); + argDescriptions.add(new Description( + "<duration>", + "A number representing a time period.")); + } + + public static void main(String[] cmdlineArgs) { + Args args = null; + try { + args = new Args(cmdlineArgs); + } catch (IllegalArgumentException e) { + System.err.println(e); + System.err.println(usage); + System.exit(1); + } + + (new ResponderClientCLI(args.city, args.idNum)).run(); + } + + private class Add implements Command { + public void exec(String[] args) { + if (args.length < 3) { + System.out.println("invalid arguments for 'add'"); + } else { + add(args[0], args[1], args[2]); + } + } + } + + private void add(String resourceIDStr, String resourceNameStr, String durationStr) { + ResourceID rid = ResourceID.parse(resourceIDStr); + ResourceName name = ResourceName.parse(resourceNameStr); + int duration = Integer.parseInt(durationStr); + if (duration < 0) { + throw new NumberFormatException("duration less than 0"); + } + try { + client.add(rid, name, duration); + System.out.println("Successfully added resource to server."); + } catch (Exception e) { + System.out.println("Failed to add resource: "+e.getMessage()); + } + } + + private class Remove implements Command { + public void exec(String[] args) { + if (args.length < 2) { + System.out.println("invalid arguments for 'remove'"); + } else { + remove(args[0], args[1]); + } + } + } + + private void remove(String resourceIDStr, String durationStr) { + try { + ResourceID resourceID = ResourceID.parse(resourceIDStr); + int duration = Integer.parseInt(durationStr); + client.remove(resourceID, duration); + System.out.println("Successfully removed resource from server."); + } catch (NumberFormatException e) { + System.out.println("invalid duration: "+durationStr); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } catch (Exception e) { + System.out.println("Failed to remove resource: "+e.getMessage()); + } + } + + private class List implements Command { + public void exec(String[] args) { + if (args.length < 1) { + System.out.println("invalid arguments for 'list'"); + } else { + list(args[0]); + } + } + } + + private void list(String resourceNameStr) { + try { + ResourceName name = ResourceName.parse(resourceNameStr); + Resource[] resources = client.listResources(name); + System.out.println("Available resources:"); + for (Resource resource : resources) { + System.out.println(resource.toString()); + } + } catch (IllegalArgumentException e) { + System.out.println("invalid resource name: " + resourceNameStr); + } catch (UnknownHostException | MalformedURLException e) { + System.err.println(e.getMessage()); + } catch (ServerCommunicationError e) { + System.err.println("Failed to retrieve resources from server: "+e.getMessage()); + } + } + + private static class Args { + private final City city; + private final short idNum; + + private Args(String[] args) throws IllegalArgumentException { + if (args.length < 1) { + throw new IllegalArgumentException("Missing argument 'city'"); + } + city = new City(args[0]); + + if (args.length < 2) { + throw new IllegalArgumentException("Missing argument 'id number'"); + } + try { + idNum = Short.parseShort(args[1]); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Bad value of 'id number'"); + } + } + } +} |