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 f9c7704c8bd0ff00214b41d5793c8fdb15bcc61a..53d99edacbab696f352abc2d0081bd2a5a8e9081 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 390deedde211c0931eca1c3677ac5ff9c8ee9d8f..bc75a5b682c61448f324d96cc622cf012a174bbb 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()); - } - } } }