Skip to content

Commit

Permalink
Initial commits of the dataset create operation
Browse files Browse the repository at this point in the history
  • Loading branch information
knighto82 committed Nov 19, 2024
1 parent 0ded2a5 commit 4e354c3
Show file tree
Hide file tree
Showing 22 changed files with 311 additions and 29 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package io.github.jpmorganchase.fusion.packaging;

import com.github.tomakehurst.wiremock.client.WireMock;
import com.github.tomakehurst.wiremock.core.WireMockConfiguration;
import com.github.tomakehurst.wiremock.junit5.WireMockExtension;
import io.github.jpmorganchase.fusion.Fusion;
import io.github.jpmorganchase.fusion.FusionConfiguration;
import io.github.jpmorganchase.fusion.model.Dataset;
import org.hamcrest.MatcherAssert;
import org.hamcrest.Matchers;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import java.io.IOException;

public class DatasetOperations {

// WireMock server running on port 8080
@RegisterExtension
public WireMockExtension wireMockRule = WireMockExtension.newInstance().options(WireMockConfiguration.wireMockConfig().port(8080)).build();

private Fusion sdk;

@BeforeEach
public void setUp() {
sdk = Fusion.builder().configuration(FusionConfiguration.builder()
.rootURL("http://localhost:8080/v1")
.build()).build();
}

public void testGetDataFromApi() throws IOException, InterruptedException {
// Stub WireMock to respond with a custom JSON
WireMock.stubFor(WireMock.get(WireMock.urlEqualTo("/api/data"))
.willReturn(WireMock.aResponse()
.withHeader("Content-Type", "application/json")
.withStatus(200)
.withBody("{\"message\": \"Success\"}")));

Dataset dataset = Dataset.builder()
.identifier("SD0001")
.description("Sample dataset description 1")
.linkedEntity("SD0001/")
.title("Sample Dataset 1 | North America")
.frequency("Daily")
.build();

// Call your SDK method
sdk.create(dataset);

// Verify the response
//MatcherAssert.assertThat("{\"message\": \"Success\"}", Matchers.is(Matchers.equalTo("abc")));
}

}
26 changes: 26 additions & 0 deletions src/main/java/io/github/jpmorganchase/fusion/Fusion.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@
import java.util.List;
import java.util.Map;
import java.util.Objects;

import io.github.jpmorganchase.fusion.serializing.APIRequestSerializer;
import io.github.jpmorganchase.fusion.serializing.GsonAPIRequestSerializer;
import lombok.Builder;

/**
Expand All @@ -48,6 +51,9 @@ public class Fusion {
@Builder.Default
private APIResponseParser responseParser = new GsonAPIResponseParser();

@Builder.Default
private APIRequestSerializer requestSerializer = new GsonAPIRequestSerializer();

/**
* Get the default download path - Please see default {@link FusionConfiguration}
*/
Expand Down Expand Up @@ -307,6 +313,26 @@ public Map<String, Map<String, Object>> datasetMemberResources(String dataset, S
return this.datasetMemberResources(this.getDefaultCatalog(), dataset, seriesMember);
}

/**
* Creates a dataset, using the default catalog.
*
* @param dataset {@link Dataset} to be created
*/
public void create(Dataset dataset){
this.create(this.getDefaultCatalog(), dataset);
}

/**
* Creates a dataset, using the specified catalog.
*
* @param dataset {@link Dataset} to be created
*/
public void create(String catalogName, Dataset dataset){

String url = String.format("%1scatalogs/%2s/datasets/%3s", this.rootURL, catalogName, dataset.getIdentifier());
this.api.callAPIPost(url, requestSerializer.serializeDatasetRequest(dataset));
}

