From ca5469c372d92304ab7b44fcbe2c40252f1d8e9d Mon Sep 17 00:00:00 2001
From: Sikandar Ejaz <34721766+SikandarEjaz@users.noreply.github.com>
Date: Mon, 1 Jun 2026 22:53:48 -0400
Subject: [PATCH 1/3] addressed issue #233
---
Middleware/pom.xml | 20 ++
.../core/controllers/DatasetController.java | 63 +++++
.../exceptions/AccessDeniedException.java | 20 ++
.../core/exceptions/MetadataException.java | 24 ++
.../encs/citydata/core/model/DatasetType.java | 43 +++
.../services/DatasetAccessService.java | 113 ++++++++
.../test/core/DatasetAccessServiceTest.java | 266 ++++++++++++++++++
.../DatasetControllerIntegrationTest.java | 193 +++++++++++++
.../test/producers/BTUProducerTest.java | 26 +-
.../test/producers/FCUProducerTest.java | 25 +-
.../src/test/resources/private_dataset.csv | 1 +
.../src/test/resources/private_metadata.TXT | 3 +
.../src/test/resources/protected_dataset.csv | 1 +
.../src/test/resources/protected_metadata.TXT | 4 +
.../src/test/resources/public_dataset.csv | 1 +
.../src/test/resources/public_metadata.TXT | 6 +
16 files changed, 781 insertions(+), 28 deletions(-)
create mode 100644 Middleware/src/main/java/ca/concordia/encs/citydata/core/controllers/DatasetController.java
create mode 100644 Middleware/src/main/java/ca/concordia/encs/citydata/core/exceptions/AccessDeniedException.java
create mode 100644 Middleware/src/main/java/ca/concordia/encs/citydata/core/exceptions/MetadataException.java
create mode 100644 Middleware/src/main/java/ca/concordia/encs/citydata/core/model/DatasetType.java
create mode 100644 Middleware/src/main/java/ca/concordia/encs/citydata/services/DatasetAccessService.java
create mode 100644 Middleware/src/test/java/ca/concordia/encs/citydata/test/core/DatasetAccessServiceTest.java
create mode 100644 Middleware/src/test/java/ca/concordia/encs/citydata/test/core/DatasetControllerIntegrationTest.java
create mode 100644 Middleware/src/test/resources/private_dataset.csv
create mode 100644 Middleware/src/test/resources/private_metadata.TXT
create mode 100644 Middleware/src/test/resources/protected_dataset.csv
create mode 100644 Middleware/src/test/resources/protected_metadata.TXT
create mode 100644 Middleware/src/test/resources/public_dataset.csv
create mode 100644 Middleware/src/test/resources/public_metadata.TXT
diff --git a/Middleware/pom.xml b/Middleware/pom.xml
index 94e3ca96..22a90b24 100644
--- a/Middleware/pom.xml
+++ b/Middleware/pom.xml
@@ -99,6 +99,26 @@
org.springframework.security
spring-security-test
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.mockito
+ mockito-inline
+ 5.2.0
+ test
+
+
+ org.assertj
+ assertj-core
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ test
+
diff --git a/Middleware/src/main/java/ca/concordia/encs/citydata/core/controllers/DatasetController.java b/Middleware/src/main/java/ca/concordia/encs/citydata/core/controllers/DatasetController.java
new file mode 100644
index 00000000..43522357
--- /dev/null
+++ b/Middleware/src/main/java/ca/concordia/encs/citydata/core/controllers/DatasetController.java
@@ -0,0 +1,63 @@
+package ca.concordia.encs.citydata.core.controllers;
+
+import java.util.Map;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import ca.concordia.encs.citydata.core.exceptions.AccessDeniedException;
+import ca.concordia.encs.citydata.core.exceptions.MetadataException;
+import ca.concordia.encs.citydata.core.model.DatasetType;
+import ca.concordia.encs.citydata.services.DatasetAccessService;
+
+/**
+ * REST controller providing access to the three dataset tiers.
+ *
+ * @author Sikandar Ejaz
+ * @since 2026-06-01
+ */
+
+@RestController
+@RequestMapping("/api/datasets")
+public class DatasetController {
+
+ private final DatasetAccessService datasetAccessService;
+
+ public DatasetController(DatasetAccessService datasetAccessService) {
+ this.datasetAccessService = datasetAccessService;
+ }
+
+ @GetMapping("/public")
+ public ResponseEntity