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 5f7773d..0bb117f 100644 --- a/pom.xml +++ b/pom.xml @@ -38,6 +38,14 @@ spring-security-crypto 7.0.2 + + + tools.jackson.core + jackson-databind + 3.1.0 + compile + + commons-logging commons-logging @@ -91,6 +99,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/App.java b/src/main/java/edu/group5/app/App.java index 7fd22a6..5886cd4 100644 --- a/src/main/java/edu/group5/app/App.java +++ b/src/main/java/edu/group5/app/App.java @@ -1,10 +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) { - System.out.println("Hello World!"); - } + 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 new file mode 100644 index 0000000..f8bc7ab --- /dev/null +++ b/src/main/java/edu/group5/app/control/OrgAPIWrapper.java @@ -0,0 +1,54 @@ +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 Object[] data; + private HttpClient client; + private HttpRequest request; + + public OrgAPIWrapper(String 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() throws InterruptedException { + try { + HttpResponse response = this.client.send( + this.request, HttpResponse.BodyHandlers.ofString()); + this.data = new ObjectMapper().readValue(response.body(), Object[].class); + return true; + } catch (IOException IOe) { + return false; + } catch (StreamReadException e) { + throw new StreamReadException("The URL leads to a website that can't be parsed"); + } + } + + @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 9655c26..012ea2c 100644 --- a/src/main/java/edu/group5/app/control/Wrapper.java +++ b/src/main/java/edu/group5/app/control/Wrapper.java @@ -1,5 +1,11 @@ package edu.group5.app.control; -public class Wrapper { - +abstract class Wrapper { + + protected Wrapper() { + } + + public abstract boolean importData() throws InterruptedException; + + public abstract Object getData(); } diff --git a/src/main/java/edu/group5/app/model/organization/Organization.java b/src/main/java/edu/group5/app/model/organization/Organization.java index 941ed5a..be0e810 100644 --- a/src/main/java/edu/group5/app/model/organization/Organization.java +++ b/src/main/java/edu/group5/app/model/organization/Organization.java @@ -5,14 +5,16 @@ /** * Represents an organization. * - *

An organization is identified by an organization number, a name, + *

+ * An organization is identified by an organization number, a name, * trust status, website URL, pre-approval status, and a textual description. * - *

Instances are validated on creation: + *

+ * Instances are validated on creation: *

    - *
  • orgNumber must be non-negative
  • - *
  • name and websiteURL must not be null or blank
  • - *
  • description must not be null
  • + *
  • orgNumber must be non-negative
  • + *
  • name and websiteURL must not be null or blank
  • + *
  • description must not be null
  • *
*/ public record Organization( @@ -21,21 +23,24 @@ public record Organization( boolean trusted, String websiteURL, boolean isPreApproved, - String description -) { + String description) { /** * Creates a new organization. * - * @param orgNumber the organization number; must be non-negative - * @param name the organization name; must not be null or blank - * @param trusted whether the organization is trusted - * @param websiteURL the organization's website URL; must not be null or blank + * @param orgNumber the organization number; must be non-negative + * @param name the organization name; must not be null or blank + * @param trusted whether the organization is trusted + * @param websiteURL the organization's website URL; must not be null or + * blank * @param isPreApproved whether the organization is pre-approved - * @param description a textual description of the organization; must not be null - * @throws NullPointerException if name, websiteURL or description is null - * @throws IllegalArgumentException if orgNumber is negative, or if name or websiteURL is blank + * @param description a textual description of the organization; must not be + * null + * @throws NullPointerException if name, websiteURL or description is null + * @throws IllegalArgumentException if orgNumber is negative, or if name or + * websiteURL is blank */ - public Organization(int orgNumber, String name, boolean trusted, String websiteURL, boolean isPreApproved, String description) { + public Organization(int orgNumber, String name, boolean trusted, String websiteURL, boolean isPreApproved, + String description) { if (orgNumber < 0) { throw new IllegalArgumentException("orgNumber cannot be negative"); } 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()); + }); + } + +}