From 7dea663fc5a874e5d3ff299a083fa56aca5416e6 Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Wed, 2 Aug 2023 12:14:39 +0200
Subject: [PATCH] BUG: fix NullPointerException when value is NULL in grpc
 serialization

---
 src/main/java/org/caosdb/server/entity/Entity.java         | 7 ++++---
 .../org/caosdb/server/grpc/CaosDBToGrpcConverters.java     | 7 +++++--
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/main/java/org/caosdb/server/entity/Entity.java b/src/main/java/org/caosdb/server/entity/Entity.java
index 48367508..e1acfbdc 100644
--- a/src/main/java/org/caosdb/server/entity/Entity.java
+++ b/src/main/java/org/caosdb/server/entity/Entity.java
@@ -609,10 +609,11 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
 
   @Override
   public void parseValue() throws Message {
-    if (!this.isParsed) {
-      this.isParsed = true;
-      setValue(getDatatype().parseValue(getValue()));
+    if (this.isParsed) {
+      return;
     }
+    this.isParsed = true;
+    if (getValue() != null) setValue(getDatatype().parseValue(getValue()));
   }
 
   @Override
diff --git a/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java b/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java
index 6fef5907..b4605c82 100644
--- a/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java
+++ b/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java
@@ -298,6 +298,8 @@ public class CaosDBToGrpcConverters {
 
     } else if (value instanceof GenericValue) {
       return convertGenericValue((GenericValue) value);
+    } else if (value == null) {
+      return ScalarValue.newBuilder().setSpecialValue(SpecialValue.SPECIAL_VALUE_UNSPECIFIED);
     }
     return null;
   }
@@ -735,8 +737,9 @@ public class CaosDBToGrpcConverters {
                 result = getSelectedValue(s.getSubselection(), referenced_entity);
               } else if (v instanceof CollectionValue) {
                 for (Value i : (CollectionValue) v) {
-                  if (i instanceof ReferenceValue) {
-                    EntityInterface referenced_entity = ((ReferenceValue) i).getEntity();
+                  Value wrapped = ((IndexedSingleValue) i).getWrapped();
+                  if (wrapped instanceof ReferenceValue) {
+                    EntityInterface referenced_entity = ((ReferenceValue) wrapped).getEntity();
                     result = getSelectedValue(s.getSubselection(), referenced_entity);
                     results.add(result);
                   } else {
-- 
GitLab