This is an automated email from the ASF dual-hosted git repository.

machristie pushed a commit to branch machristie/issue7
in repository https://gitbox.apache.org/repos/asf/airavata-data-catalog.git

commit 131ca0eabdfebb7573812614af75c6d4d12ff835
Author: Marcus Christie <[email protected]>
AuthorDate: Mon Feb 13 17:01:28 2023 -0500

    Initial work at implementing metadata schema management APIs
---
 .../api/client/DataCatalogAPIClient.java           |  62 ++++++++++-
 .../api/mapper/MetadataSchemaFieldMapper.java      |  36 +++++++
 .../api/mapper/MetadataSchemaMapper.java           |  19 ++++
 .../api/model/MetadataSchemaEntity.java            |  73 +++++++++++++
 .../api/model/MetadataSchemaFieldEntity.java       | 108 +++++++++++++++++++
 .../repository/MetadataSchemaFieldRepository.java  |  11 ++
 .../api/repository/MetadataSchemaRepository.java   |   9 ++
 .../api/service/DataCatalogAPIService.java         | 119 ++++++++++++++++++++-
 .../stubs/src/main/proto/DataCatalogAPI.proto      |  83 ++++++++++++++
 9 files changed, 515 insertions(+), 5 deletions(-)

diff --git 
a/data-catalog-api/client/src/main/java/org/apache/airavata/datacatalog/api/client/DataCatalogAPIClient.java
 
b/data-catalog-api/client/src/main/java/org/apache/airavata/datacatalog/api/client/DataCatalogAPIClient.java
index 8ae7d07..954f994 100644
--- 
a/data-catalog-api/client/src/main/java/org/apache/airavata/datacatalog/api/client/DataCatalogAPIClient.java
+++ 
b/data-catalog-api/client/src/main/java/org/apache/airavata/datacatalog/api/client/DataCatalogAPIClient.java
@@ -1,6 +1,7 @@
 package org.apache.airavata.datacatalog.api.client;
 
 import java.text.MessageFormat;
+import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.airavata.datacatalog.api.DataCatalogAPIServiceGrpc;
@@ -13,8 +14,15 @@ import 
org.apache.airavata.datacatalog.api.DataProductGetRequest;
 import org.apache.airavata.datacatalog.api.DataProductGetResponse;
 import org.apache.airavata.datacatalog.api.DataProductUpdateRequest;
 import org.apache.airavata.datacatalog.api.DataProductUpdateResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.airavata.datacatalog.api.FieldValueType;
+import org.apache.airavata.datacatalog.api.MetadataSchema;
+import org.apache.airavata.datacatalog.api.MetadataSchemaCreateRequest;
+import org.apache.airavata.datacatalog.api.MetadataSchemaCreateResponse;
+import org.apache.airavata.datacatalog.api.MetadataSchemaField;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldCreateRequest;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldCreateResponse;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldListRequest;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldListResponse;
 
 import io.grpc.Channel;
 import io.grpc.ManagedChannel;
