From b426cbea32dc1186257425b4df257bc078ed8989 Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Mon, 2 Aug 2021 12:27:07 +0200
Subject: [PATCH] WIP: fix server 154

---
 .../jobs/core/CheckDatatypePresent.java       | 38 +++++++++++++------
 .../server/jobs/core/CheckPropValid.java      |  9 -----
 2 files changed, 26 insertions(+), 21 deletions(-)

diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckDatatypePresent.java b/src/main/java/org/caosdb/server/jobs/core/CheckDatatypePresent.java
index f9c7704c..53d99eda 100644
--- a/src/main/java/org/caosdb/server/jobs/core/CheckDatatypePresent.java
+++ b/src/main/java/org/caosdb/server/jobs/core/CheckDatatypePresent.java
@@ -23,6 +23,7 @@
 package org.caosdb.server.jobs.core;
 
 import java.util.List;
+import java.util.Objects;
 import org.caosdb.server.database.exceptions.EntityDoesNotExistException;
 import org.caosdb.server.database.exceptions.EntityWasNotUniqueException;
 import org.caosdb.server.datatype.AbstractCollectionDatatype;
@@ -153,28 +154,41 @@ public final class CheckDatatypePresent extends EntityJob {
     checkPermission(datatype, EntityPermission.USE_AS_DATA_TYPE);
   }
 
+  private void checkIfOverride(final EntityInterface foreign) {
+    if (foreign.hasDatatype() && !foreign.getDatatype().equals(getEntity().getDatatype())) {
+      // is override!
+      getEntity().setDatatypeOverride(true);
+    } else if (!foreign.hasDatatype()) {
+      // non-matching reference datatype
+      if (getEntity().getDatatype() instanceof ReferenceDatatype2) {
+        final ReferenceDatatype2 datatype = (ReferenceDatatype2) getEntity().getDatatype();
+        if (!Objects.equals(foreign.getId(), datatype.getId())
+            && !(Objects.equals(foreign.getName(), datatype.getName())
+                && datatype.getId() == null)) {
+          getEntity().setDatatypeOverride(true);
+        }
+      } else {
+        getEntity().setDatatypeOverride(true);
+      }
+    }
+  }
+
   private void checkIfOverride() throws Message {
     if (getEntity().hasId() && getEntity().getId() > 0) {
       // get data type from database
       final EntityInterface foreign = retrieveValidSparseEntityById(getEntity().getId(), null);
+      checkIfOverride(foreign);
 
-      if (foreign.hasDatatype() && !foreign.getDatatype().equals(getEntity().getDatatype())) {
-        // is override!
-        getEntity().setDatatypeOverride(true);
-      }
     } else {
       // get data type from container
-      EntityInterface abstractProperty = null;
+      EntityInterface foreign = null;
       if (getEntity().hasId()) {
-        abstractProperty = getEntityById(getEntity().getId());
+        foreign = getEntityById(getEntity().getId());
       } else if (getEntity().hasName()) {
-        abstractProperty = getEntityByName(getEntity().getName());
+        foreign = getEntityByName(getEntity().getName());
       }
-      if (abstractProperty != null && abstractProperty.hasDatatype()) {
-        if (!getEntity().getDatatype().equals(abstractProperty.getDatatype())) {
-          // is override!
-          getEntity().setDatatypeOverride(true);
-        }
+      if (foreign != null) {
+        checkIfOverride(foreign);
       }
     }
   }
diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckPropValid.java b/src/main/java/org/caosdb/server/jobs/core/CheckPropValid.java
index 390deedd..bc75a5b6 100644
--- a/src/main/java/org/caosdb/server/jobs/core/CheckPropValid.java
+++ b/src/main/java/org/caosdb/server/jobs/core/CheckPropValid.java
@@ -167,14 +167,5 @@ public class CheckPropValid extends EntityJob {
         child.setDescription(parent.getDescription());
       }
     }
-    if (!Objects.equal(child.getDatatype(), parent.getDatatype())) {
-      if (child.hasDatatype()
-          // FIXME why this?
-          && (!child.getDatatype().toString().equals("REFERENCE") || parent.hasDatatype())) {
-        child.setDatatypeOverride(true);
-      } else {
-        child.setDatatype(parent.getDatatype());
-      }
-    }
   }
 }
-- 
GitLab