From 571af0ac81091a083c937d329fbd1ce43966cc6a Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Thu, 8 Jul 2021 15:39:16 +0200
Subject: [PATCH] WIP: implement retrieve

---
 caosdb-proto                                  |   2 +-
 .../grpc/EntityTransactionServiceImpl.java    | 180 +++++++++++++++++-
 .../caosdb/server/transaction/Retrieve.java   |   4 +-
 .../server/transaction/Transaction.java       |   2 +-
 4 files changed, 180 insertions(+), 8 deletions(-)

diff --git a/caosdb-proto b/caosdb-proto
index dd9abe34..12f07226 160000
--- a/caosdb-proto
+++ b/caosdb-proto
@@ -1 +1 @@
-Subproject commit dd9abe3499367c4eded4774ade1acbc90ef048b3
+Subproject commit 12f072263c05208464b80c0124bde0396b100d86
diff --git a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
index 1ca75f9c..3d7df68a 100644
--- a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
+++ b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
@@ -1,20 +1,192 @@
 package org.caosdb.server.grpc;
 
 import io.grpc.stub.StreamObserver;
+import java.util.Iterator;
+import java.util.UUID;
+import org.apache.shiro.SecurityUtils;
+import org.caosdb.api.entity.v1alpha1.ByIdRequest;
 import org.caosdb.api.entity.v1alpha1.Entity;
+import org.caosdb.api.entity.v1alpha1.Entity.Builder;
 import org.caosdb.api.entity.v1alpha1.EntityTransactionServiceGrpc.EntityTransactionServiceImplBase;
+import org.caosdb.api.entity.v1alpha1.Parent;
 import org.caosdb.api.entity.v1alpha1.RetrieveRequest;
 import org.caosdb.api.entity.v1alpha1.RetrieveResponse;
+import org.caosdb.api.entity.v1alpha1.Version;
+import org.caosdb.server.entity.EntityInterface;
+import org.caosdb.server.entity.MagicTypes;
+import org.caosdb.server.entity.RetrieveEntity;
+import org.caosdb.server.entity.container.ParentContainer;
+import org.caosdb.server.entity.container.PropertyContainer;
+import org.caosdb.server.entity.container.RetrieveContainer;
+import org.caosdb.server.entity.wrapper.Property;
+import org.caosdb.server.transaction.Retrieve;
+import org.caosdb.server.utils.EntityStatus;
 
 public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBase {
 
+  public String getStringUnit(final EntityInterface entity) {
+    for (final Property p : entity.getProperties()) {
+      if (MagicTypes.UNIT.getId() == p.getId()) {
+        p.setEntityStatus(EntityStatus.IGNORE);
+        return p.getValue().toString();
+      }
+    }
+    return null;
+  }
+
+  public Entity convert(final EntityInterface from) {
+    final Builder builder = Entity.newBuilder();
+
+    if (from.getRole() != null) {
+      builder.setRole(from.getRole().toString());
+    }
+    if (from.hasId()) {
+      builder.setId(from.getId().toString());
+    }
+    if (from.hasVersion()) {
+      builder.setVersion(convert(from.getVersion()));
+    }
+    if (from.hasName()) {
+      builder.setName(from.getName());
+    }
+    if (from.hasDescription()) {
+      builder.setDescription(from.getDescription());
+    }
+    if (from.hasDatatype()) {
+      builder.setDatatype(from.getDatatype().getName());
+    }
+    if (from.hasUnit()) {
+      builder.setUnit(getStringUnit(from));
+    }
+    if (from.hasProperties()) {
+      builder.addAllProperties(convert(from.getProperties()));
+    }
+    if (from.hasParents()) {
+      builder.addAllParents(convert(from.getParents()));
+    }
+
+    return builder.build();
+  }
+
+  public Version convert(final org.caosdb.server.entity.Version from) {
+    final org.caosdb.api.entity.v1alpha1.Version.Builder builder = Version.newBuilder();
+
+    builder.setId(from.getId());
+    return builder.build();
+  }
+
+  public Parent convert(final org.caosdb.server.entity.wrapper.Parent from) {
+    final org.caosdb.api.entity.v1alpha1.Parent.Builder builder = Parent.newBuilder();
+    if (from.hasId()) {
+      builder.setId(from.getId().toString());
+    }
+    if (from.hasName()) {
+      builder.setName(from.getName());
+    }
+    if (from.hasDescription()) {
+      builder.setDescription(from.getDescription());
+    }
+
+    return builder.build();
+  }
+
+  public org.caosdb.api.entity.v1alpha1.Property convert(final Property from) {
+    final org.caosdb.api.entity.v1alpha1.Property.Builder builder =
+        org.caosdb.api.entity.v1alpha1.Property.newBuilder();
+
+    if (from.hasId()) {
+      builder.setId(from.getId().toString());
+    }
+    if (from.hasName()) {
+      builder.setName(from.getName());
+    }
+    if (from.hasDescription()) {
+      builder.setDescription(from.getDescription());
+    }
+    if (from.hasDatatype()) {
+      builder.setDatatype(from.getDatatype().getName());
+    }
+    if (from.hasUnit()) {
+      builder.setUnit(getStringUnit(from));
+    }
+    if (from.hasValue()) {
+      builder.setValue(from.getValue().toString());
+    }
+    builder.setImportance(from.getStatementStatus().toString());
+    return builder.build();
+  }
+
+  public Iterable<? extends org.caosdb.api.entity.v1alpha1.Property> convert(
+      final PropertyContainer from) {
+    final Iterator<org.caosdb.server.entity.wrapper.Property> iterator = from.iterator();
+    return () ->
+        new Iterator<>() {
+
+          @Override
+          public boolean hasNext() {
+            return iterator.hasNext();
+          }
+
+          @Override
+          public org.caosdb.api.entity.v1alpha1.Property next() {
+            return convert(iterator.next());
+          }
+        };
+  }
+
+  public Iterable<? extends Parent> convert(final ParentContainer from) {
+    final Iterator<org.caosdb.server.entity.wrapper.Parent> iterator = from.iterator();
+    return () ->
+        new Iterator<>() {
+
+          @Override
+          public boolean hasNext() {
+            return iterator.hasNext();
+          }
+
+          @Override
+          public Parent next() {
+            return convert(iterator.next());
+          }
+        };
+  }
+
+  public Integer getId(final ByIdRequest request) {
+    return Integer.parseInt(request.getId());
+  }
+
+  public Entity retrieve(final RetrieveRequest request) throws Exception {
+
+    final RetrieveContainer container =
+        new RetrieveContainer(SecurityUtils.getSubject(), getTimestamp(), getSRID(), null);
+    final RetrieveEntity entity = new RetrieveEntity(getId(request.getById()));
+    container.add(entity);
+
+    final Retrieve transaction = new Retrieve(container);
+    transaction.execute();
+    return convert(transaction.getContainer().get(0));
+  }
+
+  private String getSRID() {
+    return UUID.randomUUID().toString();
+  }
+
+  private Long getTimestamp() {
+    return System.currentTimeMillis();
+  }
+
   @Override
   public void retrieve(
       final RetrieveRequest request, final StreamObserver<RetrieveResponse> responseObserver) {
-    final Entity entity = Entity.newBuilder().setDescription("This is an entity").build();
-    final RetrieveResponse response = RetrieveResponse.newBuilder().setEntity(entity).build();
+    try {
+      final Entity entity = retrieve(request);
+      final RetrieveResponse response = RetrieveResponse.newBuilder().setEntity(entity).build();
+      responseObserver.onNext(response);
+      responseObserver.onCompleted();
 
-    responseObserver.onNext(response);
-    responseObserver.onCompleted();
+    } catch (final Exception e) {
+      e.printStackTrace();
+      responseObserver.onError(e);
+    }
   }
 }
