You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by is...@apache.org on 2021/07/10 15:49:22 UTC

[airavata-data-lake] branch master updated: Add sharedBy and SharedWith functions

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

isjarana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-data-lake.git


The following commit(s) were added to refs/heads/master by this push:
     new d13d211  Add sharedBy and SharedWith functions
     new 4aa39f8  Merge pull request #22 from isururanawaka/workflow_invocation
d13d211 is described below

commit d13d211c9853027f1029874bc761e69cd5c72869
Author: Isuru Ranawaka <ir...@gmail.com>
AuthorDate: Sat Jul 10 11:48:33 2021 -0400

    Add sharedBy and SharedWith functions
---
 .../drms/api/handlers/ResourceServiceHandler.java  | 48 +++++++++++++++++++++-
 .../org/apache/airavata/drms/api/utils/Utils.java  | 31 ++++++++++++++
 .../synchronizer/handlers/SharingHandler.java      | 10 ++++-
 .../src/main/resources/application.properties      |  3 +-
 .../main/proto/resource/DRMSResourceService.proto  |  1 +
 5 files changed, 89 insertions(+), 4 deletions(-)

diff --git a/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/handlers/ResourceServiceHandler.java b/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/handlers/ResourceServiceHandler.java
index d97f29d..3be511a 100644
--- a/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/handlers/ResourceServiceHandler.java
+++ b/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/handlers/ResourceServiceHandler.java
@@ -363,6 +363,50 @@ public class ResourceServiceHandler extends ResourceServiceGrpc.ResourceServiceI
             List<ResourceSearchQuery> resourceSearchQueries = request.getQueriesList();
             int depth = request.getDepth();
             String value = request.getType();
+
+            if (!resourceSearchQueries.isEmpty()) {
+                for (ResourceSearchQuery qry : resourceSearchQueries) {
+                    if (qry.getField().equals("sharedBy")) {
+                        String val = qry.getValue();
+                        String query = " Match (m)-[r:SHARED_WITH]->(l) where r.sharedBy=$sharedBy AND m.tenantId=$tenantId and l.tenantId=$tenantId " +
+                                "return (m) ";
+                        Map<String, Object> objectMap = new HashMap<>();
+                        objectMap.put("sharedBy", val);
+                        objectMap.put("tenantId", callUser.getTenantId());
+                        List<Record> records = this.neo4JConnector.searchNodes(objectMap, query);
+
+                        List<GenericResource> genericResourceList = GenericResourceDeserializer.deserializeList(records);
+                        ResourceSearchResponse.Builder builder = ResourceSearchResponse.newBuilder();
+                        builder.addAllResources(genericResourceList);
+                        responseObserver.onNext(builder.build());
+                        responseObserver.onCompleted();
+                        return;
+                    }
+
+                    if (qry.getField().equals("sharedWith")) {
+                        String val = qry.getValue();
+                        String query = "MATCH (u:User) where u.username = $username AND u.tenantId = $tenantId " +
+                                " OPTIONAL MATCH (g:Group)<-[:MEMBER_OF]-(u)  " +
+                                " OPTIONAL MATCH (u)<-[:SHARED_WITH]-(m)<-[:CHILD_OF*]-(rm) , (r)-[:SHARED_WITH]->(u) where NOT  r.owner  = '" + val + "'" +
+                                " AND NOT rm.owner='" + val + "' " +
+                                " OPTIONAL MATCH (g)<-[:SHARED_WITH]-(mg)<-[:CHILD_OF*]-(rmg), (rg)-[:SHARED_WITH]->(g) where NOT  rg.owner  = '" + val + "'" +
+                                " AND NOT rmg.owner='" + val + "' " +
+                                " return distinct   r, rm, rmg, rg ";
+                        Map<String, Object> objectMap = new HashMap<>();
+                        objectMap.put("username", val);
+                        objectMap.put("tenantId", callUser.getTenantId());
+                        List<Record> records = this.neo4JConnector.searchNodes(objectMap, query);
+
+                        List<GenericResource> genericResourceList = GenericResourceDeserializer.deserializeList(records);
+                        ResourceSearchResponse.Builder builder = ResourceSearchResponse.newBuilder();
+                        builder.addAllResources(genericResourceList);
+                        responseObserver.onNext(builder.build());
+                        responseObserver.onCompleted();
+                        return;
+                    }
+                }
+            }
+
             if (value == null || value.isEmpty()) {
                 logger.error("Errored while searching generic resources");
                 responseObserver
@@ -417,6 +461,7 @@ public class ResourceServiceHandler extends ResourceServiceGrpc.ResourceServiceI
                 ResourceSearchResponse.Builder builder = ResourceSearchResponse.newBuilder();
                 builder.addAllResources(allowedResourceList);
                 responseObserver.onNext(builder.build());
+                return;
             } else {
                 Map<String, Object> userProps = new HashMap<>();
                 userProps.put("username", callUser.getUsername());
@@ -444,8 +489,9 @@ public class ResourceServiceHandler extends ResourceServiceGrpc.ResourceServiceI
                 ResourceSearchResponse.Builder builder = ResourceSearchResponse.newBuilder();
                 builder.addAllResources(genericResourceList);
                 responseObserver.onNext(builder.build());
+                responseObserver.onCompleted();
             }
