You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ma...@apache.org on 2023/01/31 17:07:59 UTC

[airavata-data-catalog] branch main created (now 2e63939)

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

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


      at 2e63939  Initial work on sharing management interface

This branch includes the following new commits:

     new 96785f9  Initial commit, createDataProduct implemented
     new 9ea7ae9  Add unique constraint to external_id
     new 33bdc76  Adding PostgreSQL docker-compose script and README instructions
     new 6d8f094  Added mapping of metadata column to JSONB/JsonNode
     new 2e63939  Initial work on sharing management interface

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[airavata-data-catalog] 04/05: Added mapping of metadata column to JSONB/JsonNode

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 6d8f0948e4ed5eb0226354657cff60c32a85e3d0
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Mon Jan 23 17:42:05 2023 -0500

    Added mapping of metadata column to JSONB/JsonNode
---
 .../datacatalog/api/client/DataCatalogAPIClient.java    |  3 ++-
 data-catalog-api/server/pom.xml                         | 11 ++++++++++-
 .../datacatalog/api/model/DataProductEntity.java        | 17 +++++++++++++++++
 .../datacatalog/api/service/DataCatalogAPIService.java  | 14 +++++++++++++-
 .../stubs/src/main/proto/DataCatalogAPI.proto           |  1 +
 5 files changed, 43 insertions(+), 3 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 5ba7ebc..4ba83e1 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
