Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions .run/Unnamed.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Unnamed" type="MavenRunConfiguration" factoryName="Maven">
<MavenSettings>
<option name="myGeneralSettings" />
<option name="myRunnerSettings" />
<option name="myRunnerParameters">
<MavenRunnerParameters>
<option name="cmdOptions" />
<option name="profiles">
<set />
</option>
<option name="goals">
<list />
</option>
<option name="multimoduleDir" />
<option name="pomFileName" />
<option name="profilesMap">
<map />
</option>
<option name="projectsCmdOptionValues">
<list />
</option>
<option name="resolveToWorkspace" value="false" />
<option name="workingDirPath" value="$PROJECT_DIR$/Middleware/src" />
</MavenRunnerParameters>
</option>
</MavenSettings>
<method v="2" />
</configuration>
</component>
3 changes: 2 additions & 1 deletion Middleware/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,5 @@ Middleware/src/main/resources/scripts/certs/
Middleware/src/main/resources/scripts/credentials/
Middleware/src/main/resources/credentials/


#Run/Debug configurations file
.run/
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
import com.google.gson.JsonParser;

import ca.concordia.encs.citydata.core.contracts.IProducer;
import ca.concordia.encs.citydata.core.implementations.ExceptionProducer;
import ca.concordia.encs.citydata.datastores.InMemoryDataStore;
import ca.concordia.encs.citydata.producers.ExceptionProducer;
import ca.concordia.encs.citydata.runners.SequentialRunner;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
import java.util.HashSet;
import java.util.Set;

import org.springframework.beans.factory.annotation.Value;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
Expand All @@ -38,14 +40,18 @@
* @since 2025-05-27
*/

