From a46a47bc21df121096e27effedba925583620e04 Mon Sep 17 00:00:00 2001 From: carmen-chau <80921817+carmen-chau@users.noreply.github.com> Date: Mon, 13 Nov 2023 15:29:53 -0500 Subject: [PATCH 01/41] based on comments in branch cchau-trial-team_use_case-with-full_station_view, changed variable name. also removed stopData.txt --- src/app/SearchUseCaseFactory.java | 4 ++-- src/view/StationInfoView.java | 4 ++-- stopData.txt | Bin 7778 -> 0 bytes 3 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 stopData.txt diff --git a/src/app/SearchUseCaseFactory.java b/src/app/SearchUseCaseFactory.java index 94685f2..ed4d3f8 100644 --- a/src/app/SearchUseCaseFactory.java +++ b/src/app/SearchUseCaseFactory.java @@ -28,8 +28,8 @@ public static SearchPanelView create( StationInfoViewModel stationInfoViewModel) { try { - SearchController loginController = createSearchUseCase(viewManagerModel, searchViewModel, searchDataAccessObject, stationInfoViewModel); - return new SearchPanelView(searchViewModel, loginController); + SearchController searchController = createSearchUseCase(viewManagerModel, searchViewModel, searchDataAccessObject, stationInfoViewModel); + return new SearchPanelView(searchViewModel, searchController); } catch (IOException e) { JOptionPane.showMessageDialog(null, "Could not open user data file."); } diff --git a/src/view/StationInfoView.java b/src/view/StationInfoView.java index dbeb852..5246dbc 100644 --- a/src/view/StationInfoView.java +++ b/src/view/StationInfoView.java @@ -20,8 +20,8 @@ public class StationInfoView extends JPanel implements ActionListener, PropertyC /** * A window with a title and a JButton. */ - public StationInfoView(StationInfoViewModel loggedInViewModel) { - this.stationInfoViewModel = loggedInViewModel; + public StationInfoView(StationInfoViewModel stationInfoViewModel) { + this.stationInfoViewModel = stationInfoViewModel; this.stationInfoViewModel.addPropertyChangeListener(this); JLabel title = new JLabel("Station info screen"); diff --git a/stopData.txt b/stopData.txt deleted file mode 100644 index 40e08be42ca0745c0abdd082b46e83118d36088e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7778 zcma)>UsD=c5XJBFR_%A-1DF&L5qRWZFcFl(xb9nu1Y_JNT4-YO<#+e|y1AJ<1B_Es zDhy-y?e5d3&%ONj?_+oh_u(OY3^!pJ4np>R6&B$xT;=ZF>fTe~&V5+v&aM7`WlzUf zANAfX{2BfTmtn4_F7*T+YT;O)t-~kz{;t2ZFb-$>{4l%;uR}8&>1yk0>E0{-?dopF z?l$#lQ+Fq_#qUM%D7G*>KI}RW8`@~lHS*yLWT&~UfML5-G z7rJw!7_ogWztq9s$E*;&rWNU!iHPM z8;jwM@tf8KR<`5MZsxi|2}YCy%6{yrw_ z$@^;=(ps_{aezP8(9uO~Q_IuTvO|0;tIWCXyN}n(*VGXGOMYtMFFoJWXBnRBdfl)( zypqj^>^GFRBmK1XQ;vZ1@OI;8ZFT=*SYK}W!5$tDZO!DWd(TuY#w2UwV~-+J(2g@wrqCg zW7}(6u{uXo>E5}z;6Uv3T`|*nYatiEqgW4XSqel4_I z8BXTLZSzee^w#mF&+;DHvQw9rJnxZNIvBR7%1Cp=>s(%7lRJ4{SvQh04e1mK2pm<-?aVrRCQnSTN6T$Z_ips=;dksGY$bQLmW3F#W-&P* z5My(bSt55e^~pgP+We$L@AT9_{+++C^<+)Y zJgWYS@T{MF1*myL6^EC61VgAhWj`!m1fE}o|Pt+Kzb5&ETpnt2N z>r5PSpone_$pgiGXZob59#9MP5S^6emOF5j->v2k20v5gzU`eHV8@Xhv&iJ|`ZBMa zg{ml(Q|s7M;bkH0f-EZbR==s|HtYIq^63HX^W|K3SJ&| zAQ1IJhdZytY_%*Z*qhqzX6~u#&-6#ptSl=tvyb*$Z0@A7z?Dn{FrT82I??g005&a~ z!c)U}sx|WYYRQs!PgV(d6MQrI_NkSr^d+CU!n?6L7nLgOM9tBcnRO-uw#j3aTD&(u zSWhWA z=U$!iL$9`(4wS)X>|U~%xC8IgC;Mvy*MQ$!p=|dK0tRhaW+H;gl~=4BQ4^aK6J_af z!!7wtv2GYY-+|PdilZI(t$SkqF|idhar?$wD^nfYKB%kXKSn@is1sGGI`Jnq@7*WW z0K=KyZi=nwX{z3^8b`ein-Hnb`mzq37#GJ$Gg3{8oP`zE9u>XsQ0X1iw=3S4@H;Ub z!44L+@~FBmY}b^}o2yRGQ-&#+*!zUMRhecd#*pkVVaQzy2{ggB%(KiB^`}={_3qvW zomjrMcdz+Kd{#0Wy*qq&Lgiz}m(}FNdhkR&xYBi{J}fc{yBwGbKiT?yj-Uqc`ch3! zZ2v(dt{?|`^|a-Qy%g+)rpP?OWv*WFw0oW$Tg^H9fV1+wj(Q_H-?3(UM=C)6Q-whe z=~h-!wQt6@&lziy;dv<*yVq6R<-k@%;*%uyDV|^&KB=mceJ+mWW36am%VNdoL^>$X z3GfYkL^Z2ndu$Vv$gbq)K`JB7rK|6BO4Cg+a%59SVpJQxnldbo4U1!WBQ}&aoc*lY zXTtHo&lxt(79C2Sv1y++@j2UmRD1QBhy(U ziwA#9RrFv@oJ*|ikn=HmXOT0I5q&cQS(A5Nd5m+5(RXc2n}Ed~1lF*hKVe|XGN0VX zZe|)Ozhv-QxS*$Z&sGoz$E7;Kbr8%{74IYK?RYLomY(Gk^^QXMBy_HG9pJi}Q%>-n zDh6jtKH1MCLp%Q*ZgA&kTWI*2c-~cfu};q9bXAH*PH&hoaOQ5#8XCI~6~#~e6l=r2 zfc`0-ZnFBQvUb;IX!#mywX4mE%Qm`vTA&e9biwlQ1N-Ev)ft#lVSfyw%gzGfIdoi_ zCH%+fxK9fWjD-fOx92~e45Xckh67W1eNC^x@s8wbojNcMiW9@9B6~+p8d8tUZB~wg z&-&B%Y#^SyFHOb1O^&`HIBJJoorLxwHh3@d1v=n7KC3#bA`;mJ--*$qw|BzIN)<$Z z$Mf%+&OlJM%uN_8-MjK_f@6q@;uG}&G@Qj1 zPnW8k1N5~Epc8Kmsi*{$NQ^(NtnW3jjRuTS!DaaM-l(Ds`-a=-v3Qz7Ezugjdx>6P zC=liPqm1AChEv}caK3;JD4sz^e}kx6WqRWReG+=w=nE*^PGhjcq!X^_|5?S02|%|yM6Sm%X-#j%-S?d zJ}Y27vH|PG)l-RB@qG;5Gwt6~ANlFX_V-|D6yo>q2%>E|gx>Y4RO6+dp{b`jFO@sa zNBL&1*psgK*}dkOf=W=K>bt>S;IyF^{!zYuZgC&ejVRLT>fgi=F Date: Sun, 19 Nov 2023 23:33:56 -0500 Subject: [PATCH 02/41] revised ApiTestFile to reflect GO Train API usuage and sample use case --- src/data_access/GOStationApiClass.java | 4 ++++ target/classes/ApiTestFile.class | Bin 2534 -> 2500 bytes 2 files changed, 4 insertions(+) create mode 100644 src/data_access/GOStationApiClass.java diff --git a/src/data_access/GOStationApiClass.java b/src/data_access/GOStationApiClass.java new file mode 100644 index 0000000..0459e5d --- /dev/null +++ b/src/data_access/GOStationApiClass.java @@ -0,0 +1,4 @@ +package data_access; + +public class GOApiClass { +} diff --git a/target/classes/ApiTestFile.class b/target/classes/ApiTestFile.class index 464ffde10a2c7dc30bf427f54cb893e35b43f567..d2ef3cb0d5184ef5a3fa21a1883c4e3307ef75f1 100644 GIT binary patch delta 1011 zcmZ9L+fy557{-5_1K+Y)=uD7~VrPo9wm^Zj6vdXdCJL2EfXGqm0Tb0U)IgW=vJ#!&i8p`w^VffidV>&Hu{#mqQxz=+uXq}gGkP+`ieaU zu~a!f<5vBX`GRY5r$KyD5{Dh%NoCUs5lYM*3NrWGbOxEt&dN&G@pIGeYSAtECf%Yo z?R#aD9s@P(`c7ZIP&Mf@2+dBI95e{8xtk{avMrj6V?d zj_HBWsof`R;@oS{(%F^q)`FrACq@NlD}^CNN`DpF)s!S`k!09rgp>N0&|u4`fxYaN zeDT!lZ0V&GWEg z!R8c?=L+T6rN3)v--El z(YC4_dB$0H5_vC?o*da&cFTU=6V5rEh~93T*JIJ$Hiw>T)d4>l0Qmd{XbUs}=?Ny3Spl7fno0^(Qr!tHB$7ql4X!!HMd$Rby zJ}Tb7Y4P9s6(8yo>cXB5LUO4L+IW^NiO?tekngBe)7C}`Km zQC{L@nKcF;>)c+mXKQbbeetdU4g}B}Kq7wVDu-(vsc}4WjpV`=?vvg7;}68sHO6X8 zj(7LenEIAEgNd(sRI;9^ak@s~OPVIGvA)oIg^eFBi@SL|D)RgjeeoK&o1;~*8B70a zPHqJr2c&`}ns|j*g;N!mukpH!nkD}Y-V{cPW4y)N;(VTcyu$@ie^=Ib68cLH2rHCg zTcI%&A2f=>MLr7Z6i&aqK|dl_dFrynP~C+k5#;WL>AI;=5kBUVI_c9oe#Yk#+k~}4 T?%^eFlb>$89+Ps|B^v(*6l&W; delta 1030 zcmZ8gTXPge6#ja4W_vQ**`ziK8bXPH=0cLmE+mm#AV451xe_2Ia&g!U*~w*R*_i|a zNVtht2+$~a1AOv1mNh}C(ifk6@WJvo_-^?QoEc&j<->gEboV#seCM3*->UwuGJb#Z z^Dh9}@!c)sNnFeOe$kWVtb4xFDmu-6$trkLPGPb+XBl`2YXn|L4TG9@JzvK<243=g zhp6G{8v<{Jr%7vUY{2sKL-zQzT_9c^gEE`e(ZHa2zFYKkG&00nTieo^9XguHrx26& zoQ@U>**TCsUb(+(#6SicIW`HjqD?AFHvX2tW^9pz%4mF>KnmOCqVkHmgJGqtjIFFN z(1BP8y99P)kNj6@Z`sQra&EyVAx-{V(bmz;K*bfOoSfx5Zo!=J+(P)%+XDO1BS&Kc zbsgvn!}l{()z$a7lVMvnng{GtGq&e%HNY__Z~#N{&sa<15Ds$;3%r97S*~XE4Bizu zf}?Vux+ZZP?{QcHCycd_qrC4i{E?<5%>KGa>W1N>gyOO-k=9V% zVZ2P3gdqdHe?HW>i7GgOa(sl3iQ|#VPw**uN&5dYTqi~+w&4aANck|mk(;Mz({JJw(|v27BH) From b5742bc86b768e5a88ece6584ca60f9d58fa7fd2 Mon Sep 17 00:00:00 2001 From: carmen-chau <80921817+carmen-chau@users.noreply.github.com> Date: Sun, 19 Nov 2023 23:37:26 -0500 Subject: [PATCH 03/41] actually push the modifications intended from prior commit for ApiTestFile.java --- src/ApiTestFile.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/ApiTestFile.java b/src/ApiTestFile.java index 2982ea7..50b2180 100644 --- a/src/ApiTestFile.java +++ b/src/ApiTestFile.java @@ -8,19 +8,19 @@ public class ApiTestFile { - private static final String API_URL = "https://api.translink.ca/rttiapi/v1/stops/55612?"; + private static final String PARTIAL_API_URL = "OpenDataAPI/api/V1"; public static void getStopInformation() { OkHttpClient client = new OkHttpClient().newBuilder() .build(); HttpUrl httpUrl = new HttpUrl.Builder() - .scheme("https") - .host("api.translink.ca") - .addPathSegment("rttiapi") - .addPathSegment("v1") - .addPathSegment("stops") - .addPathSegment("55612?") - .addQueryParameter("apikey", System.getenv("API_KEY")) + .scheme("http") + .host("api.openmetrolinx.com") + .addPathSegment(PARTIAL_API_URL) + .addPathSegment("Stop") + .addPathSegment("Details") + .addPathSegment("UN") //getting station information for UN, which denotes Union Station + .addQueryParameter("key", System.getenv("API_KEY")) .build(); Request request = new Request.Builder() From 9464ba0665f5ca3fc592946af7d5f7081a1b13a0 Mon Sep 17 00:00:00 2001 From: carmen-chau <80921817+carmen-chau@users.noreply.github.com> Date: Sun, 19 Nov 2023 23:38:40 -0500 Subject: [PATCH 04/41] fix naming of class to GOStationApiClass.java --- src/data_access/GOStationApiClass.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data_access/GOStationApiClass.java b/src/data_access/GOStationApiClass.java index 0459e5d..de6671f 100644 --- a/src/data_access/GOStationApiClass.java +++ b/src/data_access/GOStationApiClass.java @@ -1,4 +1,4 @@ package data_access; -public class GOApiClass { +public class GOStationApiClass { } From 625acc33d00278250941907928d69b4d3b34d052 Mon Sep 17 00:00:00 2001 From: carmen-chau <80921817+carmen-chau@users.noreply.github.com> Date: Mon, 20 Nov 2023 00:10:00 -0500 Subject: [PATCH 05/41] added ApiClassInterface.java as an interface that forms structure for all future api classes --- src/data_access/ApiClassInterface.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/data_access/ApiClassInterface.java diff --git a/src/data_access/ApiClassInterface.java b/src/data_access/ApiClassInterface.java new file mode 100644 index 0000000..b98e345 --- /dev/null +++ b/src/data_access/ApiClassInterface.java @@ -0,0 +1,8 @@ +package data_access; + +public interface ApiClassInterface { + // This is an interface defining all the shared attributes and methods that all Api classes should have + String PARTIAL_API_URL = null; + String API_KEY = null; + +} From 15fc222184f5b90fda7efe9a17ad9885864445ca Mon Sep 17 00:00:00 2001 From: carmen-chau <80921817+carmen-chau@users.noreply.github.com> Date: Mon, 20 Nov 2023 00:11:05 -0500 Subject: [PATCH 06/41] Modified GoStationApiClass.java's structure such that it inherits ApiClassInterface --- src/data_access/GOStationApiClass.java | 45 +++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/src/data_access/GOStationApiClass.java b/src/data_access/GOStationApiClass.java index de6671f..e972330 100644 --- a/src/data_access/GOStationApiClass.java +++ b/src/data_access/GOStationApiClass.java @@ -1,4 +1,47 @@ package data_access; -public class GOStationApiClass { +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.json.JSONException; +import java.io.IOException; +public class GOStationApiClass implements ApiClassInterface{ + + private final String PARTIAL_API_URL; + private final String API_KEY; + + public GOStationApiClass (String partialApiUrl, String apiKey) { + //private static final String PARTIAL_API_URL = "OpenDataAPI/api/V1"; // denotes "common portion" of API url across all possible calls + //private static final String API_KEY = System.getenv("API_KEY"); + this.PARTIAL_API_URL = partialApiUrl; + this.API_KEY = apiKey; + } + + public void retrieveStationAmenities(String stationId){ + OkHttpClient client = new OkHttpClient().newBuilder() + .build(); + HttpUrl httpUrl = new HttpUrl.Builder() + .scheme("http") + .host("api.openmetrolinx.com") + .addPathSegment(PARTIAL_API_URL) + .addPathSegment("Stop") + .addPathSegment("Details") + .addPathSegment(stationId) //getting station information for the station with the id denoted by stationId + .addQueryParameter("key", API_KEY) + .build(); + + Request request = new Request.Builder() + .url(httpUrl) + .addHeader("content-type", "application/json") + .build(); + try { + Response response = client.newCall(request).execute(); + System.out.println(response.body().string()); + + } catch (IOException | JSONException e) { + throw new RuntimeException(e); + } + + } } From 96088348becad2d4f615a416a7e65d0f1adc2502 Mon Sep 17 00:00:00 2001 From: carmen-chau <80921817+carmen-chau@users.noreply.github.com> Date: Mon, 20 Nov 2023 10:30:52 -0500 Subject: [PATCH 07/41] reworked structure of ApiClassInterface as well as GOStationApiClass --- src/data_access/ApiClassInterface.java | 3 +-- src/data_access/GOStationApiClass.java | 32 +++++++++++++++++--------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/data_access/ApiClassInterface.java b/src/data_access/ApiClassInterface.java index b98e345..24eab04 100644 --- a/src/data_access/ApiClassInterface.java +++ b/src/data_access/ApiClassInterface.java @@ -2,7 +2,6 @@ public interface ApiClassInterface { // This is an interface defining all the shared attributes and methods that all Api classes should have - String PARTIAL_API_URL = null; - String API_KEY = null; + String API_KEY = System.getenv("API_KEY"); } diff --git a/src/data_access/GOStationApiClass.java b/src/data_access/GOStationApiClass.java index e972330..36062a6 100644 --- a/src/data_access/GOStationApiClass.java +++ b/src/data_access/GOStationApiClass.java @@ -4,21 +4,20 @@ import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; +import org.json.JSONArray; import org.json.JSONException; +import org.json.JSONObject; + import java.io.IOException; -public class GOStationApiClass implements ApiClassInterface{ +import java.util.ArrayList; +import java.util.List; - private final String PARTIAL_API_URL; - private final String API_KEY; +public class GOStationApiClass implements ApiClassInterface{ - public GOStationApiClass (String partialApiUrl, String apiKey) { - //private static final String PARTIAL_API_URL = "OpenDataAPI/api/V1"; // denotes "common portion" of API url across all possible calls - //private static final String API_KEY = System.getenv("API_KEY"); - this.PARTIAL_API_URL = partialApiUrl; - this.API_KEY = apiKey; + private final String PARTIAL_API_URL = "OpenDataAPI/api/V1"; + public GOStationApiClass () { } - - public void retrieveStationAmenities(String stationId){ + public List retrieveStationAmenities(String stationId){ OkHttpClient client = new OkHttpClient().newBuilder() .build(); HttpUrl httpUrl = new HttpUrl.Builder() @@ -36,8 +35,19 @@ public void retrieveStationAmenities(String stationId){ .addHeader("content-type", "application/json") .build(); try { + // TODO: Do we need additional error checking based on error codes in Metadata? Response response = client.newCall(request).execute(); - System.out.println(response.body().string()); + String fullStopJsonData = response.body().string(); + JSONObject fullStopJsonObj = new JSONObject(fullStopJsonData); // This is where the metadata is located at + JSONObject stopJsonDataObj = fullStopJsonObj.getJSONObject("Stop"); + JSONArray amenitiesJsonArray = stopJsonDataObj.getJSONArray("Facilities"); + List amenitiesList = new ArrayList(); + for (int i = 0; i < amenitiesJsonArray.length(); i++) { + JSONObject currAmenitiesEntry = amenitiesJsonArray.getJSONObject(i); + amenitiesList.add(currAmenitiesEntry.getString("Description")); + //System.out.println(currAmenitiesEntry.getString("Description")); // For debugging purposes + } + return amenitiesList; } catch (IOException | JSONException e) { throw new RuntimeException(e); From 877c96b006045449c7edcb5522568cf5b12e3a14 Mon Sep 17 00:00:00 2001 From: carmen-chau <80921817+carmen-chau@users.noreply.github.com> Date: Mon, 20 Nov 2023 10:47:57 -0500 Subject: [PATCH 08/41] incoperated the GoStationApiClass into the Station DAO, revised Main.java to reflect this change --- src/app/Main.java | 3 ++- src/data_access/FileStationDataAccessObject.java | 16 +++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/app/Main.java b/src/app/Main.java index 8eb52a8..0d3ed53 100644 --- a/src/app/Main.java +++ b/src/app/Main.java @@ -1,6 +1,7 @@ package app; import data_access.FileStationDataAccessObject; +import data_access.GOStationApiClass; import entity.StationFactory; import interface_adapter.search.SearchViewModel; import interface_adapter.ViewManagerModel; @@ -47,7 +48,7 @@ public static void main(String[] args) { // TODO [Implementation question]: Is there suppose to be NO ARGUMENT for the StationFactory() instance passed inside? FileStationDataAccessObject stationDataAccessObject; try { - stationDataAccessObject = new FileStationDataAccessObject("./revisedStopData.txt", new StationFactory()); + stationDataAccessObject = new FileStationDataAccessObject("./revisedStopData.txt", new StationFactory(), new GOStationApiClass()); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/src/data_access/FileStationDataAccessObject.java b/src/data_access/FileStationDataAccessObject.java index 60293f0..c3ef568 100644 --- a/src/data_access/FileStationDataAccessObject.java +++ b/src/data_access/FileStationDataAccessObject.java @@ -17,9 +17,12 @@ public class FileStationDataAccessObject implements SearchDataAccessInterface { private final Map stations = new HashMap<>(); private final StationFactory stationFactory; - public FileStationDataAccessObject(String txtFilePath, StationFactory stationFactory) throws IOException { + private final GOStationApiClass goStationApiClass; + + public FileStationDataAccessObject(String txtFilePath, StationFactory stationFactory, GOStationApiClass goStationApiClass) throws IOException { this.stationFactory = stationFactory; + this.goStationApiClass = goStationApiClass; stationTxtFile = new File(txtFilePath); // Reading the provided txt file that has a path specified by attribute txtFilePath @@ -59,10 +62,17 @@ public String getStationParentLine(String inputStationName) { return (stations.get(inputStationName)).getParentLine(); } + public String getStationID (String inputStationName) { + + return (stations.get(inputStationName)).getId(); + } + @Override public List getStationAmenities(String inputStationName) { - - return (stations.get(inputStationName)).getAmenitiesList(); + //TODO: Need to save this information in the actual Station objects such that we don't duplicate API calls + String stationID = getStationID(inputStationName); + List stationAmenitiesList = goStationApiClass.retrieveStationAmenities(stationID); + return stationAmenitiesList; } public boolean stationExist(String identifier){ From e93e7c9e9bbc5f9cee83f30b120b5b3be75a3f75 Mon Sep 17 00:00:00 2001 From: carmen-chau <80921817+carmen-chau@users.noreply.github.com> Date: Mon, 20 Nov 2023 11:00:09 -0500 Subject: [PATCH 09/41] preliminary solution to set station amenities list to actual value, but might violate clean arch --- src/data_access/FileStationDataAccessObject.java | 7 +++++++ src/entity/Station.java | 6 +++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/data_access/FileStationDataAccessObject.java b/src/data_access/FileStationDataAccessObject.java index c3ef568..9a0b4aa 100644 --- a/src/data_access/FileStationDataAccessObject.java +++ b/src/data_access/FileStationDataAccessObject.java @@ -52,6 +52,13 @@ public FileStationDataAccessObject(String txtFilePath, StationFactory stationFac } @Override public Station getStation (String inputStationName) { + Station incompleteStationObj = stations.get(inputStationName); + + // Assigning the Station obj's amenitiesList attribute to a valid value + List retrievedStationAmenities = getStationAmenities(inputStationName); + incompleteStationObj.setAmenitiesList(retrievedStationAmenities); + + //TODO: Do something similar for incomingVehicles? return stations.get(inputStationName); } diff --git a/src/entity/Station.java b/src/entity/Station.java index 2bf9c48..7fc4f19 100644 --- a/src/entity/Station.java +++ b/src/entity/Station.java @@ -8,7 +8,7 @@ public class Station implements StationInterface{ private final String parentLine; private final float latitude; private final float longitude; - private final List amenitiesList; + private List amenitiesList; //TODO: Due to this variable being assigned a valid value AFTER initial text file is read, we need to make this non-final. But this violates CAE? private final List incomingVehicles; /** @@ -62,6 +62,10 @@ public List getAmenitiesList() { return amenitiesList; } + public void setAmenitiesList(List stationAmenitiesList) { + this.amenitiesList = stationAmenitiesList; + } + @Override public List getIncomingVehicles() { return incomingVehicles; From cae6251f9359c97690d129c29a86046159a03b94 Mon Sep 17 00:00:00 2001 From: carmen-chau <80921817+carmen-chau@users.noreply.github.com> Date: Mon, 20 Nov 2023 16:25:27 -0500 Subject: [PATCH 10/41] implemented changes to the UI [incld changes to presentor, interactor..etc] to display amenities --- src/data_access/ApiClassInterface.java | 1 + src/interface_adapter/search/SearchPresenter.java | 9 +++++++-- .../station_info/StationInfoState.java | 8 ++++++++ src/use_case/search/SearchInteractor.java | 7 +++++-- src/use_case/search/SearchOutputData.java | 6 +++--- src/view/StationInfoView.java | 10 ++++++++-- 6 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/data_access/ApiClassInterface.java b/src/data_access/ApiClassInterface.java index 24eab04..4b241a3 100644 --- a/src/data_access/ApiClassInterface.java +++ b/src/data_access/ApiClassInterface.java @@ -2,6 +2,7 @@ public interface ApiClassInterface { // This is an interface defining all the shared attributes and methods that all Api classes should have + //TODO: We might not need an Api interface since the 2 API we are using have little to no relationships with each other String API_KEY = System.getenv("API_KEY"); } diff --git a/src/interface_adapter/search/SearchPresenter.java b/src/interface_adapter/search/SearchPresenter.java index 89b439c..721c353 100644 --- a/src/interface_adapter/search/SearchPresenter.java +++ b/src/interface_adapter/search/SearchPresenter.java @@ -19,8 +19,8 @@ public SearchPresenter(SearchViewModel searchViewModel, StationInfoViewModel sta public void prepareSuccessView(SearchOutputData response){ String retrieveStationName = response.getStationName(); - // TODO: Left NOTE FOR TESTING PURPOSES ONLY. Delete in final implementation - + String retrieveStationAmenities = response.getStationAmenities(); + // TODO: Left NOTE BELOW FOR TESTING PURPOSES ONLY. Delete in final implementation // In the above, changing the arguments to String retrieveStationParentLine = response.getStationParentLine(); would display the Parent line of station // Step 1: Resetting the station error value in the searchState to be null (in case any failed search attempts came before this "successful" attempt) @@ -33,9 +33,14 @@ public void prepareSuccessView(SearchOutputData response){ searchState.setStateStationError(null); // Step 2: Setting values in the SearchPanelView + + // Setting the station name value and updating state with change StationInfoState stationInfoState = stationInfoViewModel.getState(); stationInfoState.setStateStationName(retrieveStationName); + // Setting the station amenities list and updating state with change + stationInfoState.setStateStationAmenities(retrieveStationAmenities); + stationInfoViewModel.firePropertyChanged(); viewManagerModel.setActiveView(stationInfoViewModel.getViewName()); diff --git a/src/interface_adapter/station_info/StationInfoState.java b/src/interface_adapter/station_info/StationInfoState.java index 27105e0..c0ea2fa 100644 --- a/src/interface_adapter/station_info/StationInfoState.java +++ b/src/interface_adapter/station_info/StationInfoState.java @@ -5,6 +5,7 @@ public class StationInfoState { //Purpose of class: Contains the information we need to have during the station info state (the state after successful user input is received) private String stationName; + private String stationAmenities; //TODO: Tentatively, it is a String type //TODO: If this "copy" constructor is unused, delete in the final project implementation public StationInfoState(StationInfoState copy) { @@ -22,4 +23,11 @@ public void setStateStationName(String stationName) { this.stationName = stationName; } + //TODO: This is a MOCK change to the state, where the stationAmenitiesList is converted to a string format + // Ideally, we want to seperate and print each entry + public String getStateStationAmenities() {return stationAmenities;} + public void setStateStationAmenities(String stationAmenities) { + this.stationAmenities = stationAmenities; + } + } diff --git a/src/use_case/search/SearchInteractor.java b/src/use_case/search/SearchInteractor.java index 2939fb1..14753e1 100644 --- a/src/use_case/search/SearchInteractor.java +++ b/src/use_case/search/SearchInteractor.java @@ -1,6 +1,7 @@ package use_case.search; import entity.Station; +import java.util.List; public class SearchInteractor implements SearchInputBoundary { final SearchDataAccessInterface stationDataAccessObject; @@ -19,8 +20,10 @@ public void execute(SearchInputData searchInputData) { // Creating a Station object using the station factory based on the name that the user input Station station = stationDataAccessObject.getStation(searchInputData.getStationName()); - // Packaging key details from the above Station object into a SearchOutputData object - SearchOutputData searchOutputData = new SearchOutputData(station.getName(), station.getParentLine(), station.getAmenitiesList()); + // Packaging key details from the above Station object into a SearchOutputData object + List amenitiesList = station.getAmenitiesList(); + String amenitiesListAsString = String.join(", ", amenitiesList); + SearchOutputData searchOutputData = new SearchOutputData(station.getName(), station.getParentLine(), amenitiesListAsString); // return the output data to the user stationPresenter.prepareSuccessView(searchOutputData); diff --git a/src/use_case/search/SearchOutputData.java b/src/use_case/search/SearchOutputData.java index 99cb065..ec1b8e5 100644 --- a/src/use_case/search/SearchOutputData.java +++ b/src/use_case/search/SearchOutputData.java @@ -5,7 +5,7 @@ public class SearchOutputData { private final String stationName; private final String stationParentLine; - private final List stationAmenities; + private final String stationAmenities; //TODO: TEMP CHANGE TO STRING TYPE // After clicking "Find Info" button, the app directs us to Panel #2 // We still need to figure out Amenities output @@ -15,7 +15,7 @@ public class SearchOutputData { * @param stationParentLine * @param stationAmenities */ - public SearchOutputData(String stationName, String stationParentLine, List stationAmenities) { + public SearchOutputData(String stationName, String stationParentLine, String stationAmenities) { this.stationName = stationName; this.stationParentLine = stationParentLine; this.stationAmenities = stationAmenities; @@ -25,5 +25,5 @@ public SearchOutputData(String stationName, String stationParentLine, List getStationAmenities() {return stationAmenities;} + public String getStationAmenities() {return stationAmenities;} } diff --git a/src/view/StationInfoView.java b/src/view/StationInfoView.java index 7aa3d98..5bc369f 100644 --- a/src/view/StationInfoView.java +++ b/src/view/StationInfoView.java @@ -16,6 +16,7 @@ public class StationInfoView extends JPanel implements ActionListener, PropertyC private final StationInfoViewModel stationInfoViewModel; JLabel stationName; + JLabel stationAmenities; /** * A window with a title and a JButton. @@ -27,13 +28,17 @@ public StationInfoView(StationInfoViewModel stationInfoViewModel) { JLabel title = new JLabel("Station info screen"); title.setAlignmentX(Component.CENTER_ALIGNMENT); - JLabel stationInfo = new JLabel("Station name: "); + JLabel stationNameLabel = new JLabel("Station name: "); stationName = new JLabel(); + JLabel stationAmenitiesLabel = new JLabel("Station amenities: "); + stationAmenities = new JLabel(); this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); this.add(title); - this.add(stationInfo); + this.add(stationNameLabel); this.add(stationName); + this.add(stationAmenitiesLabel); + this.add(stationAmenities); } /** @@ -48,5 +53,6 @@ public void propertyChange(PropertyChangeEvent evt) { //System.out.println("Reached"); //Commented out for testing purposes StationInfoState state = (StationInfoState) evt.getNewValue(); stationName.setText(state.getStateStationName()); + stationAmenities.setText(state.getStateStationAmenities()); } } \ No newline at end of file From 8cd8f91637ef0b4775a78c0fa590b56a7c5abd43 Mon Sep 17 00:00:00 2001 From: carmen-chau <80921817+carmen-chau@users.noreply.github.com> Date: Mon, 20 Nov 2023 16:28:52 -0500 Subject: [PATCH 11/41] renamed ApiClassInterface.java to TrainApiInterface.java. changed GOStationApiClass.java to reflect this change --- src/data_access/GOStationApiClass.java | 2 +- .../{ApiClassInterface.java => TrainApiInterface.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/data_access/{ApiClassInterface.java => TrainApiInterface.java} (89%) diff --git a/src/data_access/GOStationApiClass.java b/src/data_access/GOStationApiClass.java index 36062a6..d9c4aa7 100644 --- a/src/data_access/GOStationApiClass.java +++ b/src/data_access/GOStationApiClass.java @@ -12,7 +12,7 @@ import java.util.ArrayList; import java.util.List; -public class GOStationApiClass implements ApiClassInterface{ +public class GOStationApiClass implements TrainApiInterface{ private final String PARTIAL_API_URL = "OpenDataAPI/api/V1"; public GOStationApiClass () { diff --git a/src/data_access/ApiClassInterface.java b/src/data_access/TrainApiInterface.java similarity index 89% rename from src/data_access/ApiClassInterface.java rename to src/data_access/TrainApiInterface.java index 4b241a3..c29990d 100644 --- a/src/data_access/ApiClassInterface.java +++ b/src/data_access/TrainApiInterface.java @@ -1,6 +1,6 @@ package data_access; -public interface ApiClassInterface { +public interface TrainApiInterface { // This is an interface defining all the shared attributes and methods that all Api classes should have //TODO: We might not need an Api interface since the 2 API we are using have little to no relationships with each other String API_KEY = System.getenv("API_KEY"); From 6d24276000ff215f996271824e1eadf70841eeec Mon Sep 17 00:00:00 2001 From: carmen-chau <80921817+carmen-chau@users.noreply.github.com> Date: Mon, 20 Nov 2023 16:33:23 -0500 Subject: [PATCH 12/41] per TA feedback, moved the API class and interface to an API folder nested inside data_access --- src/data_access/{ => API}/GOStationApiClass.java | 4 ++-- src/data_access/{ => API}/TrainApiInterface.java | 2 +- src/data_access/FileStationDataAccessObject.java | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) rename src/data_access/{ => API}/GOStationApiClass.java (96%) rename src/data_access/{ => API}/TrainApiInterface.java (92%) diff --git a/src/data_access/GOStationApiClass.java b/src/data_access/API/GOStationApiClass.java similarity index 96% rename from src/data_access/GOStationApiClass.java rename to src/data_access/API/GOStationApiClass.java index d9c4aa7..eb025a2 100644 --- a/src/data_access/GOStationApiClass.java +++ b/src/data_access/API/GOStationApiClass.java @@ -1,4 +1,4 @@ -package data_access; +package data_access.API; import okhttp3.HttpUrl; import okhttp3.OkHttpClient; @@ -12,7 +12,7 @@ import java.util.ArrayList; import java.util.List; -public class GOStationApiClass implements TrainApiInterface{ +public class GOStationApiClass implements TrainApiInterface { private final String PARTIAL_API_URL = "OpenDataAPI/api/V1"; public GOStationApiClass () { diff --git a/src/data_access/TrainApiInterface.java b/src/data_access/API/TrainApiInterface.java similarity index 92% rename from src/data_access/TrainApiInterface.java rename to src/data_access/API/TrainApiInterface.java index c29990d..342b6a3 100644 --- a/src/data_access/TrainApiInterface.java +++ b/src/data_access/API/TrainApiInterface.java @@ -1,4 +1,4 @@ -package data_access; +package data_access.API; public interface TrainApiInterface { // This is an interface defining all the shared attributes and methods that all Api classes should have diff --git a/src/data_access/FileStationDataAccessObject.java b/src/data_access/FileStationDataAccessObject.java index 9a0b4aa..61c2d72 100644 --- a/src/data_access/FileStationDataAccessObject.java +++ b/src/data_access/FileStationDataAccessObject.java @@ -1,5 +1,6 @@ package data_access; +import data_access.API.GOStationApiClass; import entity.Vehicle; import entity.StationFactory; import use_case.search.SearchDataAccessInterface; From 03f0f5654ec600e49b467a045c31b6da6e31d4e6 Mon Sep 17 00:00:00 2001 From: carmen-chau <80921817+carmen-chau@users.noreply.github.com> Date: Mon, 20 Nov 2023 17:06:55 -0500 Subject: [PATCH 13/41] moved the DAO Object file to a new folder called text_file that is nested inside data_access --- src/app/Main.java | 4 ++-- .../{ => text_file}/FileStationDataAccessObject.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/data_access/{ => text_file}/FileStationDataAccessObject.java (99%) diff --git a/src/app/Main.java b/src/app/Main.java index 0d3ed53..56f564a 100644 --- a/src/app/Main.java +++ b/src/app/Main.java @@ -1,7 +1,7 @@ package app; -import data_access.FileStationDataAccessObject; -import data_access.GOStationApiClass; +import data_access.text_file.FileStationDataAccessObject; +import data_access.API.GOStationApiClass; import entity.StationFactory; import interface_adapter.search.SearchViewModel; import interface_adapter.ViewManagerModel; diff --git a/src/data_access/FileStationDataAccessObject.java b/src/data_access/text_file/FileStationDataAccessObject.java similarity index 99% rename from src/data_access/FileStationDataAccessObject.java rename to src/data_access/text_file/FileStationDataAccessObject.java index 61c2d72..f96785b 100644 --- a/src/data_access/FileStationDataAccessObject.java +++ b/src/data_access/text_file/FileStationDataAccessObject.java @@ -1,4 +1,4 @@ -package data_access; +package data_access.text_file; import data_access.API.GOStationApiClass; import entity.Vehicle; From 9707baedd364e2cfc82ab1646cc670e8c303319e Mon Sep 17 00:00:00 2001 From: jacquelyn Date: Tue, 21 Nov 2023 18:17:41 -0500 Subject: [PATCH 14/41] deleted grade-api.iml --- .idea/compiler.xml | 5 ++++- .idea/modules.xml | 2 +- grade-api.iml | 8 -------- 3 files changed, 5 insertions(+), 10 deletions(-) delete mode 100644 grade-api.iml diff --git a/.idea/compiler.xml b/.idea/compiler.xml index c5cc545..cedff6f 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -6,8 +6,11 @@ - + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 75418cf..bfdd95a 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/grade-api.iml b/grade-api.iml deleted file mode 100644 index abe781f..0000000 --- a/grade-api.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file From 8467cca2e14ad24cfef0371915f656a871bdf962 Mon Sep 17 00:00:00 2001 From: arandaaron04 Date: Tue, 21 Nov 2023 18:25:29 -0500 Subject: [PATCH 15/41] Created GOTrainsApiClass.java for checking all trains current location. --- src/data_access/API/GOTrainsApiClass.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/data_access/API/GOTrainsApiClass.java diff --git a/src/data_access/API/GOTrainsApiClass.java b/src/data_access/API/GOTrainsApiClass.java new file mode 100644 index 0000000..c253f8d --- /dev/null +++ b/src/data_access/API/GOTrainsApiClass.java @@ -0,0 +1,4 @@ +package data_access.API; + +public class GOTrainsApiClass { +} From 67f015a405cc5662e7cd19673c16916957b225c7 Mon Sep 17 00:00:00 2001 From: arandaaron04 Date: Tue, 21 Nov 2023 18:56:46 -0500 Subject: [PATCH 16/41] First GOTrainsApiClass.java test for pulling description --- src/data_access/API/TrainApiInterface.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data_access/API/TrainApiInterface.java b/src/data_access/API/TrainApiInterface.java index 342b6a3..e735feb 100644 --- a/src/data_access/API/TrainApiInterface.java +++ b/src/data_access/API/TrainApiInterface.java @@ -3,6 +3,6 @@ public interface TrainApiInterface { // This is an interface defining all the shared attributes and methods that all Api classes should have //TODO: We might not need an Api interface since the 2 API we are using have little to no relationships with each other - String API_KEY = System.getenv("API_KEY"); - + String API_KEY = "30023637"; + // System.getenv("API_KEY") } From f3d1d32acc81e855d807bfb1209c0aa23ea952c0 Mon Sep 17 00:00:00 2001 From: arandaaron04 Date: Tue, 21 Nov 2023 19:17:45 -0500 Subject: [PATCH 17/41] Created GOVehiclePositionApiClass.java will be used for pulling Long, Latt. --- .../API/GOVehiclePositionApiClass.java | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/data_access/API/GOVehiclePositionApiClass.java diff --git a/src/data_access/API/GOVehiclePositionApiClass.java b/src/data_access/API/GOVehiclePositionApiClass.java new file mode 100644 index 0000000..b3fbb98 --- /dev/null +++ b/src/data_access/API/GOVehiclePositionApiClass.java @@ -0,0 +1,59 @@ +package data_access.API; + +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class GOVehiclePositionApiClass implements TrainApiInterface { + + private final String PARTIAL_API_URL = "OpenDataAPI/api/V1"; + public GOVehiclePositionApiClass () { + } + public List retrieveVehiclePosition(String stationId){ + OkHttpClient client = new OkHttpClient().newBuilder() + .build(); + HttpUrl httpUrl = new HttpUrl.Builder() + .scheme("http") + .host("api.openmetrolinx.com") + .addPathSegment(PARTIAL_API_URL) + .addPathSegment("UP") + .addPathSegment("Gtfs") + .addPathSegment("Feed") + .addPathSegment("VehiclePosition") + .addPathSegment(stationId) //getting station information for the station with the id denoted by stationId + .addQueryParameter("key", API_KEY) + .build(); + + Request request = new Request.Builder() + .url(httpUrl) + .addHeader("content-type", "application/json") + .build(); + try { + Response response = client.newCall(request).execute(); + String vehiclePositionJsonData = response.body().string(); + JSONObject vehiclePositionJsonObj = new JSONObject(vehiclePositionJsonData); // This is where the header is located at + // JSONObject vehiclePositionJsonDataObj = vehiclePositionJsonObj.getJSONObject("entity"); + JSONArray entityJsonArray = vehiclePositionJsonObj.getJSONArray("entity"); + List entityList = new ArrayList(); + for (int i = 0; i < entityJsonArray.length(); i++) { + JSONObject currEntityEntry = entityJsonArray.getJSONObject(i); + entityList.add(currEntityEntry.getString("id")); // left at "id" for now, to be changed to vehicle + //System.out.println(currAmenitiesEntry.getString("Description")); // For debugging purposes + System.out.println(httpUrl); + } + return entityList; // do not print this yet, wait for full change + + } catch (IOException | JSONException e) { + throw new RuntimeException(e); + } + + } +} From 8d5f0059af00bf65ec4e600be7529371f405a7a7 Mon Sep 17 00:00:00 2001 From: jacquelyn Date: Tue, 21 Nov 2023 19:18:38 -0500 Subject: [PATCH 18/41] nothing --- src/entity/Train.java | 3 ++- src/entity/TrainFactory.java | 3 ++- src/entity/TrainInterface.java | 5 +++++ 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 src/entity/TrainInterface.java diff --git a/src/entity/Train.java b/src/entity/Train.java index 0e7fc8d..e9c9a94 100644 --- a/src/entity/Train.java +++ b/src/entity/Train.java @@ -1,2 +1,3 @@ -package entity;public class Train { +package entity; +public class Train { } diff --git a/src/entity/TrainFactory.java b/src/entity/TrainFactory.java index f1d57f3..214a4f7 100644 --- a/src/entity/TrainFactory.java +++ b/src/entity/TrainFactory.java @@ -1,2 +1,3 @@ -package entity;public class TrainFactory { +package entity; +public class TrainFactory { } diff --git a/src/entity/TrainInterface.java b/src/entity/TrainInterface.java new file mode 100644 index 0000000..2856850 --- /dev/null +++ b/src/entity/TrainInterface.java @@ -0,0 +1,5 @@ +package entity; + +public interface TrainInterface { + String +} From 7d0c75798b0f450032c477171b45243f6cc762a5 Mon Sep 17 00:00:00 2001 From: arandaaron04 Date: Tue, 21 Nov 2023 20:00:58 -0500 Subject: [PATCH 19/41] Fixed GOTrainsApiClass.java and GOVehiclePositionApiClass.java --- src/data_access/API/GOTrainsApiClass.java | 57 ++++++++++++++++++- .../API/GOVehiclePositionApiClass.java | 4 +- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/data_access/API/GOTrainsApiClass.java b/src/data_access/API/GOTrainsApiClass.java index c253f8d..da90507 100644 --- a/src/data_access/API/GOTrainsApiClass.java +++ b/src/data_access/API/GOTrainsApiClass.java @@ -1,4 +1,59 @@ package data_access.API; -public class GOTrainsApiClass { +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class GOTrainsApiClass implements TrainApiInterface { + + private final String PARTIAL_API_URL = "OpenDataAPI/api/V1"; + public GOTrainsApiClass () { + } + public List retrieveTrains(String stationId){ + OkHttpClient client = new OkHttpClient().newBuilder() + .build(); + HttpUrl httpUrl = new HttpUrl.Builder() + .scheme("http") + .host("api.openmetrolinx.com") + .addPathSegment(PARTIAL_API_URL) + .addPathSegment("ServiceataGlance") + .addPathSegment("Trains") + .addPathSegment("All") + // TODO: may need for future + // .addPathSegment(stationId) //getting station information for the station with the id denoted by stationId + .addQueryParameter("key", API_KEY) + .build(); + + Request request = new Request.Builder() + .url(httpUrl) + .addHeader("content-type", "application/json") + .build(); + try { + Response response = client.newCall(request).execute(); + String trainJsonData = response.body().string(); + JSONObject metaDataJsonObj = new JSONObject(trainJsonData); // This is where the Metadata is located at + JSONObject tripsJsonDataObj = metaDataJsonObj.getJSONObject("Trips"); + JSONArray tripJsonArray = tripsJsonDataObj.getJSONArray("Trip"); + List tripList = new ArrayList(); + for (int i = 0; i < tripJsonArray.length(); i++) { + JSONObject currTripEntry = tripJsonArray.getJSONObject(i); + tripList.add(currTripEntry.getString("id")); // left at "id" for now, to be changed to vehicle + //System.out.println(currAmenitiesEntry.getString("Description")); // For debugging purposes + System.out.println(httpUrl); + } + return tripList; // do not print this yet, wait for full change + + } catch (IOException | JSONException e) { + throw new RuntimeException(e); + } + + } } diff --git a/src/data_access/API/GOVehiclePositionApiClass.java b/src/data_access/API/GOVehiclePositionApiClass.java index b3fbb98..7ad3d78 100644 --- a/src/data_access/API/GOVehiclePositionApiClass.java +++ b/src/data_access/API/GOVehiclePositionApiClass.java @@ -39,9 +39,9 @@ public List retrieveVehiclePosition(String stationId){ try { Response response = client.newCall(request).execute(); String vehiclePositionJsonData = response.body().string(); - JSONObject vehiclePositionJsonObj = new JSONObject(vehiclePositionJsonData); // This is where the header is located at + JSONObject headerPositionJsonObj = new JSONObject(vehiclePositionJsonData); // This is where the header is located at // JSONObject vehiclePositionJsonDataObj = vehiclePositionJsonObj.getJSONObject("entity"); - JSONArray entityJsonArray = vehiclePositionJsonObj.getJSONArray("entity"); + JSONArray entityJsonArray = headerPositionJsonObj.getJSONArray("entity"); List entityList = new ArrayList(); for (int i = 0; i < entityJsonArray.length(); i++) { JSONObject currEntityEntry = entityJsonArray.getJSONObject(i); From 1f3b17ede4d60d8bceea292f27a16e2bfc4c88cd Mon Sep 17 00:00:00 2001 From: arandaaron04 Date: Tue, 21 Nov 2023 20:15:31 -0500 Subject: [PATCH 20/41] Fixed GOVehiclePositionApiClass.java, no more "UP". --- src/data_access/API/GOVehiclePositionApiClass.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/data_access/API/GOVehiclePositionApiClass.java b/src/data_access/API/GOVehiclePositionApiClass.java index 7ad3d78..268a17a 100644 --- a/src/data_access/API/GOVehiclePositionApiClass.java +++ b/src/data_access/API/GOVehiclePositionApiClass.java @@ -24,7 +24,6 @@ public List retrieveVehiclePosition(String stationId){ .scheme("http") .host("api.openmetrolinx.com") .addPathSegment(PARTIAL_API_URL) - .addPathSegment("UP") .addPathSegment("Gtfs") .addPathSegment("Feed") .addPathSegment("VehiclePosition") From a16aa9a3713ccaa3116127f3a2180835579cc1ae Mon Sep 17 00:00:00 2001 From: arandaaron04 <132975284+arandaaron04@users.noreply.github.com> Date: Tue, 21 Nov 2023 20:30:23 -0500 Subject: [PATCH 21/41] Update TrainApiInterface.java --- src/data_access/API/TrainApiInterface.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/data_access/API/TrainApiInterface.java b/src/data_access/API/TrainApiInterface.java index e735feb..6a41ebc 100644 --- a/src/data_access/API/TrainApiInterface.java +++ b/src/data_access/API/TrainApiInterface.java @@ -3,6 +3,5 @@ public interface TrainApiInterface { // This is an interface defining all the shared attributes and methods that all Api classes should have //TODO: We might not need an Api interface since the 2 API we are using have little to no relationships with each other - String API_KEY = "30023637"; - // System.getenv("API_KEY") + String API_KEY = System.getenv("API_KEY"); } From 357fab16e7f7e60ec4c313074859e0e91464ccba Mon Sep 17 00:00:00 2001 From: jacquelyn Date: Tue, 21 Nov 2023 20:45:53 -0500 Subject: [PATCH 22/41] Added GOTrainScheduledTimeApiClass to retrieve train scheduled time to a station. --- .../API/GOTrainScheduledTimeApiClass.java | 76 +++++++++++++++++++ src/data_access/API/GOTrainsApiClass.java | 4 - 2 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 src/data_access/API/GOTrainScheduledTimeApiClass.java delete mode 100644 src/data_access/API/GOTrainsApiClass.java diff --git a/src/data_access/API/GOTrainScheduledTimeApiClass.java b/src/data_access/API/GOTrainScheduledTimeApiClass.java new file mode 100644 index 0000000..fe60adb --- /dev/null +++ b/src/data_access/API/GOTrainScheduledTimeApiClass.java @@ -0,0 +1,76 @@ +package data_access.API; + +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; +import java.util.List; + +import static data_access.API.TrainApiInterface.API_KEY; +import static java.time.LocalTime.now; + +public class GOTrainScheduledTimeApiClass { + private final String PARTIAL_API_URL = "OpenDataAPI/api/V1"; + public GOTrainScheduledTimeApiClass () { + } + public HashMap retrieveTrainScheduledTime(String tripNumber){ + + String DATE_FORMAT = "yyyyMMdd"; + SimpleDateFormat sdf = + new SimpleDateFormat(DATE_FORMAT); + Calendar c1 = Calendar.getInstance(); // today + System.out.println("Today is " + sdf.format(c1.getTime())); // for test purpose + + OkHttpClient client = new OkHttpClient().newBuilder() + .build(); + HttpUrl httpUrl = new HttpUrl.Builder() + .scheme("http") + .host("api.openmetrolinx.com") + .addPathSegment(PARTIAL_API_URL) + .addPathSegment("Schedule") + .addPathSegment("Trip") + .addPathSegment(sdf.format(c1.getTime())) //date + .addPathSegment(tripNumber) //tripNumber retrieved in GOTrainsApiClass + .addQueryParameter("key", API_KEY) + .build(); + + Request request = new Request.Builder() + .url(httpUrl) + .addHeader("content-type", "application/json") + .build(); + try { + Response response = client.newCall(request).execute(); + String trainScheduledTimeJsonData = response.body().string(); + JSONObject trainScheduledTimeJsonObj = new JSONObject(trainScheduledTimeJsonData); // This is where the header is located at + JSONArray tripsJsonArray = trainScheduledTimeJsonObj.getJSONArray("Trips"); + JSONArray stopsJsonArray = tripsJsonArray.getJSONArray(6); + + HashMap trainscheduledtimeList = new HashMap<>(); + // Key is Station_id in String format, Value is Departure Time in String format + for (int i = 0; i < stopsJsonArray.length(); i++) { + JSONObject currstopEntry = stopsJsonArray.getJSONObject(i); + JSONObject departuretimeObj = currstopEntry.getJSONObject("DepartureTime"); + trainscheduledtimeList.put(currstopEntry.getString("Code"), departuretimeObj.getString("Scheduled")); + + System.out.println(currstopEntry.getString("Code")); // For debugging purposes + System.out.println(departuretimeObj.getString("Scheduled")); // For debugging purposes + System.out.println(httpUrl); + } + return trainscheduledtimeList; // do not print this yet, wait for full change + + } catch (IOException | JSONException e) { + throw new RuntimeException(e); + } + + } + +} diff --git a/src/data_access/API/GOTrainsApiClass.java b/src/data_access/API/GOTrainsApiClass.java deleted file mode 100644 index c253f8d..0000000 --- a/src/data_access/API/GOTrainsApiClass.java +++ /dev/null @@ -1,4 +0,0 @@ -package data_access.API; - -public class GOTrainsApiClass { -} From 63ac341ab339af48b042419c7ce9e4094d99c81c Mon Sep 17 00:00:00 2001 From: jacquelyn Date: Wed, 22 Nov 2023 02:28:05 -0500 Subject: [PATCH 23/41] Added GOTrainApiClass to retrieve real time train info --- src/data_access/API/GOTrainApiClass.java | 68 ++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/data_access/API/GOTrainApiClass.java diff --git a/src/data_access/API/GOTrainApiClass.java b/src/data_access/API/GOTrainApiClass.java new file mode 100644 index 0000000..ae4d82e --- /dev/null +++ b/src/data_access/API/GOTrainApiClass.java @@ -0,0 +1,68 @@ +package data_access.API; + +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import static data_access.API.TrainApiInterface.API_KEY; + +public class GOTrainApiClass { + private final String PARTIAL_API_URL = "OpenDataAPI/api/V1"; + public GOTrainApiClass () { + } + public List> retrieveTrainInfo(){ + OkHttpClient client = new OkHttpClient().newBuilder() + .build(); + HttpUrl httpUrl = new HttpUrl.Builder() + .scheme("http") + .host("api.openmetrolinx.com") + .addPathSegment(PARTIAL_API_URL) + .addPathSegment("ServiceataGlance") + .addPathSegment("Trains") + .addPathSegment("All") + .addQueryParameter("key", API_KEY) + .build(); + + Request request = new Request.Builder() + .url(httpUrl) + .addHeader("content-type", "application/json") + .build(); + try { + Response response = client.newCall(request).execute(); + String trainInfoJsonData = response.body().string(); + JSONObject headerPositionJsonObj = new JSONObject(trainInfoJsonData); // This is where the header is located at + + JSONObject tripsJsonObj = headerPositionJsonObj.getJSONObject("Trips"); + JSONArray tripJsonArray = tripsJsonObj.getJSONArray("Trip"); + + List> trainList = new ArrayList<>(); + for (int i = 0; i < tripJsonArray.length(); i++) { + JSONObject currtripEntry = tripJsonArray.getJSONObject(i); + List trainInfoList = new ArrayList<>(); + trainInfoList.add(currtripEntry.getString("TripNumber")); // "TripNumber" is a String for Train Number + trainInfoList.add(currtripEntry.getString("LineCode")); // second item of trainInfoList is its Line Code + trainInfoList.add(currtripEntry.getString("Display")); // 3rd item of trainInfoList is Train Name + trainInfoList.add(currtripEntry.getString("DelaySeconds")); //4th item is train delay (in seconds) + + trainList.add(trainInfoList); //add trainInfoList in trainList + + System.out.println(currtripEntry.getString("trainInfoList")); // For debugging purposes + + System.out.println(httpUrl); + } + return trainList; // do not print this yet, wait for full change + + } catch (IOException | JSONException e) { + throw new RuntimeException(e); + } + + } +} From b8faa09f9f4c1414f1d7a60151afb17e5684ec33 Mon Sep 17 00:00:00 2001 From: jacquelyn Date: Wed, 22 Nov 2023 02:41:15 -0500 Subject: [PATCH 24/41] Created Train Class and TrainInterface. Edited some comment in Api classes --- src/data_access/API/GOTrainApiClass.java | 2 +- .../API/GOTrainScheduledTimeApiClass.java | 2 +- src/entity/Train.java | 68 ++++++++++++++++++- src/entity/TrainInterface.java | 14 +++- 4 files changed, 82 insertions(+), 4 deletions(-) diff --git a/src/data_access/API/GOTrainApiClass.java b/src/data_access/API/GOTrainApiClass.java index ae4d82e..8775cf5 100644 --- a/src/data_access/API/GOTrainApiClass.java +++ b/src/data_access/API/GOTrainApiClass.java @@ -48,7 +48,7 @@ public List> retrieveTrainInfo(){ JSONObject currtripEntry = tripJsonArray.getJSONObject(i); List trainInfoList = new ArrayList<>(); trainInfoList.add(currtripEntry.getString("TripNumber")); // "TripNumber" is a String for Train Number - trainInfoList.add(currtripEntry.getString("LineCode")); // second item of trainInfoList is its Line Code + trainInfoList.add(currtripEntry.getString("LineCode")); // second item of trainInfoList is its Parent Line Code trainInfoList.add(currtripEntry.getString("Display")); // 3rd item of trainInfoList is Train Name trainInfoList.add(currtripEntry.getString("DelaySeconds")); //4th item is train delay (in seconds) diff --git a/src/data_access/API/GOTrainScheduledTimeApiClass.java b/src/data_access/API/GOTrainScheduledTimeApiClass.java index fe60adb..dc9231c 100644 --- a/src/data_access/API/GOTrainScheduledTimeApiClass.java +++ b/src/data_access/API/GOTrainScheduledTimeApiClass.java @@ -39,7 +39,7 @@ public HashMap retrieveTrainScheduledTime(String tripNumber){ .addPathSegment("Schedule") .addPathSegment("Trip") .addPathSegment(sdf.format(c1.getTime())) //date - .addPathSegment(tripNumber) //tripNumber retrieved in GOTrainsApiClass + .addPathSegment(tripNumber) //tripNumber for a certain trip(train) .addQueryParameter("key", API_KEY) .build(); diff --git a/src/entity/Train.java b/src/entity/Train.java index e9c9a94..232a4c7 100644 --- a/src/entity/Train.java +++ b/src/entity/Train.java @@ -1,3 +1,69 @@ package entity; -public class Train { +public class Train implements TrainInterface{ + + private final String name; + private final String trainNumber; //trainNumber = tripNumber + private final String parentLine; + // Will have to decide if we need to have parentLine for a certain train + private final float latitude; + private final float longitude; + private final String scheduledTime; + private final String delay; + + /** + * Requirement: Train name and trainNumber exist. + * Note: trainNumber is tripNumber in GOtrainApiClass + * @param name + * @param trainNumber + * @param parentLine + * @param latitude + * @param longitude + * @param scheduledTime + * @param delay + */ + Train(String name, String trainNumber, String parentLine, float latitude, float longitude, String scheduledTime, String delay) { + this.name = name; + this.trainNumber = trainNumber; + this.parentLine = parentLine; + this.latitude = latitude; + this.longitude = longitude; + this.scheduledTime = scheduledTime; + this.delay = delay; + } + + @Override + public String getNumber() { + return trainNumber; + } + + @Override + public String getName() { + return name; + } + + @Override + public float getLatitude() { + return latitude; + } + + @Override + public float getLongitude() { + return longitude; + } + + @Override + public String getParentLine() { + return parentLine; + } + // We don't really need parentLine for a train? + + @Override + public String getScheduledTime() { + return scheduledTime; + } + + @Override + public String getDelay() { + return delay; + } } diff --git a/src/entity/TrainInterface.java b/src/entity/TrainInterface.java index 2856850..c819458 100644 --- a/src/entity/TrainInterface.java +++ b/src/entity/TrainInterface.java @@ -1,5 +1,17 @@ package entity; public interface TrainInterface { - String + String getNumber(); + + String getName(); + + float getLatitude(); + + float getLongitude(); + + String getParentLine(); + + String getScheduledTime(); + + String getDelay(); } From 836bf89758919abe6bd81bb31ca3b72f2458bfa0 Mon Sep 17 00:00:00 2001 From: jacquelyn Date: Wed, 22 Nov 2023 02:45:03 -0500 Subject: [PATCH 25/41] Created TrainFactory --- src/entity/TrainFactory.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/entity/TrainFactory.java b/src/entity/TrainFactory.java index 214a4f7..4c04c8e 100644 --- a/src/entity/TrainFactory.java +++ b/src/entity/TrainFactory.java @@ -1,3 +1,13 @@ package entity; + +import java.util.List; + public class TrainFactory { + /** + * Provide a create method that could "construct" instances of Train without having us to call + * the actual Train class constructor. + **/ + public Train create (String name, String trainNumber, String parentLine, float latitude, float longitude, String scheduledTime, String delay) { + return new Train (name, trainNumber, parentLine, latitude, longitude, scheduledTime, delay); + } } From 0a4c0d9f741f2a52ac1c7ef547f3b07dd363910d Mon Sep 17 00:00:00 2001 From: jacquelyn Date: Wed, 22 Nov 2023 15:57:45 -0500 Subject: [PATCH 26/41] updated StationInfoView and StationInfoViewModel for show_incoming_vehicles use case --- .../station_info/StationInfoViewModel.java | 2 ++ src/view/StationInfoView.java | 25 ++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/interface_adapter/station_info/StationInfoViewModel.java b/src/interface_adapter/station_info/StationInfoViewModel.java index 36224d8..7eaeeb9 100644 --- a/src/interface_adapter/station_info/StationInfoViewModel.java +++ b/src/interface_adapter/station_info/StationInfoViewModel.java @@ -9,6 +9,8 @@ public class StationInfoViewModel extends ViewModel { public final String TITLE_LABEL = "Station Info View"; + public final String SHOW_INCOMING_VEHICLES_BUTTON_LABEL = "Show Incoming Vehicles"; + private StationInfoState state = new StationInfoState(); public StationInfoViewModel() { diff --git a/src/view/StationInfoView.java b/src/view/StationInfoView.java index 5246dbc..b993270 100644 --- a/src/view/StationInfoView.java +++ b/src/view/StationInfoView.java @@ -7,6 +7,7 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import interface_adapter.show_incoming_vehicles.ShowIncomingVehiclesState; import interface_adapter.station_info.StationInfoState; import interface_adapter.station_info.StationInfoViewModel; @@ -14,8 +15,9 @@ public class StationInfoView extends JPanel implements ActionListener, PropertyChangeListener{ public final String viewName = "stationInfo"; private final StationInfoViewModel stationInfoViewModel; - JLabel stationName; + final JButton show_incoming_vehicles; + private final StationInfoController stationInfoController; /** * A window with a title and a JButton. @@ -30,10 +32,31 @@ public StationInfoView(StationInfoViewModel stationInfoViewModel) { JLabel stationInfo = new JLabel("Station name: "); stationName = new JLabel(); + JPanel buttons = new JPanel(); + show_incoming_vehicles = new JButton(stationInfoViewModel.SHOW_INCOMING_VEHICLES_BUTTON_LABEL); + buttons.add(show_incoming_vehicles); + + show_incoming_vehicles.addActionListener( + // This creates an anonymous subclass of ActionListener and instantiates it. + new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (e.getSource().equals(show_incoming_vehicles)) { + StationInfoState currentState = stationInfoViewModel.getState(); + + stationInfoController.execute( + currentState.getStateStationName() + ); + } + } + } + ); + this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); this.add(title); this.add(stationInfo); this.add(stationName); + this.add(buttons); } /** From 44570e79cee45402416777342bd73d28935a41fc Mon Sep 17 00:00:00 2001 From: jacquelyn Date: Wed, 22 Nov 2023 17:19:19 -0500 Subject: [PATCH 27/41] Found better API calls to retrieve vehicle info. Thus changed GOTrainApiClass into GOVehicleApiClass and deleted GOTrainScheduledTimeApiClass. --- src/data_access/API/GOTrainApiClass.java | 68 ----------------- .../API/GOTrainScheduledTimeApiClass.java | 76 ------------------- src/data_access/API/GOVehicleApiClass.java | 75 ++++++++++++++++++ 3 files changed, 75 insertions(+), 144 deletions(-) delete mode 100644 src/data_access/API/GOTrainApiClass.java delete mode 100644 src/data_access/API/GOTrainScheduledTimeApiClass.java create mode 100644 src/data_access/API/GOVehicleApiClass.java diff --git a/src/data_access/API/GOTrainApiClass.java b/src/data_access/API/GOTrainApiClass.java deleted file mode 100644 index 8775cf5..0000000 --- a/src/data_access/API/GOTrainApiClass.java +++ /dev/null @@ -1,68 +0,0 @@ -package data_access.API; - -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static data_access.API.TrainApiInterface.API_KEY; - -public class GOTrainApiClass { - private final String PARTIAL_API_URL = "OpenDataAPI/api/V1"; - public GOTrainApiClass () { - } - public List> retrieveTrainInfo(){ - OkHttpClient client = new OkHttpClient().newBuilder() - .build(); - HttpUrl httpUrl = new HttpUrl.Builder() - .scheme("http") - .host("api.openmetrolinx.com") - .addPathSegment(PARTIAL_API_URL) - .addPathSegment("ServiceataGlance") - .addPathSegment("Trains") - .addPathSegment("All") - .addQueryParameter("key", API_KEY) - .build(); - - Request request = new Request.Builder() - .url(httpUrl) - .addHeader("content-type", "application/json") - .build(); - try { - Response response = client.newCall(request).execute(); - String trainInfoJsonData = response.body().string(); - JSONObject headerPositionJsonObj = new JSONObject(trainInfoJsonData); // This is where the header is located at - - JSONObject tripsJsonObj = headerPositionJsonObj.getJSONObject("Trips"); - JSONArray tripJsonArray = tripsJsonObj.getJSONArray("Trip"); - - List> trainList = new ArrayList<>(); - for (int i = 0; i < tripJsonArray.length(); i++) { - JSONObject currtripEntry = tripJsonArray.getJSONObject(i); - List trainInfoList = new ArrayList<>(); - trainInfoList.add(currtripEntry.getString("TripNumber")); // "TripNumber" is a String for Train Number - trainInfoList.add(currtripEntry.getString("LineCode")); // second item of trainInfoList is its Parent Line Code - trainInfoList.add(currtripEntry.getString("Display")); // 3rd item of trainInfoList is Train Name - trainInfoList.add(currtripEntry.getString("DelaySeconds")); //4th item is train delay (in seconds) - - trainList.add(trainInfoList); //add trainInfoList in trainList - - System.out.println(currtripEntry.getString("trainInfoList")); // For debugging purposes - - System.out.println(httpUrl); - } - return trainList; // do not print this yet, wait for full change - - } catch (IOException | JSONException e) { - throw new RuntimeException(e); - } - - } -} diff --git a/src/data_access/API/GOTrainScheduledTimeApiClass.java b/src/data_access/API/GOTrainScheduledTimeApiClass.java deleted file mode 100644 index dc9231c..0000000 --- a/src/data_access/API/GOTrainScheduledTimeApiClass.java +++ /dev/null @@ -1,76 +0,0 @@ -package data_access.API; - -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.HashMap; -import java.util.List; - -import static data_access.API.TrainApiInterface.API_KEY; -import static java.time.LocalTime.now; - -public class GOTrainScheduledTimeApiClass { - private final String PARTIAL_API_URL = "OpenDataAPI/api/V1"; - public GOTrainScheduledTimeApiClass () { - } - public HashMap retrieveTrainScheduledTime(String tripNumber){ - - String DATE_FORMAT = "yyyyMMdd"; - SimpleDateFormat sdf = - new SimpleDateFormat(DATE_FORMAT); - Calendar c1 = Calendar.getInstance(); // today - System.out.println("Today is " + sdf.format(c1.getTime())); // for test purpose - - OkHttpClient client = new OkHttpClient().newBuilder() - .build(); - HttpUrl httpUrl = new HttpUrl.Builder() - .scheme("http") - .host("api.openmetrolinx.com") - .addPathSegment(PARTIAL_API_URL) - .addPathSegment("Schedule") - .addPathSegment("Trip") - .addPathSegment(sdf.format(c1.getTime())) //date - .addPathSegment(tripNumber) //tripNumber for a certain trip(train) - .addQueryParameter("key", API_KEY) - .build(); - - Request request = new Request.Builder() - .url(httpUrl) - .addHeader("content-type", "application/json") - .build(); - try { - Response response = client.newCall(request).execute(); - String trainScheduledTimeJsonData = response.body().string(); - JSONObject trainScheduledTimeJsonObj = new JSONObject(trainScheduledTimeJsonData); // This is where the header is located at - JSONArray tripsJsonArray = trainScheduledTimeJsonObj.getJSONArray("Trips"); - JSONArray stopsJsonArray = tripsJsonArray.getJSONArray(6); - - HashMap trainscheduledtimeList = new HashMap<>(); - // Key is Station_id in String format, Value is Departure Time in String format - for (int i = 0; i < stopsJsonArray.length(); i++) { - JSONObject currstopEntry = stopsJsonArray.getJSONObject(i); - JSONObject departuretimeObj = currstopEntry.getJSONObject("DepartureTime"); - trainscheduledtimeList.put(currstopEntry.getString("Code"), departuretimeObj.getString("Scheduled")); - - System.out.println(currstopEntry.getString("Code")); // For debugging purposes - System.out.println(departuretimeObj.getString("Scheduled")); // For debugging purposes - System.out.println(httpUrl); - } - return trainscheduledtimeList; // do not print this yet, wait for full change - - } catch (IOException | JSONException e) { - throw new RuntimeException(e); - } - - } - -} diff --git a/src/data_access/API/GOVehicleApiClass.java b/src/data_access/API/GOVehicleApiClass.java new file mode 100644 index 0000000..1584602 --- /dev/null +++ b/src/data_access/API/GOVehicleApiClass.java @@ -0,0 +1,75 @@ +package data_access.API; + +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import static data_access.API.TrainApiInterface.API_KEY; + +public class GOVehicleApiClass { + private final String PARTIAL_API_URL = "OpenDataAPI/api/V1"; + public GOVehicleApiClass() { + } + public List> retrieveVehicleInfo(String stationId){ + OkHttpClient client = new OkHttpClient().newBuilder() + .build(); + HttpUrl httpUrl = new HttpUrl.Builder() + .scheme("http") + .host("api.openmetrolinx.com") + .addPathSegment(PARTIAL_API_URL) + .addPathSegment("Stop") + .addPathSegment("NextService") + .addPathSegment(stationId) + .addQueryParameter("key", API_KEY) + .build(); + + Request request = new Request.Builder() + .url(httpUrl) + .addHeader("content-type", "application/json") + .build(); + try { + Response response = client.newCall(request).execute(); + String trainInfoJsonData = response.body().string(); + JSONObject headerPositionJsonObj = new JSONObject(trainInfoJsonData); // This is where the header is located at + + JSONObject stationServiceJsonObj = headerPositionJsonObj.getJSONObject("NextService"); + JSONArray vehiclesJsonArray = stationServiceJsonObj.getJSONArray("Lines"); + + List> vehiclesList = new ArrayList<>(); + for (int i = 0; i < vehiclesJsonArray.length(); i++) { + JSONObject currtripEntry = vehiclesJsonArray.getJSONObject(i); + List vehiclesInfoList = new ArrayList<>(); + vehiclesInfoList.add(currtripEntry.getString("LineCode")); // parent line id of the station + vehiclesInfoList.add(currtripEntry.getString("LineName")); // parent line full name + vehiclesInfoList.add(currtripEntry.getString("ServiceType")); + // indicates if vehicle is a train or a bus. Train is "T", Bus is "B" + vehiclesInfoList.add(currtripEntry.getString("DirectionName")); // Vehicle display name + vehiclesInfoList.add(currtripEntry.getString("ScheduledDepartureTime")); + // vehicle scheduled departure time from this station + vehiclesInfoList.add(currtripEntry.getString("ComputedDepartureTime")); + // vehicle actual departure time from this station + vehiclesInfoList.add(currtripEntry.getString("TripNumber")); + // We could calculate delay based on Computed Departure time and Scheduled departure time of a Certain Vehicle + + vehiclesList.add(vehiclesInfoList); //add trainInfoList in trainList + + System.out.println(vehiclesInfoList); // For debugging purposes + + System.out.println(httpUrl); + } + return vehiclesList; // do not print this yet, wait for full change + + } catch (IOException | JSONException e) { + throw new RuntimeException(e); + } + + } +} From 397de09904e255b65e14c6c41e870931b0e007fc Mon Sep 17 00:00:00 2001 From: jacquelyn Date: Wed, 22 Nov 2023 17:20:18 -0500 Subject: [PATCH 28/41] updated StationInfo use case except Interactor --- .../StationInfoDataAccessInterface.java | 11 ++++++++ .../StationInfo/StationInfoInputBoundary.java | 5 ++++ .../StationInfo/StationInfoInputData.java | 9 ++++++ .../StationInfoOutputBoundary.java | 7 +++++ .../StationInfo/StationInfoOutputData.java | 28 +++++++++++++++++++ 5 files changed, 60 insertions(+) create mode 100644 src/use_case/StationInfo/StationInfoDataAccessInterface.java create mode 100644 src/use_case/StationInfo/StationInfoInputBoundary.java create mode 100644 src/use_case/StationInfo/StationInfoInputData.java create mode 100644 src/use_case/StationInfo/StationInfoOutputBoundary.java create mode 100644 src/use_case/StationInfo/StationInfoOutputData.java diff --git a/src/use_case/StationInfo/StationInfoDataAccessInterface.java b/src/use_case/StationInfo/StationInfoDataAccessInterface.java new file mode 100644 index 0000000..e0b91db --- /dev/null +++ b/src/use_case/StationInfo/StationInfoDataAccessInterface.java @@ -0,0 +1,11 @@ +package use_case.StationInfo; + +import entity.Station; + +public interface StationInfoDataAccessInterface { + + Station getStation(String inputStationName); + + String getStationId(String inputStationName); + // We might not need this since we could get station id from getStation(). +} diff --git a/src/use_case/StationInfo/StationInfoInputBoundary.java b/src/use_case/StationInfo/StationInfoInputBoundary.java new file mode 100644 index 0000000..f047318 --- /dev/null +++ b/src/use_case/StationInfo/StationInfoInputBoundary.java @@ -0,0 +1,5 @@ +package use_case.StationInfo; + +public interface StationInfoInputBoundary { + void execute(StationInfoInputData stationInfoInputData); +} diff --git a/src/use_case/StationInfo/StationInfoInputData.java b/src/use_case/StationInfo/StationInfoInputData.java new file mode 100644 index 0000000..e6343a3 --- /dev/null +++ b/src/use_case/StationInfo/StationInfoInputData.java @@ -0,0 +1,9 @@ +package use_case.StationInfo; + +public class StationInfoInputData { + final private String stationName; + + public StationInfoInputData(String stationName) {this.stationName = stationName;} + + String getStationName() {return stationName;} +} diff --git a/src/use_case/StationInfo/StationInfoOutputBoundary.java b/src/use_case/StationInfo/StationInfoOutputBoundary.java new file mode 100644 index 0000000..fcb2f66 --- /dev/null +++ b/src/use_case/StationInfo/StationInfoOutputBoundary.java @@ -0,0 +1,7 @@ +package use_case.StationInfo; + +public interface StationInfoOutputBoundary { + void prepareSuccessView(StationInfoOutputData stationInfoOutputData); + +// void parepareFailView(String error); // TODO: Implement later +} diff --git a/src/use_case/StationInfo/StationInfoOutputData.java b/src/use_case/StationInfo/StationInfoOutputData.java new file mode 100644 index 0000000..52d8285 --- /dev/null +++ b/src/use_case/StationInfo/StationInfoOutputData.java @@ -0,0 +1,28 @@ +package use_case.StationInfo; + +import java.util.List; + +public class StationInfoOutputData { + private final String stationName; + private final List> stationIncomingVehiclesInfo; + // the nested List is a list including parent line code, parent line name, vehicle type, + // vehicle display name, scheduled departure time, actual departure time and vehicle number + private final String vehicleDelay; + // We can calculate the delay from scheduled time and actual time based on a certain vehicle number + + public StationInfoOutputData(String stationName, + List> stationIncomingVehiclesInfo, + String vehicleDelay) { + this.stationName = stationName; + this.stationIncomingVehiclesInfo = stationIncomingVehiclesInfo; + this.vehicleDelay = vehicleDelay; + } + + public String getStationName() {return stationName;} + + public List> getStationIncomingVehiclesInfo() {return stationIncomingVehiclesInfo;} + + public String getVehicleDelay(String vehicleNumber) {return vehicleDelay;} + // + +} From 6101c97134aca390c3f41ca071f1b1631a252c7a Mon Sep 17 00:00:00 2001 From: jacquelyn Date: Sun, 26 Nov 2023 23:13:03 -0500 Subject: [PATCH 29/41] edited train related code based on api call change --- src/entity/Train.java | 50 ++++++++++++------- src/entity/TrainFactory.java | 6 ++- src/entity/TrainInterface.java | 8 +-- .../StationInfo/StationInfoInteractor.java | 41 +++++++++++++++ .../StationInfo/StationInfoOutputData.java | 11 ++-- 5 files changed, 85 insertions(+), 31 deletions(-) create mode 100644 src/use_case/StationInfo/StationInfoInteractor.java diff --git a/src/entity/Train.java b/src/entity/Train.java index 232a4c7..4199723 100644 --- a/src/entity/Train.java +++ b/src/entity/Train.java @@ -1,44 +1,51 @@ package entity; public class Train implements TrainInterface{ - private final String name; - private final String trainNumber; //trainNumber = tripNumber - private final String parentLine; - // Will have to decide if we need to have parentLine for a certain train + private final String lineName; //parent line name + private final String lineNumber; //lineNumber = lineCode + private final String trainName; + // train display name private final float latitude; private final float longitude; private final String scheduledTime; + private final String departureTime; + private final String tripNumber; private final String delay; /** * Requirement: Train name and trainNumber exist. * Note: trainNumber is tripNumber in GOtrainApiClass - * @param name - * @param trainNumber - * @param parentLine + * @param lineName + * @param lineNumber + * @param trainName * @param latitude * @param longitude * @param scheduledTime + * @param departureTime + * @param tripNumber * @param delay */ - Train(String name, String trainNumber, String parentLine, float latitude, float longitude, String scheduledTime, String delay) { - this.name = name; - this.trainNumber = trainNumber; - this.parentLine = parentLine; + Train(String lineName, String lineNumber, String trainName, float latitude, float longitude, + String scheduledTime, String departureTime, String tripNumber, String delay) { + this.lineName = lineName; + this.lineNumber = lineNumber; + this.trainName = trainName; this.latitude = latitude; this.longitude = longitude; this.scheduledTime = scheduledTime; + this.departureTime = departureTime; + this.tripNumber = tripNumber; this.delay = delay; } @Override - public String getNumber() { - return trainNumber; + public String getLineNumber() { + return lineNumber; } @Override - public String getName() { - return name; + public String getLineName() { + return lineName; } @Override @@ -52,16 +59,23 @@ public float getLongitude() { } @Override - public String getParentLine() { - return parentLine; + public String getTrainName() { + return trainName; } - // We don't really need parentLine for a train? @Override public String getScheduledTime() { return scheduledTime; } + @Override + public String getDepartureTime() { + return departureTime; + } + + @Override + public String getTripNumber(){return tripNumber;} + @Override public String getDelay() { return delay; diff --git a/src/entity/TrainFactory.java b/src/entity/TrainFactory.java index 4c04c8e..e2ae191 100644 --- a/src/entity/TrainFactory.java +++ b/src/entity/TrainFactory.java @@ -7,7 +7,9 @@ public class TrainFactory { * Provide a create method that could "construct" instances of Train without having us to call * the actual Train class constructor. **/ - public Train create (String name, String trainNumber, String parentLine, float latitude, float longitude, String scheduledTime, String delay) { - return new Train (name, trainNumber, parentLine, latitude, longitude, scheduledTime, delay); + public Train create (String lineName, String lineNumber, String trainName, float latitude, float longitude, + String scheduledTime, String departureTime, String tripNumber, String delay) { + return new Train (lineName, lineNumber, trainName, latitude, longitude, + scheduledTime, departureTime, tripNumber, delay); } } diff --git a/src/entity/TrainInterface.java b/src/entity/TrainInterface.java index c819458..3b1db75 100644 --- a/src/entity/TrainInterface.java +++ b/src/entity/TrainInterface.java @@ -1,17 +1,19 @@ package entity; public interface TrainInterface { - String getNumber(); + String getLineNumber(); - String getName(); + String getLineName(); float getLatitude(); float getLongitude(); - String getParentLine(); + String getTrainName(); String getScheduledTime(); + String getDepartureTime(); + String getTripNumber(); String getDelay(); } diff --git a/src/use_case/StationInfo/StationInfoInteractor.java b/src/use_case/StationInfo/StationInfoInteractor.java new file mode 100644 index 0000000..dfc20db --- /dev/null +++ b/src/use_case/StationInfo/StationInfoInteractor.java @@ -0,0 +1,41 @@ +package use_case.StationInfo; + +import entity.Station; +import entity.Vehicle; +import entity.VehicleFactory; +import use_case.search.SearchOutputData; + +import java.util.List; + +public class StationInfoInteractor implements StationInfoInputBoundary{ + final StationInfoDataAccessInterface stationInfoDataAccessObject; + final StationInfoOutputBoundary stationInfoPresenter; + final VehicleFactory vehicleFactory; + + //TODO: need to consider if we need vehicleFactory + public StationInfoInteractor(StationInfoDataAccessInterface stationInfoDataAccessInterface, + StationInfoOutputBoundary stationInfoOutputBoundary, + VehicleFactory vehicleFactory) { + this.stationInfoDataAccessObject = stationInfoDataAccessInterface; + this.stationInfoPresenter = stationInfoOutputBoundary; + this.vehicleFactory = vehicleFactory; + } + + @Override + public void execute(StationInfoInputData stationInfoInputData) { + // Creating a Station object using the station factory based on the name that the user input + Station station = stationInfoDataAccessObject.getStation(stationInfoInputData.getStationName()); + + // Packaging key details from the above Station object into a SearchOutputData object + List incomingVehicles = station.getIncomingVehicles(); + List> incomingVehiclesInfo; + for (vehicle : incomingVehicles) { + + String amenitiesListAsString = String.join(", ", amenitiesList); + SearchOutputData searchOutputData = new SearchOutputData(station.getName(), station.getParentLine(), amenitiesListAsString); + + // return the output data to the user + stationPresenter.prepareSuccessView(searchOutputData); + } + } +} diff --git a/src/use_case/StationInfo/StationInfoOutputData.java b/src/use_case/StationInfo/StationInfoOutputData.java index 52d8285..83e95fc 100644 --- a/src/use_case/StationInfo/StationInfoOutputData.java +++ b/src/use_case/StationInfo/StationInfoOutputData.java @@ -6,23 +6,18 @@ public class StationInfoOutputData { private final String stationName; private final List> stationIncomingVehiclesInfo; // the nested List is a list including parent line code, parent line name, vehicle type, - // vehicle display name, scheduled departure time, actual departure time and vehicle number - private final String vehicleDelay; - // We can calculate the delay from scheduled time and actual time based on a certain vehicle number + // vehicle display name, scheduled departure time, actual departure time, trip number and delay public StationInfoOutputData(String stationName, - List> stationIncomingVehiclesInfo, - String vehicleDelay) { + List> stationIncomingVehiclesInfo) { this.stationName = stationName; this.stationIncomingVehiclesInfo = stationIncomingVehiclesInfo; - this.vehicleDelay = vehicleDelay; } public String getStationName() {return stationName;} public List> getStationIncomingVehiclesInfo() {return stationIncomingVehiclesInfo;} - public String getVehicleDelay(String vehicleNumber) {return vehicleDelay;} - // + } From 216b33cea248a885ff48d1aa496d9616cf3f8169 Mon Sep 17 00:00:00 2001 From: jacquelyn Date: Sun, 26 Nov 2023 23:35:38 -0500 Subject: [PATCH 30/41] changed List incomingVehicleList into List type in Station.java because we haven't implemented Vehicle Class. Completed StationInfoInteractor --- src/entity/Station.java | 13 +++++-- .../StationInfo/StationInfoInteractor.java | 37 +++++++++++++++---- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/entity/Station.java b/src/entity/Station.java index 7fc4f19..7d42bec 100644 --- a/src/entity/Station.java +++ b/src/entity/Station.java @@ -9,7 +9,10 @@ public class Station implements StationInterface{ private final float latitude; private final float longitude; private List amenitiesList; //TODO: Due to this variable being assigned a valid value AFTER initial text file is read, we need to make this non-final. But this violates CAE? - private final List incomingVehicles; + + private final List incomingVehicles; + // used to be: private final List incomingVehicles; + // will change to the original one after implementing Vehicle class. /** * Requirement: stationId and name exist. @@ -22,7 +25,8 @@ public class Station implements StationInterface{ * @param incomingVehicles */ - Station(String name, String stationId, String parentLine, float latitude, float longitude, List amenitiesList, List incomingVehicles) { + Station(String name, String stationId, String parentLine, float latitude, float longitude, List amenitiesList, List incomingVehicles) { + //String name, String stationId, String parentLine, float latitude, float longitude, List amenitiesList, List incomingVehicles this.stationId = stationId; this.name = name; this.parentLine = parentLine; @@ -67,7 +71,10 @@ public void setAmenitiesList(List stationAmenitiesList) { } @Override - public List getIncomingVehicles() { + public List getIncomingVehicles() { return incomingVehicles; } +// public List getIncomingVehicles() { +// return incomingVehicles; +// } } \ No newline at end of file diff --git a/src/use_case/StationInfo/StationInfoInteractor.java b/src/use_case/StationInfo/StationInfoInteractor.java index dfc20db..e534358 100644 --- a/src/use_case/StationInfo/StationInfoInteractor.java +++ b/src/use_case/StationInfo/StationInfoInteractor.java @@ -4,7 +4,9 @@ import entity.Vehicle; import entity.VehicleFactory; import use_case.search.SearchOutputData; +import entity.Train; +import java.util.ArrayList; import java.util.List; public class StationInfoInteractor implements StationInfoInputBoundary{ @@ -27,15 +29,34 @@ public void execute(StationInfoInputData stationInfoInputData) { Station station = stationInfoDataAccessObject.getStation(stationInfoInputData.getStationName()); // Packaging key details from the above Station object into a SearchOutputData object - List incomingVehicles = station.getIncomingVehicles(); - List> incomingVehiclesInfo; - for (vehicle : incomingVehicles) { - - String amenitiesListAsString = String.join(", ", amenitiesList); - SearchOutputData searchOutputData = new SearchOutputData(station.getName(), station.getParentLine(), amenitiesListAsString); + List incomingVehicles = station.getIncomingVehicles(); + // List will change into List after implementing Vehicle class. + List> incomingVehiclesInfo = new ArrayList<>(); + + // We want to show train display name, scheduled time, departure time and delay + for (int i = 0; i < incomingVehicles.size(); i++) { + List vehicleinfo = new ArrayList<>(); + String vehicleName = incomingVehicles.get(i).getTrainName(); + String vehicleScheduledTime = incomingVehicles.get(i).getScheduledTime(); + String vehicleDepartureTime = incomingVehicles.get(i).getDepartureTime(); + String vehicleDelay = incomingVehicles.get(i).getDelay(); + vehicleinfo.add(vehicleName); + vehicleinfo.add(vehicleScheduledTime); + vehicleinfo.add(vehicleDepartureTime); + vehicleinfo.add(vehicleDelay); + incomingVehiclesInfo.add(vehicleinfo); + } + +// String incomingVehicleListAsString; +// for (List i : incomingVehiclesInfo) { +// incomingVehicleListAsString = String.join("\n", i); +// } +// Do not need to convert to String + + StationInfoOutputData stationInfoOutputData = new StationInfoOutputData(station.getName(), incomingVehiclesInfo); // return the output data to the user - stationPresenter.prepareSuccessView(searchOutputData); + stationInfoPresenter.prepareSuccessView(stationInfoOutputData); } - } + } From 20190f4801fd05ceb23f44342b92e02b195f1013 Mon Sep 17 00:00:00 2001 From: jacquelyn Date: Sun, 26 Nov 2023 23:57:19 -0500 Subject: [PATCH 31/41] updated ShowIncomingVehiclesState for StationInfoPresenter --- .../ShowIncomingVehiclesState.java | 27 +++++++++++++++ .../station_info/StationInfoController.java | 4 +++ .../station_info/StationInfoPresenter.java | 34 +++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 src/interface_adapter/station_info/StationInfoController.java create mode 100644 src/interface_adapter/station_info/StationInfoPresenter.java diff --git a/src/interface_adapter/show_incoming_vehicles/ShowIncomingVehiclesState.java b/src/interface_adapter/show_incoming_vehicles/ShowIncomingVehiclesState.java index 905764a..46e5f84 100644 --- a/src/interface_adapter/show_incoming_vehicles/ShowIncomingVehiclesState.java +++ b/src/interface_adapter/show_incoming_vehicles/ShowIncomingVehiclesState.java @@ -1,4 +1,31 @@ package interface_adapter.show_incoming_vehicles; +import interface_adapter.station_info.StationInfoState; + +import java.util.List; + public class ShowIncomingVehiclesState { + private String stationName; + private List> incomingVehiclesInfo; //TODO: Tentative type for incomingVehiclesInfo + + //TODO: If this "copy" constructor is unused, delete in the final project implementation + public ShowIncomingVehiclesState(ShowIncomingVehiclesState copy) { + stationName = copy.stationName; + incomingVehiclesInfo = copy.incomingVehiclesInfo; + } + + public ShowIncomingVehiclesState() {} + + public String getStateStationName(){return stationName;} + + public void setStateStationName(String stationName) { + this.stationName = stationName; + } + + //TODO: This is a MOCK change to the state, where the incomingVehiclesList is converted to a string format + // Ideally, we want to seperate and print each entry + public List> getStateIncomingVehiclesList() {return incomingVehiclesInfo;} + public void setStateIncomingVehiclesList(List> incomingVehiclesInfoList){ + this.incomingVehiclesInfo = incomingVehiclesInfoList; + } } diff --git a/src/interface_adapter/station_info/StationInfoController.java b/src/interface_adapter/station_info/StationInfoController.java new file mode 100644 index 0000000..4ee50b5 --- /dev/null +++ b/src/interface_adapter/station_info/StationInfoController.java @@ -0,0 +1,4 @@ +package interface_adapter.station_info; + +public class StationInfoController { +} diff --git a/src/interface_adapter/station_info/StationInfoPresenter.java b/src/interface_adapter/station_info/StationInfoPresenter.java new file mode 100644 index 0000000..25d068d --- /dev/null +++ b/src/interface_adapter/station_info/StationInfoPresenter.java @@ -0,0 +1,34 @@ +package interface_adapter.station_info; + +import interface_adapter.ViewManagerModel; +import interface_adapter.show_incoming_vehicles.ShowIncomingVehiclesState; +import interface_adapter.show_incoming_vehicles.ShowIncomingVehiclesViewModel; +import use_case.StationInfo.StationInfoOutputBoundary; +import use_case.StationInfo.StationInfoOutputData; + +public class StationInfoPresenter implements StationInfoOutputBoundary { + private final StationInfoViewModel stationInfoViewModel; + private final ShowIncomingVehiclesViewModel showIncomingVehiclesoViewModel; + private final ViewManagerModel viewManagerModel; + + public StationInfoPresenter(StationInfoViewModel stationInfoViewModel, + ShowIncomingVehiclesViewModel showIncomingVehiclesViewModel, + ViewManagerModel viewManagerModel) { + this.stationInfoViewModel = stationInfoViewModel; + this.showIncomingVehiclesoViewModel = showIncomingVehiclesViewModel; + this.viewManagerModel = viewManagerModel; + } + @Override + public void prepareSuccessView(StationInfoOutputData response) { + // On success, switch to show incoming vehicles view. + + ShowIncomingVehiclesState showIncomingVehiclesState = ShowIncomingVehiclesViewModel.getState(); +// loginState.setUsername(response.getUsername()); +// this.loginViewModel.setState(loginState); +// loginViewModel.firePropertyChanged(); +// +// viewManagerModel.setActiveView(loginViewModel.getViewName()); +// viewManagerModel.firePropertyChanged(); + //TODO: implement show incoming vehicles first + } +} From aa3c1cf696d116afcde46c9851cd2d8cc9cf8b1d Mon Sep 17 00:00:00 2001 From: jacquelyn Date: Mon, 27 Nov 2023 00:39:15 -0500 Subject: [PATCH 32/41] Added ShowIncomingVehiclesView --- src/view/ShowIncomingVehiclesView.java | 53 ++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/view/ShowIncomingVehiclesView.java diff --git a/src/view/ShowIncomingVehiclesView.java b/src/view/ShowIncomingVehiclesView.java new file mode 100644 index 0000000..20329e4 --- /dev/null +++ b/src/view/ShowIncomingVehiclesView.java @@ -0,0 +1,53 @@ +package view; + +import interface_adapter.show_incoming_vehicles.ShowIncomingVehiclesState; +import interface_adapter.show_incoming_vehicles.ShowIncomingVehiclesViewModel; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +public class ShowIncomingVehiclesView extends JPanel implements ActionListener, PropertyChangeListener { + public final String viewName = "show_incoming_vehicles"; + private final ShowIncomingVehiclesViewModel showIncomingVehiclesViewModel; + JLabel stationName; + JLabel stationIncomingVehicles; + + public ShowIncomingVehiclesView(ShowIncomingVehiclesViewModel showIncomingVehiclesViewModel) { + this.showIncomingVehiclesViewModel = showIncomingVehiclesViewModel; + this.showIncomingVehiclesViewModel.addPropertyChangeListener(this); + + JLabel title = new JLabel("Incoming Vehicles Screen"); + title.setAlignmentX(Component.CENTER_ALIGNMENT); + + JLabel stationNameLabel = new JLabel("Station name: "); + stationName = new JLabel(); + + JLabel stationIncomingVehiclesLabel = new JLabel("Incoming Vehicles: "); + stationIncomingVehicles = new JLabel(); + + this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + this.add(title); + this.add(stationNameLabel); + this.add(stationName); + this.add(stationIncomingVehiclesLabel); + this.add(stationIncomingVehicles); + } + + @Override + public void actionPerformed(ActionEvent e) { + System.out.println("Click " + e.getActionCommand()); + } + @Override + public void propertyChange(PropertyChangeEvent evt) { + //System.out.println("Reached"); //Commented out for testing purposes + ShowIncomingVehiclesState state = (ShowIncomingVehiclesState) evt.getNewValue(); + stationName.setText(state.getStateStationName()); + stationIncomingVehicles.setText(state.getStateIncomingVehiclesList().toString()); + //TODO: Should we make incoming vehicles a String instead of a list? + } + +} From 03b1bccf5a8bf42d99f0172744315d45386b015b Mon Sep 17 00:00:00 2001 From: jacquelyn Date: Mon, 27 Nov 2023 00:48:30 -0500 Subject: [PATCH 33/41] implemented ShowIncomingVehiclesViewModel and StationInfoPresenter --- .../ShowIncomingVehiclesViewModel.java | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/interface_adapter/show_incoming_vehicles/ShowIncomingVehiclesViewModel.java b/src/interface_adapter/show_incoming_vehicles/ShowIncomingVehiclesViewModel.java index 5d210ee..d513d25 100644 --- a/src/interface_adapter/show_incoming_vehicles/ShowIncomingVehiclesViewModel.java +++ b/src/interface_adapter/show_incoming_vehicles/ShowIncomingVehiclesViewModel.java @@ -1,4 +1,35 @@ package interface_adapter.show_incoming_vehicles; -public class ShowIncomingVehiclesViewModel { +import interface_adapter.ViewModel; +import interface_adapter.search.SearchState; + +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; + +public class ShowIncomingVehiclesViewModel extends ViewModel { + public final String TITLE_LABEL = "Station Incoming Vehicles View"; + + private ShowIncomingVehiclesState state = new ShowIncomingVehiclesState(); + + + public ShowIncomingVehiclesViewModel() {super("show_incoming_vehicles");} + + public void setState(ShowIncomingVehiclesState state) { + this.state = state; + } + + private final PropertyChangeSupport support = new PropertyChangeSupport(this); + + public void firePropertyChanged() { + support.firePropertyChange("state", null, this.state); + } + + @Override + public void addPropertyChangeListener(PropertyChangeListener listener) { + support.addPropertyChangeListener(listener); + } + + public ShowIncomingVehiclesState getState() { + return state; + } } From 55c3a4ace45cef7c0168774145bdbf6433527008 Mon Sep 17 00:00:00 2001 From: jacquelyn Date: Mon, 27 Nov 2023 01:06:32 -0500 Subject: [PATCH 34/41] implemented StationInfoController, StationInfoUseCaseFactory. Finished StationInfoPresenter. Deleted VehicleFactory in StationInfoInteractor. Added StationInfoController in StationInfoView. --- src/app/StationInfoUseCaseFactory.java | 54 +++++++++++++++++++ .../station_info/StationInfoController.java | 13 +++++ .../station_info/StationInfoPresenter.java | 23 ++++---- .../StationInfo/StationInfoInteractor.java | 5 +- src/view/StationInfoView.java | 7 +-- 5 files changed, 85 insertions(+), 17 deletions(-) create mode 100644 src/app/StationInfoUseCaseFactory.java diff --git a/src/app/StationInfoUseCaseFactory.java b/src/app/StationInfoUseCaseFactory.java new file mode 100644 index 0000000..0620657 --- /dev/null +++ b/src/app/StationInfoUseCaseFactory.java @@ -0,0 +1,54 @@ +package app; + +import interface_adapter.ViewManagerModel; +import interface_adapter.show_incoming_vehicles.ShowIncomingVehiclesViewModel; +import interface_adapter.station_info.StationInfoController; +import interface_adapter.station_info.StationInfoPresenter; +import interface_adapter.station_info.StationInfoViewModel; +import use_case.StationInfo.StationInfoDataAccessInterface; +import use_case.StationInfo.StationInfoInputBoundary; +import use_case.StationInfo.StationInfoInteractor; +import use_case.StationInfo.StationInfoOutputBoundary; +import view.StationInfoView; + +import javax.swing.*; +import java.io.IOException; + +public class StationInfoUseCaseFactory { + + /** Prevent instantiation. */ + private StationInfoUseCaseFactory() {} + + public static StationInfoView create( + ViewManagerModel viewManagerModel, + StationInfoViewModel stationInfoViewModel, + StationInfoDataAccessInterface stationInfoDataAccessObject, + ShowIncomingVehiclesViewModel showIncomingVehiclesViewModel) { + + try { + StationInfoController stationInfoController = createStationInfoUseCase(viewManagerModel, + stationInfoViewModel, stationInfoDataAccessObject, showIncomingVehiclesViewModel); + return new StationInfoView(stationInfoViewModel, stationInfoController); + } catch (IOException e) { + JOptionPane.showMessageDialog(null, "Could not open user data file."); + } + + return null; + } + + private static StationInfoController createStationInfoUseCase( + ViewManagerModel viewManagerModel, + StationInfoViewModel stationInfoViewModel, + StationInfoDataAccessInterface stationInfoDataAccessObject, + ShowIncomingVehiclesViewModel showIncomingVehiclesViewModel) throws IOException { + + // Notice how we pass this method's parameters to the Presenter. + StationInfoOutputBoundary stationInfoOutputBoundary = new StationInfoPresenter(stationInfoViewModel, + showIncomingVehiclesViewModel, viewManagerModel); + + StationInfoInputBoundary stationInfoInteractor = new StationInfoInteractor( + stationInfoDataAccessObject, stationInfoOutputBoundary); + + return new StationInfoController(stationInfoInteractor); + } +} diff --git a/src/interface_adapter/station_info/StationInfoController.java b/src/interface_adapter/station_info/StationInfoController.java index 4ee50b5..38f03ad 100644 --- a/src/interface_adapter/station_info/StationInfoController.java +++ b/src/interface_adapter/station_info/StationInfoController.java @@ -1,4 +1,17 @@ package interface_adapter.station_info; +import use_case.StationInfo.StationInfoInputBoundary; +import use_case.StationInfo.StationInfoInputData; + public class StationInfoController { + final StationInfoInputBoundary stationInfoUseCaseInteractor; + + public StationInfoController(StationInfoInputBoundary stationInfoUseCaseInteractor) { + this.stationInfoUseCaseInteractor = stationInfoUseCaseInteractor; + } + + public void execute(String stationName) { + StationInfoInputData stationInfoInputData = new StationInfoInputData(stationName); + stationInfoUseCaseInteractor.execute(stationInfoInputData); + } } diff --git a/src/interface_adapter/station_info/StationInfoPresenter.java b/src/interface_adapter/station_info/StationInfoPresenter.java index 25d068d..b065921 100644 --- a/src/interface_adapter/station_info/StationInfoPresenter.java +++ b/src/interface_adapter/station_info/StationInfoPresenter.java @@ -8,27 +8,30 @@ public class StationInfoPresenter implements StationInfoOutputBoundary { private final StationInfoViewModel stationInfoViewModel; - private final ShowIncomingVehiclesViewModel showIncomingVehiclesoViewModel; + private final ShowIncomingVehiclesViewModel showIncomingVehiclesViewModel; private final ViewManagerModel viewManagerModel; public StationInfoPresenter(StationInfoViewModel stationInfoViewModel, ShowIncomingVehiclesViewModel showIncomingVehiclesViewModel, ViewManagerModel viewManagerModel) { this.stationInfoViewModel = stationInfoViewModel; - this.showIncomingVehiclesoViewModel = showIncomingVehiclesViewModel; + this.showIncomingVehiclesViewModel = showIncomingVehiclesViewModel; this.viewManagerModel = viewManagerModel; } @Override public void prepareSuccessView(StationInfoOutputData response) { + StationInfoState stationInfoState = stationInfoViewModel.getState(); + stationInfoState.setStateStationName(response.getStationName()); + // On success, switch to show incoming vehicles view. - ShowIncomingVehiclesState showIncomingVehiclesState = ShowIncomingVehiclesViewModel.getState(); -// loginState.setUsername(response.getUsername()); -// this.loginViewModel.setState(loginState); -// loginViewModel.firePropertyChanged(); -// -// viewManagerModel.setActiveView(loginViewModel.getViewName()); -// viewManagerModel.firePropertyChanged(); - //TODO: implement show incoming vehicles first + ShowIncomingVehiclesState showIncomingVehiclesState = showIncomingVehiclesViewModel.getState(); + showIncomingVehiclesState.setStateStationName(response.getStationName()); + showIncomingVehiclesState.setStateIncomingVehiclesList(response.getStationIncomingVehiclesInfo()); + this.showIncomingVehiclesViewModel.setState(showIncomingVehiclesState); + showIncomingVehiclesViewModel.firePropertyChanged(); + + viewManagerModel.setActiveView(showIncomingVehiclesViewModel.getViewName()); + viewManagerModel.firePropertyChanged(); } } diff --git a/src/use_case/StationInfo/StationInfoInteractor.java b/src/use_case/StationInfo/StationInfoInteractor.java index e534358..aca7df5 100644 --- a/src/use_case/StationInfo/StationInfoInteractor.java +++ b/src/use_case/StationInfo/StationInfoInteractor.java @@ -12,15 +12,12 @@ public class StationInfoInteractor implements StationInfoInputBoundary{ final StationInfoDataAccessInterface stationInfoDataAccessObject; final StationInfoOutputBoundary stationInfoPresenter; - final VehicleFactory vehicleFactory; //TODO: need to consider if we need vehicleFactory public StationInfoInteractor(StationInfoDataAccessInterface stationInfoDataAccessInterface, - StationInfoOutputBoundary stationInfoOutputBoundary, - VehicleFactory vehicleFactory) { + StationInfoOutputBoundary stationInfoOutputBoundary) { this.stationInfoDataAccessObject = stationInfoDataAccessInterface; this.stationInfoPresenter = stationInfoOutputBoundary; - this.vehicleFactory = vehicleFactory; } @Override diff --git a/src/view/StationInfoView.java b/src/view/StationInfoView.java index b993270..b14c10f 100644 --- a/src/view/StationInfoView.java +++ b/src/view/StationInfoView.java @@ -7,7 +7,7 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import interface_adapter.show_incoming_vehicles.ShowIncomingVehiclesState; +import interface_adapter.station_info.StationInfoController; import interface_adapter.station_info.StationInfoState; import interface_adapter.station_info.StationInfoViewModel; @@ -22,8 +22,9 @@ public class StationInfoView extends JPanel implements ActionListener, PropertyC /** * A window with a title and a JButton. */ - public StationInfoView(StationInfoViewModel stationInfoViewModel) { + public StationInfoView(StationInfoViewModel stationInfoViewModel, StationInfoController stationInfoController) { this.stationInfoViewModel = stationInfoViewModel; + this.stationInfoController = stationInfoController; this.stationInfoViewModel.addPropertyChangeListener(this); JLabel title = new JLabel("Station info screen"); @@ -44,7 +45,7 @@ public void actionPerformed(ActionEvent e) { if (e.getSource().equals(show_incoming_vehicles)) { StationInfoState currentState = stationInfoViewModel.getState(); - stationInfoController.execute( + StationInfoView.this.stationInfoController.execute( currentState.getStateStationName() ); } From 14d6105d64b2e86d342a4c69ea43579ada0f56e5 Mon Sep 17 00:00:00 2001 From: jacquelyn Date: Mon, 27 Nov 2023 01:16:27 -0500 Subject: [PATCH 35/41] let FileStationDataAccessObject implement StationInfoDataAccessInterface --- src/data_access/FileStationDataAccessObject.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/data_access/FileStationDataAccessObject.java b/src/data_access/FileStationDataAccessObject.java index c84a52f..deceb2e 100644 --- a/src/data_access/FileStationDataAccessObject.java +++ b/src/data_access/FileStationDataAccessObject.java @@ -2,6 +2,7 @@ import entity.Vehicle; import entity.StationFactory; +import use_case.StationInfo.StationInfoDataAccessInterface; import use_case.search.SearchDataAccessInterface; import java.io.*; @@ -12,7 +13,7 @@ // We will name it as FileStationDataAccessObject for now. When we start to implement vehicles, we will change it as requires // We might need to create different DA0 java files based on what data we are pulling (station, train or bus) -public class FileStationDataAccessObject implements SearchDataAccessInterface { +public class FileStationDataAccessObject implements SearchDataAccessInterface, StationInfoDataAccessInterface { private final File stationTxtFile; private final Map stations = new HashMap<>(); private final StationFactory stationFactory; @@ -54,6 +55,11 @@ public Station getStation (String inputStationName) { return stations.get(inputStationName); } + @Override + public String getStationId(String inputStationName) { + return stations.get(inputStationName).getId(); + } + @Override public String getStationParentLine(String inputStationName) { From a7c3c65aa2bba54556d8f00dbbfaa157d0ee6545 Mon Sep 17 00:00:00 2001 From: jacquelyn Date: Mon, 27 Nov 2023 01:23:59 -0500 Subject: [PATCH 36/41] added stationinfo related code in Main --- src/app/Main.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/app/Main.java b/src/app/Main.java index 56f564a..f11a4d9 100644 --- a/src/app/Main.java +++ b/src/app/Main.java @@ -5,6 +5,8 @@ import entity.StationFactory; import interface_adapter.search.SearchViewModel; import interface_adapter.ViewManagerModel; +import interface_adapter.show_incoming_vehicles.ShowIncomingVehiclesState; +import interface_adapter.show_incoming_vehicles.ShowIncomingVehiclesViewModel; import interface_adapter.station_info.StationInfoViewModel; import view.SearchPanelView; import view.StationInfoView; @@ -39,6 +41,8 @@ public static void main(String[] args) { // be observed by the Views. SearchViewModel searchViewModel = new SearchViewModel(); StationInfoViewModel stationInfoViewModel = new StationInfoViewModel(); + ShowIncomingVehiclesViewModel showIncomingVehiclesViewModel = new ShowIncomingVehiclesViewModel(); + // Creating a DAO called stationDataAccessObject by reading from file revisedStopData.txt, with the creation of the object being done by StationFactory() // Note: This process is wrapped in a try-catch block since it is possible that the code throws out an IOException (occurs when the txt file being read does not exist) @@ -59,7 +63,7 @@ public static void main(String[] args) { // Creating an instance of StationInfoView. Note: Although this view should have its own use case, for now, since we are NOT displaying other data besides the station name, there is no useCaseFactory for this case // This View is only linked to transition from the SearchPanelView (once the other use case are integrated into this view, this will NO LONGER be the case) - StationInfoView stationInfoView = new StationInfoView(stationInfoViewModel); + StationInfoView stationInfoView = StationInfoUseCaseFactory.create(viewManagerModel, stationInfoViewModel, stationDataAccessObject, showIncomingVehiclesViewModel); views.add(stationInfoView, stationInfoView.viewName); // When initially booting up the application, the stationPanel is the 1st panel displayed to viewers. From 8419d744c80d11b95fcb4fdb60413fa3e9ceb9d4 Mon Sep 17 00:00:00 2001 From: jacquelyn Date: Mon, 27 Nov 2023 02:10:32 -0500 Subject: [PATCH 37/41] Tentative change for incomingVehicles class (changed it from Vehicle to Train). Will change it back once we finish implementing Vehicle class --- src/data_access/FileStationDataAccessObject.java | 3 ++- .../text_file/FileStationDataAccessObject.java | 11 +++++++++-- src/entity/StationFactory.java | 2 +- src/entity/StationInterface.java | 2 +- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/data_access/FileStationDataAccessObject.java b/src/data_access/FileStationDataAccessObject.java index deceb2e..af1ee2f 100644 --- a/src/data_access/FileStationDataAccessObject.java +++ b/src/data_access/FileStationDataAccessObject.java @@ -1,5 +1,6 @@ package data_access; +import entity.Train; import entity.Vehicle; import entity.StationFactory; import use_case.StationInfo.StationInfoDataAccessInterface; @@ -38,7 +39,7 @@ public FileStationDataAccessObject(String txtFilePath, StationFactory stationFac Float parsedStationLongtitude = Float.valueOf(parsedStationInfo[3]); List parsedStationAmenities = new ArrayList(); //TODO: empty at the time of reading txt file, this will be populated through API calls - List parsedStationVehicles = new ArrayList(); //TODO: empty at the time of reading txt file, this will be populated through API calls + List parsedStationVehicles = new ArrayList(); //TODO: empty at the time of reading txt file, this will be populated through API calls // For reference, here are the order of arguments in order to pass into stationFactory.create(): //(name, stationId, parentLine, latitude, longitude, amenitiesList, incomingVehicles) diff --git a/src/data_access/text_file/FileStationDataAccessObject.java b/src/data_access/text_file/FileStationDataAccessObject.java index f96785b..f3925ed 100644 --- a/src/data_access/text_file/FileStationDataAccessObject.java +++ b/src/data_access/text_file/FileStationDataAccessObject.java @@ -1,8 +1,10 @@ package data_access.text_file; import data_access.API.GOStationApiClass; +import entity.Train; import entity.Vehicle; import entity.StationFactory; +import use_case.StationInfo.StationInfoDataAccessInterface; import use_case.search.SearchDataAccessInterface; import java.io.*; @@ -13,7 +15,7 @@ // We will name it as FileStationDataAccessObject for now. When we start to implement vehicles, we will change it as requires // We might need to create different DA0 java files based on what data we are pulling (station, train or bus) -public class FileStationDataAccessObject implements SearchDataAccessInterface { +public class FileStationDataAccessObject implements SearchDataAccessInterface, StationInfoDataAccessInterface { private final File stationTxtFile; private final Map stations = new HashMap<>(); private final StationFactory stationFactory; @@ -41,7 +43,7 @@ public FileStationDataAccessObject(String txtFilePath, StationFactory stationFac Float parsedStationLongtitude = Float.valueOf(parsedStationInfo[3]); List parsedStationAmenities = new ArrayList(); //This is empty at the time of reading txt file, this will be populated through API calls - List parsedStationVehicles = new ArrayList(); //This is empty at the time of reading txt file, this will be populated through API calls + List parsedStationVehicles = new ArrayList(); //This is empty at the time of reading txt file, this will be populated through API calls // For reference, here are the order of arguments in order to pass into stationFactory.create(): //(name, stationId, parentLine, latitude, longitude, amenitiesList, incomingVehicles) @@ -64,6 +66,11 @@ public Station getStation (String inputStationName) { return stations.get(inputStationName); } + @Override + public String getStationId(String inputStationName) { + return (stations.get(inputStationName)).getId(); + } + @Override public String getStationParentLine(String inputStationName) { diff --git a/src/entity/StationFactory.java b/src/entity/StationFactory.java index 7bdf8fd..88bfc7f 100644 --- a/src/entity/StationFactory.java +++ b/src/entity/StationFactory.java @@ -13,7 +13,7 @@ public class StationFactory { without having us to call the actual Station class constructor. That way, we can keep the constructor as "default access" rather than making it "public" for files like FileStationDataAccessObject.java to use (making it public will break CAE principles). */ - public Station create (String name, String stationId, String parentLine, float latitude, float longitude, List amenitiesList, List incomingVehicles) { + public Station create (String name, String stationId, String parentLine, float latitude, float longitude, List amenitiesList, List incomingVehicles) { return new Station (name, stationId, parentLine, latitude, longitude, amenitiesList, incomingVehicles); } diff --git a/src/entity/StationInterface.java b/src/entity/StationInterface.java index bca8570..6682fc6 100644 --- a/src/entity/StationInterface.java +++ b/src/entity/StationInterface.java @@ -16,6 +16,6 @@ public interface StationInterface { List getAmenitiesList(); - List getIncomingVehicles(); + List getIncomingVehicles(); } From 70d091a17afa66e98a70fc917f6596e26066af86 Mon Sep 17 00:00:00 2001 From: arandaaron04 Date: Mon, 27 Nov 2023 14:41:10 -0500 Subject: [PATCH 38/41] GOVehiclePositionApiClass.java JavaDocs added. --- src/data_access/API/GOVehiclePositionApiClass.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/data_access/API/GOVehiclePositionApiClass.java b/src/data_access/API/GOVehiclePositionApiClass.java index 268a17a..3ec2887 100644 --- a/src/data_access/API/GOVehiclePositionApiClass.java +++ b/src/data_access/API/GOVehiclePositionApiClass.java @@ -17,6 +17,13 @@ public class GOVehiclePositionApiClass implements TrainApiInterface { private final String PARTIAL_API_URL = "OpenDataAPI/api/V1"; public GOVehiclePositionApiClass () { } + + /** + * Searches for the current position of a train. + * + * @param stationId + * @return return the longitude and latitude + */ public List retrieveVehiclePosition(String stationId){ OkHttpClient client = new OkHttpClient().newBuilder() .build(); @@ -35,6 +42,10 @@ public List retrieveVehiclePosition(String stationId){ .url(httpUrl) .addHeader("content-type", "application/json") .build(); + + /** + * Search for longitude and latitude + */ try { Response response = client.newCall(request).execute(); String vehiclePositionJsonData = response.body().string(); From 02979497e449bf389b34a4621c4d76ffdfdd75a6 Mon Sep 17 00:00:00 2001 From: arandaaron04 Date: Mon, 27 Nov 2023 14:43:30 -0500 Subject: [PATCH 39/41] GOTrainsApiClass.java created. --- src/data_access/API/GOTrainsApiClass.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/data_access/API/GOTrainsApiClass.java diff --git a/src/data_access/API/GOTrainsApiClass.java b/src/data_access/API/GOTrainsApiClass.java new file mode 100644 index 0000000..c253f8d --- /dev/null +++ b/src/data_access/API/GOTrainsApiClass.java @@ -0,0 +1,4 @@ +package data_access.API; + +public class GOTrainsApiClass { +} From f7381606835f6ddadb73be39977e8d8aa9a24095 Mon Sep 17 00:00:00 2001 From: arandaaron04 Date: Mon, 27 Nov 2023 14:44:02 -0500 Subject: [PATCH 40/41] GOTrainsApiClass.java updated. --- src/data_access/API/GOTrainsApiClass.java | 57 ++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/src/data_access/API/GOTrainsApiClass.java b/src/data_access/API/GOTrainsApiClass.java index c253f8d..da90507 100644 --- a/src/data_access/API/GOTrainsApiClass.java +++ b/src/data_access/API/GOTrainsApiClass.java @@ -1,4 +1,59 @@ package data_access.API; -public class GOTrainsApiClass { +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class GOTrainsApiClass implements TrainApiInterface { + + private final String PARTIAL_API_URL = "OpenDataAPI/api/V1"; + public GOTrainsApiClass () { + } + public List retrieveTrains(String stationId){ + OkHttpClient client = new OkHttpClient().newBuilder() + .build(); + HttpUrl httpUrl = new HttpUrl.Builder() + .scheme("http") + .host("api.openmetrolinx.com") + .addPathSegment(PARTIAL_API_URL) + .addPathSegment("ServiceataGlance") + .addPathSegment("Trains") + .addPathSegment("All") + // TODO: may need for future + // .addPathSegment(stationId) //getting station information for the station with the id denoted by stationId + .addQueryParameter("key", API_KEY) + .build(); + + Request request = new Request.Builder() + .url(httpUrl) + .addHeader("content-type", "application/json") + .build(); + try { + Response response = client.newCall(request).execute(); + String trainJsonData = response.body().string(); + JSONObject metaDataJsonObj = new JSONObject(trainJsonData); // This is where the Metadata is located at + JSONObject tripsJsonDataObj = metaDataJsonObj.getJSONObject("Trips"); + JSONArray tripJsonArray = tripsJsonDataObj.getJSONArray("Trip"); + List tripList = new ArrayList(); + for (int i = 0; i < tripJsonArray.length(); i++) { + JSONObject currTripEntry = tripJsonArray.getJSONObject(i); + tripList.add(currTripEntry.getString("id")); // left at "id" for now, to be changed to vehicle + //System.out.println(currAmenitiesEntry.getString("Description")); // For debugging purposes + System.out.println(httpUrl); + } + return tripList; // do not print this yet, wait for full change + + } catch (IOException | JSONException e) { + throw new RuntimeException(e); + } + + } } From 2fa40676fd3d1ad95abbbeb2a4346c72692b4e0f Mon Sep 17 00:00:00 2001 From: arandaaron04 Date: Mon, 27 Nov 2023 14:48:02 -0500 Subject: [PATCH 41/41] GOTrainsApiClass.java JavaDocs added. --- src/data_access/API/GOTrainsApiClass.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/data_access/API/GOTrainsApiClass.java b/src/data_access/API/GOTrainsApiClass.java index da90507..9b69592 100644 --- a/src/data_access/API/GOTrainsApiClass.java +++ b/src/data_access/API/GOTrainsApiClass.java @@ -17,6 +17,13 @@ public class GOTrainsApiClass implements TrainApiInterface { private final String PARTIAL_API_URL = "OpenDataAPI/api/V1"; public GOTrainsApiClass () { } + + /** + * Searches for all trains and their information including ID and position. + * + * @param stationId ID of station for incoming trains + * @return API information + */ public List retrieveTrains(String stationId){ OkHttpClient client = new OkHttpClient().newBuilder() .build(); @@ -36,6 +43,10 @@ public List retrieveTrains(String stationId){ .url(httpUrl) .addHeader("content-type", "application/json") .build(); + + /** + * Search for information + */ try { Response response = client.newCall(request).execute(); String trainJsonData = response.body().string();