diff --git a/src/main/java/org/caosdb/server/transaction/Retrieve.java b/src/main/java/org/caosdb/server/transaction/Retrieve.java
index 250df042..45647c1d 100644
--- a/src/main/java/org/caosdb/server/transaction/Retrieve.java
+++ b/src/main/java/org/caosdb/server/transaction/Retrieve.java
@@ -54,14 +54,14 @@ public class Retrieve extends Transaction<RetrieveContainer> {
     {
       final ResolveNames r = new ResolveNames();
       r.init(JobFailureSeverity.WARN, null, this);
-      ScheduledJob scheduledJob = getSchedule().add(r);
+      final ScheduledJob scheduledJob = getSchedule().add(r);
       getSchedule().runJob(scheduledJob);
     }
 
     {
       final RemoveDuplicates job = new RemoveDuplicates();
       job.init(JobFailureSeverity.ERROR, null, this);
-      ScheduledJob scheduledJob = getSchedule().add(job);
+      final ScheduledJob scheduledJob = getSchedule().add(job);
       getSchedule().runJob(scheduledJob);
     }
 
diff --git a/src/main/java/org/caosdb/server/transaction/Transaction.java b/src/main/java/org/caosdb/server/transaction/Transaction.java
index fe0b63f3..028afdd6 100644
--- a/src/main/java/org/caosdb/server/transaction/Transaction.java
+++ b/src/main/java/org/caosdb/server/transaction/Transaction.java
@@ -91,7 +91,7 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra
    *
    * <p>E.g. in {@link Retrieve} and {@link WriteTransaction}.
    */
-  protected void makeSchedule() throws Exception {
+  protected void makeSchedule() {
     // load flag jobs
     final Job loadContainerFlags =
         Job.getJob("LoadContainerFlagJobs", JobFailureSeverity.ERROR, null, this);
-- 
GitLab