@@ -38,7 +38,8 @@ public class DataCatalogAPIClient {
         ManagedChannel channel = ManagedChannelBuilder.forTarget(target).usePlaintext().build();
         try {
             DataCatalogAPIClient client = new DataCatalogAPIClient(channel);
-            DataProduct dataProduct = DataProduct.newBuilder().setName("testing").build();
+            DataProduct dataProduct = DataProduct.newBuilder().setName("testing").setMetadata("{\"foo\": \"bar\"}")
+                    .build();
             DataProduct result = client.createDataProduct(dataProduct);
             System.out.println(MessageFormat.format("Created data product with id [{0}]", result.getDataProductId()));
 
diff --git a/data-catalog-api/server/pom.xml b/data-catalog-api/server/pom.xml
index b3c9cf1..d2b0ce1 100644
--- a/data-catalog-api/server/pom.xml
+++ b/data-catalog-api/server/pom.xml
@@ -52,7 +52,16 @@
             <artifactId>data-catalog-api-stubs</artifactId>
             <version>0.1-SNAPSHOT</version>
         </dependency>
-
+        <dependency>
+            <groupId>io.hypersistence</groupId>
+            <artifactId>hypersistence-utils-hibernate-60</artifactId>
+            <version>3.1.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.module</groupId>
+            <artifactId>jackson-module-jakarta-xmlbind-annotations</artifactId>
+            <version>2.14.1</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/DataProductEntity.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/DataProductEntity.java
index 01aa429..c9a67d2 100644
--- a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/DataProductEntity.java
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/DataProductEntity.java
@@ -1,5 +1,10 @@
 package org.apache.airavata.datacatalog.api.model;
 
+import org.hibernate.annotations.Type;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+import io.hypersistence.utils.hibernate.type.json.JsonType;
 import jakarta.persistence.Basic;
 import jakarta.persistence.Column;
 import jakarta.persistence.Entity;
@@ -34,6 +39,10 @@ public class DataProductEntity {
     @Column(name="name", nullable = false)
     private String name;
 
+    @Type(JsonType.class)
+    @Column(name = "metadata", columnDefinition = "jsonb")
+    private JsonNode metadata;
+
     public Long getDataProductId() {
         return dataProductId;
     }
@@ -66,6 +75,14 @@ public class DataProductEntity {
         this.name = name;
     }
 
+    public JsonNode getMetadata() {
+        return metadata;
+    }
+
+    public void setMetadata(JsonNode metadata) {
+        this.metadata = metadata;
+    }
+
     @Override
     public int hashCode() {
         final int prime = 31;
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 d4e9589..fa979a6 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
@@ -3,7 +3,6 @@ package org.apache.airavata.datacatalog.api.service;
 import java.util.UUID;
 
 import org.apache.airavata.datacatalog.api.DataCatalogAPIServiceGrpc;
-import org.apache.airavata.datacatalog.api.DataProduct;
 import org.apache.airavata.datacatalog.api.DataProductCreateRequest;
 import org.apache.airavata.datacatalog.api.DataProductCreateResponse;
 import org.apache.airavata.datacatalog.api.model.DataProductEntity;
@@ -13,6 +12,10 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
 import io.grpc.stub.StreamObserver;
 
 @GRpcService
@@ -37,6 +40,15 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog
                     .findByExternalId(request.getDataProduct().getParentDataProductId());
             dataProductEntity.setParentDataProductEntity(parentDataProductEntity);
         }
+        if (request.getDataProduct().hasMetadata()) {
+            ObjectMapper mapper = new ObjectMapper();
+            try {
+                JsonNode metadata = mapper.readTree(request.getDataProduct().getMetadata());
+                dataProductEntity.setMetadata(metadata);
+            } catch (JsonProcessingException e) {
+                throw new RuntimeException(e);
+            }
+        }
         DataProductEntity savedDataProductEntity = dataProductRepository.save(dataProductEntity);
 
         DataProductCreateResponse.Builder responseBuilder = DataProductCreateResponse.newBuilder();
diff --git a/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto b/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto
index 0a2a083..43854f9 100644
--- a/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto
+++ b/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto
@@ -25,6 +25,7 @@ message DataProduct {
     string data_product_id = 1;
     optional string parent_data_product_id = 2;
     string name = 3;
+    optional string metadata = 4;
 }
 
 message DataProductCreateRequest {


[airavata-data-catalog] 01/05: Initial commit, createDataProduct implemented

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 96785f9fe0b4db9841a953c2e34590106b7e7156
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Mon Jan 23 15:30:03 2023 -0500

    Initial commit, createDataProduct implemented
---
 .gitignore                                         |  3 +
 data-catalog-api/client/pom.xml                    | 29 +++++++
 .../api/client/DataCatalogAPIClient.java           | 49 ++++++++++++
 data-catalog-api/pom.xml                           | 39 +++++++++
 data-catalog-api/server/pom.xml                    | 68 ++++++++++++++++
 .../api/DataCatalogApiServiceApplication.java      | 13 +++
 .../datacatalog/api/model/DataProductEntity.java   | 92 ++++++++++++++++++++++
 .../api/repository/DataProductRepository.java      | 10 +++
 .../api/service/DataCatalogAPIService.java         | 53 +++++++++++++
 .../src/main/resources/application.properties      |  5 ++
 .../server/src/main/resources/logback.xml          | 54 +++++++++++++
 .../DataCatalogApiServerApplicationTests.java      | 13 +++
 data-catalog-api/stubs/pom.xml                     | 87 ++++++++++++++++++++
 .../stubs/src/main/proto/DataCatalogAPI.proto      | 39 +++++++++
 pom.xml                                            | 54 +++++++++++++
 15 files changed, 608 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..79edcba
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+target
+.vscode
+logs
diff --git a/data-catalog-api/client/pom.xml b/data-catalog-api/client/pom.xml
new file mode 100644
index 0000000..431b57a
--- /dev/null
+++ b/data-catalog-api/client/pom.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.airavata</groupId>
+        <artifactId>data-catalog-api</artifactId>
+        <version>0.1-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>data-catalog-api-client</artifactId>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.airavata</groupId>
+            <artifactId>data-catalog-api-stubs</artifactId>
+            <version>0.1-SNAPSHOT</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>${slf4j.version}</version>
+        </dependency>
+
+    </dependencies>
+
+</project>
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
new file mode 100644
index 0000000..5ba7ebc
--- /dev/null
+++ b/data-catalog-api/client/src/main/java/org/apache/airavata/datacatalog/api/client/DataCatalogAPIClient.java
@@ -0,0 +1,49 @@
+package org.apache.airavata.datacatalog.api.client;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.grpc.Channel;
+import io.grpc.ManagedChannel;
+import io.grpc.ManagedChannelBuilder;
+
+import java.text.MessageFormat;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.airavata.datacatalog.api.DataCatalogAPIServiceGrpc;
+import org.apache.airavata.datacatalog.api.DataProduct;
+import org.apache.airavata.datacatalog.api.DataProductCreateRequest;
+import org.apache.airavata.datacatalog.api.DataProductCreateResponse;
+import org.apache.airavata.datacatalog.api.DataCatalogAPIServiceGrpc.DataCatalogAPIServiceBlockingStub;;
+
+public class DataCatalogAPIClient {
+
+    private static final Logger logger = LoggerFactory.getLogger(DataCatalogAPIClient.class);
+
+    private final DataCatalogAPIServiceBlockingStub blockingStub;
+
+    public DataCatalogAPIClient(Channel channel) {
+        blockingStub = DataCatalogAPIServiceGrpc.newBlockingStub(channel);
+    }
+
+    public DataProduct createDataProduct(DataProduct dataProduct) {
+        DataProductCreateRequest request = DataProductCreateRequest.newBuilder().setDataProduct(dataProduct).build();
+        DataProductCreateResponse response = blockingStub.createDataProduct(request);
+        return response.getDataProduct();
+    }
+
+    public static void main(String[] args) throws InterruptedException {
+        String target = "localhost:6565";
+
+        ManagedChannel channel = ManagedChannelBuilder.forTarget(target).usePlaintext().build();
+        try {
+            DataCatalogAPIClient client = new DataCatalogAPIClient(channel);
+            DataProduct dataProduct = DataProduct.newBuilder().setName("testing").build();
+            DataProduct result = client.createDataProduct(dataProduct);
+            System.out.println(MessageFormat.format("Created data product with id [{0}]", result.getDataProductId()));
+
+        }finally {
+            channel.shutdownNow().awaitTermination(5, TimeUnit.SECONDS);
+        }
+    }
+}
diff --git a/data-catalog-api/pom.xml b/data-catalog-api/pom.xml
new file mode 100644
index 0000000..5d1da44
--- /dev/null
+++ b/data-catalog-api/pom.xml
@@ -0,0 +1,39 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+  <parent>
+    <groupId>org.apache.airavata</groupId>
+    <artifactId>airavata-data-catalog</artifactId>
+    <version>0.1-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>data-catalog-api</artifactId>
+  <modelVersion>4.0.0</modelVersion>
+
+  <packaging>pom</packaging>
+
+  <modules>
+    <module>server</module>
+    <module>stubs</module>
+    <module>client</module>
+  </modules>
+</project>
diff --git a/data-catalog-api/server/pom.xml b/data-catalog-api/server/pom.xml
new file mode 100644
index 0000000..b3c9cf1
--- /dev/null
+++ b/data-catalog-api/server/pom.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.airavata</groupId>
+        <artifactId>data-catalog-api</artifactId>
+        <version>0.1-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>data-catalog-api-server</artifactId>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-parent</artifactId>
+                <version>${spring.boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.github.lognet</groupId>
+            <artifactId>grpc-spring-boot-starter</artifactId>
+            <version>${grpc.spring.boot}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.airavata</groupId>
+            <artifactId>data-catalog-api-stubs</artifactId>
+            <version>0.1-SNAPSHOT</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring.boot.version}</version>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/DataCatalogApiServiceApplication.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/DataCatalogApiServiceApplication.java
new file mode 100644
index 0000000..5b3fa8e
--- /dev/null
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/DataCatalogApiServiceApplication.java
@@ -0,0 +1,13 @@
+package org.apache.airavata.datacatalog.api;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DataCatalogApiServiceApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(DataCatalogApiServiceApplication.class, args);
+    }
+
+}
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/DataProductEntity.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/DataProductEntity.java
new file mode 100644
index 0000000..63af7e8
--- /dev/null
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/DataProductEntity.java
@@ -0,0 +1,92 @@
+package org.apache.airavata.datacatalog.api.model;
+
+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.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name="data_product")
+public class DataProductEntity {
+
+    @Id
+    @SequenceGenerator(name="data_product_data_product_id_seq", sequenceName = "data_product_data_product_id_seq", allocationSize = 1)
+    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "data_product_data_product_id_seq")
+    @Column(name="data_product_id")
+    private Long dataProductId;
+
+    @ManyToOne(optional = true)
+    @JoinColumn(name="parent_data_product_id", referencedColumnName = "data_product_id", nullable = true)
+    private DataProductEntity parentDataProductEntity;
+
+    @Basic
+    @Column(name="external_id", nullable = false)
+    private String externalId;
+
+    @Basic
+    @Column(name="name", nullable = false)
+    private String name;
+
+    public Long getDataProductId() {
+        return dataProductId;
+    }
+
+    public void setDataProductId(Long dataProductId) {
+        this.dataProductId = dataProductId;
+    }
+
+    public DataProductEntity getParentDataProductEntity() {
+        return parentDataProductEntity;
+    }
+
+    public void setParentDataProductEntity(DataProductEntity parentDataProductEntity) {
+        this.parentDataProductEntity = parentDataProductEntity;
+    }
+
+    public String getExternalId() {
+        return externalId;
+    }
+
+    public void setExternalId(String externalId) {
+        this.externalId = externalId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((dataProductId == null) ? 0 : dataProductId.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;
+        DataProductEntity other = (DataProductEntity) obj;
+        if (dataProductId == null) {
+            if (other.dataProductId != null)
+                return false;
+        } else if (!dataProductId.equals(other.dataProductId))
+            return false;
+        return true;
+    }
+}
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/DataProductRepository.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/DataProductRepository.java
new file mode 100644
index 0000000..770eb8f
--- /dev/null
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/DataProductRepository.java
@@ -0,0 +1,10 @@
+package org.apache.airavata.datacatalog.api.repository;
+
+import org.apache.airavata.datacatalog.api.model.DataProductEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface DataProductRepository extends JpaRepository<DataProductEntity, Long> {
+
+    DataProductEntity findByExternalId(String parentDataProductId);
+
+}
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
new file mode 100644
index 0000000..d4e9589
--- /dev/null
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/service/DataCatalogAPIService.java
@@ -0,0 +1,53 @@
+package org.apache.airavata.datacatalog.api.service;
+
+import java.util.UUID;
+
+import org.apache.airavata.datacatalog.api.DataCatalogAPIServiceGrpc;
+import org.apache.airavata.datacatalog.api.DataProduct;
+import org.apache.airavata.datacatalog.api.DataProductCreateRequest;
+import org.apache.airavata.datacatalog.api.DataProductCreateResponse;
+import org.apache.airavata.datacatalog.api.model.DataProductEntity;
+import org.apache.airavata.datacatalog.api.repository.DataProductRepository;
+import org.lognet.springboot.grpc.GRpcService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import io.grpc.stub.StreamObserver;
+
+@GRpcService
+public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalogAPIServiceImplBase {
+
+    private static final Logger logger = LoggerFactory.getLogger(DataCatalogAPIService.class);
+
+    @Autowired
+    DataProductRepository dataProductRepository;
+
+    @Override
+    public void createDataProduct(DataProductCreateRequest request,
+            StreamObserver<DataProductCreateResponse> responseObserver) {
+
+        logger.info("Creating data product {}", request.getDataProduct());
+        DataProductEntity dataProductEntity = new DataProductEntity();
+        dataProductEntity.setExternalId(UUID.randomUUID().toString());
+        dataProductEntity.setName(request.getDataProduct().getName());
+        if (request.getDataProduct().hasParentDataProductId()) {
+            // TODO: handle parent data product not found
+            DataProductEntity parentDataProductEntity = dataProductRepository
+                    .findByExternalId(request.getDataProduct().getParentDataProductId());
+            dataProductEntity.setParentDataProductEntity(parentDataProductEntity);
+        }
+        DataProductEntity savedDataProductEntity = dataProductRepository.save(dataProductEntity);
+
+        DataProductCreateResponse.Builder responseBuilder = DataProductCreateResponse.newBuilder();
+        responseBuilder.getDataProductBuilder()
+                .setDataProductId(savedDataProductEntity.getExternalId())
+                .setName(savedDataProductEntity.getName()).build();
+        if (savedDataProductEntity.getParentDataProductEntity() != null) {
+            responseBuilder.getDataProductBuilder()
+                    .setParentDataProductId(savedDataProductEntity.getParentDataProductEntity().getExternalId());
+        }
+        responseObserver.onNext(responseBuilder.build());
+        responseObserver.onCompleted();
+    }
+}
diff --git a/data-catalog-api/server/src/main/resources/application.properties b/data-catalog-api/server/src/main/resources/application.properties
new file mode 100644
index 0000000..2064c00
--- /dev/null
+++ b/data-catalog-api/server/src/main/resources/application.properties
@@ -0,0 +1,5 @@
+spring.datasource.url=jdbc:postgresql://localhost:5432/data_catalog
+spring.datasource.username=postgres
+spring.datasource.password=example
+spring.jpa.hibernate.ddl-auto=update
+spring.jpa.show-sql=true
diff --git a/data-catalog-api/server/src/main/resources/logback.xml b/data-catalog-api/server/src/main/resources/logback.xml
new file mode 100644
index 0000000..5cd56ea
--- /dev/null
+++ b/data-catalog-api/server/src/main/resources/logback.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<configuration>
+
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d [%t] %-5p %c{30} %m [%X]%n</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="LOGFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <File>../logs/airavata.log</File>
+        <Append>true</Append>
+        <encoder>
+            <pattern>%d [%t] %-5p %c{30} %m [%X]%n</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>../logs/airavata.log.%d{yyyy-MM-dd}</fileNamePattern>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>1GB</totalSizeCap>
+        </rollingPolicy>
+    </appender>
+
+    <logger name="ch.qos.logback" level="WARN"/>
+    <logger name="org.apache.helix" level="WARN"/>
+    <logger name="org.apache.zookeeper" level="ERROR"/>
+    <logger name="org.apache.airavata" level="INFO"/>
+    <logger name="org.hibernate" level="INFO"/>
+    <logger name="net.schmizz.sshj" level="WARN"/>
+    <root level="INFO">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="LOGFILE"/>
+    </root>
+</configuration>
diff --git a/data-catalog-api/server/src/test/java/org/apache/airavata/datacatalogapiserver/DataCatalogApiServerApplicationTests.java b/data-catalog-api/server/src/test/java/org/apache/airavata/datacatalogapiserver/DataCatalogApiServerApplicationTests.java
new file mode 100644
index 0000000..f7ed907
--- /dev/null
+++ b/data-catalog-api/server/src/test/java/org/apache/airavata/datacatalogapiserver/DataCatalogApiServerApplicationTests.java
@@ -0,0 +1,13 @@
+package org.apache.airavata.datacatalogapiserver;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class DataCatalogApiServerApplicationTests {
+
+	@Test
+	void contextLoads() {
+	}
+
+}
diff --git a/data-catalog-api/stubs/pom.xml b/data-catalog-api/stubs/pom.xml
new file mode 100644
index 0000000..18f5fe6
--- /dev/null
+++ b/data-catalog-api/stubs/pom.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>data-catalog-api</artifactId>
+        <groupId>org.apache.airavata</groupId>
+        <version>0.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>data-catalog-api-stubs</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-netty-shaded</artifactId>
+            <version>${grpc.version}</version>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-protobuf</artifactId>
+            <version>${grpc.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-stub</artifactId>
+            <version>${grpc.version}</version>
+        </dependency>
+        <dependency>            <!-- necessary for Java 9+ -->
+            <groupId>org.apache.tomcat</groupId>
+            <artifactId>annotations-api</artifactId>
+            <version>${tomcat.annotations-api.version}</version>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <extensions>
+            <extension>
+                <groupId>kr.motd.maven</groupId>
+                <artifactId>os-maven-plugin</artifactId>
+                <version>${os.maven.plugin}</version>
+            </extension>
+        </extensions>
+        <plugins>
+            <plugin>
+                <groupId>org.xolstice.maven.plugins</groupId>
+                <artifactId>protobuf-maven-plugin</artifactId>
+                <version>${protobuf.maven.plugin}</version>
+                <configuration>
+                    <protocArtifact>com.google.protobuf:protoc:${protobuf.protoc.version}:exe:${os.detected.classifier}</protocArtifact>
+                    <pluginId>grpc-java</pluginId>
+                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:${protoc-gen-grpc-java.version}:exe:${os.detected.classifier}</pluginArtifact>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>compile</goal>
+                            <goal>compile-custom</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto b/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto
new file mode 100644
index 0000000..0a2a083
--- /dev/null
+++ b/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto
@@ -0,0 +1,39 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+
+//   http://www.apache.org/licenses/LICENSE-2.0
+
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+syntax = "proto3";
+
+option java_multiple_files = true;
+option java_package = "org.apache.airavata.datacatalog.api";
+
+
+message DataProduct {
+    string data_product_id = 1;
+    optional string parent_data_product_id = 2;
+    string name = 3;
+}
+
+message DataProductCreateRequest {
+    DataProduct data_product = 1;
+}
+message DataProductCreateResponse {
+    DataProduct data_product = 1;
+}
+
+service DataCatalogAPIService {
+    rpc createDataProduct(DataProductCreateRequest) returns (DataProductCreateResponse){}
+}
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..2fd997b
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,54 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.airavata</groupId>
+  <artifactId>airavata-data-catalog</artifactId>
+  <packaging>pom</packaging>
+  <version>0.1-SNAPSHOT</version>
+  <name>airavata-data-catalog</name>
+  <url>http://airavata.apache.org</url>
+
+  <modules>
+    <module>data-catalog-api</module>
+  </modules>
+
+  <properties>
+    <java.version>17</java.version>
+    <maven.compiler.source>${java.version}</maven.compiler.source>
+    <maven.compiler.target>${java.version}</maven.compiler.target>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    <spring.boot.version>3.0.1</spring.boot.version>
+    <grpc.spring.boot>5.0.0</grpc.spring.boot>
+    <slf4j.version>2.0.6</slf4j.version>
+    <os.maven.plugin>1.6.2</os.maven.plugin>
+    <protobuf.maven.plugin>0.6.1</protobuf.maven.plugin>
+    <protobuf.protoc.version>3.21.7</protobuf.protoc.version>
+    <grpc.version>1.52.1</grpc.version>
+    <protoc-gen-grpc-java.version>${grpc.version}</protoc-gen-grpc-java.version>
+    <tomcat.annotations-api.version>6.0.53</tomcat.annotations-api.version>
+  </properties>
+
+  <dependencies>
+  </dependencies>
+</project>


[airavata-data-catalog] 05/05: Initial work on sharing management interface

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 2e6393961620230cfbdc9ad5f4f799904905a728
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Thu Jan 26 11:19:20 2023 -0500

    Initial work on sharing management interface
---
 .../datacatalog/api/model/DataProductEntity.java   |  11 ++-
 .../airavata/datacatalog/api/model/UserEntity.java |  79 ++++++++++++++++
 .../api/service/DataCatalogAPIService.java         |   4 +
 .../datacatalog/api/sharing/SharingManager.java    | 102 +++++++++++++++++++++
 .../stubs/src/main/proto/DataCatalogAPI.proto      |  18 ++++
 5 files changed, 209 insertions(+), 5 deletions(-)

diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/DataProductEntity.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/DataProductEntity.java
index c9a67d2..65b24e7 100644
--- a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/DataProductEntity.java
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/DataProductEntity.java
@@ -22,27 +22,28 @@ import jakarta.persistence.UniqueConstraint;
 public class DataProductEntity {
 
     @Id
-    @SequenceGenerator(name="data_product_data_product_id_seq", sequenceName = "data_product_data_product_id_seq", allocationSize = 1)
+    @SequenceGenerator(name = "data_product_data_product_id_seq", sequenceName = "data_product_data_product_id_seq", allocationSize = 1)
     @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "data_product_data_product_id_seq")
-    @Column(name="data_product_id")
+    @Column(name = "data_product_id")
     private Long dataProductId;
 
     @ManyToOne(optional = true)
-    @JoinColumn(name="parent_data_product_id", referencedColumnName = "data_product_id", nullable = true)
+    @JoinColumn(name = "parent_data_product_id", referencedColumnName = "data_product_id", nullable = true)
     private DataProductEntity parentDataProductEntity;
 
     @Basic
-    @Column(name="external_id", nullable = false)
+    @Column(name = "external_id", nullable = false)
     private String externalId;
 
     @Basic
-    @Column(name="name", nullable = false)
+    @Column(name = "name", nullable = false)
     private String name;
 
     @Type(JsonType.class)
     @Column(name = "metadata", columnDefinition = "jsonb")
     private JsonNode metadata;
 
+    // TODO: ManyToOne mapping to owner: UserEntity
     public Long getDataProductId() {
         return dataProductId;
     }
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/UserEntity.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/UserEntity.java
new file mode 100644
index 0000000..0540ab2
--- /dev/null
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/UserEntity.java
@@ -0,0 +1,79 @@
+package org.apache.airavata.datacatalog.api.model;
+
+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.SequenceGenerator;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name = "user")
+public class UserEntity {
+
+    @Id
+    @SequenceGenerator(name = "user_user_id_seq", sequenceName = "user_user_id_seq", allocationSize = 1)
+    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_user_id_seq")
+    @Column(name = "user_id")
+    private Long userId;
+
+    @Basic
+    @Column(name = "external_id", nullable = false)
+    private String externalId;
+
+    @Basic
+    @Column(name = "name", nullable = false)
+    private String name;
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getExternalId() {
+        return externalId;
+    }
+
+    public void setExternalId(String externalId) {
+        this.externalId = externalId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((userId == null) ? 0 : userId.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;
+        UserEntity other = (UserEntity) obj;
+        if (userId == null) {
+            if (other.userId != null)
+                return false;
+        } else if (!userId.equals(other.userId))
+            return false;
+        return true;
+    }
+
+}
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 fa979a6..e14c437 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
@@ -30,6 +30,7 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog
     public void createDataProduct(DataProductCreateRequest request,
             StreamObserver<DataProductCreateResponse> responseObserver) {
 
+        // TODO: SharingManager.resolveUser
         logger.info("Creating data product {}", request.getDataProduct());
         DataProductEntity dataProductEntity = new DataProductEntity();
         dataProductEntity.setExternalId(UUID.randomUUID().toString());
@@ -51,6 +52,9 @@ public class DataCatalogAPIService extends DataCatalogAPIServiceGrpc.DataCatalog
         }
         DataProductEntity savedDataProductEntity = dataProductRepository.save(dataProductEntity);
 
+        // TODO: SharingManager.grantPermissionToUser(userInfo, dataProduct,
+        // Permission.OWNER)
+
         DataProductCreateResponse.Builder responseBuilder = DataProductCreateResponse.newBuilder();
         responseBuilder.getDataProductBuilder()
                 .setDataProductId(savedDataProductEntity.getExternalId())
diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/sharing/SharingManager.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/sharing/SharingManager.java
new file mode 100644
index 0000000..cbe470e
--- /dev/null
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/sharing/SharingManager.java
@@ -0,0 +1,102 @@
+package org.apache.airavata.datacatalog.api.sharing;
+
+import org.apache.airavata.datacatalog.api.DataProduct;
+import org.apache.airavata.datacatalog.api.GroupInfo;
+import org.apache.airavata.datacatalog.api.Permission;
+import org.apache.airavata.datacatalog.api.UserInfo;
+import org.apache.airavata.datacatalog.api.model.UserEntity;
+
+public interface SharingManager {
+
+    /**
+     * Get or create a {@link UserEntity}.
+     *
+     * @param userInfo
+     * @return
+     */
+    UserEntity resolveUser(UserInfo userInfo);
+
+    /**
+     * Return true if the user has access to the data product with the given
+     * permission.
+     *
+     * @param userInfo
+     * @param dataProduct
+     * @param permission
+     * @return
+     */
+    boolean userHasAccess(UserInfo userInfo, DataProduct dataProduct, Permission permission);
+
+    /**
+     * Return the name of the database view that includes sharing information
+     * for each data product. The view should contain the following columns:
+     * data_product_id, user_id, and permission_id where the permission_id
+     * should be a number as defined in the {@link Permission} enum.
+     *
+     * @return
+     */
+    String getDataProductSharingView();
+
+    /**
+     * Grant permission to the user for the given data product.
+     *
+     * @param userInfo
+     * @param dataProduct
+     * @param permission
+     */
+    void grantPermissionToUser(UserInfo userInfo, DataProduct dataProduct, Permission permission);
+
+    /**
+     * Revoke permission from the user for the given data product.
+     *
+     * @param userInfo
+     * @param dataProduct
+     * @param permission
+     */
+    void revokePermissionFromUser(UserInfo userInfo, DataProduct dataProduct, Permission permission);
+
+    /**
+     * Grant permission to the group for the given data product.
+     *
+     * @param groupInfo
+     * @param dataProduct
+     * @param permission
+     */
+    void grantPermissionToGroup(GroupInfo groupInfo, DataProduct dataProduct, Permission permission);
+
+    /**
+     * Revoke permission from the group for the given data product.
+     *
+     * @param groupInfo
+     * @param dataProduct
+     * @param permission
+     */
+    void revokePermissionFromGroup(GroupInfo groupInfo, DataProduct dataProduct, Permission permission);
+
+    /**
+     * Return true if public access at the given permission is granted for the
+     * given data product. Public access means anonymous access; no user information
+     * provided in the API request.
+     *
+     * @param dataProduct
+     * @param permission
+     * @return
+     */
+    boolean hasPublicAccess(DataProduct dataProduct, Permission permission);
+
+    /**
+     * Grant public access to the given data product.
+     *
+     * @param dataProduct
+     * @param permission
+     */
+    void grantPublicAccess(DataProduct dataProduct, Permission permission);
+
+    /**
+     * Revoke public access from the given data product.
+     *
+     * @param dataProduct
+     * @param permission
+     */
+    void revokePublicAccess(DataProduct dataProduct, Permission permission);
+}
diff --git a/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto b/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto
index 43854f9..bc8f656 100644
--- a/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto
+++ b/data-catalog-api/stubs/src/main/proto/DataCatalogAPI.proto
@@ -20,6 +20,24 @@ syntax = "proto3";
 option java_multiple_files = true;
 option java_package = "org.apache.airavata.datacatalog.api";
 
+message UserInfo {
+    string user_id = 1;
+    optional string tenant_id = 2;
+}
+
+message GroupInfo {
+    string group_id = 1;
+    optional string tenant_id = 2;
+}
+
+enum Permission {
+    OWNER = 0;
+    READ = 1;
+    READ_METADATA = 2;
+    WRITE = 3;
+    WRITE_METADATA = 4;
+    MANAGE_SHARING = 5;
+}
 
 message DataProduct {
     string data_product_id = 1;


[airavata-data-catalog] 02/05: Add unique constraint to external_id

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 9ea7ae9b8d4679ed630e789075b368126f557b4b
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Mon Jan 23 15:33:04 2023 -0500

    Add unique constraint to external_id
---
 .../org/apache/airavata/datacatalog/api/model/DataProductEntity.java   | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/DataProductEntity.java b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/DataProductEntity.java
index 63af7e8..01aa429 100644
--- a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/DataProductEntity.java
+++ b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/DataProductEntity.java
@@ -10,9 +10,10 @@ import jakarta.persistence.JoinColumn;
 import jakarta.persistence.ManyToOne;
 import jakarta.persistence.SequenceGenerator;
 import jakarta.persistence.Table;
+import jakarta.persistence.UniqueConstraint;
 
 @Entity
-@Table(name="data_product")
+@Table(name = "data_product", uniqueConstraints = { @UniqueConstraint(columnNames = { "external_id" }) })
 public class DataProductEntity {
 
     @Id


[airavata-data-catalog] 03/05: Adding PostgreSQL docker-compose script and README instructions

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 33bdc76af680871b800bf72baa5b16354e838d91
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Mon Jan 23 15:48:44 2023 -0500

    Adding PostgreSQL docker-compose script and README instructions
---
 README.md          | 25 +++++++++++++++++++++++++
 docker-compose.yml | 18 ++++++++++++++++++
 2 files changed, 43 insertions(+)

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..0f57854
--- /dev/null
+++ b/README.md
@@ -0,0 +1,25 @@
+# Apache Airavata Data Catalog
+
+## Getting started
+
+Start the PostgreSQL database in a docker container
+
+```
+docker-compose up
+```
+
+Run the API server
+
+```
+mvn install
+cd data-catalog-api/server
+mvn spring-boot:run
+```
+
+Run the API client
+
+```
+mvn install
+cd data-catalog-api/client
+mvn exec:java -Dexec.mainClass=org.apache.airavata.datacatalog.api.client.DataCatalogAPIClient
+```
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..d7d84d8
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,18 @@
+# Use postgres/example user/password credentials
+version: "3.1"
+
+services:
+  db:
+    image: postgres
+    restart: always
+    environment:
+      POSTGRES_PASSWORD: example
+      POSTGRES_DB: data_catalog
+    ports:
+      - 5432:5432
+
+  adminer:
+    image: adminer
+    restart: always
+    ports:
+      - 8080:8080