From 58965ef9e2ee22a35141ec9c6052f103dda865ee Mon Sep 17 00:00:00 2001 From: Lucy Ciara Herud-Thomassen <86323303+LucyCiara@users.noreply.github.com> Date: Sun, 1 Mar 2026 16:56:22 +0100 Subject: [PATCH 1/5] feat[Wrapper]: add abstract class for wrappers --- src/main/java/edu/group5/app/control/Wrapper.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/group5/app/control/Wrapper.java b/src/main/java/edu/group5/app/control/Wrapper.java index 9655c26..56efc11 100644 --- a/src/main/java/edu/group5/app/control/Wrapper.java +++ b/src/main/java/edu/group5/app/control/Wrapper.java @@ -1,5 +1,10 @@ package edu.group5.app.control; -public class Wrapper { - +abstract class Wrapper { + protected Object data; + + protected Wrapper() { + } + + public abstract boolean importData(); } From d9dff24a20feb4001075c2a7be32ada811f91e4f Mon Sep 17 00:00:00 2001 From: Lucy Ciara Herud-Thomassen <86323303+LucyCiara@users.noreply.github.com> Date: Sun, 1 Mar 2026 20:45:32 +0100 Subject: [PATCH 2/5] feat[OrgAPIWrapper]: add a wrapper for APIs --- pom.xml | 12 +++++++++++- src/main/java/edu/group5/app/App.java | 11 ++++++++--- src/main/java/edu/group5/app/control/Wrapper.java | 1 - 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index b0f6764..e4e534e 100644 --- a/pom.xml +++ b/pom.xml @@ -38,7 +38,17 @@ spring-security-crypto 7.0.2 - + + + + com.fasterxml.jackson.core + jackson-databind + 2.21.1 + compile + + + + diff --git a/src/main/java/edu/group5/app/App.java b/src/main/java/edu/group5/app/App.java index 7fd22a6..4f4364f 100644 --- a/src/main/java/edu/group5/app/App.java +++ b/src/main/java/edu/group5/app/App.java @@ -1,10 +1,15 @@ package edu.group5.app; +import edu.group5.app.control.OrgAPIWrapper; + /** * Hello world! */ public class App { - public static void main(String[] args) { - System.out.println("Hello World!"); - } + public static void main(String[] args) { + OrgAPIWrapper orgWrap = new OrgAPIWrapper("https://app.innsamlingskontrollen.no/api/public/v1/all"); + System.out.println(); + System.out.println(); + orgWrap.importData(); + } } diff --git a/src/main/java/edu/group5/app/control/Wrapper.java b/src/main/java/edu/group5/app/control/Wrapper.java index 56efc11..584507c 100644 --- a/src/main/java/edu/group5/app/control/Wrapper.java +++ b/src/main/java/edu/group5/app/control/Wrapper.java @@ -1,7 +1,6 @@ package edu.group5.app.control; abstract class Wrapper { - protected Object data; protected Wrapper() { } From a3752a26e96d552b8d7fc037549a969f594a0f26 Mon Sep 17 00:00:00 2001 From: Lucy Ciara Herud-Thomassen <86323303+LucyCiara@users.noreply.github.com> Date: Mon, 2 Mar 2026 15:41:12 +0100 Subject: [PATCH 3/5] feat&chore[Wrapper]: Add APIWrapper child class of Wrapper, and update .gitignore and POM Added a child class of Wrapper that specializes in APIs, and updated .gitignore to ignore more artifacts, and updated .pom to use shade-plugin to build fat jars --- .gitignore | 7 ++++ pom.xml | 36 ++++++++++++---- .../edu/group5/app/control/OrgAPIWrapper.java | 42 +++++++++++++++++++ .../java/edu/group5/app/control/Wrapper.java | 2 + 4 files changed, 80 insertions(+), 7 deletions(-) create mode 100644 src/main/java/edu/group5/app/control/OrgAPIWrapper.java diff --git a/.gitignore b/.gitignore index 48a9ee7..07e3800 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,10 @@ out/ ## VSCode ############################## .vscode/ + +############################## +## Misc +############################## +.settings/* +.project +.classpath diff --git a/pom.xml b/pom.xml index e4e534e..d78f0c3 100644 --- a/pom.xml +++ b/pom.xml @@ -39,13 +39,13 @@ 7.0.2 - - - com.fasterxml.jackson.core - jackson-databind - 2.21.1 - compile - + + + tools.jackson.core + jackson-databind + 3.1.0 + compile + @@ -96,6 +96,28 @@ maven-javadoc-plugin 3.12.0 + + + + org.apache.maven.plugins + maven-shade-plugin + 3.6.1 + + + package + + shade + + + + + edu.group5.app.App + + + + + + diff --git a/src/main/java/edu/group5/app/control/OrgAPIWrapper.java b/src/main/java/edu/group5/app/control/OrgAPIWrapper.java new file mode 100644 index 0000000..9123c69 --- /dev/null +++ b/src/main/java/edu/group5/app/control/OrgAPIWrapper.java @@ -0,0 +1,42 @@ +package edu.group5.app.control; + +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; + +import tools.jackson.databind.ObjectMapper; + +public class OrgAPIWrapper extends Wrapper { + private String urlString; + private Object[] data; + + public OrgAPIWrapper(String urlString) { + this.urlString = urlString; + } + + @Override + public boolean importData() { + URI uri = URI.create(this.urlString); + HttpClient client = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(uri) + .GET() + .build(); + + try { + HttpResponse response = client.send( + request, HttpResponse.BodyHandlers.ofString()); + this.data = new ObjectMapper().readValue(response.body(), Object[].class); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + @Override + public Object[] getData() { + return this.data; + } +} diff --git a/src/main/java/edu/group5/app/control/Wrapper.java b/src/main/java/edu/group5/app/control/Wrapper.java index 584507c..e8a8365 100644 --- a/src/main/java/edu/group5/app/control/Wrapper.java +++ b/src/main/java/edu/group5/app/control/Wrapper.java @@ -6,4 +6,6 @@ protected Wrapper() { } public abstract boolean importData(); + + public abstract Object getData(); } From fecaec92bff03ceeaaeba8e3457534ae38da1151 Mon Sep 17 00:00:00 2001 From: Lucy Ciara Herud-Thomassen <86323303+LucyCiara@users.noreply.github.com> Date: Tue, 3 Mar 2026 17:32:55 +0100 Subject: [PATCH 4/5] test[OrgAPIWrapper]: add tests for OrgAPIWrapper --- pom.xml | 1 - src/main/java/edu/group5/app/App.java | 11 ++++- .../edu/group5/app/control/OrgAPIWrapper.java | 40 ++++++++++++------- .../java/edu/group5/app/control/Wrapper.java | 2 +- 4 files changed, 37 insertions(+), 17 deletions(-) diff --git a/pom.xml b/pom.xml index d78f0c3..3941344 100644 --- a/pom.xml +++ b/pom.xml @@ -47,7 +47,6 @@ compile - diff --git a/src/main/java/edu/group5/app/App.java b/src/main/java/edu/group5/app/App.java index 4f4364f..5886cd4 100644 --- a/src/main/java/edu/group5/app/App.java +++ b/src/main/java/edu/group5/app/App.java @@ -1,15 +1,24 @@ package edu.group5.app; +import java.util.HashMap; + import edu.group5.app.control.OrgAPIWrapper; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.ObjectMapper; /** * Hello world! */ public class App { - public static void main(String[] args) { + public static void main(String[] args) throws InterruptedException { OrgAPIWrapper orgWrap = new OrgAPIWrapper("https://app.innsamlingskontrollen.no/api/public/v1/all"); System.out.println(); System.out.println(); orgWrap.importData(); + Object[] imports = orgWrap.getData(); + ObjectMapper objectMapper = new ObjectMapper(); + HashMap map = objectMapper.convertValue(imports[0], new TypeReference>() { + }); + System.out.println(map.get("org_number")); } } diff --git a/src/main/java/edu/group5/app/control/OrgAPIWrapper.java b/src/main/java/edu/group5/app/control/OrgAPIWrapper.java index 9123c69..f8bc7ab 100644 --- a/src/main/java/edu/group5/app/control/OrgAPIWrapper.java +++ b/src/main/java/edu/group5/app/control/OrgAPIWrapper.java @@ -1,37 +1,49 @@ package edu.group5.app.control; +import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; +import tools.jackson.core.exc.StreamReadException; import tools.jackson.databind.ObjectMapper; public class OrgAPIWrapper extends Wrapper { - private String urlString; private Object[] data; + private HttpClient client; + private HttpRequest request; public OrgAPIWrapper(String urlString) { - this.urlString = urlString; + if (urlString == null) { + throw new IllegalArgumentException("url can't be null"); + } else if (urlString.isBlank()) { + throw new IllegalArgumentException("url can't be blank"); + } + try { + URI uri = URI.create(urlString); + this.client = HttpClient.newHttpClient(); + this.request = HttpRequest.newBuilder() + .uri(uri) + .GET() + .build(); + } catch (IllegalArgumentException IAe) { + throw new IllegalArgumentException("url has to be valid"); + } + } @Override - public boolean importData() { - URI uri = URI.create(this.urlString); - HttpClient client = HttpClient.newHttpClient(); - HttpRequest request = HttpRequest.newBuilder() - .uri(uri) - .GET() - .build(); - + public boolean importData() throws InterruptedException { try { - HttpResponse response = client.send( - request, HttpResponse.BodyHandlers.ofString()); + HttpResponse response = this.client.send( + this.request, HttpResponse.BodyHandlers.ofString()); this.data = new ObjectMapper().readValue(response.body(), Object[].class); return true; - } catch (Exception e) { - e.printStackTrace(); + } catch (IOException IOe) { return false; + } catch (StreamReadException e) { + throw new StreamReadException("The URL leads to a website that can't be parsed"); } } diff --git a/src/main/java/edu/group5/app/control/Wrapper.java b/src/main/java/edu/group5/app/control/Wrapper.java index e8a8365..012ea2c 100644 --- a/src/main/java/edu/group5/app/control/Wrapper.java +++ b/src/main/java/edu/group5/app/control/Wrapper.java @@ -5,7 +5,7 @@ abstract class Wrapper { protected Wrapper() { } - public abstract boolean importData(); + public abstract boolean importData() throws InterruptedException; public abstract Object getData(); } From 59be68d8a208e0aecfb91a0572688d1fe529ce12 Mon Sep 17 00:00:00 2001 From: Lucy Ciara Herud-Thomassen <86323303+LucyCiara@users.noreply.github.com> Date: Tue, 3 Mar 2026 17:33:30 +0100 Subject: [PATCH 5/5] test[OrgAPIWrapper]: add tests for OrgAPIWrapper --- .../group5/app/control/OrgAPIWrapperTest.java | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/test/java/edu/group5/app/control/OrgAPIWrapperTest.java diff --git a/src/test/java/edu/group5/app/control/OrgAPIWrapperTest.java b/src/test/java/edu/group5/app/control/OrgAPIWrapperTest.java new file mode 100644 index 0000000..6f22c85 --- /dev/null +++ b/src/test/java/edu/group5/app/control/OrgAPIWrapperTest.java @@ -0,0 +1,74 @@ +package edu.group5.app.control; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import tools.jackson.core.exc.StreamReadException; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.lang.IllegalArgumentException; + +public class OrgAPIWrapperTest { + String testURL; + String wrongURL; + String wrongURL2; + + @BeforeEach + void init() { + this.testURL = "https://app.innsamlingskontrollen.no/api/public/v1/all"; + this.wrongURL = "This is not a URL"; + this.wrongURL2 = "https://www.google.com"; + } + + @Test + public void nullURLThrowsException() { + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, + () -> new OrgAPIWrapper(null)); + assertEquals("url can't be null", exception.getMessage()); + } + + @Test + public void emptyURLThrowsException() { + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> new OrgAPIWrapper("")); + assertEquals("url can't be blank", exception.getMessage()); + } + + @Test + public void faultyURLThrowsException() { + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, + () -> new OrgAPIWrapper(this.wrongURL)); + assertEquals("url has to be valid", exception.getMessage()); + } + + // @Test + // public void noConnectionReturnsFalseImport() { + // assertDoesNotThrow(() -> { + // OrgAPIWrapper api = new OrgAPIWrapper(this.testURL); + // assertFalse(api.importData()); + // }); + // } + + @Test + public void importsNonEmptyData() { + assertDoesNotThrow(() -> { + OrgAPIWrapper api = new OrgAPIWrapper(testURL); + assertTrue(api.importData()); + assertFalse(api.getData().length == 0); + }); + } + + @Test + public void nonParseableSiteThrowsExceptionWhenImporting() { + assertDoesNotThrow(() -> { + OrgAPIWrapper api = new OrgAPIWrapper(this.wrongURL2); + StreamReadException exception = assertThrows(StreamReadException.class, () -> api.importData()); + assertEquals("The URL leads to a website that can't be parsed", exception.getMessage()); + }); + } + +}