public void createResource()

in data-resource-management-service/drms-graph-impl/drms-api/src/main/java/org/apache/airavata/drms/api/handlers/ResourceServiceHandler.java [130:231]


    public void createResource(ResourceCreateRequest request, StreamObserver<ResourceCreateResponse> responseObserver) {
        try {
            AuthenticatedUser callUser = request.getAuthToken().getAuthenticatedUser();

            String type = request.getResource().getType();

            Map<String, Object> userProps = new HashMap<>();
            userProps.put("username", callUser.getUsername());
            userProps.put("tenantId", callUser.getTenantId());

            String parentId = request.getResource().getParentId();


            String entityId = request.getResource().getResourceId();
            if (entityId == null || entityId.isEmpty()) {
                entityId = Utils.getId(request.getResource().toString());
            }
            Map<String, Object> serializedMap = GenericResourceSerializer.serializeToMap(request.getResource());
            Optional<Entity> exEntity = CustosUtils.mergeResourceEntity(custosClientProvider, callUser.getTenantId(),
                    parentId, type, entityId,
                    request.getResource().getResourceName(), request.getResource().getResourceName(),
                    callUser.getUsername());

            if (exEntity.isPresent()) {
                serializedMap.put("description", exEntity.get().getDescription());
                serializedMap.put("resourceName", exEntity.get().getName());
                serializedMap.put("createdTime", String.valueOf(exEntity.get().getCreatedAt()));
                serializedMap.put("tenantId", callUser.getTenantId());
                serializedMap.put("entityId", exEntity.get().getId());
                serializedMap.put("entityType", exEntity.get().getType());
                serializedMap.put("lastModifiedTime", exEntity.get().getCreatedAt());
                serializedMap.put("owner", exEntity.get().getOwnerId());
                serializedMap.put("firstName", callUser.getFirstName());
                serializedMap.put("lastName", callUser.getLastName());

                if (serializedMap.containsKey("properties") && serializedMap.get("properties") instanceof List) {
                    List propertiesList = (List) serializedMap.get("properties");
                    propertiesList.forEach(property -> {
                        MapEntry entry = (MapEntry) property;
                        serializedMap.put(entry.getKey().toString(), entry.getValue());
                    });
                }
                serializedMap.remove("properties");
                if (!parentId.isEmpty()) {
                    String parentLabel = request.getResource().getPropertiesMap().get("PARENT_TYPE");
                    if (parentLabel == null || parentLabel.isEmpty()) {
                        parentLabel = request.getResource().getPropertiesMap().get("parentType");
                    }
                    this.neo4JConnector.mergeNodesWithParentChildRelationShip(serializedMap, new HashMap<>(),
                            request.getResource().getType(), parentLabel, callUser.getUsername(), entityId,
                            parentId, callUser.getTenantId());
                } else {
                    this.neo4JConnector.mergeNode(serializedMap, request.getResource().getType(),
                            callUser.getUsername(), entityId, callUser.getTenantId());
                }
            } else {
                logger.error("Error occurred while creating resource entity in Custos {}", request.getResource().getResourceId());
                String msg = "Error occurred while creating resource entity in Custos with id"
                        + request.getResource().getResourceId();
                responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
                return;
            }
            Map<String, Object> exProps = new HashMap<>();
            exProps.put("username", callUser.getUsername());
            exProps.put("tenantId", callUser.getTenantId());
            exProps.put("entityId", exEntity.get().getId());

            String query = " MATCH (u:User) where u.username = $username AND u.tenantId = $tenantId with u  " +
                    " Match (r:" + type + ") where r.entityId = $entityId AND r.tenantId = $tenantId with u, r" +
                    " OPTIONAL MATCH (g:Group)<-[:MEMBER_OF]-(u) " +
                    " OPTIONAL MATCH (cg:Group)-[:CHILD_OF]->(g)" +
                    " return case when  exists((u)<-[:SHARED_WITH]-(r)) OR  exists((g)<-[:SHARED_WITH]-(r)) OR   " +
                    "exists((cg)<-[:SHARED_WITH]-(r)) then r  else NULL end as value";

            logger.debug("Create resource query {}", query);

            List<Record> records = this.neo4JConnector.searchNodes(exProps, query);

            List<GenericResource> genericResourceList = GenericResourceDeserializer.deserializeList(records);
            GenericResource genericResource = genericResourceList.get(0);
            if (genericResource.getPropertiesMap().containsKey("name")) {
                genericResource = genericResource.toBuilder()
                        .setResourceName(genericResource.getPropertiesMap().get("name")).build();
            } else if (genericResource.getPropertiesMap().containsKey("resourceName")) {
                genericResource = genericResource.toBuilder()
                        .setResourceName(genericResource.getPropertiesMap().get("resourceName")).build();
            }
            ResourceCreateResponse response = ResourceCreateResponse
                    .newBuilder()
                    .setResource(genericResource)
                    .build();
            responseObserver.onNext(response);
            responseObserver.onCompleted();


        } catch (Exception ex) {
            logger.error("Error occurred while creating resource {}", request.getResource().getResourceId(), ex);
            String msg = "Error occurred while creating resource" + ex.getMessage();
            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
        }

    }