/**
* List the attributes for a specified dataset in a defined catalog
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@

public interface APIManager extends APIDownloadOperations, APIUploadOperations {
String callAPI(String apiPath) throws APICallException;
String callAPIPost(String apiPath, String body);
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,22 @@ public String callAPI(String apiPath) throws APICallException {
return response.getBody();
}

/**
* Call the API to POST with the path and body provided and return the JSON response.
*
* @param apiPath appended to the base URL
* @param body json body to be posted
*/
@Override
public String callAPIPost(String apiPath, String body) throws APICallException {
Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("Authorization", "Bearer " + tokenProvider.getSessionBearerToken());

HttpResponse<String> response = httpClient.post(apiPath, requestHeaders, body);
checkResponseStatus(response);
return response.getBody();
}

@Override
public void callAPIFileDownload(
String apiPath, String fileName, String catalog, String dataset, Map<String, String> headers)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public class Attribute extends CatalogResource {
@Builder
public Attribute(
String identifier,
Map<String, String> varArgs,
Map<String, Object> varArgs,
boolean key,
String dataType,
long index,
Expand All @@ -38,9 +38,9 @@ public Attribute(
}

public static class AttributeBuilder {
private Map<String, String> varArgs;
private Map<String, Object> varArgs;

public AttributeBuilder varArgs(Map<String, String> varArgs) {
public AttributeBuilder varArgs(Map<String, Object> varArgs) {
this.varArgs = copyMap(varArgs);
return this;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public class Catalog extends CatalogResource {

@Builder
public Catalog(
String identifier, Map<String, String> varArgs, String description, String linkedEntity, String title) {
String identifier, Map<String, Object> varArgs, String description, String linkedEntity, String title) {
super(identifier, varArgs);
this.description = description;
this.linkedEntity = linkedEntity;
Expand All @@ -33,9 +33,9 @@ public Catalog(

public static class CatalogBuilder {
@SuppressWarnings("FieldCanBeLocal")
private Map<String, String> varArgs;
private Map<String, Object> varArgs;

public CatalogBuilder varArgs(Map<String, String> varArgs) {
public CatalogBuilder varArgs(Map<String, Object> varArgs) {
this.varArgs = copyMap(varArgs);
return this;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,27 @@
public abstract class CatalogResource {

private final String identifier;
private final Map<String, String> varArgs;
private final Map<String, Object> varArgs;

public CatalogResource(String identifier, Map<String, String> varArgs) {
public CatalogResource(String identifier, Map<String, Object> varArgs) {
this.varArgs = copyMap(varArgs);
this.identifier = identifier;
}

public Map<String, String> getVarArgs() {
public Map<String, Object> getVarArgs() {
return copyMap(varArgs);
}

static Map<String, String> copyMap(Map<String, String> source) {
Map<String, String> target = null;
static Map<String, Object> copyMap(Map<String, Object> source) {
Map<String, Object> target = null;
if (source != null) {
target = new HashMap<>(source);
}
return target;
}


static Map<String, Object> initializeMap() {
return new HashMap<>();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public class DataProduct extends CatalogResource {
@Builder
public DataProduct(
String identifier,
Map<String, String> varArgs,
Map<String, Object> varArgs,
String description,
String linkedEntity,
String title,
Expand All @@ -40,9 +40,9 @@ public DataProduct(

public static class DataProductBuilder {
@SuppressWarnings("FieldCanBeLocal")
private Map<String, String> varArgs;
private Map<String, Object> varArgs;

public DataProductBuilder varArgs(Map<String, String> varArgs) {
public DataProductBuilder varArgs(Map<String, Object> varArgs) {
this.varArgs = copyMap(varArgs);
return this;
}
Expand Down
16 changes: 13 additions & 3 deletions src/main/java/io/github/jpmorganchase/fusion/model/Dataset.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import com.google.gson.annotations.SerializedName;
import java.util.Map;
import java.util.Objects;

import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.ToString;
Expand All @@ -26,7 +28,7 @@ public class Dataset extends CatalogResource {
@Builder
public Dataset(
String identifier,
Map<String, String> varArgs,
Map<String, Object> varArgs,
String description,
String linkedEntity,
String title,
Expand All @@ -40,9 +42,17 @@ public Dataset(

public static class DatasetBuilder {
@SuppressWarnings("FieldCanBeLocal")
private Map<String, String> varArgs;
private Map<String, Object> varArgs;

public DatasetBuilder varArg(String key, Object value) {
if (Objects.isNull(varArgs)) {
this.varArgs = initializeMap();
}
this.varArgs.put(key, value);
return this;
}

public DatasetBuilder varArgs(Map<String, String> varArgs) {
public DatasetBuilder varArgs(Map<String, Object> varArgs) {
this.varArgs = copyMap(varArgs);
return this;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public class DatasetSeries extends CatalogResource {
@Builder
public DatasetSeries(
String identifier,
Map<String, String> varArgs,
Map<String, Object> varArgs,
LocalDate fromDate,
LocalDate toDate,
LocalDate createdDate,
Expand All @@ -37,9 +37,9 @@ public DatasetSeries(

public static class DatasetSeriesBuilder {
@SuppressWarnings("FieldCanBeLocal")
private Map<String, String> varArgs;
private Map<String, Object> varArgs;

public DatasetSeriesBuilder varArgs(Map<String, String> varArgs) {
public DatasetSeriesBuilder varArgs(Map<String, Object> varArgs) {
this.varArgs = copyMap(varArgs);
return this;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public class Distribution extends CatalogResource {
@Builder
public Distribution(
String identifier,
Map<String, String> varArgs,
Map<String, Object> varArgs,
String description,
String linkedEntity,
String title,
Expand All @@ -43,9 +43,9 @@ public Distribution(

public static class DistributionBuilder {
@SuppressWarnings("FieldCanBeLocal")
private Map<String, String> varArgs;
private Map<String, Object> varArgs;

public DistributionBuilder varArgs(Map<String, String> varArgs) {
public DistributionBuilder varArgs(Map<String, Object> varArgs) {
this.varArgs = copyMap(varArgs);
return this;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package io.github.jpmorganchase.fusion.serializing;

import io.github.jpmorganchase.fusion.model.Dataset;

public interface APIRequestSerializer {

String serializeDatasetRequest(Dataset dataset);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package io.github.jpmorganchase.fusion.serializing;

import com.google.gson.*;
import io.github.jpmorganchase.fusion.model.Dataset;
import io.github.jpmorganchase.fusion.parsing.GsonAPIResponseParser;
import io.github.jpmorganchase.fusion.serializing.APIRequestSerializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.invoke.MethodHandles;
import java.lang.reflect.Type;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Map;

public class GsonAPIRequestSerializer implements APIRequestSerializer {

private static final Logger logger =
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

private final Gson gson;

public GsonAPIRequestSerializer() {
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Dataset.class, new DatasetSerializer());
gson = gsonBuilder.create();
}

@Override
public String serializeDatasetRequest(Dataset dataset) {
logger.debug("Attempting to serialize dataset {}", dataset);
return gson.toJson(dataset);
}

private static final class DatasetSerializer implements JsonSerializer<Dataset> {

@Override
public JsonElement serialize(Dataset src, Type typeOfSrc, JsonSerializationContext context) {

JsonObject jsonObject = new JsonObject();

jsonObject.add("description", context.serialize(src.getDescription()));
jsonObject.add("@id", context.serialize(src.getLinkedEntity()));
jsonObject.add("title", context.serialize(src.getTitle()));
jsonObject.add("frequency", context.serialize(src.getFrequency()));
jsonObject.add("identifier", context.serialize(src.getIdentifier()));

Map<String, Object> varArgs = src.getVarArgs();
if (varArgs != null) {
varArgs.forEach((key, value) -> jsonObject.add(key, context.serialize(value)));
}


if (jsonObject.has("varArgs")){
jsonObject.remove("varArgs");
}

return jsonObject;
}
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class AttributeBuilderTest {

@Test
void constructionWithBuilderCorrectlyPopulatesAllFields() {
Map<String, String> varArgs = new HashMap<>();
Map<String, Object> varArgs = new HashMap<>();
varArgs.put("key1", "value1");
Attribute a = Attribute.builder()
.identifier("The identifier")
Expand Down
Loading

0 comments on commit 4e354c3

Please sign in to comment.