From db262112e1acbae3d4369980ab877cc0224feb13 Mon Sep 17 00:00:00 2001 From: Tinsae Date: Sat, 24 Jan 2026 22:24:15 +0100 Subject: [PATCH] task 2 in progress --- week5_TinsaeGhilay/client/pom.xml | 44 +++++++++ .../src/main/java/net/tinsae/Client.java | 78 +++++++++++++++ .../src/main/java/net/tinsae/Delegator.java | 89 ++++++++++++++++++ .../client/src/main/java/net/tinsae/Main.java | 24 +++++ .../target/classes/net/tinsae/Client.class | Bin 0 -> 3943 bytes .../target/classes/net/tinsae/Delegator.class | Bin 0 -> 3845 bytes .../target/classes/net/tinsae/Main.class | Bin 0 -> 1302 bytes .../client/target/client-1.0-SNAPSHOT.jar | Bin 0 -> 6603 bytes .../target/maven-archiver/pom.properties | 3 + .../compile/default-compile/createdFiles.lst | 3 + .../compile/default-compile/inputFiles.lst | 3 + .../default-testCompile/createdFiles.lst | 0 .../default-testCompile/inputFiles.lst | 0 13 files changed, 244 insertions(+) create mode 100644 week5_TinsaeGhilay/client/pom.xml create mode 100644 week5_TinsaeGhilay/client/src/main/java/net/tinsae/Client.java create mode 100644 week5_TinsaeGhilay/client/src/main/java/net/tinsae/Delegator.java create mode 100644 week5_TinsaeGhilay/client/src/main/java/net/tinsae/Main.java create mode 100644 week5_TinsaeGhilay/client/target/classes/net/tinsae/Client.class create mode 100644 week5_TinsaeGhilay/client/target/classes/net/tinsae/Delegator.class create mode 100644 week5_TinsaeGhilay/client/target/classes/net/tinsae/Main.class create mode 100644 week5_TinsaeGhilay/client/target/client-1.0-SNAPSHOT.jar create mode 100644 week5_TinsaeGhilay/client/target/maven-archiver/pom.properties create mode 100644 week5_TinsaeGhilay/client/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 week5_TinsaeGhilay/client/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 week5_TinsaeGhilay/client/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst create mode 100644 week5_TinsaeGhilay/client/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst diff --git a/week5_TinsaeGhilay/client/pom.xml b/week5_TinsaeGhilay/client/pom.xml new file mode 100644 index 0000000..37ea0c2 --- /dev/null +++ b/week5_TinsaeGhilay/client/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + net.tinsae + client + 1.0-SNAPSHOT + + + 21 + 21 + 5.10.0 + + + + jakarta.enterprise + jakarta.enterprise.cdi-api + 4.1.0 + provided + + + jakarta.ws.rs + jakarta.ws.rs-api + 4.0.0 + provided + + + + org.junit.jupiter + junit-jupiter-api + ${junit.version} + test + + + org.junit.jupiter + junit-jupiter-engine + ${junit.version} + test + + + + \ No newline at end of file diff --git a/week5_TinsaeGhilay/client/src/main/java/net/tinsae/Client.java b/week5_TinsaeGhilay/client/src/main/java/net/tinsae/Client.java new file mode 100644 index 0000000..0abee46 --- /dev/null +++ b/week5_TinsaeGhilay/client/src/main/java/net/tinsae/Client.java @@ -0,0 +1,78 @@ +package net.tinsae; + +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; + +public class Client { + private String url; + private String table = "/items"; + + public Client(String url){ + this.url = url+table; + } + + private static final HttpClient client = HttpClient.newHttpClient(); + + public static void main(String[] args) throws Exception { + + + } + + + public int postItem(String json) throws Exception { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI(url)) + .header("Content-Type", "application/json") + .POST(HttpRequest.BodyPublishers.ofString(json)) + .build(); + + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + return response.statusCode(); + } + + public int putItem(int id, String json) throws Exception { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI(url + "/" + id)) + .header("Content-Type", "application/json") + .PUT(HttpRequest.BodyPublishers.ofString(json)) + .build(); + + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + return response.statusCode(); + } + + public int deleteItem(int id) throws Exception { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI(url + "/" + id)) + .DELETE() + .build(); + + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + return response.statusCode(); + } + + + public int getItems() throws Exception { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI(url)) + .GET() + .build(); + + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + System.out.println(response.body()); + return response.statusCode(); + } + + public int getItem(int id) throws Exception { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI(url+"/"+id)) + .GET() + .build(); + + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + System.out.println(response.body()); + return response.statusCode(); + } +} diff --git a/week5_TinsaeGhilay/client/src/main/java/net/tinsae/Delegator.java b/week5_TinsaeGhilay/client/src/main/java/net/tinsae/Delegator.java new file mode 100644 index 0000000..6c76660 --- /dev/null +++ b/week5_TinsaeGhilay/client/src/main/java/net/tinsae/Delegator.java @@ -0,0 +1,89 @@ +package net.tinsae; + +import java.util.Scanner; + +public class Delegator { + + private final Client client; + private final Scanner sc = new Scanner(System.in); + + public Delegator(String path) { + client = new Client(path); + } + + public void executeCommand(String command) { + switch (command) { + case "delete" -> delegateDelete(); + case "insert" -> delegateInsert(); + case "read" -> delegateRead(); + case "update" -> delegateUpdate(); + default -> System.err.println("Unknown command, please repeat"); + } + } + + private void delegateDelete() { + try { + System.out.print("ID of the item you want to delete: "); + int id = sc.nextInt(); + sc.nextLine(); // consume newline + int response = client.deleteItem(id); + System.out.println("Command executed with response code " + response); + } catch (Exception e) { + System.err.println("Error in executing delete command: " + e.getMessage()); + } + } + + private void delegateInsert() { + try { + System.out.print("Name: "); + String name = sc.nextLine().strip(); + + System.out.print("Description: "); + String description = sc.nextLine(); + + System.out.print("Price: "); + float price = sc.nextFloat(); + sc.nextLine(); // consume newline + + int response = client.postItem(makeJson(name, description, price)); + System.out.println("Command executed with response code " + response); + + } catch (Exception e) { + System.err.println("Error in executing insert command: " + e.getMessage()); + } + } + + private String makeJson(String name, String desc, float price) { + return String.format(""" + { + "name": "%s", + "description": "%s", + "price": %s + } + """, name, desc, price); + } + + private void delegateRead() { + try { + System.out.print("Read All or One? (A/O): "); + String input = sc.nextLine(); + + if (input.equalsIgnoreCase("A")) { + client.getItems(); + return; + } + + System.out.print("Enter ID: "); + int id = sc.nextInt(); + sc.nextLine(); // consume newline + client.getItem(id); + + } catch (Exception e) { + System.err.println("Error in executing read command: " + e.getMessage()); + } + } + + private void delegateUpdate() { + System.out.println("Update not implemented yet"); + } +} diff --git a/week5_TinsaeGhilay/client/src/main/java/net/tinsae/Main.java b/week5_TinsaeGhilay/client/src/main/java/net/tinsae/Main.java new file mode 100644 index 0000000..87516f8 --- /dev/null +++ b/week5_TinsaeGhilay/client/src/main/java/net/tinsae/Main.java @@ -0,0 +1,24 @@ +package net.tinsae; + +import java.util.Scanner; +public class Main { + + public static void main(String[] args) { + String path = "http://localhost:8080/shop-1.0-SNAPSHOT/api"; + Delegator delegator = new Delegator(path); + System.out.println("Hello! What do you want to do? allowed actions are \n"+ + "Insert, update, delete and read"); + Scanner sc = new Scanner(System.in); + while(sc.hasNext()){ + String response = sc.nextLine().strip(); + if(response.equalsIgnoreCase("exit")){ + return; + } + + delegator.executeCommand(response); + + } + sc.close(); + + } +} \ No newline at end of file diff --git a/week5_TinsaeGhilay/client/target/classes/net/tinsae/Client.class b/week5_TinsaeGhilay/client/target/classes/net/tinsae/Client.class new file mode 100644 index 0000000000000000000000000000000000000000..9d2a98133f075a9510808264529877072dbf5ae8 GIT binary patch literal 3943 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�$`DSn;5Vw7pZ8;n(S_eC*EWDKIH!)l@k zFMDAuS`%qj&&`6wV$a2Ltb!?edobn9FOA5&I5#g1RfpTzm2RuxTm>KA6{p$?Yy%lR~@a62!xEG+Pt-C~MaPALUo* zV@z(@k=cJxr|@e`0RO@q;Kzo$QeUdz<;yUHU=@6Q?7B!?nv*!Pw>l;3D|lsW0qedK z!7n|hg|}XdOzIEDkbPkq2AGCHGV4h?cYtykN)0n1BiN3^EYne*$@0|GlsLlDKROre zQi6UXNW*plA-s%HW*+jfD#%x%?w@F7o&ATI)^w(jkAR$#(6H}4%JahFMhWw~QJIH$ z%YRfNL|0D)=8aG=GEj$KaW{rHag*a(Ch;EkE5Y-2@Vpy5e~mwIKgqp6;?H;&YyJxh Cx07lB literal 0 HcmV?d00001 diff --git a/week5_TinsaeGhilay/client/target/classes/net/tinsae/Main.class b/week5_TinsaeGhilay/client/target/classes/net/tinsae/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..5dcdb4300586ee2d55db6ab64689dc0a95cbcaad GIT binary patch literal 1302 zcmZux-BQ~|6#mv0$Z`Y(^A|!}MB5~Gz=)(tN)2sDolt0vAvNPp+N(w0u|?&TBCQhg zD0zZjCl_X>%=7{J620hKbTYJO4Q-tedq%7C|DErg)$gaj{s!OyzRx3rtO>)$5QZ5p zAM$714Y+K(y9bBDQw+oFzVy{s4B29-nM00Yv7=N}aor&Fc+d$GRasqGU2&667?p1= zuaq102YZdJ-F=rwzKJ};q!h|kzD&4qABsSW^Q z;j)Qw8wE_fg{|=-QKCzb!juqBodx@$yGN0V;sx)n0 z=UggBg(Tj0I9Z>Imcu>ehca<^ES&tdOhl}foHS~2C6=5PK~}=yvgJ_bRvt6BVq(_D zRgHb3kNoZ83}&RE1k%I@4C8&5RQZA1@VJyB)~$VHV;&Ae#+QRVY|AM9w}(9D@UiCT z6NW4298sk~mr_$ZU9)i=H>hlfCv|Z|q|mf})RvNsn^2B(2_dvw^{2(Ar zp{6&o$zxy3=So9${DfvudneBtCF=I`O&5Q<$VaJ3oW&xEXf67wFDxj<^SDi^C*BiI z#)zv9gQd5pzwivxgBbq12m~aPc$DT0#Ne8cX{4dJ_wx>q&fCd1!Zh~8rmq{eG$G3x z85Zy*U1j~tfcV2OJ@1p`(#hx?x_J!ts&C$)r#1ryeF6ac%mH7cN|J?#ctjc<{3o)M z3fL-`wG&uR7LRdh=QTzPlRZqIVD8Cle0Yq7dbx*BU&5iI*uzrAm^BKwdid-mj8{vu zMh~C=^7kKPtmyh#Y|!&IRRv6va`a|l5|`*U=q(;0$fL9%W2n%*-ylmBQ}~81oyK~H z@VFSqCTR?kx9Go3XO=L3OFBk5*6|%`M8iBv*g>6ayW}y0>?!6=lucMB=HB2cz5hk! L8TQDW!Q+1b8)PqH literal 0 HcmV?d00001 diff --git a/week5_TinsaeGhilay/client/target/client-1.0-SNAPSHOT.jar b/week5_TinsaeGhilay/client/target/client-1.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..c6b407a1151c433dfa8208f29e8e1f3b6cd4cb76 GIT binary patch literal 6603 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