diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/DatabaseUtils.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/DatabaseUtils.java index 6528627d0e7080452827f8b70b87c34c78ac6c57..18c994e454a75bb17ea1e69777778d9592e18eab 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/DatabaseUtils.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/DatabaseUtils.java @@ -87,19 +87,19 @@ public class DatabaseUtils { private static void processPropertiesStage1( final List<Property> stage1Inserts, final Property p, final EntityInterface e) { - if (!p.isDescOverride() && !p.isNameOverride() && !p.isDatatypeOverride() && (!p.hasProperties() || hasUniquePropertyId(p, e)) && !(p.getDatatype() instanceof AbstractCollectionDatatype)) { stage1Inserts.add(p); + processSubPropertiesStage1(stage1Inserts, p); } else { Replacement r = new Replacement(p); stage1Inserts.add(r); stage1Inserts.add(r.replacement); + processSubPropertiesStage1(stage1Inserts, r); } - processSubPropertiesStage1(stage1Inserts, p); } public static void deriveStage2Inserts( @@ -107,21 +107,24 @@ public class DatabaseUtils { final List<Property> stage1Inserts, Deque<EntityID> replacementIds, EntityInterface entity) { + Map<String, EntityInterface> replacements = new HashMap<>(); for (final Property p : stage1Inserts) { if (p instanceof Replacement) { + if (!p.hasId() || p.getId().isTemporary()) { + EntityID replacementId = replacementIds.pop(); + replacements.put(replacementId.toString(), p); + ((Replacement) p).setReplacementId(replacementId); + } + } + } - EntityID replacementId = replacementIds.pop(); - ((Replacement) p).setReplacementId(replacementId); - - if (p.hasProperties()) { - for (Property subP : p.getProperties()) { - subP.setDomain(p); - stage2Inserts.add(subP); - } + for (final Property p : stage1Inserts) { + if (p.hasProperties()) { + if (p instanceof Replacement && ((Replacement) p).isState2Replacement()) { + stage2Inserts.add(((Replacement) p).replacement); } - } else { - if (p.hasProperties()) { - for (Property subP : p.getProperties()) { + for (Property subP : p.getProperties()) { + if (!subP.hasProperties()) { stage2Inserts.add(subP); } } @@ -142,9 +145,13 @@ public class DatabaseUtils { private static void processSubPropertiesStage1( final List<Property> stage1Inserts, final EntityInterface p) { for (final Property subP : p.getProperties()) { + subP.setDomain(p); if (subP.hasProperties()) { - stage1Inserts.add(new Replacement(subP)); - processSubPropertiesStage1(stage1Inserts, subP); + Replacement r = new Replacement(subP); + r.replacement.setDomain(p); + r.setStage2Replacement(true); + stage1Inserts.add(r); + processSubPropertiesStage1(stage1Inserts, r); } } } @@ -164,9 +171,10 @@ public class DatabaseUtils { if (desc != null) { p.desc = desc; } - final String type = bytes2UTF8(rs.getBytes("type_override")); - if (type != null) { - p.type = type; + final String type_id = bytes2UTF8(rs.getBytes("type_id_override")); + if (type_id != null) { + p.type_id = type_id; + p.type_name = bytes2UTF8(rs.getBytes("type_name_override")); } final String coll = bytes2UTF8(rs.getBytes("collection_override")); if (coll != null) { @@ -221,7 +229,8 @@ public class DatabaseUtils { final SparseEntity ret = parseNameRoleACL(rs); ret.id = rs.getString("EntityID"); ret.description = bytes2UTF8(rs.getBytes("EntityDesc")); - ret.datatype = bytes2UTF8(rs.getBytes("Datatype")); + ret.datatype_id = bytes2UTF8(rs.getBytes("DatatypeID")); + ret.datatype_name = bytes2UTF8(rs.getBytes("DatatypeName")); ret.collection = bytes2UTF8(rs.getBytes("Collection")); ret.filePath = bytes2UTF8(rs.getBytes("FilePath")); @@ -300,6 +309,14 @@ public class DatabaseUtils { if (pp.status.equals(ReplacementStatus.REPLACEMENT.name())) { replacements.put(pp.value, null); } + if (pp.subProperties != null) { + for (ProtoProperty subP : pp.subProperties) { + if (subP.status.equals(ReplacementStatus.REPLACEMENT.name())) { + + replacements.put(subP.value, null); + } + } + } } Iterator<ProtoProperty> iterator = properties.iterator(); while (iterator.hasNext()) { @@ -325,6 +342,13 @@ public class DatabaseUtils { if (pp.status.equals(ReplacementStatus.REPLACEMENT.name())) { replace(pp, replacements.get(pp.value), isHead); } + if (pp.subProperties != null) { + for (ProtoProperty subP : pp.subProperties) { + if (subP.status.equals(ReplacementStatus.REPLACEMENT.name())) { + replace(subP, replacements.get(subP.value), isHead); + } + } + } if (pp.collValues != null) { // sort pp.collValues.sort( @@ -358,7 +382,8 @@ public class DatabaseUtils { } pp.desc = replacement.desc; pp.name = replacement.name; - pp.type = replacement.type; + pp.type_id = replacement.type_id; + pp.type_name = replacement.type_name; pp.collection = replacement.collection; pp.value = replacement.value; pp.collValues = replacement.collValues; diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityDatatype.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityDatatype.java index 4260ae03e76eec7fab1e33957a00dedc2ef77e17..40c7a40754d823ce20580b671147c9cf21576af7 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityDatatype.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityDatatype.java @@ -62,7 +62,7 @@ public class MySQLInsertEntityDatatype extends MySQLTransaction prepareStatement(STMT_INSERT_ENTITY_DATATYPE); insertEntityDatatypeStmt.setString(1, entity.id); - insertEntityDatatypeStmt.setString(2, entity.datatype); + insertEntityDatatypeStmt.setString(2, entity.datatype_id); insertEntityDatatypeStmt.execute(); diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityProperties.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityProperties.java index cef624dce3a022043a2f86e56acd6ca589d493d1..d303acca337cf196ddd251666d71ccb2d21ee21c 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityProperties.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityProperties.java @@ -113,7 +113,7 @@ public class MySQLInsertEntityProperties extends MySQLTransaction stmt.setString(7, fp.status); stmt.setString(8, fp.name); stmt.setString(9, fp.desc); - stmt.setString(10, fp.type); + stmt.setString(10, fp.type_id); stmt.setString(11, fp.collection); stmt.setInt(12, fp.idx); stmt.execute(); @@ -207,7 +207,7 @@ public class MySQLInsertEntityProperties extends MySQLTransaction } if (property.isDatatypeOverride()) { if (property.getDatatype() instanceof AbstractCollectionDatatype) { - fp.type = + fp.type_id = ((AbstractCollectionDatatype) property.getDatatype()) .getDatatype() .getId() @@ -215,7 +215,7 @@ public class MySQLInsertEntityProperties extends MySQLTransaction fp.collection = ((AbstractCollectionDatatype) property.getDatatype()).getCollectionName(); } else { - fp.type = property.getDatatype().getId().toString(); + fp.type_id = property.getDatatype().getId().toString(); } } } diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java index 8d2af662f32d2f5a788d6470cf6cd526e15d0976..0957ab539e74b960e5e384ba395bef7156cbda97 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java @@ -69,8 +69,8 @@ public class MySQLUpdateSparseEntity extends MySQLTransaction implements UpdateS updateEntityStmt.setString(2, spe.name); updateEntityStmt.setString(3, spe.description); updateEntityStmt.setString(4, spe.role); - if (spe.datatype != null) { - updateEntityStmt.setString(5, spe.datatype); + if (spe.datatype_id != null) { + updateEntityStmt.setString(5, spe.datatype_id); } else { updateEntityStmt.setNull(5, Types.VARCHAR); } diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/Replacement.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/Replacement.java index 8ec47231d7d3644bc4c21a2b2125175a75f4bc97..fbe2f57e1cdc7868dac239313f7579011e23e868 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/Replacement.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/Replacement.java @@ -41,12 +41,18 @@ enum ReplacementStatus implements StatementStatusInterface { public class Replacement extends Property { public Property replacement; + private boolean state2Replacement; @Override public EntityID getId() { return replacement.getId(); } + @Override + public boolean hasId() { + return replacement.hasId(); + } + public void setReplacementId(EntityID id) { replacement.getId().link(id); } @@ -55,10 +61,18 @@ public class Replacement extends Property { super(p); replacement = new Property(new RetrieveEntity()); - replacement.setDomain(p.getDomainEntity()); + replacement.setDomain(p); replacement.setId(new EntityID()); replacement.setStatementStatus(ReplacementStatus.REPLACEMENT); replacement.setValue(new ReferenceValue(p.getId())); - replacement.setPIdx(0); + replacement.setPIdx(p.getPIdx()); + } + + public void setStage2Replacement(boolean t) { + this.state2Replacement = t; + } + + public boolean isState2Replacement() { + return state2Replacement; } } diff --git a/src/main/java/org/caosdb/server/database/proto/FlatProperty.java b/src/main/java/org/caosdb/server/database/proto/FlatProperty.java index b2123ce206ce01acee3ef70b1c22151b94f59bd9..ecb49147474e156ea3f560edc3e039f8181dd0ca 100644 --- a/src/main/java/org/caosdb/server/database/proto/FlatProperty.java +++ b/src/main/java/org/caosdb/server/database/proto/FlatProperty.java @@ -33,6 +33,7 @@ public class FlatProperty implements Serializable { public Integer idx = null; public String name = null; public String desc = null; - public String type = null; + public String type_id = null; + public String type_name = null; public String collection = null; } diff --git a/src/main/java/org/caosdb/server/database/proto/SparseEntity.java b/src/main/java/org/caosdb/server/database/proto/SparseEntity.java index d2292c58825ac6807e24f3ad3d086b29dd8a6e7e..f4ff2d41c46ceec3b408b980df906fdc8d10553f 100644 --- a/src/main/java/org/caosdb/server/database/proto/SparseEntity.java +++ b/src/main/java/org/caosdb/server/database/proto/SparseEntity.java @@ -33,7 +33,8 @@ public class SparseEntity extends VerySparseEntity { private static final long serialVersionUID = -560259468853956476L; public String collection = null; - public String datatype = null; + public String datatype_id = null; + public String datatype_name = null; public String fileHash = null; public String filePath = null; public Long fileSize = null; @@ -48,7 +49,8 @@ public class SparseEntity extends VerySparseEntity { .append(this.description) .append(this.role) .append(this.collection) - .append(this.datatype) + .append(this.datatype_id) + .append(this.datatype_name) .append(this.fileHash) .append(this.filePath) .append(this.fileSize) diff --git a/src/main/java/org/caosdb/server/datatype/AbstractCollectionDatatype.java b/src/main/java/org/caosdb/server/datatype/AbstractCollectionDatatype.java index cbd822ee10a24127483fae9adff440404a243771..1d816947d642e2ccb6f9867ced4478ea9a59c2d3 100644 --- a/src/main/java/org/caosdb/server/datatype/AbstractCollectionDatatype.java +++ b/src/main/java/org/caosdb/server/datatype/AbstractCollectionDatatype.java @@ -25,6 +25,7 @@ package org.caosdb.server.datatype; import java.util.HashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.caosdb.server.entity.EntityID; public abstract class AbstractCollectionDatatype extends AbstractDatatype { @@ -50,7 +51,7 @@ public abstract class AbstractCollectionDatatype extends AbstractDatatype { if (matcher.matches()) { final String col = matcher.group(1).toUpperCase(); final String type = matcher.group(2); - return collectionDatatypeFactory(col, type); + return collectionDatatypeFactory(col, null, type); } return null; } @@ -73,7 +74,9 @@ public abstract class AbstractCollectionDatatype extends AbstractDatatype { } public static AbstractCollectionDatatype collectionDatatypeFactory( - final String col, final String dt) { - return instances.get(col).createDataType(AbstractDatatype.datatypeFactory(dt)); + final String col, final String id, String name) { + return instances + .get(col) + .createDataType(AbstractDatatype.datatypeFactory(new EntityID(id), name)); } } diff --git a/src/main/java/org/caosdb/server/datatype/AbstractDatatype.java b/src/main/java/org/caosdb/server/datatype/AbstractDatatype.java index 583145fb19361adf08ae81bf8c9e338d53ad908f..795ac56dbb1df24f38964edc5eac47e491199c37 100644 --- a/src/main/java/org/caosdb/server/datatype/AbstractDatatype.java +++ b/src/main/java/org/caosdb/server/datatype/AbstractDatatype.java @@ -65,6 +65,24 @@ public abstract class AbstractDatatype { return ret; } + public static AbstractDatatype datatypeFactory(final EntityID id, String name) { + AbstractDatatype dt; + if (id.hasId()) { + dt = datatypeFactory(id); + + if (name != null) { + dt.setName(name); + } + } else { + dt = AbstractDatatype.datatypeFactory(name); + } + return dt; + } + + protected void setName(String name) { + this.name = name; + } + public static AbstractDatatype datatypeFactory(final EntityID datatype) { for (final AbstractDatatype abstractDatatype : instances.values()) { if (abstractDatatype.getId().equals(datatype)) { @@ -121,6 +139,6 @@ public abstract class AbstractDatatype { @Override public String toString() { - return "DT." + getName(); + return "DT." + (getName() != null ? getName() : getId().toString()); } } diff --git a/src/main/java/org/caosdb/server/datatype/ReferenceDatatype2.java b/src/main/java/org/caosdb/server/datatype/ReferenceDatatype2.java index 503e4679335381da6c08b746af8ed14665bd409b..cbc080b92b1220b21a36da43aecfd9434515420f 100644 --- a/src/main/java/org/caosdb/server/datatype/ReferenceDatatype2.java +++ b/src/main/java/org/caosdb/server/datatype/ReferenceDatatype2.java @@ -30,6 +30,10 @@ public class ReferenceDatatype2 extends ReferenceDatatype { private final ReferenceValue refid; + public ReferenceDatatype2(final EntityID entity) { + refid = ReferenceValue.parseReference(entity); + } + public ReferenceDatatype2(final Object entity) { try { this.refid = ReferenceValue.parseReference(entity); @@ -56,6 +60,11 @@ public class ReferenceDatatype2 extends ReferenceDatatype { return this.refid.getName(); } + @Override + protected void setName(String name) { + this.refid.setName(name); + } + @Override public boolean equals(final Object obj) { if (obj instanceof ReferenceDatatype2) { diff --git a/src/main/java/org/caosdb/server/datatype/ReferenceValue.java b/src/main/java/org/caosdb/server/datatype/ReferenceValue.java index e07b1b807c3226cb5bc074aeafd4d8c712ce2ec1..1a1c33ffe4ebafca0ca6e3011740a2d789750671 100644 --- a/src/main/java/org/caosdb/server/datatype/ReferenceValue.java +++ b/src/main/java/org/caosdb/server/datatype/ReferenceValue.java @@ -55,6 +55,10 @@ public class ReferenceValue implements SingleValue { private String version = null; private boolean versioned = false; + public static ReferenceValue parseReference(final EntityID reference) { + return new ReferenceValue(reference); + } + public static ReferenceValue parseReference(final Object reference) throws Message { if (reference == null) { return null; @@ -70,11 +74,7 @@ public class ReferenceValue implements SingleValue { } else if (reference instanceof CollectionValue) { throw ServerMessages.DATA_TYPE_DOES_NOT_ACCEPT_COLLECTION_VALUES; } else { - try { - return new ReferenceValue(reference.toString()); - } catch (final NumberFormatException e) { - return new ReferenceValue(reference.toString()); - } + return new ReferenceValue(reference.toString()); } } @@ -242,4 +242,8 @@ public class ReferenceValue implements SingleValue { } return false; } + + public void setName(String name) { + this.name = name; + } } diff --git a/src/main/java/org/caosdb/server/entity/Entity.java b/src/main/java/org/caosdb/server/entity/Entity.java index b27eaa28e5111d783d1d8d3779f36a1938898173..8179375d8f4671f721969e0103a427077ca8e027 100644 --- a/src/main/java/org/caosdb/server/entity/Entity.java +++ b/src/main/java/org/caosdb/server/entity/Entity.java @@ -200,7 +200,6 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa } else { setDatatype(AbstractDatatype.datatypeFactory(datatype)); } - notifyObservers(DATATYPE_CHANGED_EVENT); } @Override @@ -367,9 +366,12 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa if (hasDatatype()) { if (getDatatype() instanceof AbstractCollectionDatatype) { ret.collection = ((AbstractCollectionDatatype) getDatatype()).getCollectionName(); - ret.datatype = ((AbstractCollectionDatatype) getDatatype()).getDatatype().getName(); + ret.datatype_id = + ((AbstractCollectionDatatype) getDatatype()).getDatatype().getId().toString(); + ret.datatype_name = ((AbstractCollectionDatatype) getDatatype()).getDatatype().getName(); } else { - ret.datatype = getDatatype().getName(); + ret.datatype_id = getDatatype().getId().toString(); + ret.datatype_name = getDatatype().getName(); } } if (hasFileProperties()) { @@ -728,7 +730,13 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa // Parse sub elements which represent PROPERTIES of this // record. - final Property property = new Property(new WritableEntity(pe, Role.Property)); + WritableEntity wrapped; + if (this instanceof InsertEntity) { + wrapped = new InsertEntity(pe, Role.Property); + } else { + wrapped = new UpdateEntity(pe, Role.Property); + } + final Property property = new Property(wrapped); // Ignore parents of properties property.getParents().clear(); @@ -737,7 +745,13 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa } else if (pe.getName().equalsIgnoreCase("Parent")) { // Parse sub elements which represent PARENTS of this // record. - final Parent parent = new Parent(new WritableEntity(pe, null)); + WritableEntity wrapped; + if (this instanceof InsertEntity) { + wrapped = new InsertEntity(pe, null); + } else { + wrapped = new UpdateEntity(pe, null); + } + final Parent parent = new Parent(wrapped); addParent(parent); } else if (pe.getName().equalsIgnoreCase("EntityACL")) { // Parse and concatenate EntityACL @@ -953,18 +967,14 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa if (!isDescOverride()) { setDescription(spe.description); } - if (!isDatatypeOverride()) { - final String dt = spe.datatype; - final String col = spe.collection; - - if (dt != null - && !dt.equalsIgnoreCase("null") - && (!hasDatatype() || !dt.equalsIgnoreCase(getDatatype().toString()))) { - if (col != null && !col.equalsIgnoreCase("null")) { - this.setDatatype(AbstractCollectionDatatype.collectionDatatypeFactory(col, dt)); - } else { - this.setDatatype(dt); - } + if (!isDatatypeOverride() && spe.datatype_id != null) { + if (spe.collection != null) { + this.setDatatype( + AbstractCollectionDatatype.collectionDatatypeFactory( + spe.collection, spe.datatype_id, spe.datatype_name)); + } else { + this.setDatatype( + AbstractDatatype.datatypeFactory(new EntityID(spe.datatype_id), spe.datatype_name)); } } diff --git a/src/main/java/org/caosdb/server/entity/EntityID.java b/src/main/java/org/caosdb/server/entity/EntityID.java index 9f61127db2969578300fbe2f12091c0f9f258d90..5f6c4667bc3eba056a036d718a350aa032bcb8f0 100644 --- a/src/main/java/org/caosdb/server/entity/EntityID.java +++ b/src/main/java/org/caosdb/server/entity/EntityID.java @@ -59,7 +59,7 @@ public class EntityID implements Serializable { return this.id; } - boolean hasId() { + public boolean hasId() { return this.id != null || this.link != null && this.link.hasId(); } diff --git a/src/main/java/org/caosdb/server/entity/WritableEntity.java b/src/main/java/org/caosdb/server/entity/WritableEntity.java index 6c967cc4e3404c7940066dc123bf805785a6e4c3..b17a54b9a68ebcdf21d8e67b9c31b0f7d59d02e8 100644 --- a/src/main/java/org/caosdb/server/entity/WritableEntity.java +++ b/src/main/java/org/caosdb/server/entity/WritableEntity.java @@ -23,7 +23,7 @@ package org.caosdb.server.entity; import org.jdom2.Element; -public class WritableEntity extends Entity { +public abstract class WritableEntity extends Entity { public WritableEntity(final Element element, Role role) { super(); diff --git a/src/main/java/org/caosdb/server/entity/wrapper/Property.java b/src/main/java/org/caosdb/server/entity/wrapper/Property.java index 9268d7f3cb327a70a4cca872657d72e2779fc344..4d2b8e25b8e7518822b13c08ef04623e74d37a29 100644 --- a/src/main/java/org/caosdb/server/entity/wrapper/Property.java +++ b/src/main/java/org/caosdb/server/entity/wrapper/Property.java @@ -27,6 +27,7 @@ import org.apache.shiro.authz.Permission; import org.apache.shiro.subject.Subject; import org.caosdb.server.database.proto.ProtoProperty; import org.caosdb.server.datatype.AbstractCollectionDatatype; +import org.caosdb.server.datatype.AbstractDatatype; import org.caosdb.server.datatype.CollectionValue; import org.caosdb.server.datatype.GenericValue; import org.caosdb.server.entity.EntityID; @@ -86,12 +87,13 @@ public class Property extends EntityWrapper { setDescription(pp.desc); setDescOverride(true); } - if (pp.type != null) { + if (pp.type_id != null) { if (pp.collection != null) { this.setDatatype( - AbstractCollectionDatatype.collectionDatatypeFactory(pp.collection, pp.type)); + AbstractCollectionDatatype.collectionDatatypeFactory( + pp.collection, pp.type_id, pp.type_name)); } else { - this.setDatatype(pp.type); + this.setDatatype(AbstractDatatype.datatypeFactory(new EntityID(pp.type_id), pp.type_name)); } setDatatypeOverride(true); } diff --git a/src/main/java/org/caosdb/server/jobs/JobConfig.java b/src/main/java/org/caosdb/server/jobs/JobConfig.java index b2bb0d4a1b13a98dd68893c9f0cad7bc8192edba..83300e00d4be7c463f4b92f4fdbb521c17739a7b 100644 --- a/src/main/java/org/caosdb/server/jobs/JobConfig.java +++ b/src/main/java/org/caosdb/server/jobs/JobConfig.java @@ -36,7 +36,7 @@ import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.RetrieveEntity; import org.caosdb.server.entity.container.TransactionContainer; -import org.caosdb.server.entity.wrapper.Property; +import org.caosdb.server.entity.wrapper.EntityWrapper; import org.caosdb.server.jobs.core.JobFailureSeverity; import org.caosdb.server.transaction.Transaction; import org.caosdb.server.utils.ConfigurationException; @@ -173,8 +173,8 @@ public class JobConfig { final EntityInterface target, final Transaction<? extends TransactionContainer> transaction) { String transactionType; - if (target instanceof Property) { - transactionType = getTransactionType(((Property) target).getDomainEntity()); + if (target instanceof EntityWrapper) { + transactionType = getTransactionType(((EntityWrapper) target).getWrapped()); } else { transactionType = getTransactionType(target); } 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 b3a06ca09d7870da843a2f3ad295e019ab683c12..4a43d4a2985ad3607bb5cb9b2789acd085cc31e0 100644 --- a/src/main/java/org/caosdb/server/jobs/core/CheckDatatypePresent.java +++ b/src/main/java/org/caosdb/server/jobs/core/CheckDatatypePresent.java @@ -28,6 +28,7 @@ import org.caosdb.server.database.exceptions.EntityWasNotUniqueException; import org.caosdb.server.datatype.AbstractCollectionDatatype; import org.caosdb.server.datatype.AbstractDatatype; import org.caosdb.server.datatype.ReferenceDatatype2; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.InsertEntity; import org.caosdb.server.entity.Message; @@ -115,7 +116,11 @@ public final class CheckDatatypePresent extends EntityJob { } private void checkReference2(final ReferenceDatatype2 datatype) throws Message { - EntityInterface datatypeEntity = resolve(datatype.getId(), datatype.getName(), (String) null); + EntityID datatypeId = datatype.getId(); + if (datatypeId == null) { + datatypeId = new EntityID(datatype.getName()); + } + EntityInterface datatypeEntity = resolve(datatypeId, datatype.getName(), (String) null); if (datatypeEntity == null) { throw ServerMessages.UNKNOWN_DATATYPE; diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckRefidValid.java b/src/main/java/org/caosdb/server/jobs/core/CheckRefidValid.java index 86e95542aaa0e6f373521149d9f7376f09d3972c..78d257eadf4fa1de4331bd9bf38855ca04ccdd9e 100644 --- a/src/main/java/org/caosdb/server/jobs/core/CheckRefidValid.java +++ b/src/main/java/org/caosdb/server/jobs/core/CheckRefidValid.java @@ -28,6 +28,7 @@ import org.caosdb.server.datatype.CollectionValue; import org.caosdb.server.datatype.IndexedSingleValue; import org.caosdb.server.datatype.ReferenceValue; import org.caosdb.server.entity.Entity; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.Message; import org.caosdb.server.jobs.EntityJob; @@ -80,7 +81,11 @@ public class CheckRefidValid extends EntityJob implements Observer { } private void checkRefValue(final ReferenceValue ref) throws Message { - EntityInterface referencedEntity = resolve(ref.getId(), ref.getName(), ref.getVersion()); + EntityID refId = ref.getId(); + if (refId == null) { + refId = new EntityID(ref.getName()); + } + EntityInterface referencedEntity = resolve(refId, ref.getName(), ref.getVersion()); if (referencedEntity == null) { throw ServerMessages.REFERENCED_ENTITY_DOES_NOT_EXIST; } diff --git a/src/main/java/org/caosdb/server/transaction/Transaction.java b/src/main/java/org/caosdb/server/transaction/Transaction.java index 69dde0ea3602a650e52dadcdbc0107ff7cf12ded..b460085db94864e9936a1b7d0e8c12e74555bb1f 100644 --- a/src/main/java/org/caosdb/server/transaction/Transaction.java +++ b/src/main/java/org/caosdb/server/transaction/Transaction.java @@ -197,7 +197,7 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra this.schedule.addAll(loadJobs); // additionally load datatype job - if (e.hasValue()) { + if (e.hasValue() || e.hasDatatype()) { this.schedule.add(new CheckDatatypePresent().init(JobFailureSeverity.ERROR, e, this)); } diff --git a/src/main/java/org/caosdb/server/transaction/WriteTransaction.java b/src/main/java/org/caosdb/server/transaction/WriteTransaction.java index b780d3d68f20cb6973c902cbe92fbd4fd46d51c1..939d0bf6473611cb1a0bb1ee28bfd91a568babd3 100644 --- a/src/main/java/org/caosdb/server/transaction/WriteTransaction.java +++ b/src/main/java/org/caosdb/server/transaction/WriteTransaction.java @@ -398,14 +398,17 @@ public class WriteTransaction extends Transaction<WritableContainer> } // new datatype? - if (newEntity.hasDatatype() + if ((newEntity.hasDatatype() && oldEntity.hasDatatype() - && !newEntity.getDatatype().equals(oldEntity.getDatatype()) + && !newEntity.getDatatype().equals(oldEntity.getDatatype())) || newEntity.hasDatatype() ^ oldEntity.hasDatatype()) { needPermissions.add(EntityPermission.UPDATE_DATA_TYPE); updatetable = true; } else { - newEntity.setDatatypeOverride(oldEntity.isDatatypeOverride()); + if (oldEntity.hasDatatype()) { + newEntity.setDatatypeOverride(oldEntity.isDatatypeOverride()); + newEntity.setDatatype(oldEntity.getDatatype()); + } } // entity role diff --git a/src/test/java/org/caosdb/server/caching/TestCaching.java b/src/test/java/org/caosdb/server/caching/TestCaching.java index 8ff05660afde6e67d65e94011b662f09bdda9294..90b642f17070e2f67312d533331ee7929117b447 100644 --- a/src/test/java/org/caosdb/server/caching/TestCaching.java +++ b/src/test/java/org/caosdb/server/caching/TestCaching.java @@ -26,6 +26,7 @@ import java.io.IOException; import org.apache.commons.jcs.JCS; import org.apache.commons.jcs.access.CacheAccess; import org.caosdb.server.CaosDBServer; +import org.caosdb.server.ServerProperties; import org.caosdb.server.accessControl.Pam; import org.caosdb.server.database.backend.transaction.RetrieveProperties; import org.junit.jupiter.api.BeforeAll; @@ -36,6 +37,7 @@ public class TestCaching { @BeforeAll public static void init() throws IOException { CaosDBServer.initServerProperties(); + CaosDBServer.getServerProperties().setProperty(ServerProperties.KEY_CACHE_DISABLE, "FALSE"); CaosDBServer.initCaching(); JCSCacheHelper.init(); } diff --git a/src/test/java/org/caosdb/server/database/backend/implementation/MySQL/InsertTest.java b/src/test/java/org/caosdb/server/database/backend/implementation/MySQL/InsertTest.java index feee1360bf7fa0ae865422b31d8a2ad2bcf64ebe..e8749510b906a12c97daed5bf3971f826d26d477 100644 --- a/src/test/java/org/caosdb/server/database/backend/implementation/MySQL/InsertTest.java +++ b/src/test/java/org/caosdb/server/database/backend/implementation/MySQL/InsertTest.java @@ -174,20 +174,23 @@ public class InsertTest { assertEquals("V3", ((SingleValue) stage2Inserts.get(0).getValue()).toDatabaseString()); assertEquals(new EntityID("2"), stage2Inserts.get(0).getDomain()); - assertEquals(new EntityID("5"), stage2Inserts.get(1).getId()); - assertEquals("V5", ((SingleValue) stage2Inserts.get(1).getValue()).toDatabaseString()); + assertEquals(new EntityID("-1"), stage2Inserts.get(1).getId()); + assertEquals(ReplacementStatus.REPLACEMENT, stage2Inserts.get(1).getStatementStatus()); + assertEquals(new EntityID("5"), ((ReferenceValue) stage2Inserts.get(1).getValue()).getId()); assertEquals(new EntityID("4"), stage2Inserts.get(1).getDomain()); assertEquals(new EntityID("6"), stage2Inserts.get(2).getId()); assertEquals("V6", ((SingleValue) stage2Inserts.get(2).getValue()).toDatabaseString()); assertEquals(new EntityID("-1"), stage2Inserts.get(2).getDomain()); - assertEquals(new EntityID("8"), stage2Inserts.get(3).getId()); - assertEquals("V8", ((SingleValue) stage2Inserts.get(3).getValue()).toDatabaseString()); + assertEquals(new EntityID("-2"), stage2Inserts.get(3).getId()); + assertEquals(ReplacementStatus.REPLACEMENT, stage2Inserts.get(3).getStatementStatus()); + assertEquals(new EntityID("8"), ((ReferenceValue) stage2Inserts.get(3).getValue()).getId()); assertEquals(new EntityID("7"), stage2Inserts.get(3).getDomain()); - assertEquals(new EntityID("9"), stage2Inserts.get(4).getId()); - assertEquals("V9", ((SingleValue) stage2Inserts.get(4).getValue()).toDatabaseString()); + assertEquals(new EntityID("-3"), stage2Inserts.get(4).getId()); + assertEquals(ReplacementStatus.REPLACEMENT, stage2Inserts.get(4).getStatementStatus()); + assertEquals(new EntityID("9"), ((ReferenceValue) stage2Inserts.get(4).getValue()).getId()); assertEquals(new EntityID("-2"), stage2Inserts.get(4).getDomain()); assertEquals(new EntityID("10"), stage2Inserts.get(5).getId());