diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/DataStoreApiDefinitionConverter.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/DataStoreApiDefinitionConverter.java new file mode 100644 index 0000000..3d6c782 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/DataStoreApiDefinitionConverter.java @@ -0,0 +1,36 @@ +package org.opendatamesh.dpds.datastoreapi.v1; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApi; +import org.opendatamesh.dpds.datastoreapi.v1.parser.DataStoreApiParser; +import org.opendatamesh.dpds.extensions.DefinitionConverter; + +import java.io.IOException; + +public class DataStoreApiDefinitionConverter implements DefinitionConverter { + + private static final String SPECIFICATION = "datastoreapi"; + private static final String VERSION = "^1(\\.\\d+){0,2}$"; + private final DataStoreApiParser parser; + + public DataStoreApiDefinitionConverter(DataStoreApiParser parser) { + this.parser = parser; + } + + @Override + public boolean supports(String specification, String specificationVersion) { + return SPECIFICATION.equalsIgnoreCase(specification) && + specificationVersion.matches(VERSION); + } + + @Override + public DataStoreApi deserialize(ObjectMapper defaultMapper, JsonNode jsonNode) throws IOException { + return parser.deserialize(jsonNode); + } + + @Override + public JsonNode serialize(ObjectMapper defaultMapper, DataStoreApi value) throws IOException { + return parser.serialize(value); + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/DataStoreApiDefinitionVisitor.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/DataStoreApiDefinitionVisitor.java new file mode 100644 index 0000000..e41d070 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/DataStoreApiDefinitionVisitor.java @@ -0,0 +1,10 @@ +package org.opendatamesh.dpds.datastoreapi.v1; + +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApi; +import org.opendatamesh.dpds.extensions.DefinitionVisitor; + +public abstract class DataStoreApiDefinitionVisitor extends DefinitionVisitor { + protected DataStoreApiDefinitionVisitor() { + super(DataStoreApi.class); + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/DataStoreApiStandardDefinitionConverter.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/DataStoreApiStandardDefinitionConverter.java new file mode 100644 index 0000000..24f3222 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/DataStoreApiStandardDefinitionConverter.java @@ -0,0 +1,14 @@ +package org.opendatamesh.dpds.datastoreapi.v1.extensions; + +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.opendatamesh.dpds.model.core.ComponentBase; + +public interface DataStoreApiStandardDefinitionConverter { + boolean supports(String specification, String specificationVersion); + + T deserialize(ObjectMapper defaultMapper, JsonNode jsonNode) throws JacksonException; + + JsonNode serialize(ObjectMapper defaultMapper, T value) throws JacksonException; +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiConnectionProtocolObjectImpl.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiConnectionProtocolObjectImpl.java new file mode 100644 index 0000000..e41d47e --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiConnectionProtocolObjectImpl.java @@ -0,0 +1,31 @@ +package org.opendatamesh.dpds.datastoreapi.v1.extensions.visitorimpl; + +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiJdbcConnectionObject; +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiOdbcConnectionObject; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiConnectionProtocolObjectVisitor; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiJdbcConnectionObjectVisitor; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiOdbcConnectionObjectVisitor; + +public class DataStoreApiConnectionProtocolObjectImpl extends ExtensionVisitor implements DataStoreApiConnectionProtocolObjectVisitor { + public DataStoreApiConnectionProtocolObjectImpl(ExtensionVisitor parent) { + super(parent); + } + + @Override + public void visit(DataStoreApiJdbcConnectionObject jdbc) { + extensionHandler.handleComponentBaseExtension(jdbc, DataStoreApiJdbcConnectionObject.class); + DataStoreApiJdbcConnectionObjectVisitor visitor = new DataStoreApiJdbcConnectionObjectImpl(this); + if(jdbc.getDriverDocs() != null){ + visitor.visit(jdbc.getDriverDocs()); + } + } + + @Override + public void visit(DataStoreApiOdbcConnectionObject odbc) { + extensionHandler.handleComponentBaseExtension(odbc, DataStoreApiOdbcConnectionObject.class); + DataStoreApiOdbcConnectionObjectVisitor visitor = new DataStoreApiOdbcConnectionObjectImpl(this); + if(odbc.getDriverDocs() != null){ + visitor.visit(odbc.getDriverDocs()); + } + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiDatabaseServiceVisitorImpl.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiDatabaseServiceVisitorImpl.java new file mode 100644 index 0000000..c0746c3 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiDatabaseServiceVisitorImpl.java @@ -0,0 +1,26 @@ +package org.opendatamesh.dpds.datastoreapi.v1.extensions.visitorimpl; + +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiServerInfo; +import org.opendatamesh.dpds.datastoreapi.v1.model.DatastoreApiVariableObject; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiDatabaseServiceVisitor; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiServerInfoVisitor; + +public class DataStoreApiDatabaseServiceVisitorImpl extends ExtensionVisitor implements DataStoreApiDatabaseServiceVisitor { + public DataStoreApiDatabaseServiceVisitorImpl(ExtensionVisitor parent) { + super(parent); + } + + @Override + public void visit(DataStoreApiServerInfo serverInfo) { + extensionHandler.handleComponentBaseExtension(serverInfo, DataStoreApiServerInfo.class); + DataStoreApiServerInfoVisitor visitor = new DataStoreApiServerInfoVisitorImpl(this); + if (serverInfo.getConnectionProtocols() != null) { + visitor.visit(serverInfo.getConnectionProtocols()); + } + } + + @Override + public void visit(DatastoreApiVariableObject variableObject) { + extensionHandler.handleComponentBaseExtension(variableObject, DatastoreApiVariableObject.class); + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiExtensionVisitorImpl.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiExtensionVisitorImpl.java new file mode 100644 index 0000000..8c1dbe0 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiExtensionVisitorImpl.java @@ -0,0 +1,51 @@ +package org.opendatamesh.dpds.datastoreapi.v1.extensions.visitorimpl; + +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiDatabaseService; +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiInfo; +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiSchema; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiDatabaseServiceVisitor; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiInfoVisitor; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiSchemaVisitor; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiVisitor; + +public class DataStoreApiExtensionVisitorImpl extends ExtensionVisitor implements DataStoreApiVisitor { + + public DataStoreApiExtensionVisitorImpl(ExtensionHandler extensionHandler) { + super(null); + this.extensionHandler = extensionHandler; + } + + + @Override + public void visit(DataStoreApiInfo info) { + extensionHandler.handleComponentBaseExtension(info, DataStoreApiInfo.class); + DataStoreApiInfoVisitor visitor = new DataStoreApiInfoVisitorImpl(this); + if (info.getContact() != null) { + visitor.visit(info.getContact()); + } + if (info.getLicense() != null) { + visitor.visit(info.getLicense()); + } + } + + @Override + public void visit(DataStoreApiDatabaseService databaseService) { + extensionHandler.handleComponentBaseExtension(databaseService, DataStoreApiDatabaseService.class); + DataStoreApiDatabaseServiceVisitor visitor = new DataStoreApiDatabaseServiceVisitorImpl(this); + if (databaseService.getServerInfo() != null) { + visitor.visit(databaseService.getServerInfo()); + } + if (databaseService.getVariables() != null) { + databaseService.getVariables().forEach((key, value) -> visitor.visit(value)); + } + } + + @Override + public void visit(DataStoreApiSchema schema) { + extensionHandler.handleComponentBaseExtension(schema, DataStoreApiSchema.class); + DataStoreApiSchemaVisitor visitor = new DataStoreApiSchemaVisitorImpl(this); + if (schema.getTables() != null) { + schema.getTables().forEach(visitor::visit); + } + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiExternalResourceObjectVisitorImpl.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiExternalResourceObjectVisitorImpl.java new file mode 100644 index 0000000..80794e4 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiExternalResourceObjectVisitorImpl.java @@ -0,0 +1,15 @@ +package org.opendatamesh.dpds.datastoreapi.v1.extensions.visitorimpl; + +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiExternalResourceObject; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiStandardDefinitionObjectVisitor; + +public class DataStoreApiExternalResourceObjectVisitorImpl extends ExtensionVisitor implements DataStoreApiStandardDefinitionObjectVisitor { + public DataStoreApiExternalResourceObjectVisitorImpl(ExtensionVisitor parent) { + super(parent); + } + + @Override + public void visit(DataStoreApiExternalResourceObject externalResourceObject) { + extensionHandler.handleComponentBaseExtension(externalResourceObject, DataStoreApiExternalResourceObject.class); + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiInfoVisitorImpl.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiInfoVisitorImpl.java new file mode 100644 index 0000000..69bfe34 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiInfoVisitorImpl.java @@ -0,0 +1,22 @@ +package org.opendatamesh.dpds.datastoreapi.v1.extensions.visitorimpl; + +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiContact; +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiLicense; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiInfoVisitor; + +public class DataStoreApiInfoVisitorImpl extends ExtensionVisitor implements DataStoreApiInfoVisitor { + + public DataStoreApiInfoVisitorImpl(ExtensionVisitor parent) { + super(parent); + } + + @Override + public void visit(DataStoreApiContact contact) { + extensionHandler.handleComponentBaseExtension(contact, DataStoreApiContact.class); + } + + @Override + public void visit(DataStoreApiLicense license) { + extensionHandler.handleComponentBaseExtension(license, DataStoreApiLicense.class); + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiJdbcConnectionObjectImpl.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiJdbcConnectionObjectImpl.java new file mode 100644 index 0000000..1e484eb --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiJdbcConnectionObjectImpl.java @@ -0,0 +1,16 @@ +package org.opendatamesh.dpds.datastoreapi.v1.extensions.visitorimpl; + +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiExternalResourceObject; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiJdbcConnectionObjectVisitor; + +public class DataStoreApiJdbcConnectionObjectImpl extends ExtensionVisitor implements DataStoreApiJdbcConnectionObjectVisitor { + + public DataStoreApiJdbcConnectionObjectImpl(ExtensionVisitor parent) { + super(parent); + } + + @Override + public void visit(DataStoreApiExternalResourceObject externalResourceObject) { + extensionHandler.handleComponentBaseExtension(externalResourceObject, DataStoreApiExternalResourceObject.class); + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiOdbcConnectionObjectImpl.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiOdbcConnectionObjectImpl.java new file mode 100644 index 0000000..794ee4a --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiOdbcConnectionObjectImpl.java @@ -0,0 +1,15 @@ +package org.opendatamesh.dpds.datastoreapi.v1.extensions.visitorimpl; + +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiExternalResourceObject; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiOdbcConnectionObjectVisitor; + +public class DataStoreApiOdbcConnectionObjectImpl extends ExtensionVisitor implements DataStoreApiOdbcConnectionObjectVisitor { + public DataStoreApiOdbcConnectionObjectImpl(ExtensionVisitor parent) { + super(parent); + } + + @Override + public void visit(DataStoreApiExternalResourceObject externalResourceObject) { + extensionHandler.handleComponentBaseExtension(externalResourceObject, DataStoreApiExternalResourceObject.class); + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiSchemaVisitorImpl.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiSchemaVisitorImpl.java new file mode 100644 index 0000000..9912f13 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiSchemaVisitorImpl.java @@ -0,0 +1,21 @@ +package org.opendatamesh.dpds.datastoreapi.v1.extensions.visitorimpl; + +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiStandardDefinitionObject; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiSchemaVisitor; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiStandardDefinitionObjectVisitor; + +public class DataStoreApiSchemaVisitorImpl extends ExtensionVisitor implements DataStoreApiSchemaVisitor { + public DataStoreApiSchemaVisitorImpl(ExtensionVisitor parent) { + super(parent); + } + + @Override + public void visit(DataStoreApiStandardDefinitionObject standardDefinitionObject) { + extensionHandler.handleComponentBaseExtension(standardDefinitionObject, DataStoreApiStandardDefinitionObject.class); + extensionHandler.handleStandardObjectDefinition(standardDefinitionObject); + DataStoreApiStandardDefinitionObjectVisitor visitor = new DataStoreApiExternalResourceObjectVisitorImpl(this); + if (standardDefinitionObject.getExternalDocs() != null) { + visitor.visit(standardDefinitionObject.getExternalDocs()); + } + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiServerInfoVisitorImpl.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiServerInfoVisitorImpl.java new file mode 100644 index 0000000..7be76e8 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/DataStoreApiServerInfoVisitorImpl.java @@ -0,0 +1,23 @@ +package org.opendatamesh.dpds.datastoreapi.v1.extensions.visitorimpl; + +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiConnectionProtocolObject; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiConnectionProtocolObjectVisitor; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiServerInfoVisitor; + +public class DataStoreApiServerInfoVisitorImpl extends ExtensionVisitor implements DataStoreApiServerInfoVisitor { + public DataStoreApiServerInfoVisitorImpl(ExtensionVisitor parent) { + super(parent); + } + + @Override + public void visit(DataStoreApiConnectionProtocolObject connectionProtocolObject) { + extensionHandler.handleComponentBaseExtension(connectionProtocolObject, DataStoreApiConnectionProtocolObject.class); + DataStoreApiConnectionProtocolObjectVisitor visitor = new DataStoreApiConnectionProtocolObjectImpl(this); + if(connectionProtocolObject.getJdbc() != null){ + visitor.visit(connectionProtocolObject.getJdbc()); + } + if(connectionProtocolObject.getOdbc() != null){ + visitor.visit(connectionProtocolObject.getOdbc()); + } + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/ExtensionHandler.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/ExtensionHandler.java new file mode 100644 index 0000000..2e4a51c --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/ExtensionHandler.java @@ -0,0 +1,108 @@ +package org.opendatamesh.dpds.datastoreapi.v1.extensions.visitorimpl; + +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.opendatamesh.dpds.datastoreapi.v1.extensions.DataStoreApiStandardDefinitionConverter; +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiStandardDefinitionObject; +import org.opendatamesh.dpds.extensions.ComponentBaseExtendedConverter; +import org.opendatamesh.dpds.model.core.ComponentBase; + +import java.util.*; + +public class ExtensionHandler { + + private final ExtensionHandlerStatus status; + private final List> componentBaseExtendedConverters; + private final List> tableConverters; + private final ObjectMapper mapper; + + public ExtensionHandler( + ExtensionHandlerStatus status, + List> componentBaseExtendedConverters, + List> tableConverters, + ObjectMapper mapper + ) { + this.status = status; + this.componentBaseExtendedConverters = componentBaseExtendedConverters; + this.tableConverters = tableConverters; + this.mapper = mapper; + } + + public void handleComponentBaseExtension(ComponentBase componentBase, Class parentClazz) { + try { + switch (status) { + case SERIALIZING: + for (Map.Entry parsedProperty : componentBase.getParsedProperties().entrySet()) { + Optional> extendedComponentBaseConverter = findSupportedExtensionConverter(parentClazz, parsedProperty.getKey()); + if (extendedComponentBaseConverter.isPresent()) { + componentBase.addAdditionalProperty( + parsedProperty.getKey(), + extendedComponentBaseConverter.get() + .serialize(mapper, parsedProperty.getValue()) + ); + } else { + throw new IllegalStateException("No ComponentBaseExtendedConverter has been registered on the Parser that can handle this property: " + parsedProperty.getKey() + " " + mapper.writeValueAsString(parsedProperty.getValue())); + } + } + break; + case DESERIALIZING: + Set keys = new HashSet<>(componentBase.getAdditionalProperties().keySet()); + for (String key : keys) { + Optional> extendedComponentBaseConverter = findSupportedExtensionConverter(parentClazz, key); + if (extendedComponentBaseConverter.isPresent()) { + ComponentBase c = extendedComponentBaseConverter.get(). + deserialize(mapper, componentBase.getAdditionalProperties().remove(key)); + componentBase.addParsedProperty(key, c); + } + } + break; + } + } catch (JacksonException e) { + throw new RuntimeException(e); + } + } + + private Optional> findSupportedExtensionConverter( + Class parentClazz, String key + ) { + return componentBaseExtendedConverters.stream() + .filter(e -> e.supports(key, parentClazz)) + .findFirst(); + } + + private Optional> findSupportedTableConverter( + String definition, String definitionVersion + ) { + return tableConverters.stream() + .filter(e -> e.supports(definition, definitionVersion)) + .findFirst(); + } + + public void handleStandardObjectDefinition(DataStoreApiStandardDefinitionObject standardDefinitionObject) { + Optional> supportedStandardDefinitionConverter = findSupportedTableConverter(standardDefinitionObject.getSpecification(), standardDefinitionObject.getSpecificationVersion()); + if (supportedStandardDefinitionConverter.isEmpty()) { + return; + } + try { + JsonNode rawDefinition; + switch (status) { + case SERIALIZING: + rawDefinition = supportedStandardDefinitionConverter.get().serialize(mapper, standardDefinitionObject); + standardDefinitionObject.setDefinition(mapper.treeToValue(rawDefinition, ComponentBase.class)); + break; + case DESERIALIZING: + rawDefinition = mapper.valueToTree(standardDefinitionObject.getDefinition()); + standardDefinitionObject.setDefinition(supportedStandardDefinitionConverter.get().deserialize(mapper, rawDefinition)); + break; + } + } catch (JacksonException e) { + throw new RuntimeException(e); + } + } + + public enum ExtensionHandlerStatus { + SERIALIZING, + DESERIALIZING + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/ExtensionVisitor.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/ExtensionVisitor.java new file mode 100644 index 0000000..e684a3d --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/ExtensionVisitor.java @@ -0,0 +1,13 @@ +package org.opendatamesh.dpds.datastoreapi.v1.extensions.visitorimpl; + +public abstract class ExtensionVisitor { + protected ExtensionVisitor parent; + protected ExtensionHandler extensionHandler; + + protected ExtensionVisitor(ExtensionVisitor parent) { + this.parent = parent; + if (parent != null) { + this.extensionHandler = parent.extensionHandler; + } + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApi.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApi.java new file mode 100644 index 0000000..734ece2 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApi.java @@ -0,0 +1,48 @@ +package org.opendatamesh.dpds.datastoreapi.v1.model; + +import org.opendatamesh.dpds.model.core.ComponentBase; + +import java.util.Map; + +public class DataStoreApi extends ComponentBase { + private String datastoreapi; + private DataStoreApiInfo info; + private Map services; + private DataStoreApiSchema schema; + + public DataStoreApi() { + //DO NOTHING + } + + public String getDatastoreapi() { + return datastoreapi; + } + + public void setDatastoreapi(String datastoreapi) { + this.datastoreapi = datastoreapi; + } + + public DataStoreApiInfo getInfo() { + return info; + } + + public void setInfo(DataStoreApiInfo info) { + this.info = info; + } + + public Map getServices() { + return services; + } + + public void setServices(Map services) { + this.services = services; + } + + public DataStoreApiSchema getSchema() { + return schema; + } + + public void setSchema(DataStoreApiSchema schema) { + this.schema = schema; + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiConnectionProtocolObject.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiConnectionProtocolObject.java new file mode 100644 index 0000000..282266f --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiConnectionProtocolObject.java @@ -0,0 +1,33 @@ +package org.opendatamesh.dpds.datastoreapi.v1.model; + +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiServerInfoVisitor; +import org.opendatamesh.dpds.model.core.ComponentBase; + +public class DataStoreApiConnectionProtocolObject extends ComponentBase { + private DataStoreApiJdbcConnectionObject jdbc; + private DataStoreApiOdbcConnectionObject odbc; + + public DataStoreApiConnectionProtocolObject() { + //DO NOTHING + } + + public void accept(DataStoreApiServerInfoVisitor visitor) { + visitor.visit(this); + } + + public DataStoreApiJdbcConnectionObject getJdbc() { + return jdbc; + } + + public void setJdbc(DataStoreApiJdbcConnectionObject jdbc) { + this.jdbc = jdbc; + } + + public DataStoreApiOdbcConnectionObject getOdbc() { + return odbc; + } + + public void setOdbc(DataStoreApiOdbcConnectionObject odbc) { + this.odbc = odbc; + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiContact.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiContact.java new file mode 100644 index 0000000..a5e6f99 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiContact.java @@ -0,0 +1,42 @@ +package org.opendatamesh.dpds.datastoreapi.v1.model; + +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiInfoVisitor; +import org.opendatamesh.dpds.model.core.ComponentBase; + +public class DataStoreApiContact extends ComponentBase { + private String name; + private String url; + private String email; + + public DataStoreApiContact() { + //DO NOTHING + } + + public void accept(DataStoreApiInfoVisitor visitor) { + visitor.visit(this); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiDatabaseService.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiDatabaseService.java new file mode 100644 index 0000000..6b1bcd5 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiDatabaseService.java @@ -0,0 +1,53 @@ +package org.opendatamesh.dpds.datastoreapi.v1.model; + +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiVisitor; +import org.opendatamesh.dpds.model.core.ComponentBase; + +import java.util.Map; + +public class DataStoreApiDatabaseService extends ComponentBase { + private String name; + private String description; + private DataStoreApiServerInfo serverInfo; + private Map variables; + + public DataStoreApiDatabaseService() { + //DO NOTHING + } + + public void accept(DataStoreApiVisitor visitor) { + visitor.visit(this); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public DataStoreApiServerInfo getServerInfo() { + return serverInfo; + } + + public void setServerInfo(DataStoreApiServerInfo serverInfo) { + this.serverInfo = serverInfo; + } + + public Map getVariables() { + return variables; + } + + public void setVariables(Map variables) { + this.variables = variables; + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiExternalResourceObject.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiExternalResourceObject.java new file mode 100644 index 0000000..7999475 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiExternalResourceObject.java @@ -0,0 +1,56 @@ +package org.opendatamesh.dpds.datastoreapi.v1.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiJdbcConnectionObjectVisitor; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiOdbcConnectionObjectVisitor; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiStandardDefinitionObjectVisitor; +import org.opendatamesh.dpds.model.core.ComponentBase; + +public class DataStoreApiExternalResourceObject extends ComponentBase { + private String description; + private String mediaType; + @JsonProperty("$href") + private String href; + + public DataStoreApiExternalResourceObject() { + //DO NOTHING + } + + public void accept(DataStoreApiJdbcConnectionObjectVisitor visitor) { + visitor.visit(this); + } + + public void accept(DataStoreApiOdbcConnectionObjectVisitor visitor) { + visitor.visit(this); + } + + public void accept(DataStoreApiStandardDefinitionObjectVisitor visitor) { + visitor.visit(this); + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + @Override + public String getMediaType() { + return mediaType; + } + + @Override + public void setMediaType(String mediaType) { + this.mediaType = mediaType; + } + + public String getHref() { + return href; + } + + public void setHref(String href) { + this.href = href; + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiInfo.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiInfo.java new file mode 100644 index 0000000..cb7821f --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiInfo.java @@ -0,0 +1,87 @@ +package org.opendatamesh.dpds.datastoreapi.v1.model; + +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiVisitor; +import org.opendatamesh.dpds.model.core.ComponentBase; + +public class DataStoreApiInfo extends ComponentBase { + private String title; + private String summary; + private String description; + private String termsOfService; + private String version; + private String datastoreName; + private DataStoreApiContact contact; + private DataStoreApiLicense license; + + public DataStoreApiInfo() { + //DO NOTHING + } + + public void accept(DataStoreApiVisitor visitor) { + visitor.visit(this); + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getSummary() { + return summary; + } + + public void setSummary(String summary) { + this.summary = summary; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getTermsOfService() { + return termsOfService; + } + + public void setTermsOfService(String termsOfService) { + this.termsOfService = termsOfService; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getDatastoreName() { + return datastoreName; + } + + public void setDatastoreName(String datastoreName) { + this.datastoreName = datastoreName; + } + + public DataStoreApiContact getContact() { + return contact; + } + + public void setContact(DataStoreApiContact contact) { + this.contact = contact; + } + + public DataStoreApiLicense getLicense() { + return license; + } + + public void setLicense(DataStoreApiLicense license) { + this.license = license; + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiJdbcConnectionObject.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiJdbcConnectionObject.java new file mode 100644 index 0000000..12ce022 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiJdbcConnectionObject.java @@ -0,0 +1,78 @@ +package org.opendatamesh.dpds.datastoreapi.v1.model; + +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiConnectionProtocolObjectVisitor; +import org.opendatamesh.dpds.model.core.ComponentBase; + +public class DataStoreApiJdbcConnectionObject extends ComponentBase { + private String version; + private String connectionString; + private String driverName; + private String driverClass; + private String driverVersion; + private DataStoreApiExternalResourceObject driverLibrary; + private DataStoreApiExternalResourceObject driverDocs; + + public DataStoreApiJdbcConnectionObject() { + //DO NOTHING + } + + public void accept(DataStoreApiConnectionProtocolObjectVisitor visitor) { + visitor.visit(this); + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getConnectionString() { + return connectionString; + } + + public void setConnectionString(String connectionString) { + this.connectionString = connectionString; + } + + public String getDriverName() { + return driverName; + } + + public void setDriverName(String driverName) { + this.driverName = driverName; + } + + public String getDriverClass() { + return driverClass; + } + + public void setDriverClass(String driverClass) { + this.driverClass = driverClass; + } + + public String getDriverVersion() { + return driverVersion; + } + + public void setDriverVersion(String driverVersion) { + this.driverVersion = driverVersion; + } + + public DataStoreApiExternalResourceObject getDriverLibrary() { + return driverLibrary; + } + + public void setDriverLibrary(DataStoreApiExternalResourceObject driverLibrary) { + this.driverLibrary = driverLibrary; + } + + public DataStoreApiExternalResourceObject getDriverDocs() { + return driverDocs; + } + + public void setDriverDocs(DataStoreApiExternalResourceObject driverDocs) { + this.driverDocs = driverDocs; + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiLicense.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiLicense.java new file mode 100644 index 0000000..961e9ad --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiLicense.java @@ -0,0 +1,34 @@ +package org.opendatamesh.dpds.datastoreapi.v1.model; + +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiInfoVisitor; +import org.opendatamesh.dpds.model.core.ComponentBase; + +public class DataStoreApiLicense extends ComponentBase { + private String name; + private String url; + + public DataStoreApiLicense() { + //DO NOTHING + } + + public void accept(DataStoreApiInfoVisitor visitor) { + visitor.visit(this); + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiOdbcConnectionObject.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiOdbcConnectionObject.java new file mode 100644 index 0000000..6761608 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiOdbcConnectionObject.java @@ -0,0 +1,78 @@ +package org.opendatamesh.dpds.datastoreapi.v1.model; + +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiConnectionProtocolObjectVisitor; +import org.opendatamesh.dpds.model.core.ComponentBase; + +public class DataStoreApiOdbcConnectionObject extends ComponentBase { + private String version; + private String connectionString; + private String driverName; + private String driverClass; + private String driverVersion; + private DataStoreApiExternalResourceObject driverLibrary; + private DataStoreApiExternalResourceObject driverDocs; + + public DataStoreApiOdbcConnectionObject() { + //DO NOTHING + } + + public void accept(DataStoreApiConnectionProtocolObjectVisitor visitor) { + visitor.visit(this); + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getConnectionString() { + return connectionString; + } + + public void setConnectionString(String connectionString) { + this.connectionString = connectionString; + } + + public String getDriverName() { + return driverName; + } + + public void setDriverName(String driverName) { + this.driverName = driverName; + } + + public String getDriverClass() { + return driverClass; + } + + public void setDriverClass(String driverClass) { + this.driverClass = driverClass; + } + + public String getDriverVersion() { + return driverVersion; + } + + public void setDriverVersion(String driverVersion) { + this.driverVersion = driverVersion; + } + + public DataStoreApiExternalResourceObject getDriverLibrary() { + return driverLibrary; + } + + public void setDriverLibrary(DataStoreApiExternalResourceObject driverLibrary) { + this.driverLibrary = driverLibrary; + } + + public DataStoreApiExternalResourceObject getDriverDocs() { + return driverDocs; + } + + public void setDriverDocs(DataStoreApiExternalResourceObject driverDocs) { + this.driverDocs = driverDocs; + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiSchema.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiSchema.java new file mode 100644 index 0000000..2541350 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiSchema.java @@ -0,0 +1,44 @@ +package org.opendatamesh.dpds.datastoreapi.v1.model; + +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiVisitor; +import org.opendatamesh.dpds.model.core.ComponentBase; + +import java.util.List; + +public class DataStoreApiSchema extends ComponentBase { + private String databaseName; + private String databaseSchemaName; + private List tables; + + public DataStoreApiSchema() { + //DO NOTHING + } + + public void accept(DataStoreApiVisitor visitor) { + visitor.visit(this); + } + + public String getDatabaseName() { + return databaseName; + } + + public void setDatabaseName(String databaseName) { + this.databaseName = databaseName; + } + + public String getDatabaseSchemaName() { + return databaseSchemaName; + } + + public void setDatabaseSchemaName(String databaseSchemaName) { + this.databaseSchemaName = databaseSchemaName; + } + + public List getTables() { + return tables; + } + + public void setTables(List tables) { + this.tables = tables; + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiServerInfo.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiServerInfo.java new file mode 100644 index 0000000..fb2b4be --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiServerInfo.java @@ -0,0 +1,61 @@ +package org.opendatamesh.dpds.datastoreapi.v1.model; + +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiDatabaseServiceVisitor; +import org.opendatamesh.dpds.model.core.ComponentBase; + +public class DataStoreApiServerInfo extends ComponentBase { + private String host; + private String port; + private String dbmsType; + private String dbmsVersion; + private DataStoreApiConnectionProtocolObject connectionProtocols; + + public DataStoreApiServerInfo() { + //DO NOTHING + } + + public void accept(DataStoreApiDatabaseServiceVisitor visitor) { + visitor.visit(this); + } + + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public String getPort() { + return port; + } + + public void setPort(String port) { + this.port = port; + } + + public String getDbmsType() { + return dbmsType; + } + + public void setDbmsType(String dbmsType) { + this.dbmsType = dbmsType; + } + + public String getDbmsVersion() { + return dbmsVersion; + } + + public void setDbmsVersion(String dbmsVersion) { + this.dbmsVersion = dbmsVersion; + } + + public DataStoreApiConnectionProtocolObject getConnectionProtocols() { + return connectionProtocols; + } + + public void setConnectionProtocols(DataStoreApiConnectionProtocolObject connectionProtocols) { + this.connectionProtocols = connectionProtocols; + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiStandardDefinitionObject.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiStandardDefinitionObject.java new file mode 100644 index 0000000..e33f545 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DataStoreApiStandardDefinitionObject.java @@ -0,0 +1,88 @@ +package org.opendatamesh.dpds.datastoreapi.v1.model; + +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiSchemaVisitor; +import org.opendatamesh.dpds.model.core.ComponentBase; + +public class DataStoreApiStandardDefinitionObject extends ComponentBase { + + private String id; + private String name; + private String version; + private String description; + private String specification; + private String specificationVersion; + private ComponentBase definition; + private DataStoreApiExternalResourceObject externalDocs; + + public DataStoreApiStandardDefinitionObject() { + //DO NOTHING + } + + public void accept(DataStoreApiSchemaVisitor visitor) { + visitor.visit(this); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getSpecification() { + return specification; + } + + public void setSpecification(String specification) { + this.specification = specification; + } + + public String getSpecificationVersion() { + return specificationVersion; + } + + public void setSpecificationVersion(String specificationVersion) { + this.specificationVersion = specificationVersion; + } + + public ComponentBase getDefinition() { + return definition; + } + + public void setDefinition(ComponentBase definition) { + this.definition = definition; + } + + public DataStoreApiExternalResourceObject getExternalDocs() { + return externalDocs; + } + + public void setExternalDocs(DataStoreApiExternalResourceObject externalDocs) { + this.externalDocs = externalDocs; + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DatastoreApiVariableObject.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DatastoreApiVariableObject.java new file mode 100644 index 0000000..ad9983b --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/model/DatastoreApiVariableObject.java @@ -0,0 +1,56 @@ +package org.opendatamesh.dpds.datastoreapi.v1.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiDatabaseServiceVisitor; +import org.opendatamesh.dpds.model.core.ComponentBase; + +import java.util.List; + +public class DatastoreApiVariableObject extends ComponentBase { + private String description; + @JsonProperty("enum") + private List _enum; + @JsonProperty("default") + private String _default; + private List examples; + + public DatastoreApiVariableObject() { + //DO NOTHING + } + + public void accept(DataStoreApiDatabaseServiceVisitor visitor) { + visitor.visit(this); + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public List get_enum() { + return _enum; + } + + public void set_enum(List _enum) { + this._enum = _enum; + } + + public String get_default() { + return _default; + } + + public void set_default(String _default) { + this._default = _default; + } + + public List getExamples() { + return examples; + } + + public void setExamples(List examples) { + this.examples = examples; + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/parser/DataStoreApiParser.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/parser/DataStoreApiParser.java new file mode 100644 index 0000000..8f0f128 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/parser/DataStoreApiParser.java @@ -0,0 +1,53 @@ +package org.opendatamesh.dpds.datastoreapi.v1.parser; + +import com.fasterxml.jackson.databind.JsonNode; +import org.opendatamesh.dpds.datastoreapi.v1.extensions.DataStoreApiStandardDefinitionConverter; +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApi; +import org.opendatamesh.dpds.extensions.ComponentBaseExtendedConverter; +import org.opendatamesh.dpds.model.core.ComponentBase; + +import java.io.IOException; + +/** + * The {@code DataStoreApiParser} interface provides methods for serializing and deserializing + * {@link DataStoreApi} objects. It also allows the registration of custom + * converters for handling extended components and standard definition objects. + */ +public interface DataStoreApiParser { + + /** + * Deserializes a JSON representation into a {@link DataStoreApi} instance. + * + * @param jsonNode the JSON node representing the dataStoreApi + * @return the deserialized {@link DataStoreApi} instance + * @throws IOException if an error occurs during deserialization + */ + DataStoreApi deserialize(JsonNode jsonNode) throws IOException; + + /** + * Serializes a {@link DataStoreApi} instance into a JSON representation. + * + * @param dataStoreApi the dataStoreApi instance to serialize + * @return the JSON representation of the data product version + * @throws IOException if an error occurs during serialization + */ + JsonNode serialize(DataStoreApi dataStoreApi) throws IOException; + + /** + * Registers a {@link ComponentBaseExtendedConverter} for handling extended components. + * + * @param componentBaseExtendedConverter the converter to register + * @param the type of component base the converter handles + * @return the updated {@code Parser} instance + */ + DataStoreApiParser register(ComponentBaseExtendedConverter componentBaseExtendedConverter); + + /** + * Registers a {@link DataStoreApiStandardDefinitionConverter} for handling standard definition objects. + * + * @param dataStoreApiStandardDefinitionConverter the converter to register + * @param the type of component base the converter handles + * @return the updated {@code Parser} instance + */ + DataStoreApiParser register(DataStoreApiStandardDefinitionConverter dataStoreApiStandardDefinitionConverter); +} \ No newline at end of file diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/parser/DataStoreApiParserFactory.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/parser/DataStoreApiParserFactory.java new file mode 100644 index 0000000..d0c5eda --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/parser/DataStoreApiParserFactory.java @@ -0,0 +1,21 @@ +package org.opendatamesh.dpds.datastoreapi.v1.parser; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.ObjectMapper; + +public abstract class DataStoreApiParserFactory { + + private DataStoreApiParserFactory() { + //DO NOTHING + } + + public static DataStoreApiParser getParser() { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); + return new DataStoreApiParserImpl(objectMapper); + } + + public static DataStoreApiParser getParser(ObjectMapper objectMapper) { + return new DataStoreApiParserImpl(objectMapper); + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/parser/DataStoreApiParserImpl.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/parser/DataStoreApiParserImpl.java new file mode 100644 index 0000000..f9fedd2 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/parser/DataStoreApiParserImpl.java @@ -0,0 +1,107 @@ +package org.opendatamesh.dpds.datastoreapi.v1.parser; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.opendatamesh.dpds.datastoreapi.v1.extensions.DataStoreApiStandardDefinitionConverter; +import org.opendatamesh.dpds.datastoreapi.v1.extensions.visitorimpl.DataStoreApiExtensionVisitorImpl; +import org.opendatamesh.dpds.datastoreapi.v1.extensions.visitorimpl.ExtensionHandler; +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApi; +import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiVisitor; +import org.opendatamesh.dpds.extensions.ComponentBaseExtendedConverter; +import org.opendatamesh.dpds.model.core.ComponentBase; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + +class DataStoreApiParserImpl implements DataStoreApiParser { + + private final ObjectMapper objectMapper; + private final List> componentBaseExtendedConverters = new ArrayList<>(); + private final List> tableConverters = new ArrayList<>(); + + public DataStoreApiParserImpl(ObjectMapper objectMapper) { + this.objectMapper = objectMapper; + } + + @Override + public DataStoreApi deserialize(JsonNode raw) throws IOException { + // Deep copying the raw jsonNode object so it can be modified without affecting + // the original object passed as parameter + JsonNode jsonNode = raw.deepCopy(); + + DataStoreApi dataStoreApi = objectMapper.treeToValue(jsonNode, DataStoreApi.class); + if (!componentBaseExtendedConverters.isEmpty() || !tableConverters.isEmpty()) { + ExtensionHandler extensionHandler = new ExtensionHandler(ExtensionHandler.ExtensionHandlerStatus.DESERIALIZING, componentBaseExtendedConverters, tableConverters, objectMapper); + DataStoreApiVisitor visitor = new DataStoreApiExtensionVisitorImpl(extensionHandler); + extensionHandler.handleComponentBaseExtension(dataStoreApi, DataStoreApi.class); + + if (dataStoreApi.getInfo() != null) { + visitor.visit(dataStoreApi.getInfo()); + } + if (dataStoreApi.getServices() != null) { + dataStoreApi.getServices().forEach((key, value) -> visitor.visit(value)); + } + if (dataStoreApi.getSchema() != null) { + visitor.visit(dataStoreApi.getSchema()); + } + } + return dataStoreApi; + + } + + @Override + public JsonNode serialize(DataStoreApi dataStore) throws IOException { + // Deep copying the descriptor object so it can be modified without affecting + // the original object passed as parameter + DataStoreApi dataStoreApi = deepCopy(dataStore); + if (!componentBaseExtendedConverters.isEmpty() || !tableConverters.isEmpty()) { + ExtensionHandler extensionHandler = new ExtensionHandler(ExtensionHandler.ExtensionHandlerStatus.SERIALIZING, componentBaseExtendedConverters, tableConverters, objectMapper); + DataStoreApiVisitor visitor = new DataStoreApiExtensionVisitorImpl(extensionHandler); + extensionHandler.handleComponentBaseExtension(dataStoreApi, DataStoreApi.class); + + if (dataStoreApi.getInfo() != null) { + visitor.visit(dataStoreApi.getInfo()); + } + if (dataStoreApi.getServices() != null) { + dataStoreApi.getServices().forEach((key, value) -> visitor.visit(value)); + } + if (dataStoreApi.getSchema() != null) { + visitor.visit(dataStoreApi.getSchema()); + } + } + return objectMapper.valueToTree(dataStoreApi); + } + + @Override + @SuppressWarnings({"unchecked"}) + public DataStoreApiParser register(ComponentBaseExtendedConverter componentBaseExtendedConverter) { + this.componentBaseExtendedConverters.add((ComponentBaseExtendedConverter) componentBaseExtendedConverter); + return this; + } + + @Override + @SuppressWarnings({"unchecked"}) + public DataStoreApiParser register(DataStoreApiStandardDefinitionConverter dataStoreApiStandardDefinitionConverter) { + this.tableConverters.add((DataStoreApiStandardDefinitionConverter) dataStoreApiStandardDefinitionConverter); + return this; + } + + @SuppressWarnings({"unchecked"}) + private T deepCopy(T object) throws IOException { + // Write the object to a byte array output stream + try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream out = new ObjectOutputStream(bos)) { + out.writeObject(object); + out.flush(); + + // Read the object back from the byte array input stream + try (ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); + ObjectInputStream in = new ObjectInputStream(bis)) { + return (T) in.readObject(); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + } +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiConnectionProtocolObjectVisitor.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiConnectionProtocolObjectVisitor.java new file mode 100644 index 0000000..3803bfe --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiConnectionProtocolObjectVisitor.java @@ -0,0 +1,10 @@ +package org.opendatamesh.dpds.datastoreapi.v1.visitor; + +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiJdbcConnectionObject; +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiOdbcConnectionObject; + +public interface DataStoreApiConnectionProtocolObjectVisitor { + void visit(DataStoreApiJdbcConnectionObject jdbc); + + void visit(DataStoreApiOdbcConnectionObject odbc); +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiDatabaseServiceVisitor.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiDatabaseServiceVisitor.java new file mode 100644 index 0000000..b535b67 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiDatabaseServiceVisitor.java @@ -0,0 +1,10 @@ +package org.opendatamesh.dpds.datastoreapi.v1.visitor; + +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiServerInfo; +import org.opendatamesh.dpds.datastoreapi.v1.model.DatastoreApiVariableObject; + +public interface DataStoreApiDatabaseServiceVisitor { + void visit(DataStoreApiServerInfo serverInfo); + + void visit(DatastoreApiVariableObject variableObject); +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiInfoVisitor.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiInfoVisitor.java new file mode 100644 index 0000000..47c072e --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiInfoVisitor.java @@ -0,0 +1,10 @@ +package org.opendatamesh.dpds.datastoreapi.v1.visitor; + +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiContact; +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiLicense; + +public interface DataStoreApiInfoVisitor { + void visit(DataStoreApiContact contact); + + void visit(DataStoreApiLicense license); +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiJdbcConnectionObjectVisitor.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiJdbcConnectionObjectVisitor.java new file mode 100644 index 0000000..5db3b16 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiJdbcConnectionObjectVisitor.java @@ -0,0 +1,7 @@ +package org.opendatamesh.dpds.datastoreapi.v1.visitor; + +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiExternalResourceObject; + +public interface DataStoreApiJdbcConnectionObjectVisitor { + void visit(DataStoreApiExternalResourceObject externalResourceObject); +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiOdbcConnectionObjectVisitor.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiOdbcConnectionObjectVisitor.java new file mode 100644 index 0000000..5695d48 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiOdbcConnectionObjectVisitor.java @@ -0,0 +1,7 @@ +package org.opendatamesh.dpds.datastoreapi.v1.visitor; + +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiExternalResourceObject; + +public interface DataStoreApiOdbcConnectionObjectVisitor { + void visit(DataStoreApiExternalResourceObject externalResourceObject); +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiSchemaVisitor.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiSchemaVisitor.java new file mode 100644 index 0000000..1d64c76 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiSchemaVisitor.java @@ -0,0 +1,7 @@ +package org.opendatamesh.dpds.datastoreapi.v1.visitor; + +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiStandardDefinitionObject; + +public interface DataStoreApiSchemaVisitor { + void visit(DataStoreApiStandardDefinitionObject standardDefinitionObject); +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiServerInfoVisitor.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiServerInfoVisitor.java new file mode 100644 index 0000000..9497221 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiServerInfoVisitor.java @@ -0,0 +1,7 @@ +package org.opendatamesh.dpds.datastoreapi.v1.visitor; + +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiConnectionProtocolObject; + +public interface DataStoreApiServerInfoVisitor { + void visit(DataStoreApiConnectionProtocolObject connectionProtocolObject); +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiStandardDefinitionObjectVisitor.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiStandardDefinitionObjectVisitor.java new file mode 100644 index 0000000..f3b7143 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiStandardDefinitionObjectVisitor.java @@ -0,0 +1,7 @@ +package org.opendatamesh.dpds.datastoreapi.v1.visitor; + +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiExternalResourceObject; + +public interface DataStoreApiStandardDefinitionObjectVisitor { + void visit(DataStoreApiExternalResourceObject externalResourceObject); +} diff --git a/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiVisitor.java b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiVisitor.java new file mode 100644 index 0000000..c0729d8 --- /dev/null +++ b/src/main/java/org/opendatamesh/dpds/datastoreapi/v1/visitor/DataStoreApiVisitor.java @@ -0,0 +1,13 @@ +package org.opendatamesh.dpds.datastoreapi.v1.visitor; + +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiDatabaseService; +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiInfo; +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiSchema; + +public interface DataStoreApiVisitor { + void visit(DataStoreApiInfo info); + + void visit(DataStoreApiDatabaseService databaseService); + + void visit(DataStoreApiSchema schema); +} diff --git a/src/main/java/org/opendatamesh/dpds/extensions/DefinitionConverter.java b/src/main/java/org/opendatamesh/dpds/extensions/DefinitionConverter.java index 0550006..1d15b84 100644 --- a/src/main/java/org/opendatamesh/dpds/extensions/DefinitionConverter.java +++ b/src/main/java/org/opendatamesh/dpds/extensions/DefinitionConverter.java @@ -1,14 +1,15 @@ package org.opendatamesh.dpds.extensions; -import com.fasterxml.jackson.core.JacksonException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.opendatamesh.dpds.model.core.ComponentBase; +import java.io.IOException; + public interface DefinitionConverter { boolean supports(String specification, String specificationVersion); - T deserialize(ObjectMapper defaultMapper, JsonNode jsonNode) throws JacksonException; + T deserialize(ObjectMapper defaultMapper, JsonNode jsonNode) throws IOException; - JsonNode serialize(ObjectMapper defaultMapper, T value) throws JacksonException; + JsonNode serialize(ObjectMapper defaultMapper, T value) throws IOException; } diff --git a/src/main/java/org/opendatamesh/dpds/extensions/DefinitionVisitor.java b/src/main/java/org/opendatamesh/dpds/extensions/DefinitionVisitor.java index 0d9aa63..7b6c23a 100644 --- a/src/main/java/org/opendatamesh/dpds/extensions/DefinitionVisitor.java +++ b/src/main/java/org/opendatamesh/dpds/extensions/DefinitionVisitor.java @@ -23,5 +23,5 @@ public final void visit(ComponentBase definition) { public void visit(ExternalDocs externalDocs) { } - abstract void visitDefinition(T definition); + protected abstract void visitDefinition(T definition); } diff --git a/src/main/java/org/opendatamesh/dpds/extensions/visitorsimpl/ExtensionHandler.java b/src/main/java/org/opendatamesh/dpds/extensions/visitorsimpl/ExtensionHandler.java index d65b384..1846543 100644 --- a/src/main/java/org/opendatamesh/dpds/extensions/visitorsimpl/ExtensionHandler.java +++ b/src/main/java/org/opendatamesh/dpds/extensions/visitorsimpl/ExtensionHandler.java @@ -8,6 +8,7 @@ import org.opendatamesh.dpds.model.core.ComponentBase; import org.opendatamesh.dpds.model.core.StandardDefinition; +import java.io.IOException; import java.util.*; public class ExtensionHandler { @@ -96,7 +97,7 @@ public void handleDefinition(StandardDefinition standardDefinition) { standardDefinition.setDefinition(supportedDefinitionConverter.get().deserialize(mapper, rawDefinition)); break; } - } catch (JacksonException e) { + } catch (IOException e) { throw new RuntimeException(e); } } diff --git a/src/main/java/org/opendatamesh/dpds/model/internals/LifecycleTaskInfo.java b/src/main/java/org/opendatamesh/dpds/model/internals/LifecycleTaskInfo.java index 9af13e3..a16c0ea 100644 --- a/src/main/java/org/opendatamesh/dpds/model/internals/LifecycleTaskInfo.java +++ b/src/main/java/org/opendatamesh/dpds/model/internals/LifecycleTaskInfo.java @@ -10,7 +10,6 @@ public class LifecycleTaskInfo extends ComponentBase { private String name; private Integer order; - //TODO fix the website!!! private ExternalDocs service; private StandardDefinition template; private JsonNode configurations; diff --git a/src/test/java/org/opendatamesh/dpds/datastoreapi/v1/DataStoreApiDefinitionVisitorImpl.java b/src/test/java/org/opendatamesh/dpds/datastoreapi/v1/DataStoreApiDefinitionVisitorImpl.java new file mode 100644 index 0000000..c27076b --- /dev/null +++ b/src/test/java/org/opendatamesh/dpds/datastoreapi/v1/DataStoreApiDefinitionVisitorImpl.java @@ -0,0 +1,15 @@ +package org.opendatamesh.dpds.datastoreapi.v1; + +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApi; + +public class DataStoreApiDefinitionVisitorImpl extends DataStoreApiDefinitionVisitor { + + public DataStoreApiDefinitionVisitorImpl() { + //DO NOTHING + } + + @Override + protected void visitDefinition(DataStoreApi definition) { + throw new RuntimeException("OK"); + } +} diff --git a/src/test/java/org/opendatamesh/dpds/datastoreapi/v1/TestDataStoreApi.java b/src/test/java/org/opendatamesh/dpds/datastoreapi/v1/TestDataStoreApi.java new file mode 100644 index 0000000..2141694 --- /dev/null +++ b/src/test/java/org/opendatamesh/dpds/datastoreapi/v1/TestDataStoreApi.java @@ -0,0 +1,80 @@ +package org.opendatamesh.dpds.datastoreapi.v1; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApi; +import org.opendatamesh.dpds.datastoreapi.v1.parser.DataStoreApiParser; +import org.opendatamesh.dpds.datastoreapi.v1.parser.DataStoreApiParserFactory; +import org.opendatamesh.dpds.extensions.DefinitionConverter; +import org.opendatamesh.dpds.extensions.DefinitionVisitor; +import org.opendatamesh.dpds.model.DataProductVersion; +import org.opendatamesh.dpds.model.interfaces.Port; +import org.opendatamesh.dpds.parser.Parser; +import org.opendatamesh.dpds.parser.ParserFactory; + +import java.io.IOException; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class TestDataStoreApi { + @Test + public void testSimpleDataStoreApi() throws IOException { + JsonNode initialJson = new ObjectMapper().readTree(this.getClass().getResource("data_product_descriptor_simple_data_store_api.json")); + + DataStoreApiParser dataStoreApiParser = DataStoreApiParserFactory.getParser(); + DefinitionConverter dataStoreApiConverter = new DataStoreApiDefinitionConverter(dataStoreApiParser); + + Parser dataProductParser = ParserFactory.getParser() + .register(dataStoreApiConverter); + + DataProductVersion dataProductVersion = dataProductParser.deserialize(initialJson); + JsonNode json = dataProductParser.serialize(dataProductVersion); + + assertThat(json) + .usingRecursiveComparison() + .ignoringCollectionOrder() + .isEqualTo(initialJson); + + Port outputPort = dataProductVersion.getInterfaceComponents().getOutputPorts() + .stream() + .filter(port -> port.getName().equalsIgnoreCase("outputPortName")).findFirst().orElse(null); + + Port outputPort2 = dataProductVersion.getInterfaceComponents().getOutputPorts() + .stream() + .filter(port -> port.getName().equalsIgnoreCase("outputPortName2")).findFirst().orElse(null); + + assertThat(outputPort.getPromises().getApi().getDefinition()).isInstanceOf(DataStoreApi.class); + assertThat(outputPort2.getPromises().getApi().getDefinition()).isNotInstanceOf(DataStoreApi.class); + } + + @Test + public void testSimpleDataStoreApiVisitor() throws IOException { + JsonNode initialJson = new ObjectMapper().readTree(this.getClass().getResource("data_product_descriptor_simple_data_store_api.json")); + + DataStoreApiParser dataStoreApiParser = DataStoreApiParserFactory.getParser(); + DefinitionConverter dataStoreApiConverter = new DataStoreApiDefinitionConverter(dataStoreApiParser); + + Parser dataProductParser = ParserFactory.getParser() + .register(dataStoreApiConverter); + + DataProductVersion dataProductVersion = dataProductParser.deserialize(initialJson); + JsonNode json = dataProductParser.serialize(dataProductVersion); + + assertThat(json) + .usingRecursiveComparison() + .ignoringCollectionOrder() + .isEqualTo(initialJson); + + DefinitionVisitor definitionVisitor = new DataStoreApiDefinitionVisitorImpl(); + + RuntimeException exception = assertThrows(RuntimeException.class, () -> + dataProductVersion.getInterfaceComponents() + .getOutputPorts() + .forEach(port -> definitionVisitor.visit(port.getPromises().getApi().getDefinition())) + ); + + assertThat(exception.getMessage()).isEqualTo("OK"); + } +} diff --git a/src/test/java/org/opendatamesh/dpds/extensions/CustomDefinitionVisitor.java b/src/test/java/org/opendatamesh/dpds/extensions/CustomDefinitionVisitor.java index d92db82..3fa72dd 100644 --- a/src/test/java/org/opendatamesh/dpds/extensions/CustomDefinitionVisitor.java +++ b/src/test/java/org/opendatamesh/dpds/extensions/CustomDefinitionVisitor.java @@ -7,7 +7,7 @@ protected CustomDefinitionVisitor() { } @Override - void visitDefinition(CustomDefinition definition) { + protected void visitDefinition(CustomDefinition definition) { throw new RuntimeException("OK"); } diff --git a/src/test/resources/org/opendatamesh/dpds/datastoreapi/v1/data_product_descriptor_simple_data_store_api.json b/src/test/resources/org/opendatamesh/dpds/datastoreapi/v1/data_product_descriptor_simple_data_store_api.json new file mode 100644 index 0000000..448e3ba --- /dev/null +++ b/src/test/resources/org/opendatamesh/dpds/datastoreapi/v1/data_product_descriptor_simple_data_store_api.json @@ -0,0 +1,153 @@ +{ + "dataProductDescriptor": "1.0.0", + "info": { + "fullyQualifiedName": "urn:dpds:qualityDemo:dataproducts:test:1", + "domain": "test", + "name": "test", + "version": "1.0.0", + "displayName": "test", + "owner": { + "id": "owner@default.blindata.io", + "name": "owner@default.blindata.io" + } + }, + "interfaceComponents": { + "inputPorts": [ + { + "fullyQualifiedName": "urn:dpds:qualityDemo:dataproducts:test:1:1.0.0:inputPorts:inputPortName", + "name": "inputPortName", + "version": "1.0.0", + "displayName": "inputPortDisplayName", + "description": "inputPortDescription", + "dependsOn": "blindata:systems:PostgreSQL - Film Rental Inc." + } + ], + "outputPorts": [ + { + "fullyQualifiedName": "urn:dpds:qualityDemo:dataproducts:test:1:1.0.0:outputPorts:outputPortName", + "name": "outputPortName", + "version": "1.0.0", + "displayName": "outputPortDisplayName", + "description": "outputPortDescription", + "promises": { + "platform": "AWS Redshift:Redshift - film-rental-sales", + "servicesType": "datastore-services", + "api": { + "specification": "datastoreapi", + "specificationVersion": "1.0.0", + "definition": { + "datastoreapi": "1.0.0", + "info": { + "termsOfService": "https://example.com/terms/", + "version": "1.0.3", + "contact": { + "name": "API Support", + "url": "https://www.example.com/support", + "email": "support@example.com" + }, + "license": { + "name": "Apache 2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0.html" + } + }, + "schema": { + "databaseName": "film_rental_sales", + "databaseSchemaName": "profit", + "tables": [ + { + "name": "v_monthly_customer_payments", + "version": "1.0.0", + "description": "The view that store the information about monthly customer payments", + "specification": "json-schema", + "specificationVersion": "1", + "definition": { + "name": "v_monthly_customer_payments", + "version": "1.0.3", + "fullyQualifiedName": "urn:dpds:qualityDemo:dataproducts:test1:1:1.0.3:outputPorts:outputPortName:tables:film_rental_sales.profit.v_monthly_customer_payments", + "displayName": "Monthly Customer Payments", + "description": "The view that store the information about monthly customer payments", + "physicalType": "VIEW", + "type": "object", + "properties": { + "customer_id": { + "type": "string", + "name": "customer_id", + "kind": "ATTRIBUTE", + "required": true, + "displayName": "Customer ID", + "isUnique": true, + "isNullable": true, + "length": 10, + "physicalType": "VARCHAR", + "ordinalPosition": 1 + }, + "customer_email": { + "type": "string", + "name": "customer_email", + "description": "Email address of the customer", + "kind": "ATTRIBUTE", + "required": true, + "displayName": "Customer Email", + "isUnique": false, + "isNullable": true, + "length": 255, + "physicalType": "VARCHAR", + "ordinalPosition": 2 + }, + "payment_month": { + "type": "string", + "format": "date-time", + "name": "payment_month", + "description": "Month of the payment", + "kind": "ATTRIBUTE", + "required": true, + "displayName": "Payment Month", + "isUnique": false, + "isNullable": false, + "physicalType": "TIMESTAMP", + "ordinalPosition": 3 + }, + "total_payment": { + "type": "number", + "name": "total_payment", + "description": "Total payment amount for the month", + "kind": "ATTRIBUTE", + "required": true, + "displayName": "Total Payment", + "isUnique": false, + "isNullable": false, + "physicalType": "NUMERIC", + "ordinalPosition": 4 + } + } + } + } + ] + } + } + }, + "deprecationPolicy": { + "description": "When a new major version becomes available, the previous one is kept online for 7 days.", + "x-deprecation-period": "7D" + } + } + }, + { + "fullyQualifiedName": "urn:dpds:qualityDemo:dataproducts:test:1:1.0.0:outputPorts:outputPortName2", + "name": "outputPortName2", + "version": "1.0.0", + "displayName": "outputPortDisplayName2", + "description": "outputPortDescription2", + "promises": { + "api": { + "specification": "another_specification", + "specificationVersion": "1.0.0", + "definition": { + "anotherSpecificationField": "anotherSpecificationValue" + } + } + } + } + ] + } +}