From 9003e73bd2a802f242628293df42208542cf50d6 Mon Sep 17 00:00:00 2001
From: emtunhei <emtunhei@stud.ntnu.no>
Date: Thu, 24 Feb 2022 14:17:21 +0100
Subject: [PATCH] Updated the project structure and added comments

---
 .../java/com/application/Credentials.java     |   5 -
 src/main/java/com/application/DB/DB.java      |  78 ++++++++
 .../java/com/application/DataBase/DB.java     | 170 ------------------
 src/main/java/com/application/Main.java       |  27 +--
 .../classes/com/application/Credentials.class | Bin 370 -> 0 bytes
 .../classes/com/application/DataBase/DB.class | Bin 8779 -> 0 bytes
 target/classes/com/application/Main.class     | Bin 1550 -> 1568 bytes
 7 files changed, 94 insertions(+), 186 deletions(-)
 delete mode 100644 src/main/java/com/application/Credentials.java
 create mode 100644 src/main/java/com/application/DB/DB.java
 delete mode 100644 src/main/java/com/application/DataBase/DB.java
 delete mode 100644 target/classes/com/application/Credentials.class
 delete mode 100644 target/classes/com/application/DataBase/DB.class

diff --git a/src/main/java/com/application/Credentials.java b/src/main/java/com/application/Credentials.java
deleted file mode 100644
index e0898e7..0000000
--- a/src/main/java/com/application/Credentials.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.application;
-
-public class Credentials {
-    String projectId = "sf-drying-optimization";
-}
diff --git a/src/main/java/com/application/DB/DB.java b/src/main/java/com/application/DB/DB.java
new file mode 100644
index 0000000..4eed14a
--- /dev/null
+++ b/src/main/java/com/application/DB/DB.java
@@ -0,0 +1,78 @@
+package com.application.DB;
+
+import com.google.auth.oauth2.GoogleCredentials;
+import com.google.auth.oauth2.ServiceAccountCredentials;
+import com.google.cloud.bigquery.BigQuery;
+import com.google.cloud.bigquery.BigQueryOptions;
+import com.google.cloud.bigquery.FieldValueList;
+import com.google.cloud.bigquery.Job;
+import com.google.cloud.bigquery.JobInfo;
+import com.google.cloud.bigquery.QueryJobConfiguration;
+import com.google.cloud.bigquery.TableResult;
+
+import java.io.File;
+import java.io.FileInputStream;
+
+public class DB {
+
+    private static GoogleCredentials getCredentials() throws Exception {
+        File credentialsPath = new File(".\\src\\main\\resources\\com.application\\sf-drying-optimization-1e234ad2b0f4.json");
+
+        // Load credentials from JSON key file. If you can't set the GOOGLE_APPLICATION_CREDENTIALS
+        // environment variable, you can explicitly load the credentials file to construct the
+        // credentials.
+        GoogleCredentials credentials;
+        try (FileInputStream serviceAccountStream = new FileInputStream(credentialsPath)) {
+            credentials = ServiceAccountCredentials.fromStream(serviceAccountStream);
+        }
+        return credentials;
+    }
+
+    public static void getFromExistingTable() throws Exception {
+
+        // Step 1: Initialize BigQuery service
+        // Here we set our project ID and get the `BigQuery` service object
+        // this is the interface to our BigQuery instance that
+        // we use to execute jobs on
+        BigQuery bigquery = BigQueryOptions.newBuilder().
+                setCredentials(getCredentials()).
+                setProjectId("sf-drying-optimization")
+                .build().getService();
+
+        // Step 2: Prepare query job
+        // A "QueryJob" is a type of job that executes SQL queries
+        // we create a new job configuration from our SQL query and
+        final String GET_WORD_COUNT = "SELECT VariantValue, TimeStamp FROM sf-drying-optimization.124.int_sd_winccsensordata WHERE TimeStamp BETWEEN \"2020-06-09\" AND \"2020-06-29\" ORDER BY TimeStamp";
+
+                        QueryJobConfiguration queryConfig =
+                QueryJobConfiguration.newBuilder(GET_WORD_COUNT).build();
+
+        // Step 3: Run the job on BigQuery
+        // create a `Job` instance from the job configuration using the BigQuery service
+        // the job starts executing once the `create` method executes
+        Job queryJob = bigquery.create(JobInfo.newBuilder(queryConfig).build());
+        queryJob = queryJob.waitFor();
+        // the waitFor method blocks until the job completes
+        // and returns `null` if the job doesn't exist anymore
+        if (queryJob == null) {
+            throw new Exception("job no longer exists");
+        }
+        // once the job is done, check if any error occured
+        if (queryJob.getStatus().getError() != null) {
+            throw new Exception(queryJob.getStatus().getError().toString());
+        }
+
+        // Step 4: Display results
+        // Print out a header line, and iterate through the
+        // query results to print each result in a new line
+        System.out.println("Timestamp\tVarient value");
+        TableResult result = queryJob.getQueryResults();
+        for (FieldValueList row : result.iterateAll()) {
+            // We can use the `get` method along with the column
+            // name to get the corresponding row entry
+            int variantValue = row.get("VariantValue").getNumericValue().intValue();
+            String timeStamp = row.get("TimeStamp").getStringValue();
+            System.out.printf("%s\t%d\n", timeStamp, variantValue);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/application/DataBase/DB.java b/src/main/java/com/application/DataBase/DB.java
deleted file mode 100644
index fa8c89b..0000000
--- a/src/main/java/com/application/DataBase/DB.java
+++ /dev/null
@@ -1,170 +0,0 @@
-package com.application.DataBase;
-
-import com.application.Credentials;
-
-import com.google.auth.oauth2.GoogleCredentials;
-import com.google.auth.oauth2.ServiceAccountCredentials;
-import com.google.cloud.bigquery.BigQuery;
-import com.google.cloud.bigquery.BigQueryError;
-import com.google.cloud.bigquery.BigQueryOptions;
-import com.google.cloud.bigquery.FieldValueList;
-import com.google.cloud.bigquery.InsertAllRequest;
-import com.google.cloud.bigquery.InsertAllResponse;
-import com.google.cloud.bigquery.Job;
-import com.google.cloud.bigquery.JobInfo;
-import com.google.cloud.bigquery.QueryJobConfiguration;
-import com.google.cloud.bigquery.JobStatistics;
-import com.google.cloud.bigquery.TableResult;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.List;
-
-
-public class DB {
-
-    Credentials credentialsObject;
-
-    private static void insertSampleData() {
-        // Step 1: Initialize BigQuery service
-        BigQuery bigquery = BigQueryOptions.newBuilder().setProjectId("sf-drying-optimization")
-                .build().getService();
-
-        // Step 2: Create insertAll (streaming) request
-        InsertAllRequest insertAllRequest = getInsertRequest();
-
-        // Step 3: Insert data into table
-        InsertAllResponse response = bigquery.insertAll(insertAllRequest);
-
-        // Step 4: Check for errors and print results
-        if (response.hasErrors()) {
-            for (Map.Entry<Long, List<BigQueryError>> entry : response.getInsertErrors()
-                    .entrySet()) {
-                System.out.printf("error in entry %d: %s", entry.getKey(),
-                        entry.getValue().toString());
-            }
-            return;
-        }
-        System.out.println("inserted successfully");
-    }
-
-    // To create a streaming insert request, we need to specify the table and dataset id
-    // and create the rows we want to insert
-    private static InsertAllRequest getInsertRequest() {
-        String datasetId = "sample_dataset";
-        String tableId = "vegetables";
-        return InsertAllRequest.newBuilder(datasetId, tableId).addRow(getRow(1, "carrot"))
-                .addRow(getRow(2, "beans")).build();
-
-    }
-
-    // each row is a map with the row name as the key and row value as the value
-    // since the value type is "Object" it can take any arbitrary type, based on
-    // the datatype of the row defined on BigQuery
-    private static Map<String, Object> getRow(int id, String vegetableName) {
-        Map<String, Object> rowMap = new HashMap<String, Object>();
-        rowMap.put("id", id);
-        rowMap.put("name", vegetableName);
-        return rowMap;
-    }
-
-    public static void main(String... args) throws Exception {
-        getFromExistingTable();
-    }
-
-    public static GoogleCredentials getCredentials() throws Exception {
-        File credentialsPath = new File(".\\src\\main\\resources\\com.application\\sf-drying-optimization-1e234ad2b0f4.json");
-
-        // Load credentials from JSON key file. If you can't set the GOOGLE_APPLICATION_CREDENTIALS
-        // environment variable, you can explicitly load the credentials file to construct the
-        // credentials.
-        GoogleCredentials credentials;
-        try (FileInputStream serviceAccountStream = new FileInputStream(credentialsPath)) {
-            credentials = ServiceAccountCredentials.fromStream(serviceAccountStream);
-        }
-        return credentials;
-    }
-
-    private static void getFromExistingTable() throws Exception {
-
-        // Step 1: Initialize BigQuery service
-        // Here we set our project ID and get the `BigQuery` service object
-        // this is the interface to our BigQuery instance that
-        // we use to execute jobs on
-        BigQuery bigquery = BigQueryOptions.newBuilder().
-                setCredentials(getCredentials()).
-                setProjectId("sf-drying-optimization")
-                .build().getService();
-
-        // Step 2: Prepare query job
-        // A "QueryJob" is a type of job that executes SQL queries
-        // we create a new job configuration from our SQL query and
-        final String GET_WORD_COUNT = "SELECT VariantValue, TimeStamp FROM sf-drying-optimization.124.int_sd_winccsensordata WHERE TimeStamp BETWEEN \"2020-06-09\" AND \"2020-06-29\" ORDER BY TimeStamp";
-
-                        QueryJobConfiguration queryConfig =
-                QueryJobConfiguration.newBuilder(GET_WORD_COUNT).build();
-
-        // Step 3: Run the job on BigQuery
-        // create a `Job` instance from the job configuration using the BigQuery service
-        // the job starts executing once the `create` method executes
-        Job queryJob = bigquery.create(JobInfo.newBuilder(queryConfig).build());
-        queryJob = queryJob.waitFor();
-        // the waitFor method blocks until the job completes
-        // and returns `null` if the job doesn't exist anymore
-        if (queryJob == null) {
-            throw new Exception("job no longer exists");
-        }
-        // once the job is done, check if any error occured
-        if (queryJob.getStatus().getError() != null) {
-            throw new Exception(queryJob.getStatus().getError().toString());
-        }
-
-        // Step 4: Display results
-        // Print out a header line, and iterate through the
-        // query results to print each result in a new line
-        System.out.println("Timestamp\tVarient value");
-        TableResult result = queryJob.getQueryResults();
-        for (FieldValueList row : result.iterateAll()) {
-            // We can use the `get` method along with the column
-            // name to get the corresponding row entry
-            int variantValue = row.get("VariantValue").getNumericValue().intValue();
-            String timeStamp = row.get("TimeStamp").getStringValue();
-            System.out.printf("%s\t%d\n", timeStamp, variantValue);
-        }
-    }
-
-    private static void insertViaQuery() throws Exception {
-
-        // Step 1: Initialize BigQuery service
-        BigQuery bigquery = BigQueryOptions.newBuilder().setProjectId("sample-project-330313")
-                .build().getService();
-
-        // Step 2: Prepare query job
-        final String INSERT_VEGETABLES =
-                "INSERT INTO `sample-project-330313.sample_dataset.vegetables` (id, name) VALUES (1, 'carrot'), (2, 'beans');";
-        QueryJobConfiguration queryConfig =
-                QueryJobConfiguration.newBuilder(INSERT_VEGETABLES).build();
-
-
-        // Step 3: Run the job on BigQuery
-        Job queryJob = bigquery.create(JobInfo.newBuilder(queryConfig).build());
-        queryJob = queryJob.waitFor();
-        if (queryJob == null) {
-            throw new Exception("job no longer exists");
-        }
-        // once the job is done, check if any error occured
-        if (queryJob.getStatus().getError() != null) {
-            throw new Exception(queryJob.getStatus().getError().toString());
-        }
-
-        // Step 4: Display results
-        // Here, we will print the total number of rows that were inserted
-        JobStatistics.QueryStatistics stats = queryJob.getStatistics();
-        Long rowsInserted = stats.getDmlStats().getInsertedRowCount();
-        System.out.printf("%d rows inserted\n", rowsInserted);
-    }
-
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/application/Main.java b/src/main/java/com/application/Main.java
index b20c57f..2fd00b7 100644
--- a/src/main/java/com/application/Main.java
+++ b/src/main/java/com/application/Main.java
@@ -1,39 +1,44 @@
 package com.application;
 
+import com.application.DB.DB;
 import javafx.application.Application;
 import javafx.fxml.FXMLLoader;
 import javafx.scene.Parent;
 import javafx.scene.Scene;
-import javafx.scene.control.Button;
 import javafx.stage.Stage;
 
 import java.io.IOException;
 import java.util.Objects;
 
-
+/**
+ * This class launches the application
+ *
+ * @author Eilert Tunheim, Karin Pettersen, Mads Arnesen
+ * @version 1.0.0
+ */
 public class Main extends Application {
-    Button button;
+
+    /**
+     * Starts the application
+     * @param args
+     * @throws IOException
+     */
     public static void main(String[] args) throws IOException {
-        //System.out.println("Hello world!");
-        //Authentication test = explicit();
         launch(args);
     }
 
     /**
-     * Main javafx code
-     * Stage = The whole window
-     * Scene = Content inside the stage. Put buttons and dropdown stuff
+     * Sets the primaryStage and sets the scene for the window.
      * @param primaryStage
      * @throws Exception
      */
     @Override
     public void start(Stage primaryStage) throws Exception {
 
-        // Loading the GUI-fxml file from resources
-        Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/com.application/GUI/graphical_user_interface.fxml")));
+        DB.getFromExistingTable();
 
         // Loading the GUI-fxml file from resources
-         root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/com.application/GUI/input.fxml")));
+        Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/com.application/GUI/graphical_user_interface.fxml")));
 
         // Sets the scene and defines boundaries
         Scene scene = new Scene(root, 1200, 600);
diff --git a/target/classes/com/application/Credentials.class b/target/classes/com/application/Credentials.class
deleted file mode 100644
index 68f97c5ee7aaa1dc208d9fbcad0e9cbcdee30942..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 370
zcmX^0Z`VEs1_l!bF)jvH20;!6Ax;Js24Qvv5q1VqMh4D;qWrAX<Py&mMg}3Dti-ZJ
z{hY+Sbp7CxqRhN>Yeoh(o6Nk-5<5l)W)00SMg|t={FGEi27aH+yi~u^+@#c^ki?{%
zRFLNU<iwn?#G*_PA1cUFl95@=$RO*JoS&<oSWu9YnVeXXnV+ZcT$GxUnpcvUm{V-c
z$iNkxUs{x$>Xr#INB~Jr59A;o1`Y;JMh0Hr$oPODe=k?(ka$lQ9tJiBc18wiJO(o|
z2!OOh{NtYl@+E^J0}BHy0|Nsi0|UqaFpCjnJ_92I7Xt%>B?A*!j$3Ox1EZD@(^dxN
rjSLJ7Obpx%3=CWhObiSR%nU3HEDSsh3=BLFr3}0bd|-q4!72p+QKC=U

diff --git a/target/classes/com/application/DataBase/DB.class b/target/classes/com/application/DataBase/DB.class
deleted file mode 100644
index bcdfb2c47b692138349417763b3102b135156c6f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8779
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

diff --git a/target/classes/com/application/Main.class b/target/classes/com/application/Main.class
index 69c4841e149a06ce1a54f8eb35273e6fd9cbd1cd..72d339a777587e42e0b4cf66b835e33ec457f966 100644
GIT binary patch
delta 682
zcmeC<S-?|&>ff$?3=9k=3@Ka;;tU2{3}Ot1Tnt7G##{_045l0mW?T&B3>I7rmJC+x
z4Axu>HVn4x40h}c_G}K54lsZKn?n<X!NtJM;K0S;$lwGboI!*Oh;RiFZtM*1><k`^
z3~V-;d6^}4j10^gnqiC+7tdt$oNUY3VdBNez!jWdT9lmXmYI{v$iV5Fn3<=Sl~|U@
z!yv&R$;05ypuo=H!^7aqAj!_)$HU;y5HR^8qq%Az4?_?`FgrsC4?`$J7$XA@NRNJA
zYKeYmkPkaUI1fVvL*!&%CS7?6hA4K1XdZ?bhFBhkIEHv0h6E6i$dJUtkjx-Cc_vf7
zu4r<8u6|-cK~83JVo7Fxp1zBdzKathgGhR6iCa;Au4_eRaY<%gdPrhYPU>bh=H-m_
zVhrM-aA06&U<A38fssLqfq_Avfsuicfq{WlYdZtuMg|53CI)E+1_m~;pfH0B0|NsO
zn9a%{%OJ<Vz`)5M&!E7-1lDW}*Sv#)389&bfr){EL7IVuK?Y$!Jp(I)B7+hG1A{UH
z0|N^KBZCS9BZDe~8q}<{4D1Xn3=9meI~bU?wlS~>v2J5v+rhwofPrHN1Lpw-F5le@
z+>tsW3_KzXeA^iW{IprNF$ijlFz{_-5YiT5;Mv9?tgX9^K}35SgDAo+Y7CqV3=C=v
z%t;KI43Z2w3>pl&47v<@3?>Zv4Au+=3=Ry23@!{tV25f!Tmbbc1A{ArI)erSBUqm%
dgBAl5g9d{vgEoT>12fzgx(tjAdf;%=2LP+zVCet=

delta 632
zcmZ3$)5lYP>ff$?3=9k=42fI}Vhn~{45AE1TnxqxCL9c=TnuIm=3ERG43_K+R$L6$
z3^wcxw(JacYz~tSFn|D?LlcC-#lXd2&&A-t;0Pj|K!h`hZ~+mn><n(~4DO5!Y)Pdh
zCHZ-b46;61iDijt75c>@$*Fm%`pNluB}Mr;`c7bZ>xua*89gRTGIr>AGBR)l=a&{G
zr@Ce4q%tya`X*-P>47x!Fi0{;@i2HXD6%tn^Dy`@_)fmcXs+tV!{E;lz|IiJ!w|#}
z%*en4QmdbrTB08s<ipMo!ov{C5H{J6NmpKyA)K8df`=iJA&Q3~njwaVAr?f$F~svQ
zBrr%#u4T&KEX}->F+!9<jDdlHk%56hoI!$tfq|KU5o9+5BZD*p1A{&TBUp}AYdZtu
zMg|53CI%S>1_m~;AU}gF0|NsOn9a%{#~{zZz`)6%z@W&$#2`IcfK{v>q?U_;iGhJZ
zgn@-Y6h*xfgE9jHg9-x!0}BHqgDL|fgBpW6NGAgW!!ibT1{MYe1}Cj;49r3-+Zb4P
zFt8n9VBf*Oae#r-cQ*r9q>cy!w+I98b_RYwZI*2e0@@-ByxSNAwM7`Xw=oE5>uzHZ
z)-Kt`AcAnT5(5VV1A`KS7=t>4DuV`t7K0{(A%hl!1%oz&ErSk&BZDs3fm#r&p&nvj
qaAMG4&}3j_5M$6`&|=VLU}8{ZkY&(e&}CqTJ7151kwG6EJO%)rJ6F;G

-- 
GitLab