-            responseObserver.onCompleted();
+
 
         } catch (Exception e) {
             logger.error("Errored while searching generic resources; Message: {}", e.getMessage(), e);
diff --git a/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/utils/Utils.java b/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/utils/Utils.java
index a1729e5..d651d75 100644
--- a/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/utils/Utils.java
+++ b/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/utils/Utils.java
@@ -3,7 +3,9 @@ package org.apache.airavata.drms.api.utils;
 import io.grpc.Context;
 import org.apache.airavata.datalake.drms.storage.ResourceSearchQuery;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -57,5 +59,34 @@ public class Utils {
         return Optional.empty();
     }
 
+    public static Optional<String> getSharedByQuery(List<ResourceSearchQuery> resourceSearchQueries,
+                                                    String tenantId) {
+        if (!resourceSearchQueries.isEmpty()) {
+            for (ResourceSearchQuery qry : resourceSearchQueries) {
+                if (qry.getField().equals("sharedBy")) {
+                    String value = qry.getValue();
+                    String query = " Match (m)-[r:SHARED_WITH]->(l) where r.sharedBy=$sharedBy AND m.tenantId=$tenantId and l.tenantId=$tenantId " +
+                            "return (m) ";
+                    Map<String, Object> objectMap = new HashMap<>();
+                    objectMap.put("sharedBy", value);
+                    objectMap.put("tenantId", tenantId);
+                    return Optional.ofNullable(query);
+                }
+            }
+        }
+        return Optional.empty();
+    }
+
+    public static Optional<String> getSharedQueryExceptOwner(List<ResourceSearchQuery> resourceSearchQueries, String type) {
+        if (!resourceSearchQueries.isEmpty()) {
+            for (ResourceSearchQuery qry : resourceSearchQueries) {
+                String query = " MATCH (r:" + type +
+                        ") where r." + qry.getField() + " contains  '" + qry.getValue() + "' Return r ";
+                return Optional.ofNullable(query);
+            }
+        }
+        return Optional.empty();
+    }
+
 
 }
diff --git a/data-resource-management-service/drms-custos-synchronizer/src/main/java/org/apache/airavata/drms/custos/synchronizer/handlers/SharingHandler.java b/data-resource-management-service/drms-custos-synchronizer/src/main/java/org/apache/airavata/drms/custos/synchronizer/handlers/SharingHandler.java
index 75a739f..b07127c 100644
--- a/data-resource-management-service/drms-custos-synchronizer/src/main/java/org/apache/airavata/drms/custos/synchronizer/handlers/SharingHandler.java
+++ b/data-resource-management-service/drms-custos-synchronizer/src/main/java/org/apache/airavata/drms/custos/synchronizer/handlers/SharingHandler.java
@@ -120,17 +120,18 @@ public class SharingHandler {
         String permissionId = metadata.getPermission().getId();
         String userId = metadata.getOwnerId();
         String type = metadata.getOwnerType();
+        String sharedBy = metadata.getSharedBy();
         userId = userId.replaceAll("'", "`'");
         String query = null;
         if (type.equalsIgnoreCase("USER")) {
             query = "MATCH (a:" + entity.getType() + "), (b:User) WHERE a.entityId = $sourceId  AND a.tenantId = $clientId" +
                     " AND  b.username = $userId  AND b.tenantId = $clientId " +
-                    "MERGE (a)-[r:SHARED_WITH]->(b) SET r.permission= $permissionId  RETURN a, b";
+                    "MERGE (a)-[r:SHARED_WITH]->(b) SET r += $props RETURN a, b";
 
         } else if (type.equalsIgnoreCase("GROUP")) {
             query = "MATCH (a:" + entity.getType() + "), (b:Group) WHERE a.entityId = $sourceId " +
                     " AND a.tenantId = $clientId  AND b.groupId = $userId  AND b.tenantId = $clientId " +
-                    "MERGE (a)-[r:SHARED_WITH]->(b) SET r.permission= $permissionId RETURN a, b";
+                    "MERGE (a)-[r:SHARED_WITH]->(b) SET r += $props RETURN a, b";
         }
         if (query != null) {
             Map<String, Object> map = new HashMap<>();
@@ -138,6 +139,11 @@ public class SharingHandler {
             map.put("clientId", clientId);
             map.put("permissionId", permissionId);
             map.put("userId", userId);
+            map.put("sharedBy", sharedBy);
+            Map<String, Object> props = new HashMap<>();
+            props.put("sharedBy", sharedBy);
+            props.put("permission", permissionId);
+            map.put("props", props);
             try {
                 Utils.getNeo4JConnector().runTransactionalQuery(map, query);
             } catch (Exception ex) {
diff --git a/data-resource-management-service/drms-custos-synchronizer/src/main/resources/application.properties b/data-resource-management-service/drms-custos-synchronizer/src/main/resources/application.properties
index ba17f62..d343fdd 100644
--- a/data-resource-management-service/drms-custos-synchronizer/src/main/resources/application.properties
+++ b/data-resource-management-service/drms-custos-synchronizer/src/main/resources/application.properties
@@ -1 +1,2 @@
-spring.main.web-application-type=none
\ No newline at end of file
+spring.main.web-application-type=none
+config.path=/Users/isururanawaka/Documents/Airavata_Repository/airavata-data-lake/data-resource-management-service/drms-custos-synchronizer/src/main/resources/config.yml
\ No newline at end of file
diff --git a/data-resource-management-service/drms-stubs/src/main/proto/resource/DRMSResourceService.proto b/data-resource-management-service/drms-stubs/src/main/proto/resource/DRMSResourceService.proto
index 1b2f0ec..08ca823 100644
--- a/data-resource-management-service/drms-stubs/src/main/proto/resource/DRMSResourceService.proto
+++ b/data-resource-management-service/drms-stubs/src/main/proto/resource/DRMSResourceService.proto
@@ -220,4 +220,5 @@ service ResourceService {
     };
     }
 
+
 }
\ No newline at end of file