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());
+ });
+ }
+
+}