public abstract class AbstractProducer<E> extends AbstractEntity implements IProducer<E> {
public sealed abstract class AbstractProducer<E> extends AbstractEntity implements IProducer<E>
permits JSONProducer, CSVProducer, ExceptionProducer {

private String filePath;
private RequestOptions fileOptions;
private IOperation<E> operation;
private final Set<IRunner> runners = new HashSet<>();
private ArrayList<E> result = new ArrayList<>();

@Value("${data.path.route:../Data}")
private String dataPathRoute;

public String getFilePath() {
return filePath;
}
Expand Down Expand Up @@ -89,14 +95,6 @@ public void setOperation(IOperation operation) {
this.operation = operation;
}

@Override
public void fetch() {
if (this.filePath == null || this.filePath.isEmpty()) {
throw new DatasetNotFound(this.filePath);
}
System.out.println("Unimplemented method! This method must be implemented by a subclass.");
}

@Override
public void notifyObservers() {
for (final IRunner runner : this.runners) {
Expand Down Expand Up @@ -210,4 +208,17 @@ public String toString() {
}
return jsonArray.toString();
}

//This method will be used in the future to access data/files from the server
public String getDataPathRoute() {
return dataPathRoute;
}

@Override
public void fetch() {
if (this.filePath == null || this.filePath.isEmpty()) {
throw new DatasetNotFound(this.filePath);
}
System.out.println("Unimplemented method! This method must be implemented by a subclass.");
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ca.concordia.encs.citydata.producers.base;
package ca.concordia.encs.citydata.core.implementations;

import java.io.IOException;
import java.io.OutputStream;
Expand All @@ -8,7 +8,6 @@

import ca.concordia.encs.citydata.core.contracts.IProducer;
import ca.concordia.encs.citydata.core.exceptions.MiddlewareException;
import ca.concordia.encs.citydata.core.implementations.AbstractProducer;
import ca.concordia.encs.citydata.core.utils.RequestOptions;

/**
Expand All @@ -18,7 +17,7 @@
* @since 2024-12-01
*/

public class CSVProducer extends AbstractProducer<String> implements IProducer<String> {
public non-sealed class CSVProducer extends AbstractProducer<String> implements IProducer<String> {

public CSVProducer(String filePath, RequestOptions fileOptions) {
this.setFilePath(filePath);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package ca.concordia.encs.citydata.producers;
package ca.concordia.encs.citydata.core.implementations;

import java.util.ArrayList;

import ca.concordia.encs.citydata.core.contracts.IProducer;
import ca.concordia.encs.citydata.core.implementations.AbstractProducer;

/**
* This producer was created for the sole purpose of returning Exceptions when
Expand All @@ -14,7 +13,7 @@
* @since 2025-01-01
*/

public class ExceptionProducer extends AbstractProducer<String> implements IProducer<String> {
public non-sealed class ExceptionProducer extends AbstractProducer<String> implements IProducer<String> {

public ExceptionProducer(Exception e) {
final ArrayList<String> result = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ca.concordia.encs.citydata.producers.base;
package ca.concordia.encs.citydata.core.implementations;

import java.io.OutputStream;
import java.util.ArrayList;
Expand All @@ -8,7 +8,6 @@
import com.google.gson.JsonParser;

import ca.concordia.encs.citydata.core.contracts.IProducer;
import ca.concordia.encs.citydata.core.implementations.AbstractProducer;
import ca.concordia.encs.citydata.core.utils.RequestOptions;

/**
Expand All @@ -18,13 +17,17 @@
* @since 2024-12-01
*/

public class JSONProducer extends AbstractProducer<JsonObject> implements IProducer<JsonObject> {
public non-sealed class JSONProducer extends AbstractProducer<JsonObject> implements IProducer<JsonObject> {

public JSONProducer(String filePath, RequestOptions fileOptions) {
this.setFilePath(filePath);
this.setFileOptions(fileOptions);
}

public JSONProducer() {
// TODO Auto-generated constructor stub
}

@Override
public void fetch() {
final ArrayList<JsonObject> jsonOutput = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,33 @@
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import ca.concordia.encs.citydata.core.contracts.IProducer;
import ca.concordia.encs.citydata.core.implementations.AbstractProducer;
import ca.concordia.encs.citydata.core.contracts.IOperation;
import ca.concordia.encs.citydata.core.contracts.IRunner;
import ca.concordia.encs.citydata.core.implementations.JSONProducer;
import ca.concordia.encs.citydata.core.utils.RequestOptions;

/**
* This Producer outputs metadata about a building, such as floors, zones and sensors.
* @author Gabriel C. Ullmann
* @since 2025-05-28
*/

public class BuildingProducer extends AbstractProducer<JsonObject> implements IProducer<JsonObject> {
public final class BuildingProducer extends JSONProducer {

public BuildingProducer(String filePath, RequestOptions fileOptions) {
super(filePath, fileOptions);
// TODO Auto-generated constructor stub
}

public BuildingProducer() {
// TODO Auto-generated constructor stub
}

private String filePath;

public void setBuildingName(String buildingName) {
if (buildingName != null) {
this.filePath = "docs/examples/data/" + buildingName + "_building.json";
this.filePath = "./src/test/resources/" + buildingName + "_building.json";
} else {
throw new InvalidParameterException("Please provide a building name to the producer.");
}
Expand Down Expand Up @@ -69,4 +80,34 @@ public void fetch() {
this.setResult(jsonOutput);
this.applyOperation();
}

@Override
public void addObserver(IRunner aRunner) {
// TODO Auto-generated method stub

}

@Override
public void setOperation(IOperation operation) {
// TODO Auto-generated method stub

}

@Override
public void applyOperation() {
// TODO Auto-generated method stub

}

@Override
public void notifyObservers() {
// TODO Auto-generated method stub

}

@Override
public ArrayList<JsonObject> getResult() {
// TODO Auto-generated method stub
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,26 @@
import com.google.gson.JsonObject;

import ca.concordia.encs.citydata.core.contracts.IOperation;
import ca.concordia.encs.citydata.core.contracts.IProducer;
import ca.concordia.encs.citydata.core.contracts.IRunner;
import ca.concordia.encs.citydata.core.implementations.AbstractProducer;
import ca.concordia.encs.citydata.core.implementations.JSONProducer;
import ca.concordia.encs.citydata.core.utils.RequestOptions;
import ca.concordia.encs.citydata.producers.base.JSONProducer;

/**
* This producer can connect to a CKAN instance and fetch either dataset or resource metadata.
* @author Gabriel C. Ullmann
* @since 2025-02-12
*/

public class CKANMetadataProducer extends AbstractProducer<JsonObject> implements IProducer<JsonObject> {
public class CKANMetadataProducer extends JSONProducer {

public CKANMetadataProducer(String filePath, RequestOptions fileOptions) {
super(filePath, fileOptions);
// TODO Auto-generated constructor stub
}

public CKANMetadataProducer() {
super();
}

private String url;
private String resourceId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,26 @@
import ca.concordia.encs.citydata.core.contracts.IProducer;
import ca.concordia.encs.citydata.core.exceptions.MiddlewareException;
import ca.concordia.encs.citydata.core.exceptions.MiddlewareException.DataStoreFailureReadingException;
import ca.concordia.encs.citydata.core.implementations.AbstractProducer;
import ca.concordia.encs.citydata.core.implementations.AbstractRunner;
import ca.concordia.encs.citydata.core.utils.RequestOptions;
import ca.concordia.encs.citydata.datastores.DiskDatastore;
import ca.concordia.encs.citydata.datastores.InMemoryDataStore;
import ca.concordia.encs.citydata.runners.SingleStepRunner;

/**
* This producer can connect to a CKAN instance and fetch a resource.
* @author Gabriel C. Ullmann, Rushin D. Makwana
* @since 2025-02-12
*/
* This producer can connect to a CKAN instance and fetch a resource.
* @author Gabriel C. Ullmann, Rushin D. Makwana
* @since 2025-02-12
*/

public class CKANProducer extends AbstractProducer<String> implements IProducer<String> {
//This producer should be updated so that it extends CKANMetadataProducer

public final class CKANProducer extends CKANMetadataProducer {

public CKANProducer(String filePath, RequestOptions fileOptions) {
super(filePath, fileOptions);
// TODO Auto-generated constructor stub
}

private String url;
private String resourceId;
Expand Down Expand Up @@ -127,8 +133,12 @@ private OutputStream fetchFromCkan() {
+ " .");
}
} catch (InterruptedException e) {
final ArrayList<String> errorMessageList = new ArrayList<>();
errorMessageList.add(e.getMessage());

// Wrap error message in JsonObject to match setResult(ArrayList<JsonObject>) signature of AbstractProducer
final ArrayList<JsonObject> errorMessageList = new ArrayList<>();
JsonObject errorJson = new JsonObject();
errorJson.addProperty("error", e.getMessage());
errorMessageList.add(errorJson);
this.setResult(errorMessageList);
}

Expand All @@ -152,8 +162,13 @@ public void fetch() {
} catch (IOException e) {
throw new MiddlewareException.DatasetNotFound("Data Not Found");
}
this.intermediateResult.add(fileStream.toString());
this.setResult(this.intermediateResult);

// Wrap file stream content in JsonObject to match setResult(ArrayList<JsonObject>) signature of AbstractProducer
final ArrayList<JsonObject> resultList = new ArrayList<>();
JsonObject resultJson = new JsonObject();
resultJson.addProperty("data", fileStream.toString());
resultList.add(resultJson);
this.setResult(resultList);
this.applyOperation();
}

Expand Down
Loading
Loading