@@ -22,8 +30,6 @@ import io.grpc.ManagedChannelBuilder;;
 
 public class DataCatalogAPIClient {
 
-    private static final Logger logger = 
LoggerFactory.getLogger(DataCatalogAPIClient.class);
-
     private final DataCatalogAPIServiceBlockingStub blockingStub;
 
     public DataCatalogAPIClient(Channel channel) {
@@ -54,6 +60,27 @@ public class DataCatalogAPIClient {
         blockingStub.deleteDataProduct(request);
     }
 
+    public MetadataSchema createMetadataSchema(MetadataSchema metadataSchema) {
+        MetadataSchemaCreateRequest request = 
MetadataSchemaCreateRequest.newBuilder().setMetadataSchema(metadataSchema)
+                .build();
+        MetadataSchemaCreateResponse response = 
blockingStub.createMetadataSchema(request);
+        return response.getMetadataSchema();
+    }
+
+    public MetadataSchemaField createMetadataSchemaField(MetadataSchemaField 
metadataSchemaField) {
+        MetadataSchemaFieldCreateRequest request = 
MetadataSchemaFieldCreateRequest.newBuilder()
+                .setMetadataSchemaField(metadataSchemaField).build();
+        MetadataSchemaFieldCreateResponse response = 
blockingStub.createMetadataSchemaField(request);
+        return response.getMetadataSchemaField();
+    }
+
+    public List<MetadataSchemaField> getMetadataSchemaFields(String 
schemaName) {
+        MetadataSchemaFieldListRequest request = 
MetadataSchemaFieldListRequest.newBuilder().setSchemaName(schemaName)
+                .build();
+        MetadataSchemaFieldListResponse response = 
blockingStub.getMetadataSchemaFields(request);
+        return response.getMetadataSchemaFieldsList();
+    }
+
     public static void main(String[] args) throws InterruptedException {
         String target = "localhost:6565";
 
@@ -88,6 +115,33 @@ public class DataCatalogAPIClient {
             System.out.println(
                     MessageFormat.format("Deleted data product with id [{0}]", 
result2.getDataProductId()));
 
+            MetadataSchema metadataSchema = 
MetadataSchema.newBuilder().setSchemaName("my_schema").build();
+            metadataSchema = client.createMetadataSchema(metadataSchema);
+
+            System.out.println(
+                    MessageFormat.format("Created metadata schema with name 
[{0}]", metadataSchema.getSchemaName()));
+
+            MetadataSchemaField field1 = 
MetadataSchemaField.newBuilder().setFieldName("field1")
+                    .setJsonPath("$.field1").setValueType(FieldValueType.FLOAT)
+                    .setSchemaName(metadataSchema.getSchemaName()).build();
+            field1 = client.createMetadataSchemaField(field1);
+            System.out.println(MessageFormat.format("Created metadata schema 
field [{0}] in schema [{1}]",
+                    field1.getFieldName(), field1.getSchemaName()));
+
+            MetadataSchemaField field2 = 
MetadataSchemaField.newBuilder().setFieldName("field2")
+                    .setJsonPath("$.field2").setValueType(FieldValueType.FLOAT)
+                    .setSchemaName(metadataSchema.getSchemaName()).build();
+            field2 = client.createMetadataSchemaField(field2);
+            System.out.println(MessageFormat.format("Created metadata schema 
field [{0}] in schema [{1}]",
+                    field2.getFieldName(), field2.getSchemaName()));
+
+            List<MetadataSchemaField> fields = 
client.getMetadataSchemaFields(metadataSchema.getSchemaName());
+            System.out.println(MessageFormat.format("Found {0} fields for 
schema {1}", fields.size(),
+                    metadataSchema.getSchemaName()));
+            for (MetadataSchemaField field : fields) {
+                System.out.println(MessageFormat.format("-> field {0}", 
field.getFieldName()));
+            }
+
         } finally {
             channel.shutdownNow().awaitTermination(5, TimeUnit.SECONDS);
         }
diff --git 
a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/mapper/MetadataSchemaFieldMapper.java
 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/mapper/MetadataSchemaFieldMapper.java
new file mode 100644
index 0000000..2a96ec4
--- /dev/null
+++ 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/mapper/MetadataSchemaFieldMapper.java
@@ -0,0 +1,36 @@
+package org.apache.airavata.datacatalog.api.mapper;
+
+import org.apache.airavata.datacatalog.api.MetadataSchemaField;
+import org.apache.airavata.datacatalog.api.model.MetadataSchemaEntity;
+import org.apache.airavata.datacatalog.api.model.MetadataSchemaFieldEntity;
+import org.apache.airavata.datacatalog.api.repository.MetadataSchemaRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MetadataSchemaFieldMapper {
+
+    @Autowired
+    MetadataSchemaRepository metadataSchemaRepository;
+
+    public void mapModelToEntity(MetadataSchemaField metadataSchemaField,
+            MetadataSchemaFieldEntity metadataSchemaFieldEntity) {
+
+        
metadataSchemaFieldEntity.setFieldName(metadataSchemaField.getFieldName());
+        
metadataSchemaFieldEntity.setFieldValueType(metadataSchemaField.getValueType());
+        
metadataSchemaFieldEntity.setJsonPath(metadataSchemaField.getJsonPath());
+
+        MetadataSchemaEntity metadataSchemaEntity = metadataSchemaRepository
+                .findBySchemaName(metadataSchemaField.getSchemaName());
+        metadataSchemaFieldEntity.setMetadataSchema(metadataSchemaEntity);
+    }
+
+    public void mapEntityToModel(MetadataSchemaFieldEntity 
metadataSchemaFieldEntity,
+            MetadataSchemaField.Builder metadataSchemaFieldBuilder) {
+
+        
metadataSchemaFieldBuilder.setFieldName(metadataSchemaFieldEntity.getFieldName());
+        
metadataSchemaFieldBuilder.setJsonPath(metadataSchemaFieldEntity.getJsonPath());
+        
metadataSchemaFieldBuilder.setValueType(metadataSchemaFieldEntity.getFieldValueType());
+        
metadataSchemaFieldBuilder.setSchemaName(metadataSchemaFieldEntity.getMetadataSchema().getSchemaName());
+    }
+}
diff --git 
a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/mapper/MetadataSchemaMapper.java
 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/mapper/MetadataSchemaMapper.java
new file mode 100644
index 0000000..e7c6fcd
--- /dev/null
+++ 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/mapper/MetadataSchemaMapper.java
@@ -0,0 +1,19 @@
+package org.apache.airavata.datacatalog.api.mapper;
+
+import org.apache.airavata.datacatalog.api.MetadataSchema;
+import org.apache.airavata.datacatalog.api.model.MetadataSchemaEntity;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MetadataSchemaMapper {
+
+    public void mapModelToEntity(MetadataSchema metadataSchema, 
MetadataSchemaEntity metadataSchemaEntity) {
+
+        metadataSchemaEntity.setSchemaName(metadataSchema.getSchemaName());
+    }
+
+    public void mapEntityToModel(MetadataSchemaEntity metadataSchemaEntity,
+            MetadataSchema.Builder metadataSchemaBuilder) {
+        
metadataSchemaBuilder.setSchemaName(metadataSchemaEntity.getSchemaName());
+    }
+}
diff --git 
a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/MetadataSchemaEntity.java
 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/MetadataSchemaEntity.java
new file mode 100644
index 0000000..8c1f6cd
--- /dev/null
+++ 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/MetadataSchemaEntity.java
@@ -0,0 +1,73 @@
+package org.apache.airavata.datacatalog.api.model;
+
+import java.util.Set;
+
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
+
+@Entity
+// TODO: unique constraint on schema_name, tenant
+@Table(name = "metadata_schema")
+public class MetadataSchemaEntity {
+
+    @Id
+    @SequenceGenerator(name = "metadata_schema_metadata_schema_id_seq", 
sequenceName = "metadata_schema_metadata_schema_id_seq", allocationSize = 1)
+    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = 
"metadata_schema_metadata_schema_id_seq")
+    @Column(name = "metadata_schema_id")
+    private Long metadataSchemaId;
+
+    @Basic
+    @Column(name = "schema_name", nullable = false)
+    private String schemaName;
+
+    @OneToMany(mappedBy = "metadataSchema")
+    private Set<MetadataSchemaFieldEntity> metadataSchemaFields;
+
+    public Long getMetadataSchemaId() {
+        return metadataSchemaId;
+    }
+
+    public void setMetadataSchemaId(Long metadataSchemaId) {
+        this.metadataSchemaId = metadataSchemaId;
+    }
+
+    public String getSchemaName() {
+        return schemaName;
+    }
+
+    public void setSchemaName(String schemaName) {
+        this.schemaName = schemaName;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((metadataSchemaId == null) ? 0 : 
metadataSchemaId.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        MetadataSchemaEntity other = (MetadataSchemaEntity) obj;
+        if (metadataSchemaId == null) {
+            if (other.metadataSchemaId != null)
+                return false;
+        } else if (!metadataSchemaId.equals(other.metadataSchemaId))
+            return false;
+        return true;
+    }
+}
diff --git 
a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/MetadataSchemaFieldEntity.java
 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/MetadataSchemaFieldEntity.java
new file mode 100644
index 0000000..8f6a83a
--- /dev/null
+++ 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/MetadataSchemaFieldEntity.java
@@ -0,0 +1,108 @@
+package org.apache.airavata.datacatalog.api.model;
+
+import org.apache.airavata.datacatalog.api.FieldValueType;
+
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name = "metadata_schema_field")
+public class MetadataSchemaFieldEntity {
+
+    @Id
+    @SequenceGenerator(name = 
"metadata_schema_field_metadata_schema_field_id", sequenceName = 
"metadata_schema_field_metadata_schema_field_id", allocationSize = 1)
+    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = 
"metadata_schema_field_metadata_schema_field_id")
+    @Column(name = "metadata_schema_field_id")
+    private Long metadataSchemaFieldId;
+
+    @Basic
+    @Column(name = "field_name", nullable = false)
+    private String fieldName;
+
+    @Basic
+    @Column(name = "json_path", nullable = false)
+    private String jsonPath;
+
+    @Enumerated(EnumType.STRING)
+    private FieldValueType fieldValueType;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "metadata_schema_id", nullable = false, updatable = 
false)
+    private MetadataSchemaEntity metadataSchema;
+
+    public Long getMetadataSchemaFieldId() {
+        return metadataSchemaFieldId;
+    }
+
+    public void setMetadataSchemaFieldId(Long metadataSchemaFieldId) {
+        this.metadataSchemaFieldId = metadataSchemaFieldId;
+    }
+
+    public String getFieldName() {
+        return fieldName;
+    }
+
+    public void setFieldName(String fieldName) {
+        this.fieldName = fieldName;
+    }
+
+    public String getJsonPath() {
+        return jsonPath;
+    }
+
+    public void setJsonPath(String jsonPath) {
+        this.jsonPath = jsonPath;
+    }
+
+    public FieldValueType getFieldValueType() {
+        return fieldValueType;
+    }
+
+    public void setFieldValueType(FieldValueType fieldValueType) {
+        this.fieldValueType = fieldValueType;
+    }
+
+    public MetadataSchemaEntity getMetadataSchema() {
+        return metadataSchema;
+    }
+
+    public void setMetadataSchema(MetadataSchemaEntity metadataSchema) {
+        this.metadataSchema = metadataSchema;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((metadataSchemaFieldId == null) ? 0 : 
metadataSchemaFieldId.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        MetadataSchemaFieldEntity other = (MetadataSchemaFieldEntity) obj;
+        if (metadataSchemaFieldId == null) {
+            if (other.metadataSchemaFieldId != null)
+                return false;
+        } else if (!metadataSchemaFieldId.equals(other.metadataSchemaFieldId))
+            return false;
+        return true;
+    }
+
+}
diff --git 
a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/MetadataSchemaFieldRepository.java
 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/MetadataSchemaFieldRepository.java
new file mode 100644
index 0000000..e237dac
--- /dev/null
+++ 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/MetadataSchemaFieldRepository.java
@@ -0,0 +1,11 @@
+package org.apache.airavata.datacatalog.api.repository;
+
+import java.util.List;
+
+import org.apache.airavata.datacatalog.api.model.MetadataSchemaFieldEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface MetadataSchemaFieldRepository extends 
JpaRepository<MetadataSchemaFieldEntity, Long> {
+
+    List<MetadataSchemaFieldEntity> findByMetadataSchema_SchemaName(String 
schemaName);
+}
diff --git 
a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/MetadataSchemaRepository.java
 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/MetadataSchemaRepository.java
new file mode 100644
index 0000000..28d0518
--- /dev/null
+++ 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/MetadataSchemaRepository.java
@@ -0,0 +1,9 @@
+package org.apache.airavata.datacatalog.api.repository;
+
+import org.apache.airavata.datacatalog.api.model.MetadataSchemaEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface MetadataSchemaRepository extends 
JpaRepository<MetadataSchemaEntity, Long> {
+
+    MetadataSchemaEntity findBySchemaName(String schemaName);
+}
diff --git 
a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/service/DataCatalogAPIService.java
 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/service/DataCatalogAPIService.java
index 65f92b7..3869ee5 100644
--- 
a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/service/DataCatalogAPIService.java
+++ 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/service/DataCatalogAPIService.java
@@ -1,20 +1,42 @@
 package org.apache.airavata.datacatalog.api.service;
 
+import java.util.List;
 import java.util.UUID;
 
 import org.apache.airavata.datacatalog.api.DataCatalogAPIServiceGrpc;
 import org.apache.airavata.datacatalog.api.DataProduct;
+import 
org.apache.airavata.datacatalog.api.DataProductAddToMetadataSchemaRequest;
+import 
org.apache.airavata.datacatalog.api.DataProductAddToMetadataSchemaResponse;
 import org.apache.airavata.datacatalog.api.DataProductCreateRequest;
 import org.apache.airavata.datacatalog.api.DataProductCreateResponse;
 import org.apache.airavata.datacatalog.api.DataProductDeleteRequest;
 import org.apache.airavata.datacatalog.api.DataProductDeleteResponse;
 import org.apache.airavata.datacatalog.api.DataProductGetRequest;
 import org.apache.airavata.datacatalog.api.DataProductGetResponse;
+import 
org.apache.airavata.datacatalog.api.DataProductRemoveFromMetadataSchemaRequest;
+import 
org.apache.airavata.datacatalog.api.DataProductRemoveFromMetadataSchemaResponse;
 import org.apache.airavata.datacatalog.api.DataProductUpdateRequest;
 import org.apache.airavata.datacatalog.api.DataProductUpdateResponse;
+import org.apache.airavata.datacatalog.api.MetadataSchemaCreateRequest;
+import org.apache.airavata.datacatalog.api.MetadataSchemaCreateResponse;
+import org.apache.airavata.datacatalog.api.MetadataSchemaField;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldCreateRequest;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldCreateResponse;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldDeleteRequest;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldDeleteResponse;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldListRequest;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldListResponse;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldUpdateRequest;
+import org.apache.airavata.datacatalog.api.MetadataSchemaFieldUpdateResponse;
 import org.apache.airavata.datacatalog.api.mapper.DataProductMapper;
+import org.apache.airavata.datacatalog.api.mapper.MetadataSchemaFieldMapper;
+import org.apache.airavata.datacatalog.api.mapper.MetadataSchemaMapper;
 import org.apache.airavata.datacatalog.api.model.DataProductEntity;
+import org.apache.airavata.datacatalog.api.model.MetadataSchemaEntity;
+import org.apache.airavata.datacatalog.api.model.MetadataSchemaFieldEntity;
 import org.apache.airavata.datacatalog.api.repository.DataProductRepository;
+import 
org.apache.airavata.datacatalog.api.repository.MetadataSchemaFieldRepository;
+import org.apache.airavata.datacatalog.api.repository.MetadataSchemaRepository;
 import org.lognet.springboot.grpc.GRpcService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -31,7 +53,19 @@ public class DataCatalogAPIService extends 
DataCatalogAPIServiceGrpc.DataCatalog
     DataProductRepository dataProductRepository;
 
     @Autowired
-    DataProductMapper dataProductMapper = new DataProductMapper();
+    MetadataSchemaRepository metadataSchemaRepository;
+
+    @Autowired
+    MetadataSchemaFieldRepository metadataSchemaFieldRepository;
+
+    @Autowired
+    DataProductMapper dataProductMapper;
+
+    @Autowired
+    MetadataSchemaMapper metadataSchemaMapper;
+
+    @Autowired
+    MetadataSchemaFieldMapper metadataSchemaFieldMapper;
 
     @Override
     public void createDataProduct(DataProductCreateRequest request,
@@ -93,4 +127,87 @@ public class DataCatalogAPIService extends 
DataCatalogAPIServiceGrpc.DataCatalog
         responseObserver.onNext(responseBuilder.build());
         responseObserver.onCompleted();
     }
+
+    @Override
+    public void 
addDataProductToMetadataSchema(DataProductAddToMetadataSchemaRequest request,
+            StreamObserver<DataProductAddToMetadataSchemaResponse> 
responseObserver) {
+        // TODO Auto-generated method stub
+        super.addDataProductToMetadataSchema(request, responseObserver);
+    }
+
+    @Override
+    public void createMetadataSchema(MetadataSchemaCreateRequest request,
+            StreamObserver<MetadataSchemaCreateResponse> responseObserver) {
+
+        MetadataSchemaEntity metadataSchemaEntity = new MetadataSchemaEntity();
+        metadataSchemaMapper.mapModelToEntity(request.getMetadataSchema(), 
metadataSchemaEntity);
+        MetadataSchemaEntity savedMetadataSchemaEntity = 
metadataSchemaRepository.save(metadataSchemaEntity);
+
+        MetadataSchemaCreateResponse.Builder responseBuilder = 
MetadataSchemaCreateResponse.newBuilder();
+        metadataSchemaMapper.mapEntityToModel(savedMetadataSchemaEntity, 
responseBuilder.getMetadataSchemaBuilder());
+        responseObserver.onNext(responseBuilder.build());
+        responseObserver.onCompleted();
+    }
+
+    @Override
+    public void createMetadataSchemaField(MetadataSchemaFieldCreateRequest 
request,
+            StreamObserver<MetadataSchemaFieldCreateResponse> 
responseObserver) {
+
+        MetadataSchemaFieldEntity metadataSchemaFieldEntity = new 
MetadataSchemaFieldEntity();
+        
metadataSchemaFieldMapper.mapModelToEntity(request.getMetadataSchemaField(), 
metadataSchemaFieldEntity);
+        MetadataSchemaFieldEntity savedMetadataSchemaFieldEntity = 
metadataSchemaFieldRepository
+                .save(metadataSchemaFieldEntity);
+
+        MetadataSchemaFieldCreateResponse.Builder responseBuilder = 
MetadataSchemaFieldCreateResponse.newBuilder();
+        
metadataSchemaFieldMapper.mapEntityToModel(savedMetadataSchemaFieldEntity,
+                responseBuilder.getMetadataSchemaFieldBuilder());
+        responseObserver.onNext(responseBuilder.build());
+        responseObserver.onCompleted();
+    }
+
+    @Override
+    public void deleteMetadataSchema(MetadataSchemaCreateRequest request,
+            StreamObserver<MetadataSchemaCreateResponse> responseObserver) {
+        // TODO Auto-generated method stub
+        super.deleteMetadataSchema(request, responseObserver);
+    }
+
+    @Override
+    public void deleteMetadataSchemaField(MetadataSchemaFieldDeleteRequest 
request,
+            StreamObserver<MetadataSchemaFieldDeleteResponse> 
responseObserver) {
+        // TODO Auto-generated method stub
+        super.deleteMetadataSchemaField(request, responseObserver);
+    }
+
+    @Override
+    public void getMetadataSchemaFields(MetadataSchemaFieldListRequest request,
+            StreamObserver<MetadataSchemaFieldListResponse> responseObserver) {
+
+        // TODO: handle case where schema doesn't exist
+        List<MetadataSchemaFieldEntity> metadataSchemaFieldEntities = 
metadataSchemaFieldRepository
+                .findByMetadataSchema_SchemaName(request.getSchemaName());
+
+        MetadataSchemaFieldListResponse.Builder responseBuilder = 
MetadataSchemaFieldListResponse.newBuilder();
+        for (MetadataSchemaFieldEntity metadataSchemaFieldEntity : 
metadataSchemaFieldEntities) {
+            MetadataSchemaField.Builder builder = 
responseBuilder.addMetadataSchemaFieldsBuilder();
+            
metadataSchemaFieldMapper.mapEntityToModel(metadataSchemaFieldEntity, builder);
+        }
+        responseObserver.onNext(responseBuilder.build());
+        responseObserver.onError(null);
+        responseObserver.onCompleted();
+    }
+
+    @Override
+    public void 
removeDataProductFromMetadataSchema(DataProductRemoveFromMetadataSchemaRequest 
request,
+            StreamObserver<DataProductRemoveFromMetadataSchemaResponse> 
responseObserver) {
+        // TODO Auto-generated method stub
+        super.removeDataProductFromMetadataSchema(request, responseObserver);
+    }
+
+    @Override
+    public void updateMetadataSchemaField(MetadataSchemaFieldUpdateRequest 
request,
+            StreamObserver<MetadataSchemaFieldUpdateResponse> 
responseObserver) {
+        // TODO Auto-generated method stub
+        super.updateMetadataSchemaField(request, responseObserver);
+    }
 }
diff --git a/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto 
b/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto
index 779002c..b1d40dd 100644
--- a/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto
+++ b/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto
@@ -64,6 +64,23 @@ message DataProduct {
     optional string metadata = 4;
 }
 
+enum FieldValueType {
+    STRING = 0;
+    INTEGER = 1;
+    FLOAT = 2;
+    BOOLEAN = 3;
+    DATESTRING = 4;
+}
+message MetadataSchema {
+    string schema_name = 1;
+}
+message MetadataSchemaField {
+    string schema_name = 1;
+    string field_name = 2;
+    string json_path = 3;
+    FieldValueType value_type = 4;
+}
+
 message DataProductCreateRequest {
     DataProduct data_product = 1;
 }
@@ -88,9 +105,75 @@ message DataProductDeleteRequest {
 message DataProductDeleteResponse {
 }
 
+message MetadataSchemaCreateRequest {
+    UserInfo user_info = 1;
+    MetadataSchema metadata_schema = 2;
+}
+message MetadataSchemaCreateResponse {
+    MetadataSchema metadata_schema = 1;
+}
+message MetadataSchemaDeleteRequest {
+    UserInfo user_info = 1;
+    MetadataSchema metadata_schema = 2;
+}
+message MetadataSchemaDeleteResponse {
+}
+message MetadataSchemaFieldCreateRequest {
+    UserInfo user_info = 1;
+    MetadataSchemaField metadata_schema_field = 2;
+}
+message MetadataSchemaFieldCreateResponse {
+    MetadataSchemaField metadata_schema_field = 1;
+}
+message MetadataSchemaFieldUpdateRequest {
+    UserInfo user_info = 1;
+    MetadataSchemaField metadata_schema_field = 2;
+}
+message MetadataSchemaFieldUpdateResponse {
+    MetadataSchemaField metadata_schema_field = 1;
+}
+message MetadataSchemaFieldDeleteRequest {
+    UserInfo user_info = 1;
+    MetadataSchemaField metadata_schema_field = 2;
+}
+message MetadataSchemaFieldDeleteResponse {
+}
+message MetadataSchemaFieldListRequest {
+    UserInfo user_info = 1;
+    string schema_name = 2;
+}
+message MetadataSchemaFieldListResponse {
+    repeated MetadataSchemaField metadata_schema_fields = 1;
+}
+message DataProductAddToMetadataSchemaRequest {
+    UserInfo user_info = 1;
+    string data_product_id = 2;
+    string schema_name = 3;
+}
+message DataProductAddToMetadataSchemaResponse {
+    DataProduct data_product = 1;
+}
+message DataProductRemoveFromMetadataSchemaRequest {
+    UserInfo user_info = 1;
+    string data_product_id = 2;
+    string schema_name = 3;
+}
+message DataProductRemoveFromMetadataSchemaResponse {
+    DataProduct data_product = 1;
+}
+
+
 service DataCatalogAPIService {
     rpc createDataProduct(DataProductCreateRequest) returns 
(DataProductCreateResponse){}
     rpc updateDataProduct(DataProductUpdateRequest) returns 
(DataProductUpdateResponse){}
     rpc getDataProduct(DataProductGetRequest) returns 
(DataProductGetResponse){}
     rpc deleteDataProduct(DataProductDeleteRequest) returns 
(DataProductDeleteResponse){}
+    rpc createMetadataSchema(MetadataSchemaCreateRequest) returns 
(MetadataSchemaCreateResponse){}
+    rpc deleteMetadataSchema(MetadataSchemaCreateRequest) returns 
(MetadataSchemaCreateResponse){}
+    rpc createMetadataSchemaField(MetadataSchemaFieldCreateRequest) returns 
(MetadataSchemaFieldCreateResponse){}
+    rpc updateMetadataSchemaField(MetadataSchemaFieldUpdateRequest) returns 
(MetadataSchemaFieldUpdateResponse){}
+    rpc deleteMetadataSchemaField(MetadataSchemaFieldDeleteRequest) returns 
(MetadataSchemaFieldDeleteResponse){}
+    rpc getMetadataSchemaFields(MetadataSchemaFieldListRequest) returns 
(MetadataSchemaFieldListResponse){}
+    rpc addDataProductToMetadataSchema(DataProductAddToMetadataSchemaRequest) 
returns (DataProductAddToMetadataSchemaResponse){}
+    rpc 
removeDataProductFromMetadataSchema(DataProductRemoveFromMetadataSchemaRequest) 
returns (DataProductRemoveFromMetadataSchemaResponse){}
 }

Reply via email to