diff --git a/src/main/java/org/caosdb/server/FileSystem.java b/src/main/java/org/caosdb/server/FileSystem.java index 67587f3da7930dd2cbf3e76d3ed06f19508efef7..c05314655b8e1112e60576cc8c96b9f6b30ce2fa 100644 --- a/src/main/java/org/caosdb/server/FileSystem.java +++ b/src/main/java/org/caosdb/server/FileSystem.java @@ -39,6 +39,7 @@ import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.transaction.GetFileRecordByPath; import org.caosdb.server.database.exceptions.EntityDoesNotExistException; import org.caosdb.server.database.misc.TransactionBenchmark; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.FileProperties; import org.caosdb.server.entity.Message; @@ -332,7 +333,7 @@ public class FileSystem { // this is usually the case when target is a directory } if (t.getEntity() != null) { - final Integer foreign = t.getId(); + final EntityID foreign = t.getId(); if (foreign != null && foreign.equals(entity.getId())) { // entity already owns this path return true; diff --git a/src/main/java/org/caosdb/server/database/DatabaseUtils.java b/src/main/java/org/caosdb/server/database/DatabaseUtils.java index 4f6a58a4fc50fa91170fad6139384bccb413fa81..47e8a9afe4fb2d81d40e71aff01c81ea314a26ca 100644 --- a/src/main/java/org/caosdb/server/database/DatabaseUtils.java +++ b/src/main/java/org/caosdb/server/database/DatabaseUtils.java @@ -28,6 +28,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; import org.caosdb.server.database.proto.FlatProperty; import org.caosdb.server.database.proto.ProtoProperty; import org.caosdb.server.database.proto.SparseEntity; @@ -37,8 +38,10 @@ import org.caosdb.server.datatype.CollectionValue; import org.caosdb.server.datatype.IndexedSingleValue; import org.caosdb.server.datatype.ReferenceValue; import org.caosdb.server.datatype.SingleValue; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.Message; +import org.caosdb.server.entity.RetrieveEntity; import org.caosdb.server.entity.Role; import org.caosdb.server.entity.StatementStatus; import org.caosdb.server.entity.wrapper.Domain; @@ -72,8 +75,7 @@ public class DatabaseUtils { final List<EntityInterface> stage1Inserts, final EntityInterface e) { // entity value if (e.hasValue()) { - final Property p = new Property(); - p.setId(e.getId()); + final Property p = new Property(e); p.setStatementStatus(StatementStatus.FIX); p.setPIdx(0); p.setDatatype(e.getDatatype()); @@ -116,7 +118,7 @@ public class DatabaseUtils { } private static boolean hasUniquePropertyId(final EntityInterface p, final EntityInterface e) { - final Integer id = p.getId(); + final EntityID id = p.getId(); for (final EntityInterface p2 : e.getProperties()) { if (Objects.equal(p2.getId(), id) && p2 != p) { return false; @@ -189,7 +191,7 @@ public class DatabaseUtils { * * <p>Never returns null. */ - public static SparseEntity parseNameRoleACL(ResultSet rs) throws SQLException { + public static SparseEntity parseNameRoleACL(final ResultSet rs) throws SQLException { final SparseEntity ret = new SparseEntity(); ret.role = bytes2UTF8(rs.getBytes("EntityRole")); ret.name = bytes2UTF8(rs.getBytes("EntityName")); @@ -206,7 +208,7 @@ public class DatabaseUtils { * <p>Never returns null. */ public static SparseEntity parseEntityResultSet(final ResultSet rs) throws SQLException { - SparseEntity ret = parseNameRoleACL(rs); + final SparseEntity ret = parseNameRoleACL(rs); ret.id = rs.getInt("EntityID"); ret.description = bytes2UTF8(rs.getBytes("EntityDesc")); ret.datatype = bytes2UTF8(rs.getBytes("Datatype")); @@ -237,7 +239,7 @@ public class DatabaseUtils { public static <K extends EntityInterface> K parseEntityFromVerySparseEntity( final K entity, final VerySparseEntity vse) { - entity.setId(vse.id); + entity.setId(new EntityID(vse.id)); entity.setName(vse.name); entity.setRole(vse.role); entity.setDescription(vse.description); @@ -247,8 +249,7 @@ public class DatabaseUtils { public static void parseParentsFromVerySparseEntity( final EntityInterface entity, final List<VerySparseEntity> pars) { for (final VerySparseEntity vsp : pars) { - final Parent p = new Parent(); - p.setId(vsp.id); + final Parent p = new Parent(new RetrieveEntity(new EntityID(vsp.id))); p.setName(vsp.name); p.setDescription(vsp.description); entity.addParent(p); @@ -256,7 +257,7 @@ public class DatabaseUtils { } private static void replace( - final Property p, final HashMap<Integer, Property> domainMap, boolean isHead) { + final Property p, final Map<EntityID, Property> domainMap, final boolean isHead) { // ... find the corresponding domain and replace it ReferenceValue ref; try { @@ -264,7 +265,7 @@ public class DatabaseUtils { } catch (final Message e) { throw new RuntimeException("This should never happen."); } - final EntityInterface replacement = domainMap.get((ref.getId())); + final EntityInterface replacement = domainMap.get(ref.getId()); if (replacement == null) { if (isHead) { throw new NullPointerException("Replacement was null"); @@ -297,7 +298,7 @@ public class DatabaseUtils { final EntityInterface e, final List<Property> protoProperties) { // here we will store every domain we can find and we will index it by // its id. - final HashMap<Integer, Property> domainMap = new HashMap<Integer, Property>(); + final Map<EntityID, Property> domainMap = new HashMap<>(); // loop over all properties and collect the domains for (final Property p : protoProperties) { @@ -323,7 +324,7 @@ public class DatabaseUtils { } // loop over all properties - boolean isHead = + final boolean isHead = e.getVersion().getSuccessors() == null || e.getVersion().getSuccessors().isEmpty(); for (final Property p : protoProperties) { @@ -368,7 +369,7 @@ public class DatabaseUtils { } private static Property parseFlatProperty(final FlatProperty fp) { - final Property property = new Property(); + final Property property = new Property(new RetrieveEntity()); property.parseFlatProperty(fp); return property; } diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteEntityProperties.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteEntityProperties.java index 28285ae9a2890e6fc6d69b63e620810867035f50..f8cba7d4c9734c1e6e12b72498ceaa6c57ed1a17 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteEntityProperties.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteEntityProperties.java @@ -28,6 +28,7 @@ import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.interfaces.DeleteEntityPropertiesImpl; import org.caosdb.server.database.exceptions.IntegrityException; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public class MySQLDeleteEntityProperties extends MySQLTransaction implements DeleteEntityPropertiesImpl { @@ -39,11 +40,11 @@ public class MySQLDeleteEntityProperties extends MySQLTransaction public static final String STMT_DELETE_ENTITY_PROPERTIES = "call deleteEntityProperties(?)"; @Override - public void execute(final Integer id) throws TransactionException { + public void execute(final EntityID id) throws TransactionException { try { final PreparedStatement stmt = prepareStatement(STMT_DELETE_ENTITY_PROPERTIES); - stmt.setInt(1, id); + stmt.setInt(1, id.toInteger()); stmt.execute(); } catch (final SQLIntegrityConstraintViolationException exc) { throw new IntegrityException(exc); diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteSparseEntity.java index 9f504f3f2690a6415179761b5a647b2a13bb95d0..7fe8ac303b53ec26dc947c1e4a84e648d7b6517d 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteSparseEntity.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteSparseEntity.java @@ -28,6 +28,7 @@ import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.interfaces.DeleteSparseEntityImpl; import org.caosdb.server.database.exceptions.IntegrityException; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public class MySQLDeleteSparseEntity extends MySQLTransaction implements DeleteSparseEntityImpl { @@ -38,12 +39,12 @@ public class MySQLDeleteSparseEntity extends MySQLTransaction implements DeleteS public static final String STMT_DELETE_SPARSE_ENTITY = "call deleteEntity(?)"; @Override - public void execute(final Integer id) throws TransactionException { + public void execute(final EntityID id) throws TransactionException { try { final PreparedStatement stmt = prepareStatement(STMT_DELETE_SPARSE_ENTITY); - stmt.setInt(1, id); + stmt.setInt(1, id.toInteger()); stmt.execute(); } catch (final SQLIntegrityConstraintViolationException exc) { throw new IntegrityException(exc); diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetChildren.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetChildren.java index d63de2d530d0f32bf3d068e7d1351cfb9609ce79..3c1cebf1e20a720a5f726e378bb22b1ad61c850a 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetChildren.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetChildren.java @@ -24,11 +24,12 @@ package org.caosdb.server.database.backend.implementation.MySQL; import java.sql.PreparedStatement; import java.sql.ResultSet; -import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.interfaces.GetChildrenImpl; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public class MySQLGetChildren extends MySQLTransaction implements GetChildrenImpl { @@ -40,18 +41,18 @@ public class MySQLGetChildren extends MySQLTransaction implements GetChildrenImp "Select child from isa_cache where parent=? and rpath=child"; @Override - public List<Integer> execute(final Integer entity) throws TransactionException { + public List<EntityID> execute(final EntityID entity) throws TransactionException { try { final PreparedStatement stmt = prepareStatement(STMT_GET_CHILDREN); - stmt.setInt(1, entity); + stmt.setInt(1, entity.toInteger()); ResultSet rs = null; try { rs = stmt.executeQuery(); - final ArrayList<Integer> ret = new ArrayList<Integer>(); + final List<EntityID> ret = new LinkedList<>(); while (rs.next()) { - ret.add(rs.getInt(1)); + ret.add(new EntityID(rs.getInt(1))); } return ret; } finally { diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetDependentEntities.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetDependentEntities.java index 7875ced0d89fd11ed14cf668bb9110f643c053c9..9384c8a04861a01f1e56236b0ab42433d87990f5 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetDependentEntities.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetDependentEntities.java @@ -24,11 +24,12 @@ package org.caosdb.server.database.backend.implementation.MySQL; import java.sql.PreparedStatement; import java.sql.ResultSet; -import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.interfaces.GetDependentEntitiesImpl; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public class MySQLGetDependentEntities extends MySQLTransaction implements GetDependentEntitiesImpl { @@ -40,17 +41,17 @@ public class MySQLGetDependentEntities extends MySQLTransaction public static final String STMT_GET_DEPENDENT_ENTITIES = "call getDependentEntities(?)"; @Override - public List<Integer> execute(final Integer entity) throws TransactionException { + public List<EntityID> execute(final EntityID entity) throws TransactionException { try { final PreparedStatement stmt = prepareStatement(STMT_GET_DEPENDENT_ENTITIES); - stmt.setInt(1, entity); + stmt.setInt(1, entity.toInteger()); final ResultSet rs = stmt.executeQuery(); try { - final ArrayList<Integer> ret = new ArrayList<Integer>(); + final List<EntityID> ret = new LinkedList<>(); while (rs.next()) { - ret.add(rs.getInt(1)); + ret.add(new EntityID(rs.getInt(1))); } return ret; } finally { diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetIDByName.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetIDByName.java index 5a546ae1ae16c606a9b367cce94e1ceddf073239..c2e28cd39929f71e874fb4a69c38261ed290b18a 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetIDByName.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetIDByName.java @@ -24,11 +24,12 @@ package org.caosdb.server.database.backend.implementation.MySQL; import java.sql.PreparedStatement; import java.sql.ResultSet; -import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.interfaces.GetIDByNameImpl; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public class MySQLGetIDByName extends MySQLTransaction implements GetIDByNameImpl { @@ -52,7 +53,7 @@ public class MySQLGetIDByName extends MySQLTransaction implements GetIDByNameImp public static final String STMT_LIMIT = " LIMIT "; @Override - public List<Integer> execute(final String name, final String role, final String limit) + public List<EntityID> execute(final String name, final String role, final String limit) throws TransactionException { try { final String stmtStr = @@ -66,9 +67,9 @@ public class MySQLGetIDByName extends MySQLTransaction implements GetIDByNameImp stmt.setString(2, role); } try (ResultSet rs = stmt.executeQuery()) { - final ArrayList<Integer> ret = new ArrayList<Integer>(); + final List<EntityID> ret = new LinkedList<>(); while (rs.next()) { - ret.add(rs.getInt("id")); + ret.add(new EntityID(rs.getInt("id"))); } return ret; diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetUpdateableChecksums.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetUpdateableChecksums.java index cf4e0aa7816b7f119f610ad7a602abfbe01432e4..28c55032e0ae6b6c2fcfb779339a72b96c703ba0 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetUpdateableChecksums.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetUpdateableChecksums.java @@ -28,6 +28,7 @@ import java.sql.SQLException; import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.interfaces.GetUpdateableChecksumsImpl; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public class MySQLGetUpdateableChecksums extends MySQLTransaction implements GetUpdateableChecksumsImpl { @@ -40,12 +41,12 @@ public class MySQLGetUpdateableChecksums extends MySQLTransaction } @Override - public Integer execute() throws TransactionException { + public EntityID execute() throws TransactionException { try { final PreparedStatement stmt = prepareStatement(this.GET_UPDATEABLE_CHECKSUMS); final ResultSet rs = stmt.executeQuery(); if (rs.next()) { - return rs.getInt(1); + return new EntityID(rs.getInt(1)); } else { return null; } 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 d4243d7712cc3982221e1e815cdbdaaa4561a205..7c3c5a33e160f3da6a8c2b89fe0487e0317c99da 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 @@ -33,6 +33,7 @@ import org.caosdb.server.database.exceptions.IntegrityException; import org.caosdb.server.database.exceptions.TransactionException; import org.caosdb.server.database.proto.FlatProperty; import org.caosdb.server.datatype.AbstractDatatype.Table; +import org.caosdb.server.entity.EntityID; public class MySQLInsertEntityProperties extends MySQLTransaction implements InsertEntityPropertiesImpl { @@ -46,8 +47,8 @@ public class MySQLInsertEntityProperties extends MySQLTransaction @Override public void execute( - final Integer domain, - final Integer entity, + final EntityID domain, + final EntityID entity, final FlatProperty fp, final Table table, final Long unit_sig) @@ -55,8 +56,8 @@ public class MySQLInsertEntityProperties extends MySQLTransaction try { final PreparedStatement stmt = prepareStatement(STMT_INSERT_ENTITY_PROPERTY); - stmt.setInt(1, domain); - stmt.setInt(2, entity); + stmt.setInt(1, domain.toInteger()); + stmt.setInt(2, entity.toInteger()); stmt.setInt(3, fp.id); stmt.setString(4, table.toString()); diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertParents.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertParents.java index a37bf066aa1573e67390f88bfe18bbed0d6dbb3b..61a5e8c48cdc85098e1b0a2f5531c358d6c6058d 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertParents.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertParents.java @@ -26,6 +26,7 @@ import java.sql.PreparedStatement; import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.interfaces.InsertParentsImpl; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public class MySQLInsertParents extends MySQLTransaction implements InsertParentsImpl { @@ -36,11 +37,11 @@ public class MySQLInsertParents extends MySQLTransaction implements InsertParent public static final String STMT_INSERT_ISA = "call insertIsa(?,?)"; @Override - public void execute(final Integer entity, final Integer parent) throws TransactionException { + public void execute(final EntityID entity, final EntityID parent) throws TransactionException { try { final PreparedStatement stmt = prepareStatement(STMT_INSERT_ISA); - stmt.setInt(1, entity); - stmt.setInt(2, parent); + stmt.setInt(1, entity.toInteger()); + stmt.setInt(2, parent.toInteger()); stmt.execute(); } catch (final Exception e) { throw new TransactionException(e); diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertTransactionHistory.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertTransactionHistory.java index 27b0f8a156ae6b5c936772bf03d0d8ed8da4e42e..0832790a0b56446570fbd7b9c3a4383390c443a7 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertTransactionHistory.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertTransactionHistory.java @@ -26,6 +26,7 @@ import java.sql.PreparedStatement; import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.interfaces.InsertTransactionHistoryImpl; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public class MySQLInsertTransactionHistory extends MySQLTransaction implements InsertTransactionHistoryImpl { @@ -44,7 +45,7 @@ public class MySQLInsertTransactionHistory extends MySQLTransaction final String user, final long seconds, final int nanos, - final int entity) + final EntityID entity) throws TransactionException { try { @@ -55,7 +56,7 @@ public class MySQLInsertTransactionHistory extends MySQLTransaction logStmt.setString(3, user); logStmt.setLong(4, seconds); logStmt.setInt(5, nanos); - logStmt.setInt(6, entity); + logStmt.setInt(6, entity.toInteger()); logStmt.execute(); } catch (final Exception e) { throw new TransactionException(e); diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLIsSubType.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLIsSubType.java index bb847de7bf86e6e8a49414a52933a7bb87cf8d60..f6c2daf8d4a0bf4defcaa550cf715032d57cd9cd 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLIsSubType.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLIsSubType.java @@ -28,6 +28,7 @@ import java.sql.SQLException; import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.interfaces.IsSubTypeImpl; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public class MySQLIsSubType extends MySQLTransaction implements IsSubTypeImpl { @@ -38,12 +39,12 @@ public class MySQLIsSubType extends MySQLTransaction implements IsSubTypeImpl { public static final String STMT_IS_SUBTYPE = "call isSubtype(?,?)"; @Override - public boolean execute(final Integer child, final Integer parent) throws TransactionException { + public boolean execute(final EntityID child, final EntityID parent) throws TransactionException { try { final PreparedStatement isSubtypeStmt = prepareStatement(STMT_IS_SUBTYPE); - isSubtypeStmt.setInt(1, child); - isSubtypeStmt.setInt(2, parent); + isSubtypeStmt.setInt(1, child.toInteger()); + isSubtypeStmt.setInt(2, parent.toInteger()); final ResultSet rs = isSubtypeStmt.executeQuery(); try { diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRegisterSubDomain.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRegisterSubDomain.java index ca4997281c76ec18e54dd1c165ca082eee5e0893..1e14600e71023dff544a09910fabe0dc8b17ca42 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRegisterSubDomain.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRegisterSubDomain.java @@ -30,6 +30,7 @@ import java.util.Deque; import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.interfaces.RegisterSubDomainImpl; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public class MySQLRegisterSubDomain extends MySQLTransaction implements RegisterSubDomainImpl { @@ -40,15 +41,15 @@ public class MySQLRegisterSubDomain extends MySQLTransaction implements Register public static final String STMT_REGISTER_SUBDOMAIN = "call registerSubdomain(?)"; @Override - public Deque<Integer> execute(final int domainCount) throws TransactionException { + public Deque<EntityID> execute(final int domainCount) throws TransactionException { try { final PreparedStatement stmt = prepareStatement(STMT_REGISTER_SUBDOMAIN); stmt.setInt(1, domainCount); final ResultSet rs = stmt.executeQuery(); try { - final ArrayDeque<Integer> ret = new ArrayDeque<Integer>(); + final Deque<EntityID> ret = new ArrayDeque<>(); while (rs.next()) { - ret.add(rs.getInt(1)); + ret.add(new EntityID(rs.getInt(1))); } return ret; } finally { diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveAll.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveAll.java index 77618e92d56a166eb9d0df96258b943fb9df52d5..f847bf63e9f72b4632cecf55ee4a132f141a2cd1 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveAll.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveAll.java @@ -24,13 +24,14 @@ package org.caosdb.server.database.backend.implementation.MySQL; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; import org.apache.shiro.SecurityUtils; import org.caosdb.server.database.DatabaseUtils; import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.interfaces.RetrieveAllImpl; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.Role; import org.caosdb.server.permissions.EntityACL; import org.caosdb.server.permissions.EntityPermission; @@ -57,7 +58,7 @@ public class MySQLRetrieveAll extends MySQLTransaction implements RetrieveAllImp public static final String STMT_OTHER_ROLES = " AND e.role=?"; @Override - public List<Integer> execute(final String role) throws TransactionException { + public List<EntityID> execute(final String role) throws TransactionException { try { final String STMT_GET_ALL = STMT_GET_ALL_HEAD @@ -70,12 +71,12 @@ public class MySQLRetrieveAll extends MySQLTransaction implements RetrieveAllImp final ResultSet rs = stmt.executeQuery(); try { - final ArrayList<Integer> ret = new ArrayList<Integer>(); + final List<EntityID> ret = new LinkedList<>(); while (rs.next()) { - String acl = DatabaseUtils.bytes2UTF8(rs.getBytes("ACL")); + final String acl = DatabaseUtils.bytes2UTF8(rs.getBytes("ACL")); if (EntityACL.deserialize(acl) .isPermitted(SecurityUtils.getSubject(), EntityPermission.RETRIEVE_ENTITY)) { - ret.add(rs.getInt("ID")); + ret.add(new EntityID(rs.getInt("ID"))); } } return ret; diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveParents.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveParents.java index 7b8c0d48db3c84183c16b449822065e0c8d798b9..64ce7e9023bd18506a4b13610033923fa7320ca8 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveParents.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveParents.java @@ -32,6 +32,7 @@ import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.interfaces.RetrieveParentsImpl; import org.caosdb.server.database.exceptions.TransactionException; import org.caosdb.server.database.proto.VerySparseEntity; +import org.caosdb.server.entity.EntityID; public class MySQLRetrieveParents extends MySQLTransaction implements RetrieveParentsImpl { @@ -42,14 +43,14 @@ public class MySQLRetrieveParents extends MySQLTransaction implements RetrievePa private static final String stmtStr = "call retrieveEntityParents(?, ?)"; @Override - public ArrayList<VerySparseEntity> execute(final Integer id, final String version) + public ArrayList<VerySparseEntity> execute(final EntityID id, final String version) throws TransactionException { try { ResultSet rs = null; try { final PreparedStatement prepareStatement = prepareStatement(stmtStr); - prepareStatement.setInt(1, id); + prepareStatement.setInt(1, id.toInteger()); if (version == null) { prepareStatement.setNull(2, Types.VARBINARY); } else { diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveProperties.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveProperties.java index 39de8692a48fb57b9ad22d0054bcd5bc3541e632..6bcfeac05cd3631f05615d26741c47f4c5c1bf63 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveProperties.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveProperties.java @@ -34,6 +34,7 @@ import org.caosdb.server.database.backend.interfaces.RetrievePropertiesImpl; import org.caosdb.server.database.exceptions.TransactionException; import org.caosdb.server.database.proto.FlatProperty; import org.caosdb.server.database.proto.ProtoProperty; +import org.caosdb.server.entity.EntityID; public class MySQLRetrieveProperties extends MySQLTransaction implements RetrievePropertiesImpl { @@ -45,13 +46,13 @@ public class MySQLRetrieveProperties extends MySQLTransaction implements Retriev private static final String stmtStr2 = "call retrieveOverrides(?,?,?)"; @Override - public ArrayList<ProtoProperty> execute(final Integer entity, final String version) + public ArrayList<ProtoProperty> execute(final EntityID entity, final String version) throws TransactionException { try { final PreparedStatement prepareStatement = prepareStatement(stmtStr); final List<FlatProperty> props = - retrieveFlatPropertiesStage1(0, entity, version, prepareStatement); + retrieveFlatPropertiesStage1(0, entity.toInteger(), version, prepareStatement); final ArrayList<ProtoProperty> protos = new ArrayList<ProtoProperty>(); for (final FlatProperty p : props) { @@ -59,7 +60,7 @@ public class MySQLRetrieveProperties extends MySQLTransaction implements Retriev proto.property = p; final List<FlatProperty> subProps = - retrieveFlatPropertiesStage1(entity, p.id, version, prepareStatement); + retrieveFlatPropertiesStage1(entity.toInteger(), p.id, version, prepareStatement); proto.subProperties = subProps; @@ -94,9 +95,9 @@ public class MySQLRetrieveProperties extends MySQLTransaction implements Retriev stmt.setString(3, version); } - long t1 = System.currentTimeMillis(); + final long t1 = System.currentTimeMillis(); rs = stmt.executeQuery(); - long t2 = System.currentTimeMillis(); + final long t2 = System.currentTimeMillis(); addMeasurement(this.getClass().getSimpleName() + ".retrieveFlatPropertiesStage1", t2 - t1); final List<FlatProperty> props = DatabaseUtils.parsePropertyResultset(rs); @@ -130,9 +131,9 @@ public class MySQLRetrieveProperties extends MySQLTransaction implements Retriev } else { stmt2.setString(3, version); } - long t1 = System.currentTimeMillis(); + final long t1 = System.currentTimeMillis(); rs = stmt2.executeQuery(); - long t2 = System.currentTimeMillis(); + final long t2 = System.currentTimeMillis(); addMeasurement(this.getClass().getSimpleName() + ".retrieveOverrides", t2 - t1); DatabaseUtils.parseOverrides(props, rs); } finally { diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveQueryTemplateDefinition.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveQueryTemplateDefinition.java index fd0efb8e8756cfb7bec596382356e1ea951ad484..1ab95ae7afc756742475ff2f3c79eddfd632aae9 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveQueryTemplateDefinition.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveQueryTemplateDefinition.java @@ -29,6 +29,7 @@ import java.sql.Types; import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.interfaces.RetrieveQueryTemplateDefinitionImpl; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public class MySQLRetrieveQueryTemplateDefinition extends MySQLTransaction implements RetrieveQueryTemplateDefinitionImpl { @@ -41,11 +42,11 @@ public class MySQLRetrieveQueryTemplateDefinition extends MySQLTransaction "call retrieveQueryTemplateDef(?,?)"; @Override - public String retrieve(final Integer id, final String version) { + public String retrieve(final EntityID id, final String version) { try { final PreparedStatement stmt = prepareStatement(STMT_RETRIEVE_QUERY_TEMPLATE_DEF); - stmt.setInt(1, id); + stmt.setInt(1, id.toInteger()); if (version == null) { stmt.setNull(2, Types.VARBINARY); } else { diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveSparseEntity.java index 3775c1dd4f0b87eb36f43084776d58c0f14f5f80..ca3bd078daba4c72e7f516ce64b1da1515a1a6eb 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveSparseEntity.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveSparseEntity.java @@ -31,6 +31,7 @@ import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.interfaces.RetrieveSparseEntityImpl; import org.caosdb.server.database.exceptions.TransactionException; import org.caosdb.server.database.proto.SparseEntity; +import org.caosdb.server.entity.EntityID; /** * Retrieve a single SparseEntity by id. @@ -47,11 +48,11 @@ public class MySQLRetrieveSparseEntity extends MySQLTransaction private static final String stmtStr = "call retrieveEntity(?,?)"; @Override - public SparseEntity execute(final int id, final String version) throws TransactionException { + public SparseEntity execute(final EntityID id, final String version) throws TransactionException { try { final PreparedStatement preparedStatement = prepareStatement(stmtStr); - preparedStatement.setInt(1, id); + preparedStatement.setInt(1, id.toInteger()); if (version == null) { preparedStatement.setNull(2, Types.VARBINARY); } else { diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveVersionHistory.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveVersionHistory.java index 7ecfbfb7ac70a4a5ec248eb0e2be2c590f0676aa..585be49afe93dc94c6ba2bc4f058c5d46fcf40f6 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveVersionHistory.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveVersionHistory.java @@ -32,6 +32,7 @@ import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.interfaces.RetrieveVersionHistoryImpl; import org.caosdb.server.database.exceptions.TransactionException; import org.caosdb.server.database.proto.VersionHistoryItem; +import org.caosdb.server.entity.EntityID; /** * Transaction to retrieve all versions of an entity. @@ -43,26 +44,26 @@ public class MySQLRetrieveVersionHistory extends MySQLTransaction public static final String VERSION_HISTORY_STMT = "CALL get_version_history(?)"; - public MySQLRetrieveVersionHistory(Access access) { + public MySQLRetrieveVersionHistory(final Access access) { super(access); } @Override - public HashMap<String, VersionHistoryItem> execute(Integer entityId) { + public HashMap<String, VersionHistoryItem> execute(final EntityID entityId) { - HashMap<String, VersionHistoryItem> result = new HashMap<>(); + final HashMap<String, VersionHistoryItem> result = new HashMap<>(); try { - PreparedStatement s = prepareStatement(VERSION_HISTORY_STMT); - s.setInt(1, entityId); - ResultSet rs = s.executeQuery(); + final PreparedStatement s = prepareStatement(VERSION_HISTORY_STMT); + s.setInt(1, entityId.toInteger()); + final ResultSet rs = s.executeQuery(); while (rs.next()) { - String childId = DatabaseUtils.bytes2UTF8(rs.getBytes("child")); - String parentId = DatabaseUtils.bytes2UTF8(rs.getBytes("parent")); - Long childSeconds = rs.getLong("child_seconds"); - Integer childNanos = rs.getInt("child_nanos"); - String childUsername = DatabaseUtils.bytes2UTF8(rs.getBytes("child_username")); - String childRealm = DatabaseUtils.bytes2UTF8(rs.getBytes("child_realm")); + final String childId = DatabaseUtils.bytes2UTF8(rs.getBytes("child")); + final String parentId = DatabaseUtils.bytes2UTF8(rs.getBytes("parent")); + final Long childSeconds = rs.getLong("child_seconds"); + final Integer childNanos = rs.getInt("child_nanos"); + final String childUsername = DatabaseUtils.bytes2UTF8(rs.getBytes("child_username")); + final String childRealm = DatabaseUtils.bytes2UTF8(rs.getBytes("child_realm")); VersionHistoryItem v = result.get(childId); if (v == null) { v = new VersionHistoryItem(); diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetFileCheckedTimestampImpl.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetFileCheckedTimestampImpl.java index fa4c60ad1a688fa13ee8e1f82ee6a8a1649d6d4f..18d7d9b7f510f5cb24e1fe844ac4caac86ff4913 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetFileCheckedTimestampImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetFileCheckedTimestampImpl.java @@ -27,6 +27,7 @@ import java.sql.SQLException; import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.interfaces.SetFileCheckedTimestampImpl; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public class MySQLSetFileCheckedTimestampImpl extends MySQLTransaction implements SetFileCheckedTimestampImpl { @@ -38,11 +39,11 @@ public class MySQLSetFileCheckedTimestampImpl extends MySQLTransaction } @Override - public void execute(final Integer id, final Long ts) throws TransactionException { + public void execute(final EntityID id, final Long ts) throws TransactionException { try { final PreparedStatement stmt = getMySQLHelper().prepareStatement(STMT_SET_TS); stmt.setLong(1, ts); - stmt.setInt(2, id); + stmt.setInt(2, id.toInteger()); } catch (final SQLException e) { throw new TransactionException(e); } catch (final ConnectionException e) { diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetFileChecksum.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetFileChecksum.java index 960457cb09d1e68ca64260bb30416c2716edd6fa..fb6d4188c835fbc895ed4d5e427bb1b2bbc0bb4c 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetFileChecksum.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetFileChecksum.java @@ -5,10 +5,16 @@ import java.sql.SQLException; import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.interfaces.SetFileChecksumImpl; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; +/** + * Implements {@link SetFileChecksumImpl} for a MySQL/MariaDB back-end. + * + * @author Timm Fitschen (t.fitschen@indiscale.com) + */ public class MySQLSetFileChecksum extends MySQLTransaction implements SetFileChecksumImpl { - public MySQLSetFileChecksum(Access access) { + public MySQLSetFileChecksum(final Access access) { super(access); } @@ -16,10 +22,10 @@ public class MySQLSetFileChecksum extends MySQLTransaction implements SetFileChe "UPDATE files SET hash = unhex(?) WHERE file_id = ?"; @Override - public void execute(Integer id, String checksum) { + public void execute(final EntityID id, final String checksum) { try { - PreparedStatement stmt = prepareStatement(STMT_SET_CHECKSUM); - stmt.setInt(2, id); + final PreparedStatement stmt = prepareStatement(STMT_SET_CHECKSUM); + stmt.setInt(2, id.toInteger()); stmt.setString(1, checksum); stmt.execute(); } catch (SQLException | ConnectionException e) { diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetQueryTemplateDefinition.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetQueryTemplateDefinition.java index e938010ca56f85d7ad574e51d1b8ef7d88b6c5ad..f3ded949383c7d250d4ad58e6ae964aa9f96324c 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetQueryTemplateDefinition.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetQueryTemplateDefinition.java @@ -27,6 +27,7 @@ import java.sql.SQLException; import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.interfaces.SetQueryTemplateDefinitionImpl; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public class MySQLSetQueryTemplateDefinition extends MySQLTransaction implements SetQueryTemplateDefinitionImpl { @@ -39,10 +40,10 @@ public class MySQLSetQueryTemplateDefinition extends MySQLTransaction "INSERT INTO query_template_def (id, definition) VALUES (?,?) ON DUPLICATE KEY UPDATE definition=?;"; @Override - public void insert(final Integer id, final String definition) { + public void insert(final EntityID id, final String definition) { try { final PreparedStatement stmt = prepareStatement(STMT_INSERT_QUERY_TEMPLATE_DEF); - stmt.setInt(1, id); + stmt.setInt(1, id.toInteger()); stmt.setString(2, definition); stmt.setString(3, definition); stmt.execute(); diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/DeleteEntityPropertiesImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/DeleteEntityPropertiesImpl.java index 93b7023bf10fd1b035b8d8483bc328cfef5aa5c4..1c271bcc4fec7ada01980c51c16e7c5b884fb79d 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/DeleteEntityPropertiesImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/DeleteEntityPropertiesImpl.java @@ -23,9 +23,10 @@ package org.caosdb.server.database.backend.interfaces; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.utils.Undoable; public interface DeleteEntityPropertiesImpl extends BackendTransactionImpl, Undoable { - public abstract void execute(Integer id) throws TransactionException; + public abstract void execute(EntityID id) throws TransactionException; } diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/DeleteSparseEntityImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/DeleteSparseEntityImpl.java index 30ee60609065c0ac02b5b40a143c0643d37b5667..5f1d2ec2364aaead626182e13777af8c7e809a20 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/DeleteSparseEntityImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/DeleteSparseEntityImpl.java @@ -23,9 +23,10 @@ package org.caosdb.server.database.backend.interfaces; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.utils.Undoable; public interface DeleteSparseEntityImpl extends BackendTransactionImpl, Undoable { - public void execute(Integer id) throws TransactionException; + public void execute(EntityID id) throws TransactionException; } diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/GetChildrenImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/GetChildrenImpl.java index a58579feb9de5982a09629dfe018e564c4e62b55..8b0211a0b56bec22e4823058dfa72c355e59d19d 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/GetChildrenImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/GetChildrenImpl.java @@ -24,8 +24,9 @@ package org.caosdb.server.database.backend.interfaces; import java.util.List; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public interface GetChildrenImpl extends BackendTransactionImpl { - public abstract List<Integer> execute(Integer entity) throws TransactionException; + public abstract List<EntityID> execute(EntityID entity) throws TransactionException; } diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/GetDependentEntitiesImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/GetDependentEntitiesImpl.java index ca63fac685ce97f75954b996ba9ee74013ae5b46..00c533dffb3ad067666f11d43f8469d9a7550e0a 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/GetDependentEntitiesImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/GetDependentEntitiesImpl.java @@ -24,8 +24,9 @@ package org.caosdb.server.database.backend.interfaces; import java.util.List; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public interface GetDependentEntitiesImpl extends BackendTransactionImpl { - public abstract List<Integer> execute(Integer entity) throws TransactionException; + public abstract List<EntityID> execute(EntityID entity) throws TransactionException; } diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/GetIDByNameImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/GetIDByNameImpl.java index d788a3570ebd045549420456814786b5e0b15b42..02cbc80731d1cc0d061f5aa9f080bea1364cdb7f 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/GetIDByNameImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/GetIDByNameImpl.java @@ -24,9 +24,10 @@ package org.caosdb.server.database.backend.interfaces; import java.util.List; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public interface GetIDByNameImpl extends BackendTransactionImpl { - public abstract List<Integer> execute(String name, String role, String limit) + public abstract List<EntityID> execute(String name, String role, String limit) throws TransactionException; } diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/GetUpdateableChecksumsImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/GetUpdateableChecksumsImpl.java index 53aac4905a331a9f1e5fc71708cef9fdfa20efa5..762fa2d39ccad6a96f46246962de8746087b64a8 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/GetUpdateableChecksumsImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/GetUpdateableChecksumsImpl.java @@ -23,8 +23,9 @@ package org.caosdb.server.database.backend.interfaces; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public interface GetUpdateableChecksumsImpl extends BackendTransactionImpl { - Integer execute() throws TransactionException; + EntityID execute() throws TransactionException; } diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/InsertEntityPropertiesImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/InsertEntityPropertiesImpl.java index e45fe9ead23f963c3010577de61be02e7c00042f..2406d4895487bdec5f271b41bf46207a48c7375d 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/InsertEntityPropertiesImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/InsertEntityPropertiesImpl.java @@ -25,11 +25,12 @@ package org.caosdb.server.database.backend.interfaces; import org.caosdb.server.database.exceptions.TransactionException; import org.caosdb.server.database.proto.FlatProperty; import org.caosdb.server.datatype.AbstractDatatype.Table; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.utils.Undoable; public interface InsertEntityPropertiesImpl extends BackendTransactionImpl, Undoable { public abstract void execute( - Integer domain, Integer integer, FlatProperty fp, Table table, Long unit_sig) + EntityID domain, EntityID entity, FlatProperty fp, Table table, Long unit_sig) throws TransactionException; } diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/InsertParentsImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/InsertParentsImpl.java index aa65abe60be758197c761be3d728437c53fefcf3..890ed6422aa7e39293dc6b64fbad710089e1cf83 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/InsertParentsImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/InsertParentsImpl.java @@ -23,10 +23,11 @@ package org.caosdb.server.database.backend.interfaces; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.utils.Undoable; public interface InsertParentsImpl extends BackendTransactionImpl, Undoable { - public abstract void execute(final Integer entity, final Integer parent) + public abstract void execute(final EntityID entity, final EntityID parent) throws TransactionException; } diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/InsertTransactionHistoryImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/InsertTransactionHistoryImpl.java index a0b7db433ef24c515946e3b4fb1556f2aa2a7c16..927238e6cf4b311886840695e9de13cc6f86c87c 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/InsertTransactionHistoryImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/InsertTransactionHistoryImpl.java @@ -23,6 +23,7 @@ package org.caosdb.server.database.backend.interfaces; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.utils.Undoable; public interface InsertTransactionHistoryImpl extends BackendTransactionImpl, Undoable { @@ -33,6 +34,6 @@ public interface InsertTransactionHistoryImpl extends BackendTransactionImpl, Un final String user, long seconds, int nanos, - int entity) + EntityID entity) throws TransactionException; } diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/IsSubTypeImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/IsSubTypeImpl.java index 2e61c5fb1331ebd102e1e2034bc0ef6a47dcf5dc..10c18e43f07c927f049067a2767fe79f45f4990b 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/IsSubTypeImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/IsSubTypeImpl.java @@ -23,8 +23,9 @@ package org.caosdb.server.database.backend.interfaces; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public interface IsSubTypeImpl extends BackendTransactionImpl { - public abstract boolean execute(Integer child, Integer parent) throws TransactionException; + public abstract boolean execute(EntityID child, EntityID parent) throws TransactionException; } diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/RegisterSubDomainImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/RegisterSubDomainImpl.java index e9df6f8897b4753a273be9877c8a5fa49b106932..87ea0c85db6a698f49c103506b520342deff2fb0 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/RegisterSubDomainImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/RegisterSubDomainImpl.java @@ -24,8 +24,9 @@ package org.caosdb.server.database.backend.interfaces; import java.util.Deque; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public interface RegisterSubDomainImpl extends BackendTransactionImpl { - public abstract Deque<Integer> execute(int domainCount) throws TransactionException; + public abstract Deque<EntityID> execute(int domainCount) throws TransactionException; } diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveAllImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveAllImpl.java index 0aaa9707136ab1fc3cb498c80e2a1ad33771b746..8e5a55943176a557867925200230559609cf76c2 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveAllImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveAllImpl.java @@ -24,8 +24,9 @@ package org.caosdb.server.database.backend.interfaces; import java.util.List; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public interface RetrieveAllImpl extends BackendTransactionImpl { - public abstract List<Integer> execute(String role) throws TransactionException; + public abstract List<EntityID> execute(String role) throws TransactionException; } diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveAllUncheckedFilesImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveAllUncheckedFilesImpl.java index 031bfbf9a4566a6f5c1f7c017f86dcba81ed07ff..dc247bf6b2975f96185245813647662e8e9217f3 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveAllUncheckedFilesImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveAllUncheckedFilesImpl.java @@ -26,7 +26,22 @@ import java.util.Iterator; import org.caosdb.server.database.exceptions.TransactionException; import org.caosdb.server.database.proto.SparseEntity; +/** + * Retrieve an iterator which iterates over all File entities which need to be consistency-checked. + * + * @author Timm Fitschen (t.fitschen@indiscale.com) + */ public interface RetrieveAllUncheckedFilesImpl extends BackendTransactionImpl { - public Iterator<SparseEntity> execute(long ts, String location) throws TransactionException; + /** + * Return an iterator over all (non-directory) file entities which have not been + * consistency-checked since the (unix) timestamp `ts` and which are located below the directory + * `directory`. + * + * @param ts + * @param directory + * @return + * @throws TransactionException + */ + public Iterator<SparseEntity> execute(long ts, String directory) throws TransactionException; } diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveParentsImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveParentsImpl.java index 1948be05dbb69cb0259184bf03413edd6c61dbb1..9bfddba10a8b548d1259adb22aac392a127a8b5e 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveParentsImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveParentsImpl.java @@ -25,9 +25,10 @@ package org.caosdb.server.database.backend.interfaces; import java.util.ArrayList; import org.caosdb.server.database.exceptions.TransactionException; import org.caosdb.server.database.proto.VerySparseEntity; +import org.caosdb.server.entity.EntityID; public interface RetrieveParentsImpl extends BackendTransactionImpl { - public ArrayList<VerySparseEntity> execute(Integer id, String version) + public ArrayList<VerySparseEntity> execute(EntityID id, String version) throws TransactionException; } diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrievePropertiesImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrievePropertiesImpl.java index 54dba75e7b84dcae38d33a8bbd0245288dba65ee..dc1d5aa09653c9a4905dcc456a7037f4009bb838 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrievePropertiesImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrievePropertiesImpl.java @@ -25,8 +25,9 @@ package org.caosdb.server.database.backend.interfaces; import java.util.ArrayList; import org.caosdb.server.database.exceptions.TransactionException; import org.caosdb.server.database.proto.ProtoProperty; +import org.caosdb.server.entity.EntityID; public interface RetrievePropertiesImpl extends BackendTransactionImpl { - public ArrayList<ProtoProperty> execute(Integer id, String version) throws TransactionException; + public ArrayList<ProtoProperty> execute(EntityID id, String version) throws TransactionException; } diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveQueryTemplateDefinitionImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveQueryTemplateDefinitionImpl.java index df144c796b9349699432945c861ac42c44045db0..485b62899ecd1cd2c025b5928ed179a61e409fea 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveQueryTemplateDefinitionImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveQueryTemplateDefinitionImpl.java @@ -22,7 +22,9 @@ */ package org.caosdb.server.database.backend.interfaces; +import org.caosdb.server.entity.EntityID; + public interface RetrieveQueryTemplateDefinitionImpl extends BackendTransactionImpl { - public String retrieve(Integer id, String version); + public String retrieve(EntityID id, String version); } diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveSparseEntityImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveSparseEntityImpl.java index 8bb790c98e2c45d788f7f1bd8ede6c7c4a2faa03..8b5c516b0d486a9bc6f7745c15eb999dffbe6182 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveSparseEntityImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveSparseEntityImpl.java @@ -24,8 +24,9 @@ package org.caosdb.server.database.backend.interfaces; import org.caosdb.server.database.exceptions.TransactionException; import org.caosdb.server.database.proto.SparseEntity; +import org.caosdb.server.entity.EntityID; public interface RetrieveSparseEntityImpl extends BackendTransactionImpl { - public SparseEntity execute(int id, String version) throws TransactionException; + public SparseEntity execute(EntityID id, String version) throws TransactionException; } diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveVersionHistoryImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveVersionHistoryImpl.java index 50b6e13ca8eeb4b6b404ba3e9deb776111e5011e..1dbcbfb07e53cae2cd3289a87f5fedd7997cb1a9 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveVersionHistoryImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveVersionHistoryImpl.java @@ -2,8 +2,9 @@ package org.caosdb.server.database.backend.interfaces; import java.util.HashMap; import org.caosdb.server.database.proto.VersionHistoryItem; +import org.caosdb.server.entity.EntityID; public interface RetrieveVersionHistoryImpl extends BackendTransactionImpl { - public HashMap<String, VersionHistoryItem> execute(Integer entityId); + public HashMap<String, VersionHistoryItem> execute(EntityID entityId); } diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/SetFileCheckedTimestampImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/SetFileCheckedTimestampImpl.java index a398353978b430bbc655ad78b1cadbfcc91f1d9e..8e6a6f2b039400c7fd74c0dbbdc6d91d61bf0210 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/SetFileCheckedTimestampImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/SetFileCheckedTimestampImpl.java @@ -23,8 +23,9 @@ package org.caosdb.server.database.backend.interfaces; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public interface SetFileCheckedTimestampImpl extends BackendTransactionImpl { - public void execute(Integer id, Long ts) throws TransactionException; + public void execute(EntityID id, Long ts) throws TransactionException; } diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/SetFileChecksumImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/SetFileChecksumImpl.java index ca33df8987aa4f82051feaaff936ea29455198a4..26cb7ce19ce6d946c34c784a9849c29d4f8f4888 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/SetFileChecksumImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/SetFileChecksumImpl.java @@ -1,6 +1,21 @@ package org.caosdb.server.database.backend.interfaces; +import org.caosdb.server.entity.EntityID; + +/** + * Store the checksum and timestamp of the checksum for a File entity. + * + * @author Timm Fitschen (t.fitschen@indiscale.com) + */ public interface SetFileChecksumImpl extends BackendTransactionImpl { - void execute(Integer id, String checksum); + /** + * Store the checksum of a File entity. + * + * <p>The entity is identified by the id. + * + * @param id + * @param checksum + */ + void execute(EntityID id, String checksum); } diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/SetQueryTemplateDefinitionImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/SetQueryTemplateDefinitionImpl.java index aee26c5e53117028a9de91911cf9710a4164b6a7..53a0032fcab3b57d0f83a4843347a903c9078450 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/SetQueryTemplateDefinitionImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/SetQueryTemplateDefinitionImpl.java @@ -22,7 +22,9 @@ */ package org.caosdb.server.database.backend.interfaces; +import org.caosdb.server.entity.EntityID; + public interface SetQueryTemplateDefinitionImpl extends BackendTransactionImpl { - public void insert(Integer id, String queryTemplateDefinition); + public void insert(EntityID id, String queryTemplateDefinition); } diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/GetAllNames.java b/src/main/java/org/caosdb/server/database/backend/transaction/GetAllNames.java index f45f5104283d7d27771a3e2a9b0a38772d4cccf0..5db82a5e3b71a2fbb6280277bc57f7ace951043f 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/GetAllNames.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/GetAllNames.java @@ -5,8 +5,8 @@ import java.util.List; import org.caosdb.server.database.BackendTransaction; import org.caosdb.server.database.backend.interfaces.GetAllNamesImpl; import org.caosdb.server.database.proto.SparseEntity; -import org.caosdb.server.entity.Entity; import org.caosdb.server.entity.EntityInterface; +import org.caosdb.server.entity.RetrieveEntity; public class GetAllNames extends BackendTransaction { @@ -22,7 +22,7 @@ public class GetAllNames extends BackendTransaction { public List<EntityInterface> getEntities() { ArrayList<EntityInterface> ret = new ArrayList<>(); for (SparseEntity e : entities) { - ret.add(new Entity().parseSparseEntity(e)); + ret.add(new RetrieveEntity().parseSparseEntity(e)); } return ret; } diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/GetChildren.java b/src/main/java/org/caosdb/server/database/backend/transaction/GetChildren.java index 32bf8883b9f2662207352c8b80356b95f97d7d76..d0e2a809547ad2be4621ccab3f79d793dde70006 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/GetChildren.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/GetChildren.java @@ -26,13 +26,14 @@ import java.util.List; import org.caosdb.server.database.BackendTransaction; import org.caosdb.server.database.backend.interfaces.GetChildrenImpl; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public class GetChildren extends BackendTransaction { - private final Integer entity; - private List<Integer> list; + private final EntityID entity; + private List<EntityID> list; - public GetChildren(final Integer entity) { + public GetChildren(final EntityID entity) { this.entity = entity; } @@ -42,7 +43,7 @@ public class GetChildren extends BackendTransaction { this.list = t.execute(this.entity); } - public List<Integer> getList() { + public List<EntityID> getList() { return this.list; } } diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/GetDependentEntities.java b/src/main/java/org/caosdb/server/database/backend/transaction/GetDependentEntities.java index 067a422fd509b0987e0e5c8b69da1ee081c258a0..421fcaaed7c07e3bbbf0abb745e086260aad41d7 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/GetDependentEntities.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/GetDependentEntities.java @@ -26,16 +26,17 @@ import java.util.List; import org.caosdb.server.database.BackendTransaction; import org.caosdb.server.database.backend.interfaces.GetDependentEntitiesImpl; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public class GetDependentEntities extends BackendTransaction { - private final Integer entity; + private final EntityID entity; - public GetDependentEntities(final Integer entity) { + public GetDependentEntities(final EntityID entity) { this.entity = entity; } - private List<Integer> list; + private List<EntityID> list; @Override public void execute() throws TransactionException { @@ -43,7 +44,7 @@ public class GetDependentEntities extends BackendTransaction { this.list = t.execute(this.entity); } - public List<Integer> getList() { + public List<EntityID> getList() { return this.list; } } diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/GetFileRecordByPath.java b/src/main/java/org/caosdb/server/database/backend/transaction/GetFileRecordByPath.java index 1a7fa8635366cce858c35f54378090ebad72fb8f..8ce0e0e2e2e5c84116fe1eb8df1c3bdf322de022 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/GetFileRecordByPath.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/GetFileRecordByPath.java @@ -31,6 +31,7 @@ import org.caosdb.server.database.backend.interfaces.GetFileRecordByPathImpl; import org.caosdb.server.database.exceptions.EntityDoesNotExistException; import org.caosdb.server.database.exceptions.TransactionException; import org.caosdb.server.database.proto.SparseEntity; +import org.caosdb.server.entity.EntityID; public class GetFileRecordByPath extends CacheableBackendTransaction<String, SparseEntity> { @@ -41,12 +42,12 @@ public class GetFileRecordByPath extends CacheableBackendTransaction<String, Spa public GetFileRecordByPath(final String path) { super(cache); - this.path = path; + this.path = (path == null ? null : path.replaceFirst("^/", "")); } public static void removeCached(final String path) { if (path != null && cache != null) { - cache.remove(path); + cache.remove(path.replaceFirst("^/", "")); } } @@ -70,8 +71,8 @@ public class GetFileRecordByPath extends CacheableBackendTransaction<String, Spa return result; } - public Integer getId() { - return this.entity.id; + public EntityID getId() { + return new EntityID(this.entity.id); } public Long getSize() { diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/GetIDByName.java b/src/main/java/org/caosdb/server/database/backend/transaction/GetIDByName.java index b43db0010eeeb3179bb91333d854872f5e8ab18a..7855af4af3a7145bd5066875ffddc46585e599fd 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/GetIDByName.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/GetIDByName.java @@ -28,10 +28,11 @@ import org.caosdb.server.database.backend.interfaces.GetIDByNameImpl; import org.caosdb.server.database.exceptions.EntityDoesNotExistException; import org.caosdb.server.database.exceptions.EntityWasNotUniqueException; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public class GetIDByName extends BackendTransaction { - private List<Integer> list; + private List<EntityID> list; private final boolean unique; private final String name; private final String role; @@ -74,11 +75,11 @@ public class GetIDByName extends BackendTransaction { } } - public List<Integer> getList() { + public List<EntityID> getList() { return this.list; } - public Integer getId() { + public EntityID getId() { return this.list.get(0); } } diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/GetUpdateableChecksums.java b/src/main/java/org/caosdb/server/database/backend/transaction/GetUpdateableChecksums.java index eade9ea62168710e8928e52d1dc9176e366e0300..a9a8d280586c7f749a73940c14b178fd3c10ce64 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/GetUpdateableChecksums.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/GetUpdateableChecksums.java @@ -25,10 +25,11 @@ package org.caosdb.server.database.backend.transaction; import org.caosdb.server.database.BackendTransaction; import org.caosdb.server.database.backend.interfaces.GetUpdateableChecksumsImpl; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public class GetUpdateableChecksums extends BackendTransaction { - private Integer next; + private EntityID next; @Override protected void execute() throws TransactionException { @@ -36,7 +37,7 @@ public class GetUpdateableChecksums extends BackendTransaction { this.next = t.execute(); } - public Integer getID() { + public EntityID getID() { return this.next; } } diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/InsertEntityDatatype.java b/src/main/java/org/caosdb/server/database/backend/transaction/InsertEntityDatatype.java index aa139e7db565ae82073d6983915c0c53e9cd8b51..382dde551c3e8ec53e51d0668bdd45f3b7e12184 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/InsertEntityDatatype.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/InsertEntityDatatype.java @@ -4,6 +4,7 @@ import org.caosdb.server.database.BackendTransaction; import org.caosdb.server.database.backend.interfaces.InsertEntityDatatypeImpl; import org.caosdb.server.database.exceptions.IntegrityException; import org.caosdb.server.database.proto.SparseEntity; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.utils.ServerMessages; @@ -28,6 +29,6 @@ public class InsertEntityDatatype extends BackendTransaction { throw exc; } - this.entity.setId(e.id); + this.entity.setId(new EntityID(e.id)); } } diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/InsertEntityProperties.java b/src/main/java/org/caosdb/server/database/backend/transaction/InsertEntityProperties.java index bd5bf63a5eb7b194e119c56293e756ff0c4b6a20..f9af6a482efaccf896a1a85fc65d0e1217bd6a53 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/InsertEntityProperties.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/InsertEntityProperties.java @@ -36,6 +36,7 @@ import org.caosdb.server.datatype.AbstractDatatype.Table; import org.caosdb.server.datatype.CollectionValue; import org.caosdb.server.datatype.IndexedSingleValue; import org.caosdb.server.datatype.SingleValue; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.Role; import org.caosdb.server.entity.StatementStatus; @@ -61,7 +62,7 @@ public class InsertEntityProperties extends BackendTransaction { final int domainCount = DatabaseUtils.deriveStage2Inserts(stage2Inserts, stage1Inserts); - final Deque<Integer> domainIds = execute(new RegisterSubDomain(domainCount)).getDomains(); + final Deque<EntityID> domainIds = execute(new RegisterSubDomain(domainCount)).getDomains(); insertStages(t, domainIds, stage1Inserts, this.entity.getDomain(), this.entity.getId()); insertStages(t, domainIds, stage2Inserts, this.entity.getId(), null); @@ -69,14 +70,14 @@ public class InsertEntityProperties extends BackendTransaction { private void insertStages( final InsertEntityPropertiesImpl t, - final Deque<Integer> domainIds, + final Deque<EntityID> domainIds, final List<EntityInterface> stage1Inserts, - final Integer domain, - final Integer entity) + final EntityID domain, + final EntityID entity) throws TransactionException { for (final EntityInterface property : stage1Inserts) { - if (property.hasRole() && property.getRole() == Role.Domain && property.getId() == null) { + if (property.hasRole() && property.getRole() == Role.Domain && !property.hasId()) { property.setId(domainIds.removeFirst()); } int pIdx; @@ -92,11 +93,11 @@ public class InsertEntityProperties extends BackendTransaction { final FlatProperty fp = new FlatProperty(); Table table = Table.null_data; Long unit_sig = null; - fp.id = property.getId(); + fp.id = property.getId().toInteger(); fp.idx = pIdx; if (property.hasReplacement()) { - if (property.getReplacement().getId() == null) { + if (!property.getReplacement().hasId()) { property.getReplacement().setId(domainIds.removeFirst()); } @@ -113,7 +114,7 @@ public class InsertEntityProperties extends BackendTransaction { if (property.getValue() instanceof CollectionValue) { // insert collection of values final CollectionValue v = (CollectionValue) property.getValue(); - Iterator<IndexedSingleValue> iterator = v.iterator(); + final Iterator<IndexedSingleValue> iterator = v.iterator(); final SingleValue firstValue = iterator.next(); // insert 2nd to nth item @@ -128,7 +129,7 @@ public class InsertEntityProperties extends BackendTransaction { table = vi.getTable(); } t.execute( - domain, (entity != null ? entity : property.getDomain()), fp, table, unit_sig); + domain, entity != null ? entity : property.getDomain(), fp, table, unit_sig); } // insert first item @@ -172,7 +173,7 @@ public class InsertEntityProperties extends BackendTransaction { } } - t.execute(domain, (entity != null ? entity : property.getDomain()), fp, table, unit_sig); + t.execute(domain, entity != null ? entity : property.getDomain(), fp, table, unit_sig); } } } diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/InsertSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/transaction/InsertSparseEntity.java index 213c7529766dcac4cc002f81380bf8d141cd8065..9c9c1902019077735445295a61dfed70ce98f9fa 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/InsertSparseEntity.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/InsertSparseEntity.java @@ -27,10 +27,10 @@ import org.caosdb.server.database.backend.interfaces.InsertSparseEntityImpl; import org.caosdb.server.database.exceptions.IntegrityException; import org.caosdb.server.database.exceptions.TransactionException; import org.caosdb.server.database.proto.SparseEntity; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.Version; import org.caosdb.server.utils.ServerMessages; -import org.caosdb.server.utils.Undoable; public class InsertSparseEntity extends BackendTransaction { @@ -40,8 +40,6 @@ public class InsertSparseEntity extends BackendTransaction { this.entity = entity; } - private Integer oldId; - @Override public void execute() throws TransactionException { final InsertSparseEntityImpl t = getImplementation(InsertSparseEntityImpl.class); @@ -55,19 +53,7 @@ public class InsertSparseEntity extends BackendTransaction { throw exc; } - getUndoHandler() - .append( - new Undoable() { - - @Override - public void undo() { - InsertSparseEntity.this.entity.setId(InsertSparseEntity.this.oldId); - } - - @Override - public void cleanUp() {} - }); - this.entity.setId(e.id); + this.entity.setId(new EntityID(e.id)); this.entity.setVersion(new Version(e.versionId)); this.entity.getVersion().setHead(true); } diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/IsSubType.java b/src/main/java/org/caosdb/server/database/backend/transaction/IsSubType.java index 683903f396a186c8243b6bba20c0d19e29a61688..7404572162ec5c85f3f940a723599e7bd200667f 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/IsSubType.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/IsSubType.java @@ -25,19 +25,20 @@ package org.caosdb.server.database.backend.transaction; import org.caosdb.server.database.BackendTransaction; import org.caosdb.server.database.backend.interfaces.IsSubTypeImpl; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public class IsSubType extends BackendTransaction { - private final Integer child; - private Integer parent = null; + private final EntityID child; + private EntityID parent = null; private String parentName = null; - public IsSubType(final Integer child, final Integer parent) { + public IsSubType(final EntityID child, final EntityID parent) { this.child = child; this.parent = parent; } - public IsSubType(Integer child, String parent) { + public IsSubType(final EntityID child, final String parent) { this.parentName = parent; this.child = child; } @@ -50,7 +51,7 @@ public class IsSubType extends BackendTransaction { if (this.parent == null) { this.isSubType = false; - for (Integer parent : execute(new GetIDByName(parentName, false)).getList()) { + for (final EntityID parent : execute(new GetIDByName(parentName, false)).getList()) { this.isSubType = t.execute(this.child, parent); if (this.isSubType) { return; diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/RegisterSubDomain.java b/src/main/java/org/caosdb/server/database/backend/transaction/RegisterSubDomain.java index ecae501d40d4e6ed9ae54e44e12d37a7628699fd..0321a621a82a9ae2841d31b55b05a46743f963bd 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/RegisterSubDomain.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/RegisterSubDomain.java @@ -26,11 +26,12 @@ import java.util.Deque; import org.caosdb.server.database.BackendTransaction; import org.caosdb.server.database.backend.interfaces.RegisterSubDomainImpl; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public class RegisterSubDomain extends BackendTransaction { private final int domainCount; - private Deque<Integer> list; + private Deque<EntityID> list; public RegisterSubDomain(final int domainCount) { this.domainCount = domainCount; @@ -42,7 +43,7 @@ public class RegisterSubDomain extends BackendTransaction { this.list = t.execute(this.domainCount); } - public Deque<Integer> getDomains() { + public Deque<EntityID> getDomains() { return this.list; } } diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveAll.java b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveAll.java index 7b6173ede59720234c58c6ca882e69e4dda9e6b2..e7f27afccec15a324a1247dc220cea79b62b7daf 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveAll.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveAll.java @@ -26,6 +26,7 @@ import java.util.List; import org.caosdb.server.database.BackendTransaction; import org.caosdb.server.database.backend.interfaces.RetrieveAllImpl; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.RetrieveEntity; import org.caosdb.server.entity.container.TransactionContainer; @@ -43,9 +44,9 @@ public class RetrieveAll extends BackendTransaction { public void execute() throws TransactionException { final RetrieveAllImpl t = getImplementation(RetrieveAllImpl.class); - final List<Integer> list = t.execute(this.role); + final List<EntityID> list = t.execute(this.role); - for (final Integer id : list) { + for (final EntityID id : list) { this.container.add(new RetrieveEntity(id)); } } diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveDatatypes.java b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveDatatypes.java index 56efbdd3864c5997758417ad02a97b663dfce6e5..b4a726da8d7b352f69df23a54371feef2d2201c5 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveDatatypes.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveDatatypes.java @@ -28,6 +28,7 @@ import org.caosdb.server.database.backend.interfaces.RetrieveDatatypesImpl; import org.caosdb.server.database.exceptions.TransactionException; import org.caosdb.server.database.proto.VerySparseEntity; import org.caosdb.server.entity.Entity; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.RetrieveEntity; import org.caosdb.server.entity.container.Container; @@ -45,7 +46,7 @@ public class RetrieveDatatypes extends BackendTransaction { public Container<? extends EntityInterface> getDatatypes() { final Container<Entity> ret = new Container<Entity>(); for (final VerySparseEntity vse : this.list) { - final RetrieveEntity entity = new RetrieveEntity(vse.id); + final RetrieveEntity entity = new RetrieveEntity(new EntityID(vse.id)); entity.setName(vse.name); entity.setDescription(vse.description); entity.setRole(vse.role); diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveEntityACLTransaction.java b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveEntityACLTransaction.java index 9cb96112532fe249fd81c3e8d10d85ca900293d9..8ef143b44e292e5b100ff30ca023e91c0adb190e 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveEntityACLTransaction.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveEntityACLTransaction.java @@ -25,15 +25,16 @@ import org.caosdb.server.database.CacheableBackendTransaction; import org.caosdb.server.database.backend.interfaces.RetrieveEntityACLImpl; import org.caosdb.server.database.exceptions.TransactionException; import org.caosdb.server.database.proto.VerySparseEntity; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.permissions.EntityACL; public class RetrieveEntityACLTransaction - extends CacheableBackendTransaction<Integer, VerySparseEntity> { + extends CacheableBackendTransaction<EntityID, VerySparseEntity> { - private Integer id; + private EntityID id; private EntityACL entityAcl; - public RetrieveEntityACLTransaction(Integer id) { + public RetrieveEntityACLTransaction(EntityID id) { // TODO super(null); this.id = id; @@ -42,7 +43,7 @@ public class RetrieveEntityACLTransaction @Override public VerySparseEntity executeNoCache() throws TransactionException { RetrieveEntityACLImpl t = getImplementation(RetrieveEntityACLImpl.class); - return t.execute(getKey()); + return t.execute(getKey().toInteger()); } @Override @@ -51,7 +52,7 @@ public class RetrieveEntityACLTransaction } @Override - protected Integer getKey() { + protected EntityID getKey() { return id; } @@ -59,13 +60,13 @@ public class RetrieveEntityACLTransaction return entityAcl; } - public RetrieveEntityACLTransaction reuse(Integer id) { + public RetrieveEntityACLTransaction reuse(EntityID id) { this.id = id; this.entityAcl = null; return this; } - public static void removeCached(Integer id) { + public static void removeCached(EntityID entityID) { // TODO } } diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveFullEntityTransaction.java b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveFullEntityTransaction.java index e42b854e3284017059f8d0f6bf83a70ddfdfc165..eee73735a07cc2e152e0099bf5d027d1413631b4 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveFullEntityTransaction.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveFullEntityTransaction.java @@ -31,6 +31,7 @@ import org.caosdb.server.database.exceptions.EntityDoesNotExistException; import org.caosdb.server.datatype.CollectionValue; import org.caosdb.server.datatype.IndexedSingleValue; import org.caosdb.server.datatype.ReferenceValue; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.Message; import org.caosdb.server.entity.RetrieveEntity; @@ -67,7 +68,7 @@ public class RetrieveFullEntityTransaction extends BackendTransaction { this.container = container; } - public RetrieveFullEntityTransaction(Integer id) { + public RetrieveFullEntityTransaction(final EntityID id) { this(new RetrieveEntity(id)); } @@ -81,9 +82,10 @@ public class RetrieveFullEntityTransaction extends BackendTransaction { * * @param container */ - public void retrieveFullEntitiesInContainer(Container<? extends EntityInterface> container) { + public void retrieveFullEntitiesInContainer( + final Container<? extends EntityInterface> container) { for (final EntityInterface e : container) { - if (e.hasId() && e.getId() > 0 && e.getEntityStatus() == EntityStatus.QUALIFIED) { + if (e.hasId() && !e.getId().isTemporary() && e.getEntityStatus() == EntityStatus.QUALIFIED) { retrieveFullEntity(e, e.getSelections()); } } @@ -100,7 +102,7 @@ public class RetrieveFullEntityTransaction extends BackendTransaction { * @param e The entity. * @param selections */ - public void retrieveFullEntity(EntityInterface e, List<Selection> selections) { + public void retrieveFullEntity(final EntityInterface e, final List<Selection> selections) { if (!needMoreThanId(selections)) { return; } @@ -180,15 +182,15 @@ public class RetrieveFullEntityTransaction extends BackendTransaction { * selected sub-properties). */ private void resolveReferenceListProperty( - Property p, List<Selection> selections, String propertyName) { + final Property p, final List<Selection> selections, final String propertyName) { try { p.parseValue(); - } catch (Message m) { + } catch (final Message m) { p.addError(m); } - CollectionValue values = (CollectionValue) p.getValue(); - for (IndexedSingleValue sv : values) { + final CollectionValue values = (CollectionValue) p.getValue(); + for (final IndexedSingleValue sv : values) { resolveReferenceValue((ReferenceValue) sv.getWrapped(), selections, propertyName); } } @@ -198,10 +200,10 @@ public class RetrieveFullEntityTransaction extends BackendTransaction { * sub-properties). */ private void resolveReferenceProperty( - Property p, List<Selection> selections, String propertyName) { + final Property p, final List<Selection> selections, final String propertyName) { try { p.parseValue(); - } catch (Message m) { + } catch (final Message m) { p.addError(m); } @@ -215,8 +217,8 @@ public class RetrieveFullEntityTransaction extends BackendTransaction { * #resolveReferenceProperty(Property, List, String)}. */ private void resolveReferenceValue( - ReferenceValue value, List<Selection> selections, String propertyName) { - RetrieveEntity ref = new RetrieveEntity(value.getId()); + final ReferenceValue value, final List<Selection> selections, final String propertyName) { + final RetrieveEntity ref = new RetrieveEntity(value.getId()); // recursion! (Only for the matching selections) retrieveFullEntity(ref, getSubSelects(selections, propertyName)); value.setEntity(ref, true); @@ -228,10 +230,10 @@ public class RetrieveFullEntityTransaction extends BackendTransaction { * @param e * @param selections */ - public void retrieveSubEntities(EntityInterface e, List<Selection> selections) { + public void retrieveSubEntities(final EntityInterface e, final List<Selection> selections) { for (final Selection s : selections) { - String propertyName = s.getSelector(); - for (Property p : e.getProperties()) { + final String propertyName = s.getSelector(); + for (final Property p : e.getProperties()) { if (s.getSubselection() != null) { // The presence of sub-selections means that the properties are // expected to be references (list or plain). @@ -248,7 +250,8 @@ public class RetrieveFullEntityTransaction extends BackendTransaction { } } else { try { - boolean isSubtype = execute(new IsSubType(p.getId(), propertyName)).isSubType(); + final boolean isSubtype = + execute(new IsSubType(p.getId(), propertyName)).isSubType(); if (isSubtype) { // ... handle reference properties that are a subtype of `propertyName`. if (p.getValue() != null) { @@ -263,7 +266,7 @@ public class RetrieveFullEntityTransaction extends BackendTransaction { // wouldn't know what this property is supposed to be. p.setName(propertyName); } - } catch (EntityDoesNotExistException exc) { + } catch (final EntityDoesNotExistException exc) { // unknown parent name. } } @@ -273,11 +276,11 @@ public class RetrieveFullEntityTransaction extends BackendTransaction { if (!propertyName.equalsIgnoreCase(p.getName())) { // ... we only need to cover property sub-typing try { - boolean isSubtype = execute(new IsSubType(p.getId(), propertyName)).isSubType(); + final boolean isSubtype = execute(new IsSubType(p.getId(), propertyName)).isSubType(); if (isSubtype) { p.setName(propertyName); } - } catch (EntityDoesNotExistException exc) { + } catch (final EntityDoesNotExistException exc) { // unknown parent name. } } @@ -296,9 +299,9 @@ public class RetrieveFullEntityTransaction extends BackendTransaction { * @param select * @return A new list of Selections. */ - public List<Selection> getSubSelects(List<Selection> selections, String select) { - List<Selection> result = new LinkedList<>(); - for (Selection s : selections) { + public List<Selection> getSubSelects(final List<Selection> selections, final String select) { + final List<Selection> result = new LinkedList<>(); + for (final Selection s : selections) { if (s.getSelector().equalsIgnoreCase(select) && s.getSubselection() != null) { result.add(s.getSubselection()); } diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveSparseEntity.java index db35c45d52f40e5e6083770878dda4baed61a5a6..aabd490b0fb8a6b5e801f6132113726a9361d258 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveSparseEntity.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveSparseEntity.java @@ -31,8 +31,9 @@ import org.caosdb.server.database.DatabaseUtils; import org.caosdb.server.database.backend.interfaces.RetrieveSparseEntityImpl; import org.caosdb.server.database.exceptions.TransactionException; import org.caosdb.server.database.proto.SparseEntity; -import org.caosdb.server.entity.Entity; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; +import org.caosdb.server.entity.RetrieveEntity; import org.caosdb.server.utils.EntityStatus; public class RetrieveSparseEntity extends CacheableBackendTransaction<String, SparseEntity> { @@ -42,7 +43,7 @@ public class RetrieveSparseEntity extends CacheableBackendTransaction<String, Sp Cache.getCache("BACKEND_SparseEntities"); /** - * To be called by {@link UpdateSparseEntity} and {@link DeleteSparseEntity} on execution. + * To be called by {@link UpdateSparseEntity} and {@link DeleteEntityTransaction} on execution. * * @param entity */ @@ -58,11 +59,16 @@ public class RetrieveSparseEntity extends CacheableBackendTransaction<String, Sp this.entity = entity; } - public RetrieveSparseEntity(final int id, final String version) { - this(new Entity(id)); + public RetrieveSparseEntity(final EntityID id, final String version) { + this(new RetrieveEntity(id)); this.entity.getVersion().setId(version); } + public RetrieveSparseEntity(SparseEntity entity) { + this(new RetrieveEntity(new EntityID(entity.id))); + this.entity.getVersion().setId(entity.versionId); + } + @Override public SparseEntity executeNoCache() throws TransactionException { final RetrieveSparseEntityImpl t = getImplementation(RetrieveSparseEntityImpl.class); diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/SetFileCheckedTimestamp.java b/src/main/java/org/caosdb/server/database/backend/transaction/SetFileCheckedTimestamp.java index f7bf76c3d1cdcde7e712dd6d1ebe022c7300bea8..a96c028614baaaabe445e44cd0c4f5088db9ca42 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/SetFileCheckedTimestamp.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/SetFileCheckedTimestamp.java @@ -25,13 +25,14 @@ package org.caosdb.server.database.backend.transaction; import org.caosdb.server.database.BackendTransaction; import org.caosdb.server.database.backend.interfaces.SetFileCheckedTimestampImpl; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; public class SetFileCheckedTimestamp extends BackendTransaction { private final Long ts; - private final Integer id; + private final EntityID id; - public SetFileCheckedTimestamp(final Integer id, final Long ts) { + public SetFileCheckedTimestamp(final EntityID id, final Long ts) { this.id = id; this.ts = ts; } diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/VersionTransaction.java b/src/main/java/org/caosdb/server/database/backend/transaction/VersionTransaction.java index ee617a1c1110e9a01e9a6d6ee4c799e44cd66ab3..568528f8e779c578c5c45436d71ae016cf7611b8 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/VersionTransaction.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/VersionTransaction.java @@ -31,6 +31,7 @@ import org.caosdb.server.database.CacheableBackendTransaction; import org.caosdb.server.database.backend.interfaces.RetrieveVersionHistoryImpl; import org.caosdb.server.database.exceptions.TransactionException; import org.caosdb.server.database.proto.VersionHistoryItem; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.Version; @@ -43,11 +44,11 @@ import org.caosdb.server.entity.Version; * @author Timm Fitschen (t.fitschen@indiscale.com) */ public abstract class VersionTransaction - extends CacheableBackendTransaction<Integer, HashMap<String, VersionHistoryItem>> { + extends CacheableBackendTransaction<EntityID, HashMap<String, VersionHistoryItem>> { - private static final ICacheAccess<Integer, HashMap<String, VersionHistoryItem>> cache = + private static final ICacheAccess<EntityID, HashMap<String, VersionHistoryItem>> cache = Cache.getCache("BACKEND_RetrieveVersionHistory"); - private EntityInterface entity; + private final EntityInterface entity; /** A map of all history items which belong to this entity. The keys are the version ids. */ private HashMap<String, VersionHistoryItem> historyItems; @@ -57,30 +58,30 @@ public abstract class VersionTransaction * * @param entityId */ - public static void removeCached(Integer entityId) { + public static void removeCached(final EntityID entityId) { cache.remove(entityId); } - public VersionTransaction(EntityInterface e) { + public VersionTransaction(final EntityInterface e) { super(cache); this.entity = e; } @Override public HashMap<String, VersionHistoryItem> executeNoCache() throws TransactionException { - RetrieveVersionHistoryImpl impl = getImplementation(RetrieveVersionHistoryImpl.class); + final RetrieveVersionHistoryImpl impl = getImplementation(RetrieveVersionHistoryImpl.class); return impl.execute(getKey()); } /** After this method call, the version map is available to the object. */ @Override - protected void process(HashMap<String, VersionHistoryItem> historyItems) + protected void process(final HashMap<String, VersionHistoryItem> historyItems) throws TransactionException { this.historyItems = historyItems; } @Override - protected Integer getKey() { + protected EntityID getKey() { return entity.getId(); } @@ -103,17 +104,18 @@ public abstract class VersionTransaction * @param transitive * @return A list of predecessors. */ - protected List<Version> getPredecessors(String versionId, boolean transitive) { - LinkedList<Version> result = new LinkedList<>(); + protected List<Version> getPredecessors(final String versionId, final boolean transitive) { + final LinkedList<Version> result = new LinkedList<>(); if (getHistoryItems().containsKey(versionId) - && getHistoryItems().get(versionId).parents != null) - for (String p : getHistoryItems().get(versionId).parents) { - Version predecessor = getVersion(p); + && getHistoryItems().get(versionId).parents != null) { + for (final String p : getHistoryItems().get(versionId).parents) { + final Version predecessor = getVersion(p); if (transitive) { predecessor.setPredecessors(getPredecessors(p, transitive)); } result.add(predecessor); } + } return result; } @@ -137,15 +139,15 @@ public abstract class VersionTransaction * @param transitive * @return A list of successors. */ - protected List<Version> getSuccessors(String versionId, boolean transitive) { - LinkedList<Version> result = new LinkedList<>(); + protected List<Version> getSuccessors(final String versionId, final boolean transitive) { + final LinkedList<Version> result = new LinkedList<>(); outer: - for (VersionHistoryItem i : getHistoryItems().values()) { - if (i.parents != null) - for (String p : i.parents) { + for (final VersionHistoryItem i : getHistoryItems().values()) { + if (i.parents != null) { + for (final String p : i.parents) { if (versionId.equals(p)) { - Version successor = getVersion(i.id); + final Version successor = getVersion(i.id); result.add(successor); if (transitive) { successor.setSuccessors(getSuccessors(i.id, transitive)); @@ -153,6 +155,7 @@ public abstract class VersionTransaction continue outer; } } + } } return result; } diff --git a/src/main/java/org/caosdb/server/database/exceptions/TransactionException.java b/src/main/java/org/caosdb/server/database/exceptions/TransactionException.java index ac76fe76afe9a29532071978efe47d132cb4aa9d..6564ed49914d2080b15bf08f74c8361cfaa34db7 100644 --- a/src/main/java/org/caosdb/server/database/exceptions/TransactionException.java +++ b/src/main/java/org/caosdb/server/database/exceptions/TransactionException.java @@ -33,4 +33,8 @@ public class TransactionException extends RuntimeException { public TransactionException(final Throwable t) { super(t); } + + public TransactionException(String message, Exception cause) { + super(message, cause); + } } diff --git a/src/main/java/org/caosdb/server/datatype/AbstractDatatype.java b/src/main/java/org/caosdb/server/datatype/AbstractDatatype.java index 8dd9c22df4441db8b0fe882f613eb742106c983b..583145fb19361adf08ae81bf8c9e338d53ad908f 100644 --- a/src/main/java/org/caosdb/server/datatype/AbstractDatatype.java +++ b/src/main/java/org/caosdb/server/datatype/AbstractDatatype.java @@ -23,6 +23,7 @@ package org.caosdb.server.datatype; import java.util.HashMap; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.Message; import org.caosdb.server.entity.container.Container; @@ -48,7 +49,7 @@ public abstract class AbstractDatatype { new HashMap<String, AbstractDatatype>(); protected String name = null; - protected Integer id = null; + protected EntityID id = null; protected String desc = null; public abstract Value parseValue(Object value) throws Message; @@ -64,7 +65,7 @@ public abstract class AbstractDatatype { return ret; } - public static AbstractDatatype datatypeFactory(final Integer datatype) { + public static AbstractDatatype datatypeFactory(final EntityID datatype) { for (final AbstractDatatype abstractDatatype : instances.values()) { if (abstractDatatype.getId().equals(datatype)) { return abstractDatatype; @@ -98,7 +99,7 @@ public abstract class AbstractDatatype { } } - public Integer getId() { + public EntityID getId() { return this.id; } diff --git a/src/main/java/org/caosdb/server/datatype/ReferenceDatatype2.java b/src/main/java/org/caosdb/server/datatype/ReferenceDatatype2.java index 6d96d6deaae43d4d854875424129b7558d0fddf0..503e4679335381da6c08b746af8ed14665bd409b 100644 --- a/src/main/java/org/caosdb/server/datatype/ReferenceDatatype2.java +++ b/src/main/java/org/caosdb/server/datatype/ReferenceDatatype2.java @@ -22,6 +22,7 @@ */ package org.caosdb.server.datatype; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.Message; @@ -38,11 +39,11 @@ public class ReferenceDatatype2 extends ReferenceDatatype { } @Override - public Integer getId() { + public EntityID getId() { return this.refid.getId(); } - public void setId(final Integer id) { + public void setId(final EntityID id) { this.refid.setId(id); } diff --git a/src/main/java/org/caosdb/server/datatype/ReferenceValue.java b/src/main/java/org/caosdb/server/datatype/ReferenceValue.java index 525d3c43160adc4b47925c19cafe2acd2b6b2246..a24e2ddfda7faf333fd7d7f64420d4a6c7fdc290 100644 --- a/src/main/java/org/caosdb/server/datatype/ReferenceValue.java +++ b/src/main/java/org/caosdb/server/datatype/ReferenceValue.java @@ -29,6 +29,7 @@ package org.caosdb.server.datatype; import java.util.Objects; import org.caosdb.server.datatype.AbstractDatatype.Table; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.Message; import org.caosdb.server.utils.ServerMessages; @@ -45,7 +46,7 @@ import org.jdom2.Element; public class ReferenceValue implements SingleValue { private EntityInterface entity = null; private String name = null; - private Integer id = null; + private EntityID id = null; private String version = null; private boolean versioned = false; @@ -59,7 +60,7 @@ public class ReferenceValue implements SingleValue { } else if (reference instanceof ReferenceValue) { return (ReferenceValue) reference; } else if (reference instanceof GenericValue) { - String str = ((GenericValue) reference).toDatabaseString(); + final String str = ((GenericValue) reference).toDatabaseString(); return parseFromString(str); } else if (reference instanceof CollectionValue) { throw ServerMessages.DATA_TYPE_DOES_NOT_ACCEPT_COLLECTION_VALUES; @@ -77,8 +78,8 @@ public class ReferenceValue implements SingleValue { * * <p>If parsing the entity ID part to an integer fails, a NumberFormatException may be thrown. */ - public static ReferenceValue parseIdVersion(String str) { - String[] split = str.split("@", 2); + public static ReferenceValue parseIdVersion(final String str) { + final String[] split = str.split("@", 2); if (split.length == 2) { return new ReferenceValue(Integer.parseInt(split[0]), split[1]); } else { @@ -92,7 +93,7 @@ public class ReferenceValue implements SingleValue { * <p>If the string looks like a valid "entityID@version" string, the result will have the * corresponding entity and version parts. */ - public static ReferenceValue parseFromString(String str) { + public static ReferenceValue parseFromString(final String str) { try { return parseIdVersion(str); } catch (final NumberFormatException e) { @@ -131,16 +132,16 @@ public class ReferenceValue implements SingleValue { return this.id.toString(); } - public ReferenceValue(final EntityInterface entity, boolean versioned) { + public ReferenceValue(final EntityInterface entity, final boolean versioned) { this.versioned = versioned; this.entity = entity; } - public ReferenceValue(final Integer id) { + public ReferenceValue(final EntityID id) { this(id, null); } - public ReferenceValue(final Integer id, final String version) { + public ReferenceValue(final EntityID id, final String version) { this.id = id; this.version = version; this.versioned = version != null; @@ -151,11 +152,19 @@ public class ReferenceValue implements SingleValue { this.name = name; } + public ReferenceValue(final int id, final String name) { + this(new EntityID(id), name); + } + + public ReferenceValue(final int id) { + this(new EntityID(id)); + } + public final EntityInterface getEntity() { return this.entity; } - public final void setEntity(final EntityInterface entity, boolean versioned) { + public final void setEntity(final EntityInterface entity, final boolean versioned) { this.versioned = versioned; this.entity = entity; } @@ -167,7 +176,7 @@ public class ReferenceValue implements SingleValue { return this.name; } - public final Integer getId() { + public final EntityID getId() { if (this.entity != null && this.entity.hasId()) { return this.entity.getId(); } @@ -181,7 +190,7 @@ public class ReferenceValue implements SingleValue { return this.version; } - public final void setId(final Integer id) { + public final void setId(final EntityID id) { this.id = id; } diff --git a/src/main/java/org/caosdb/server/entity/DeleteEntity.java b/src/main/java/org/caosdb/server/entity/DeleteEntity.java index 37377534f721a3d93455473b7a8a58fb7d50f287..38e8385ac88146809254ba0e0b39c8b4be55db85 100644 --- a/src/main/java/org/caosdb/server/entity/DeleteEntity.java +++ b/src/main/java/org/caosdb/server/entity/DeleteEntity.java @@ -26,11 +26,11 @@ package org.caosdb.server.entity; public class DeleteEntity extends Entity { - public DeleteEntity(final int id) { + public DeleteEntity(final EntityID id) { super(id); } - public DeleteEntity(int id, String version) { + public DeleteEntity(final EntityID id, final String version) { super(id); setVersion(new Version(version)); } diff --git a/src/main/java/org/caosdb/server/entity/Entity.java b/src/main/java/org/caosdb/server/entity/Entity.java index 07c451a328b8a1a6d52810f25f78276699fce797..2668e770d6f779e0b3121f30aa1778dccf6c9d93 100644 --- a/src/main/java/org/caosdb/server/entity/Entity.java +++ b/src/main/java/org/caosdb/server/entity/Entity.java @@ -63,18 +63,19 @@ import org.caosdb.server.utils.TransactionLogMessage; import org.caosdb.unit.Unit; import org.jdom2.Element; -public class Entity extends AbstractObservable implements EntityInterface { +public abstract class Entity extends AbstractObservable implements EntityInterface { public static final String DATATYPE_CHANGED_EVENT = "DatatypeChangedEvent"; public static final String ENTITY_STATUS_CHANGED_EVENT = "EntityStatusChangedEvent"; private Unit unit = null; private Role role = null; - private EntityStatus entityStatus = null; + private EntityStatus entityStatus = EntityStatus.QUALIFIED; private FileProperties fileProperties = null; private String name = null; private String description = null; private Value value = null; - private final IntegerWrapper id = new IntegerWrapper(); + private final EntityID domain = new EntityID(0); + private final EntityID id = new EntityID(); private AbstractDatatype datatype = null; private final ParentContainer parents = new ParentContainer(this); private final PropertyContainer properties = new PropertyContainer(this); @@ -124,13 +125,13 @@ public class Entity extends AbstractObservable implements EntityInterface { } @Override - public boolean hasPermission(Permission permission) { + public boolean hasPermission(final Permission permission) { final Subject subject = SecurityUtils.getSubject(); return hasPermission(subject, permission); } @Override - public boolean hasPermission(Subject subject, Permission permission) { + public boolean hasPermission(final Subject subject, final Permission permission) { return this.entityACL.isPermitted(subject, permission); } @@ -200,39 +201,9 @@ public class Entity extends AbstractObservable implements EntityInterface { return this.datatype != null; } - private class IntegerWrapper { - Integer i = null; - EntityInterface link = null; - - void setId(final Integer i) { - this.i = i; - } - - public Integer toInteger() { - if (this.link != null) { - return this.link.getId(); - } - return this.i; - } - - @Override - public String toString() { - return toInteger().toString(); - } - - boolean hasId() { - return this.i != null || (this.link != null && this.link.hasId()); - } - } - @Override - public final Integer getId() { - return this.id.toInteger(); - } - - @Override - public final void setId(final Integer id) { - this.id.setId(id); + public final EntityID getId() { + return this.id; } @Override @@ -242,7 +213,7 @@ public class Entity extends AbstractObservable implements EntityInterface { @Override public EntityInterface linkIdToEntity(final EntityInterface link) { - this.id.link = link; + this.id.link(link); return this; } @@ -316,7 +287,7 @@ public class Entity extends AbstractObservable implements EntityInterface { @Override public final void setEntityStatus(final EntityStatus entityStatus) { - if (hasEntityStatus() && getEntityStatus() == entityStatus) { + if (getEntityStatus() == entityStatus) { return; } if (this.entityStatus == EntityStatus.UNQUALIFIED) { @@ -379,7 +350,7 @@ public class Entity extends AbstractObservable implements EntityInterface { @Override public SparseEntity getSparseEntity() { final SparseEntity ret = new SparseEntity(); - ret.id = getId(); + ret.id = getId().toInteger(); ret.name = getName(); ret.description = getDescription(); ret.acl = getEntityACL().serialize(); @@ -402,27 +373,18 @@ public class Entity extends AbstractObservable implements EntityInterface { return ret; } - public Entity() { - setEntityStatus(EntityStatus.QUALIFIED); + @Override + public void setId(final EntityID id) { + this.id.link(id); } - public Entity(final Integer id) { - this(); - setId(id); - } + public Entity() {} - public Entity(final Element e) { - try { - setRole(e.getName().toUpperCase()); - parseFromElement(e); - } catch (final NoSuchRoleException exc) { - parseFromElement(e); - setEntityStatus(EntityStatus.UNQUALIFIED); - addError(ServerMessages.NO_SUCH_ENTITY_ROLE(e.getName())); - } + public Entity(EntityID id) { + setId(id); } - public Entity(final Integer id, final Role role) { + public Entity(final EntityID id, final Role role) { this(id); if (role != null) { setRole(role); @@ -447,10 +409,19 @@ public class Entity extends AbstractObservable implements EntityInterface { } public Entity(final String name) { - this(); setName(name); } + public Entity(final Element e) { + try { + setRole(e.getName().toUpperCase()); + parseFromElement(e); + } catch (final NoSuchRoleException exc) { + parseFromElement(e); + addError(ServerMessages.NO_SUCH_ENTITY_ROLE(e.getName())); + } + } + private StatementStatus statementStatus = null; /** @@ -555,13 +526,13 @@ public class Entity extends AbstractObservable implements EntityInterface { } @Override - public void addToElement(Element element, SerializeFieldStrategy strategy) { + public void addToElement(final Element element, final SerializeFieldStrategy strategy) { getToElementStrategy().addToElement(this, element, strategy); } @Override - public Integer getDomain() { - return 0; + public EntityID getDomain() { + return domain; } /** Errors, Warnings and Info messages for this entity. */ @@ -676,7 +647,7 @@ public class Entity extends AbstractObservable implements EntityInterface { // Parse ID. Generate error if it isn't an integer. if (element.getAttribute("id") != null && !element.getAttributeValue("id").equals("")) { try { - setId(Integer.parseInt(element.getAttributeValue("id"))); + setId(new EntityID(Integer.parseInt(element.getAttributeValue("id")))); } catch (final NumberFormatException e) { addInfo("Id was " + element.getAttributeValue("id") + "."); addError(ServerMessages.PARSING_FAILED); @@ -708,7 +679,7 @@ public class Entity extends AbstractObservable implements EntityInterface { // Parse UNIT. if (element.getAttribute("unit") != null && !element.getAttributeValue("unit").equals("")) { final EntityInterface magicUnit = MagicTypes.UNIT.getEntity(); - final Property unit = new Property(); + final Property unit = new Property(new RetrieveEntity()); unit.setDescription(magicUnit.getDescription()); unit.setName(magicUnit.getName()); unit.setId(magicUnit.getId()); @@ -755,13 +726,13 @@ public class Entity extends AbstractObservable implements EntityInterface { // Parse sub elements which represent PROPERTIES of this // record. - final Property property = new Property(pe); + final Property property = new Property(new WritableEntity(pe, Role.Property)); property.setPIdx(pidx++); addProperty(property); } else if (pe.getName().equalsIgnoreCase("Parent")) { // Parse sub elements which represent PARENTS of this // record. - final Parent parent = new Parent(pe); + final Parent parent = new Parent(new WritableEntity(pe, null)); addParent(parent); } else if (pe.getName().equalsIgnoreCase("EntityACL")) { // Parse and concatenate EntityACL @@ -861,7 +832,7 @@ public class Entity extends AbstractObservable implements EntityInterface { @Override public String toString() { - return (getRole().toString()) + return getRole().toString() + (hasId() ? "(" + getId().toString() + ")" : "()") + (hasCuid() ? "[" + getCuid() + "]" : "[]") + (hasName() ? "(" + getName() + ")" : "()") @@ -981,7 +952,7 @@ public class Entity extends AbstractObservable implements EntityInterface { @Override public final EntityInterface parseSparseEntity(final SparseEntity spe) { - setId(spe.id); + setId(new EntityID(spe.id)); this.setRole(spe.role); setEntityACL(spe.acl); if (spe.versionId != null) { @@ -1047,7 +1018,7 @@ public class Entity extends AbstractObservable implements EntityInterface { } @Override - public void setVersion(Version version) { + public void setVersion(final Version version) { this.version = version; } diff --git a/src/main/java/org/caosdb/server/entity/EntityID.java b/src/main/java/org/caosdb/server/entity/EntityID.java new file mode 100644 index 0000000000000000000000000000000000000000..6a2d2ca368088e54c2f3c77ae669c6feda07bb4e --- /dev/null +++ b/src/main/java/org/caosdb/server/entity/EntityID.java @@ -0,0 +1,80 @@ +package org.caosdb.server.entity; + +import java.io.Serializable; +import java.util.Objects; + +/** + * EntityID + * + * <p>This class is an abstraction layer for the entity id. + * + * <p>It also allows to link entities together, e.g. an Entity's Property with the corresponding + * abstract Property, even when the abstract Property does not have a valid ID yet (during bulk + * inserts). + */ +public class EntityID implements Serializable { + + private static final long serialVersionUID = -9092133023135548179L; + + public static final EntityID DEFAULT_DOMAIN = new EntityID(0); + private Integer i = null; + private EntityID link = null; + + public EntityID() {} + + public EntityID(final Integer id) { + this.i = id; + } + + public void setId(final Integer i) { + this.i = i; + } + + public Integer toInteger() { + if (this.link != null) { + return this.link.toInteger(); + } + return this.i; + } + + @Override + public String toString() { + return toInteger().toString(); + } + + boolean hasId() { + return this.i != null || this.link != null && this.link.hasId(); + } + + public void link(final EntityInterface entity) { + this.link = entity.getId(); + } + + public void link(final EntityID entityId) { + this.link = entityId; + } + + @Override + public boolean equals(final Object obj) { + if (obj instanceof EntityID) { + return Objects.equals(((EntityID) obj).toInteger(), this.toInteger()); + } + return false; + } + + @Override + public int hashCode() { + if (this.hasId()) { + return toInteger(); + } + return super.hashCode(); + } + + public boolean isTemporary() { + return toInteger() < 0; + } + + public static boolean isReserved(final EntityID id) { + return id.toInteger() < 100; + } +} diff --git a/src/main/java/org/caosdb/server/entity/EntityInterface.java b/src/main/java/org/caosdb/server/entity/EntityInterface.java index cfb4c28050f871684044c6216081101759a1cf17..f967b307a1ea13a16d7e9225cb038a15f6883727 100644 --- a/src/main/java/org/caosdb/server/entity/EntityInterface.java +++ b/src/main/java/org/caosdb/server/entity/EntityInterface.java @@ -50,11 +50,11 @@ public interface EntityInterface public abstract SparseEntity getSparseEntity(); - public abstract Integer getId(); + public abstract EntityID getId(); public abstract String getIdVersion(); - public abstract void setId(Integer id); + public abstract void setId(EntityID id); public abstract boolean hasId(); @@ -157,7 +157,7 @@ public interface EntityInterface public abstract boolean hasUnit(); - public abstract Integer getDomain(); + public abstract EntityID getDomain(); public abstract EntityInterface parseSparseEntity(SparseEntity spe); diff --git a/src/main/java/org/caosdb/server/entity/InsertEntity.java b/src/main/java/org/caosdb/server/entity/InsertEntity.java index 4f7c33015e6ba70fb3d062ff4b32c27ebd80b8a8..b88b319fc956d9d0ee4f34d99d9abef94819ea86 100644 --- a/src/main/java/org/caosdb/server/entity/InsertEntity.java +++ b/src/main/java/org/caosdb/server/entity/InsertEntity.java @@ -26,11 +26,15 @@ import org.jdom2.Element; public class InsertEntity extends WritableEntity { - public InsertEntity(final Element element) { - super(element); + public InsertEntity(final Element element, Role role) { + super(element, role); } public InsertEntity(String name, Role role) { super(name, role); } + + public InsertEntity(Element e) { + super(e); + } } diff --git a/src/main/java/org/caosdb/server/entity/MagicTypes.java b/src/main/java/org/caosdb/server/entity/MagicTypes.java index f17d448ca934901dc491f1d737f9122e2a67862a..39556385235e6b72736bed8dff67a178cfe60aff 100644 --- a/src/main/java/org/caosdb/server/entity/MagicTypes.java +++ b/src/main/java/org/caosdb/server/entity/MagicTypes.java @@ -23,6 +23,7 @@ package org.caosdb.server.entity; import java.util.HashMap; +import java.util.Objects; import org.caosdb.server.entity.container.RetrieveContainer; import org.caosdb.server.transaction.Retrieve; @@ -32,21 +33,25 @@ public enum MagicTypes { NAME, DESCRIPTION; - public int getId() { + private static final EntityID UNIT_ID = new EntityID(21); + private static final EntityID DESCRIPTION_ID = new EntityID(24); + private static final EntityID NAME_ID = new EntityID(20); + + public EntityID getId() { switch (this) { case UNIT: - return 21; + return UNIT_ID; case NAME: - return 20; + return NAME_ID; case DESCRIPTION: - return 24; + return DESCRIPTION_ID; default: - return -1; + return null; } } - public static MagicTypes getType(final int id) { - switch (id) { + public static MagicTypes getType(final EntityID id) { + switch (id.toInteger()) { case 21: return UNIT; case 20: @@ -85,7 +90,7 @@ public enum MagicTypes { final HashMap<MagicTypes, EntityInterface> ret = new HashMap<MagicTypes, EntityInterface>(); for (final MagicTypes mt : MagicTypes.values()) { for (final EntityInterface e : container) { - if (e.getId() == mt.getId()) { + if (Objects.equals(e.getId(), mt.getId())) { ret.put(mt, e); } } diff --git a/src/main/java/org/caosdb/server/entity/RetrieveEntity.java b/src/main/java/org/caosdb/server/entity/RetrieveEntity.java index 35e34feda25c3ed7087c3c909a49a5833bce3698..2d1ca6f2175ca2377b7f1a73f847a48377cc4694 100644 --- a/src/main/java/org/caosdb/server/entity/RetrieveEntity.java +++ b/src/main/java/org/caosdb/server/entity/RetrieveEntity.java @@ -26,21 +26,33 @@ package org.caosdb.server.entity; public class RetrieveEntity extends Entity { - public RetrieveEntity(final int id) { + public RetrieveEntity() { + super(); + } + + public RetrieveEntity(final EntityID id) { super(id); } + public RetrieveEntity(final EntityID id, final Role role) { + super(id, role); + } + public RetrieveEntity(final String name) { super(name); } - public RetrieveEntity(int id, String version) { + public RetrieveEntity(final EntityID id, final String version) { super(id); this.setVersion(new Version(version)); } - public RetrieveEntity(String name, String version) { + public RetrieveEntity(final String name, final String version) { super(name); this.setVersion(new Version(version)); } + + public RetrieveEntity(final String name, final Role role) { + super(name, role); + } } diff --git a/src/main/java/org/caosdb/server/entity/Role.java b/src/main/java/org/caosdb/server/entity/Role.java index 0ce45641b5280bca29a0d61b66a9435b9e3297e6..f86158a99be307867c17f136a26e1097e6e7bc5f 100644 --- a/src/main/java/org/caosdb/server/entity/Role.java +++ b/src/main/java/org/caosdb/server/entity/Role.java @@ -37,17 +37,17 @@ public enum Role { Property, DataType, QueryTemplate; - private static HashMap<Role, Integer> ids = null; + private static HashMap<Role, EntityID> ids = null; public static void init(final Access access) throws Exception { - ids = new HashMap<Role, Integer>(); + ids = new HashMap<>(); for (final Role r : Role.values()) { ids.put(r, execute(new GetIDByName(r.name(), "ROLE"), access).getId()); } } - private static GetIDByName execute(GetIDByName getIDByName, Access access) { + private static GetIDByName execute(final GetIDByName getIDByName, final Access access) { getIDByName.setAccess(access); getIDByName.executeTransaction(); return getIDByName; @@ -62,7 +62,7 @@ public enum Role { throw new NoSuchRoleException("No such role '" + str + "'."); } - public Integer getId() { + public EntityID getId() { return ids.get(this); } diff --git a/src/main/java/org/caosdb/server/entity/UpdateEntity.java b/src/main/java/org/caosdb/server/entity/UpdateEntity.java index c5727e8257e4826b25408f35577eee4bc588e6f5..45df0abac4d742cb024deb7f2327820cb71ebe8a 100644 --- a/src/main/java/org/caosdb/server/entity/UpdateEntity.java +++ b/src/main/java/org/caosdb/server/entity/UpdateEntity.java @@ -33,15 +33,27 @@ import org.jdom2.Element; */ public class UpdateEntity extends WritableEntity { + public UpdateEntity(final Element element, Role role) { + super(element, role); + } + + public UpdateEntity(Element e) { + this(e, Role.parse(e.getName())); + } + /** The previous version of this entity. */ private EntityInterface original = null; - public UpdateEntity(final Element element) { - super(element); + public UpdateEntity(final EntityID id, final Role role) { + super(id, role); } - public UpdateEntity(final Integer id, final Role role) { - super(id, role); + public UpdateEntity(final EntityID id) { + this(id, null); + } + + public UpdateEntity() { + this((EntityID) null); } @Override diff --git a/src/main/java/org/caosdb/server/entity/WritableEntity.java b/src/main/java/org/caosdb/server/entity/WritableEntity.java index 147feb0c43de65e9fa204207b29ae27df4251721..6c967cc4e3404c7940066dc123bf805785a6e4c3 100644 --- a/src/main/java/org/caosdb/server/entity/WritableEntity.java +++ b/src/main/java/org/caosdb/server/entity/WritableEntity.java @@ -25,15 +25,21 @@ import org.jdom2.Element; public class WritableEntity extends Entity { - public WritableEntity(final Element element) { - super(element); + public WritableEntity(final Element element, Role role) { + super(); + setRole(role); + parseFromElement(element); } public WritableEntity(final String name, final Role role) { super(name, role); } - public WritableEntity(final Integer id, final Role role) { + public WritableEntity(Element e) { + super(e); + } + + public WritableEntity(final EntityID id, final Role role) { super(id, role); } } diff --git a/src/main/java/org/caosdb/server/entity/container/Container.java b/src/main/java/org/caosdb/server/entity/container/Container.java index dc38041abe24d5b5d2e55e7ae698e092848b34c2..1618fbed6a1594891ea3ddc615f48869227f2c92 100644 --- a/src/main/java/org/caosdb/server/entity/container/Container.java +++ b/src/main/java/org/caosdb/server/entity/container/Container.java @@ -25,6 +25,7 @@ package org.caosdb.server.entity.container; import java.util.ArrayList; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; public class Container<T extends EntityInterface> extends ArrayList<T> { @@ -34,7 +35,7 @@ public class Container<T extends EntityInterface> extends ArrayList<T> { /** * Return the entity with the matching id, if it can be found inside this Container, else null. */ - public T getEntityById(final Integer id) { + public T getEntityById(final EntityID id) { for (final T e : this) { if (e.hasId() && e.getId().equals(id)) { return e; diff --git a/src/main/java/org/caosdb/server/entity/container/EntityByIdContainer.java b/src/main/java/org/caosdb/server/entity/container/EntityByIdContainer.java index 466a93091e1a55d7f9d59c7d3a941058e4204a2e..a8c3e6a832848903884edda270e003a0c0dd6feb 100644 --- a/src/main/java/org/caosdb/server/entity/container/EntityByIdContainer.java +++ b/src/main/java/org/caosdb/server/entity/container/EntityByIdContainer.java @@ -24,6 +24,7 @@ package org.caosdb.server.entity.container; import java.util.HashMap; import org.apache.shiro.subject.Subject; +import org.caosdb.server.entity.EntityID; public abstract class EntityByIdContainer extends TransactionContainer { private static final long serialVersionUID = 7997517210502207523L; @@ -36,7 +37,7 @@ public abstract class EntityByIdContainer extends TransactionContainer { super(user, timestamp, srid, flags); } - public abstract void add(int id); + public abstract void add(EntityID id); - public abstract void add(int id, String version); + public abstract void add(EntityID id, String version); } diff --git a/src/main/java/org/caosdb/server/entity/container/RetrieveContainer.java b/src/main/java/org/caosdb/server/entity/container/RetrieveContainer.java index 3b847f1af9d9d642c2606820dc2993f00911ed06..bc0da7c1de2bb876551d29ad7daffb50494f9720 100644 --- a/src/main/java/org/caosdb/server/entity/container/RetrieveContainer.java +++ b/src/main/java/org/caosdb/server/entity/container/RetrieveContainer.java @@ -24,6 +24,7 @@ package org.caosdb.server.entity.container; import java.util.HashMap; import org.apache.shiro.subject.Subject; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.RetrieveEntity; public class RetrieveContainer extends EntityByIdContainer { @@ -39,7 +40,7 @@ public class RetrieveContainer extends EntityByIdContainer { } @Override - public void add(final int id) { + public void add(final EntityID id) { add(new RetrieveEntity(id)); } @@ -47,12 +48,12 @@ public class RetrieveContainer extends EntityByIdContainer { add(new RetrieveEntity(name)); } - public void add(final String name, String version) { + public void add(final String name, final String version) { add(new RetrieveEntity(name, version)); } @Override - public void add(int id, String version) { + public void add(final EntityID id, final String version) { add(new RetrieveEntity(id, version)); } } diff --git a/src/main/java/org/caosdb/server/entity/container/TransactionContainer.java b/src/main/java/org/caosdb/server/entity/container/TransactionContainer.java index 7e9a2ba36bc1fe7474e8dc57a9fe3e2d5e649c6f..289287c82fcd32092d15cb1f10a9dbbd83e77fde 100644 --- a/src/main/java/org/caosdb/server/entity/container/TransactionContainer.java +++ b/src/main/java/org/caosdb/server/entity/container/TransactionContainer.java @@ -30,6 +30,8 @@ import org.caosdb.server.CaosDBServer; import org.caosdb.server.database.misc.TransactionBenchmark; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.FileProperties; +import org.caosdb.server.entity.Message; +import org.caosdb.server.entity.Message.MessageType; import org.caosdb.server.entity.xml.ToElementable; import org.caosdb.server.jobs.JobTarget; import org.caosdb.server.utils.EntityStatus; @@ -171,4 +173,14 @@ public class TransactionContainer extends Container<EntityInterface> public boolean skipJob() { return false; } + + @Override + public void addError(Message m) { + setStatus(EntityStatus.UNQUALIFIED); + if (m.getType().equalsIgnoreCase(MessageType.Error.toString())) { + addMessage(m); + } else { + addMessage(new Message(MessageType.Error, m.getCode(), m.getDescription(), m.getBody())); + } + } } diff --git a/src/main/java/org/caosdb/server/entity/wrapper/EntityWrapper.java b/src/main/java/org/caosdb/server/entity/wrapper/EntityWrapper.java index 2028bee793d1f81525d3e1a86ebd22b7e5d46963..7da945738ac966114a020098171c049a6fa387a3 100644 --- a/src/main/java/org/caosdb/server/entity/wrapper/EntityWrapper.java +++ b/src/main/java/org/caosdb/server/entity/wrapper/EntityWrapper.java @@ -33,6 +33,7 @@ import org.caosdb.server.database.proto.SparseEntity; import org.caosdb.server.database.proto.VerySparseEntity; import org.caosdb.server.datatype.AbstractDatatype; import org.caosdb.server.datatype.Value; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.FileProperties; import org.caosdb.server.entity.Message; @@ -52,7 +53,7 @@ import org.caosdb.server.utils.TransactionLogMessage; import org.caosdb.unit.Unit; import org.jdom2.Element; -public class EntityWrapper implements EntityInterface { +public abstract class EntityWrapper implements EntityInterface { protected EntityInterface entity; private ToElementStrategy s; @@ -96,12 +97,12 @@ public class EntityWrapper implements EntityInterface { } @Override - public Integer getId() { + public EntityID getId() { return this.entity.getId(); } @Override - public void setId(final Integer id) { + public void setId(final EntityID id) { this.entity.setId(id); } @@ -479,7 +480,7 @@ public class EntityWrapper implements EntityInterface { } @Override - public Integer getDomain() { + public EntityID getDomain() { return this.entity.getDomain(); } @@ -532,12 +533,12 @@ public class EntityWrapper implements EntityInterface { } @Override - public boolean hasPermission(Permission permission) { + public boolean hasPermission(final Permission permission) { return this.entity.hasPermission(permission); } @Override - public boolean hasPermission(Subject subject, Permission permission) { + public boolean hasPermission(final Subject subject, final Permission permission) { return this.entity.hasPermission(subject, permission); } @@ -552,7 +553,7 @@ public class EntityWrapper implements EntityInterface { } @Override - public void setVersion(Version version) { + public void setVersion(final Version version) { this.entity.setVersion(version); } @@ -562,7 +563,7 @@ public class EntityWrapper implements EntityInterface { } @Override - public void addToElement(Element element, SerializeFieldStrategy strategy) { + public void addToElement(final Element element, final SerializeFieldStrategy strategy) { this.entity.addToElement(element, strategy); } diff --git a/src/main/java/org/caosdb/server/entity/wrapper/Parent.java b/src/main/java/org/caosdb/server/entity/wrapper/Parent.java index 00336f4a336ed3c7f35408e5996fa7adc936f42a..a2116ac3d0492e8c12487a5e9d6ddafc82b91df8 100644 --- a/src/main/java/org/caosdb/server/entity/wrapper/Parent.java +++ b/src/main/java/org/caosdb/server/entity/wrapper/Parent.java @@ -23,24 +23,13 @@ package org.caosdb.server.entity.wrapper; import org.caosdb.server.entity.Affiliation; -import org.caosdb.server.entity.Entity; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.xml.ParentToElementStrategy; -import org.jdom2.Element; public class Parent extends EntityWrapper { private Affiliation affiliation; - public Parent() { - this(new Entity()); - } - - public Parent(final Element pe) { - this(); - parseFromElement(pe); - } - public Parent(final EntityInterface p) { super(p); setToElementStragegy(new ParentToElementStrategy()); 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 064e2bd31fd329477d712c723ecd6462e94d3933..efa1a6857a8dec0b3d7dcc45ec689d5b3bc0f745 100644 --- a/src/main/java/org/caosdb/server/entity/wrapper/Property.java +++ b/src/main/java/org/caosdb/server/entity/wrapper/Property.java @@ -28,26 +28,15 @@ import org.apache.shiro.subject.Subject; import org.caosdb.server.database.proto.FlatProperty; import org.caosdb.server.datatype.AbstractCollectionDatatype; import org.caosdb.server.datatype.GenericValue; -import org.caosdb.server.entity.Entity; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; -import org.jdom2.Element; +import org.caosdb.server.entity.xml.PropertyToElementStrategy; public class Property extends EntityWrapper { - public Property(final Integer id) { - super(new Entity(id)); - } - - public Property(final Element e) { - super(new Entity(e)); - } - public Property(final EntityInterface prop) { super(prop); - } - - public Property() { - super(new Entity()); + setToElementStragegy(new PropertyToElementStrategy()); } /** Return the Property Index, the index of a property with respect to a containing Entity. */ @@ -70,7 +59,7 @@ public class Property extends EntityWrapper { } @Override - public Integer getDomain() { + public EntityID getDomain() { if (this.domain != null) { return this.domain.getId(); } @@ -84,7 +73,7 @@ public class Property extends EntityWrapper { } public Property parseFlatProperty(final FlatProperty fp) { - setId(fp.id); + setId(new EntityID(fp.id)); setStatementStatus(fp.status); setPIdx(fp.idx); if (fp.name != null) { diff --git a/src/main/java/org/caosdb/server/entity/xml/EntityToElementStrategy.java b/src/main/java/org/caosdb/server/entity/xml/EntityToElementStrategy.java index a274d269b2281ebed59530728c767cb1bca14f4a..7f6e6dcae9152091b854007149b0793cbff45542 100644 --- a/src/main/java/org/caosdb/server/entity/xml/EntityToElementStrategy.java +++ b/src/main/java/org/caosdb/server/entity/xml/EntityToElementStrategy.java @@ -59,7 +59,7 @@ public class EntityToElementStrategy implements ToElementStrategy { * @param entity * @param element */ - public void setDatatype(EntityInterface entity, Element element) { + public void setDatatype(final EntityInterface entity, final Element element) { if (entity.getDatatype().getName() != null) { element.setAttribute("datatype", entity.getDatatype().getName()); } else { @@ -89,7 +89,7 @@ public class EntityToElementStrategy implements ToElementStrategy { element.addContent(entity.getEntityACL().getPermissionsFor(SecurityUtils.getSubject())); } if (serializeFieldStrategy.isToBeSet("id") && entity.hasId()) { - element.setAttribute("id", Integer.toString(entity.getId())); + element.setAttribute("id", entity.getId().toString()); } if (serializeFieldStrategy.isToBeSet("version") && entity.hasVersion()) { Element v = new VersionXMLSerializer().toElement(entity.getVersion()); @@ -148,7 +148,9 @@ public class EntityToElementStrategy implements ToElementStrategy { * @param serializeFieldStrategy */ public void setValue( - EntityInterface entity, Element element, SerializeFieldStrategy serializeFieldStrategy) { + final EntityInterface entity, + final Element element, + final SerializeFieldStrategy serializeFieldStrategy) { if (entity.hasValue()) { try { entity.parseValue(); @@ -161,7 +163,7 @@ public class EntityToElementStrategy implements ToElementStrategy { if (entity.isReference() && serializeFieldStrategy.isToBeSet("_referenced")) { // Append the complete entity. This needs to be done when we are // processing SELECT Queries. - EntityInterface ref = ((ReferenceValue) entity.getValue()).getEntity(); + final EntityInterface ref = ((ReferenceValue) entity.getValue()).getEntity(); if (ref != null) { if (entity.hasDatatype()) { setDatatype(entity, element); @@ -175,22 +177,23 @@ public class EntityToElementStrategy implements ToElementStrategy { // Append the all referenced entities. This needs to be done when we are // processing SELECT Queries. boolean skipValue = false; - for (IndexedSingleValue sv : ((CollectionValue) entity.getValue())) { - EntityInterface ref = ((ReferenceValue) sv.getWrapped()).getEntity(); + for (final IndexedSingleValue sv : (CollectionValue) entity.getValue()) { + final EntityInterface ref = ((ReferenceValue) sv.getWrapped()).getEntity(); if (ref != null) { if (entity.hasDatatype()) { setDatatype(entity, element); } - Element valueElem = new Element("Value"); + final Element valueElem = new Element("Value"); ref.addToElement(valueElem, serializeFieldStrategy); element.addContent(valueElem); skipValue = true; } } - if (skipValue) + if (skipValue) { // the referenced entity has been appended. Return here to suppress // adding the reference id as well. return; + } } if (serializeFieldStrategy.isToBeSet("value")) { diff --git a/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java b/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java index 40fda9d8af48aa0b5736c328d7d2f2c3353c9a1d..fc3c26f664cd81ec27139c2591f52be7af29c3bd 100644 --- a/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java +++ b/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java @@ -105,7 +105,7 @@ public class CaosDBToGrpcConverters { final Builder entityBuilder = Entity.newBuilder(); if (from.hasId() && s.isToBeSet("id")) { - entityBuilder.setId(Integer.toString(from.getId())); + entityBuilder.setId(from.getId().toString()); } if (from.getRole() != null && s.isToBeSet("role")) { entityBuilder.setRole(convert(from.getRole())); diff --git a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java index 50845c5456c98ee59a1b4d1a05bae0e84d712774..315358deacf2d77828add722d29a6c4643acd283 100644 --- a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java +++ b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java @@ -302,7 +302,7 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa // put inserted/updated/deleted entities back into the response for (final EntityInterface entity : container) { final IdResponse.Builder idResponse = IdResponse.newBuilder(); - if (entity.getId() != null) { + if (entity.hasId()) { idResponse.setId(entity.getId().toString()); } caosdbToGrpc.appendMessages(entity, idResponse); diff --git a/src/main/java/org/caosdb/server/grpc/GrpcToCaosDBConverters.java b/src/main/java/org/caosdb/server/grpc/GrpcToCaosDBConverters.java index d7c515a433cfa82f0bea046a1856dd9fb309b915..0430a795457152141473c2819997ebd1597028fd 100644 --- a/src/main/java/org/caosdb/server/grpc/GrpcToCaosDBConverters.java +++ b/src/main/java/org/caosdb/server/grpc/GrpcToCaosDBConverters.java @@ -50,9 +50,11 @@ import org.caosdb.server.datatype.ListDatatype; import org.caosdb.server.datatype.ReferenceDatatype; import org.caosdb.server.datatype.ReferenceDatatype2; import org.caosdb.server.datatype.Value; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.FileProperties; import org.caosdb.server.entity.MagicTypes; +import org.caosdb.server.entity.RetrieveEntity; import org.caosdb.server.entity.Role; import org.caosdb.server.entity.StatementStatus; import org.caosdb.server.entity.UpdateEntity; @@ -64,8 +66,8 @@ import org.caosdb.server.utils.ServerMessages; public class GrpcToCaosDBConverters { - public Integer getId(final String id) { - return Integer.parseInt(id); + public EntityID getId(final String id) { + return new EntityID(Integer.parseInt(id)); } public Role convert(final EntityRole role) { @@ -85,7 +87,7 @@ public class GrpcToCaosDBConverters { public Property getUnit(final String unitStr) { final EntityInterface magicUnit = MagicTypes.UNIT.getEntity(); - final Property unit = new Property(); + final Property unit = new Property(new RetrieveEntity()); unit.setDescription(magicUnit.getDescription()); unit.setName(magicUnit.getName()); unit.setId(magicUnit.getId()); @@ -251,7 +253,7 @@ public class GrpcToCaosDBConverters { private Property convert( final org.caosdb.api.entity.v1.Property e, final StatementStatus defaultImportance) { - final Property result = new Property(); + final Property result = new Property(new RetrieveEntity()); try { result.setId(e.getId().isBlank() ? null : getId(e.getId())); @@ -309,7 +311,7 @@ public class GrpcToCaosDBConverters { private org.caosdb.server.entity.wrapper.Parent convert(final Parent e) { final org.caosdb.server.entity.wrapper.Parent result = - new org.caosdb.server.entity.wrapper.Parent(); + new org.caosdb.server.entity.wrapper.Parent(new RetrieveEntity()); try { result.setId(e.getId().isBlank() ? null : getId(e.getId())); @@ -334,12 +336,12 @@ public class GrpcToCaosDBConverters { private EntityInterface convert(EntityACL acl) { try { - Integer id = getId(acl.getId()); - UpdateEntity result = new UpdateEntity(id, null); + EntityID id = getId(acl.getId()); + UpdateEntity result = new UpdateEntity(id); result.setEntityACL(convertAcl(acl)); return result; } catch (NumberFormatException exc) { - UpdateEntity result = new UpdateEntity(null, null); + UpdateEntity result = new UpdateEntity(); result.addError(ServerMessages.ENTITY_DOES_NOT_EXIST); return result; } diff --git a/src/main/java/org/caosdb/server/jobs/Job.java b/src/main/java/org/caosdb/server/jobs/Job.java index 675686aa797cd2a00cf7a921a29e81ce144db179..0e9d7ef79377884853caa2198c84d428aed38e01 100644 --- a/src/main/java/org/caosdb/server/jobs/Job.java +++ b/src/main/java/org/caosdb/server/jobs/Job.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; +import java.util.Objects; import java.util.Set; import org.apache.shiro.subject.Subject; import org.caosdb.server.CaosDBException; @@ -40,6 +41,7 @@ import org.caosdb.server.database.exceptions.TransactionException; 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.Message; import org.caosdb.server.entity.container.ParentContainer; @@ -106,7 +108,7 @@ public abstract class Job { } } - protected EntityInterface getEntityById(final int id) { + protected EntityInterface getEntityById(final EntityID id) { return getContainer().getEntityById(id); } @@ -133,7 +135,7 @@ public abstract class Job { } /** to be overridden */ - protected abstract void run(); + protected abstract void run() throws Message; protected void runJobFromSchedule( final EntityInterface entity, final Class<? extends Job> jobclass) { @@ -152,7 +154,7 @@ public abstract class Job { this.failureSeverity = severiy; } - TransactionContainer getContainer() { + protected TransactionContainer getContainer() { return getTransaction().getContainer(); } @@ -177,7 +179,7 @@ public abstract class Job { * names match. * @throws Message */ - protected final boolean isSubType(final EntityInterface child, final EntityInterface targetParent) + protected final boolean isSubType(final EntityInterface child, EntityInterface targetParent) throws EntityWasNotUniqueException { if (targetParent.hasId()) { if (targetParent.getId().equals(child.getId())) { @@ -187,6 +189,8 @@ public abstract class Job { } else if (targetParent.hasName()) { if (targetParent.getName().equals(child.getName())) { return true; + } else { + targetParent = resolve(targetParent); } } @@ -199,7 +203,10 @@ public abstract class Job { } for (final Parent directParent : directParents) { EntityInterface resolvedDirectParent = null; - if (directParent.hasId()) { + if (directParent.hasId() && targetParent.hasId()) { + if (directParent.getId().equals(targetParent.getId())) { + return true; + } resolvedDirectParent = getEntityById(directParent.getId()); } else if (directParent.hasName()) { resolvedDirectParent = getEntityByName(directParent.getName()); @@ -223,7 +230,7 @@ public abstract class Job { return false; } - protected final boolean isValidSubType(final int child, final int parent) { + protected final boolean isValidSubType(final EntityID child, final EntityID parent) { if (!"false".equals(getContainer().getFlags().get("cache"))) { final HashMap<String, Boolean> isSubTypeCache = getCache("isSubType"); final String key = child + "->" + parent; @@ -240,8 +247,8 @@ public abstract class Job { } } - protected final boolean isValidSubTypeNoCache(final int child, final int parent) { - return child == parent || execute(new IsSubType(child, parent)).isSubType(); + protected final boolean isValidSubTypeNoCache(final EntityID child, final EntityID parent) { + return Objects.equals(child, parent) || execute(new IsSubType(child, parent)).isSubType(); } protected final EntityInterface retrieveValidSparseEntityByName(final String name) @@ -250,7 +257,7 @@ public abstract class Job { } protected final EntityInterface retrieveValidSparseEntityById( - final Integer id, final String version) throws Message { + final EntityID id, final String version) throws Message { String resulting_version = version; if (version == null || version.equals("HEAD")) { @@ -285,11 +292,11 @@ public abstract class Job { return ret; } - protected final EntityInterface retrieveValidEntity(final Integer id) { + protected final EntityInterface retrieveValidEntity(final EntityID id) { return execute(new RetrieveFullEntityTransaction(id)).getContainer().get(0); } - protected final Integer retrieveValidIDByName(final String name) { + protected final EntityID retrieveValidIDByName(final String name) { return execute(new GetIDByName(name)).getId(); } @@ -379,12 +386,13 @@ public abstract class Job { return new ArrayList<Job>(); } if (dt instanceof ReferenceDatatype2) { - return jobConfig.getConfiguredJobs(0, 17, entity, transaction); + return jobConfig.getConfiguredJobs( + EntityID.DEFAULT_DOMAIN, new EntityID(17), entity, transaction); } else if (dt instanceof AbstractCollectionDatatype) { final AbstractDatatype datatype = ((AbstractCollectionDatatype) dt).getDatatype(); return loadDataTypeSpecificJobs(datatype, entity, transaction); } else if (dt.getId() != null) { - return jobConfig.getConfiguredJobs(0, dt.getId(), entity, transaction); + return jobConfig.getConfiguredJobs(EntityID.DEFAULT_DOMAIN, dt.getId(), entity, transaction); } else { return null; } @@ -403,7 +411,8 @@ public abstract class Job { } // load general rules - final List<Job> generalRules = jobConfig.getConfiguredJobs(0, 0, entity, transaction); + final List<Job> generalRules = + jobConfig.getConfiguredJobs(EntityID.DEFAULT_DOMAIN, new EntityID(0), entity, transaction); if (generalRules != null) { jobs.addAll(generalRules); } @@ -411,7 +420,8 @@ public abstract class Job { // load Role specific rules if (entity.hasRole()) { final List<Job> roleRules = - jobConfig.getConfiguredJobs(0, entity.getRole().getId(), entity, transaction); + jobConfig.getConfiguredJobs( + EntityID.DEFAULT_DOMAIN, entity.getRole().getId(), entity, transaction); if (roleRules != null) { jobs.addAll(roleRules); } @@ -553,7 +563,7 @@ public abstract class Job { if (!entity.hasId() && entity.hasName()) { resolvedEntity = getEntityByName(entity.getName()); if (resolvedEntity == null) { - final Integer eid = retrieveValidIDByName(entity.getName()); + final EntityID eid = retrieveValidIDByName(entity.getName()); entity.setId(eid); } } @@ -561,7 +571,7 @@ public abstract class Job { if (entity.hasId()) { // get entity from container resolvedEntity = getEntityById(entity.getId()); - if (resolvedEntity == null && entity.getId() > 0) { + if (resolvedEntity == null && !entity.getId().isTemporary()) { resolvedEntity = retrieveValidEntity(entity.getId()); } } diff --git a/src/main/java/org/caosdb/server/jobs/JobConfig.java b/src/main/java/org/caosdb/server/jobs/JobConfig.java index 732a985a78b5f67c88d1c01dff1565e887aab13c..40917b36714ee95ef491a266580068a06f51703a 100644 --- a/src/main/java/org/caosdb/server/jobs/JobConfig.java +++ b/src/main/java/org/caosdb/server/jobs/JobConfig.java @@ -32,6 +32,7 @@ import java.util.List; import java.util.Map; import org.caosdb.server.CaosDBServer; import org.caosdb.server.ServerProperties; +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; @@ -116,7 +117,7 @@ public class JobConfig { } /** Generate a unique key (for class-internal use only). */ - private String getKey(final Integer domain, final Integer entity, final String transaction) { + private String getKey(final EntityID domain, final EntityID entity, final String transaction) { final StringBuilder sb = new StringBuilder(); sb.append("<"); sb.append(domain); @@ -145,7 +146,7 @@ public class JobConfig { final String transaction = row[2]; final String job = row[3]; final JobFailureSeverity severity = JobFailureSeverity.valueOf(row[4]); - final String key = getKey(domain, entity, transaction); + final String key = getKey(new EntityID(domain), new EntityID(entity), transaction); if (!result.containsKey(key)) { result.put(key, new ArrayList<>()); } @@ -167,8 +168,8 @@ public class JobConfig { * @return Fresh job instances, one for each matching job rule. */ public List<Job> getConfiguredJobs( - final Integer domain, - final Integer entity, + final EntityID domain, + final EntityID entity, final EntityInterface target, final Transaction<? extends TransactionContainer> transaction) { String transactionType; diff --git a/src/main/java/org/caosdb/server/jobs/JobTarget.java b/src/main/java/org/caosdb/server/jobs/JobTarget.java index 764c70250fd050bc5a1962db8bd5bc4006ae0a70..27aa0d9184575d87283989f18f144683668c4b45 100644 --- a/src/main/java/org/caosdb/server/jobs/JobTarget.java +++ b/src/main/java/org/caosdb/server/jobs/JobTarget.java @@ -22,7 +22,11 @@ */ package org.caosdb.server.jobs; +import org.caosdb.server.entity.Message; + public interface JobTarget { public boolean skipJob(); + + public void addError(Message m); } diff --git a/src/main/java/org/caosdb/server/jobs/ScheduledJob.java b/src/main/java/org/caosdb/server/jobs/ScheduledJob.java index 0ef0ac143428eaddaf857f063b7953a620f47ee6..2122b34de5f0b60db4c2b6d4c1c2358d3df02851 100644 --- a/src/main/java/org/caosdb/server/jobs/ScheduledJob.java +++ b/src/main/java/org/caosdb/server/jobs/ScheduledJob.java @@ -20,6 +20,8 @@ package org.caosdb.server.jobs; +import org.caosdb.server.entity.Message; + /** * ScheduledJob is a wrapper class for jobs held by the Scheduler. * @@ -41,10 +43,14 @@ public class ScheduledJob { this.job = job; } - void run() { + public void run() { if (!hasStarted()) { start(); - this.job.run(); + try { + this.job.run(); + } catch (final Message m) { + this.job.getTarget().addError(m); + } finish(); } } @@ -86,7 +92,11 @@ public class ScheduledJob { } public boolean skip() { - return this.job.getTarget().skipJob(); + try { + return this.job.getTarget().skipJob(); + } catch (final NullPointerException e) { + throw e; + } } public Job getJob() { diff --git a/src/main/java/org/caosdb/server/jobs/core/AccessControl.java b/src/main/java/org/caosdb/server/jobs/core/AccessControl.java index 724dd89844097dad5bd1a6fbf2102c8f2c4ceb8c..4217c55e1153dafc302630823873fc75640ca9be 100644 --- a/src/main/java/org/caosdb/server/jobs/core/AccessControl.java +++ b/src/main/java/org/caosdb/server/jobs/core/AccessControl.java @@ -102,7 +102,7 @@ public class AccessControl extends ContainerJob { // special annotations permission if (e.hasParents() && e.getParents().size() == 1) { final Parent par1 = e.getParents().get(0); - if (par1.hasId() && par1.getId() > 0) { + if (par1.hasId() && !par1.getId().isTemporary()) { execute(new RetrieveSparseEntity(par1)); } if (par1.hasName() diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckChildDependencyExistent.java b/src/main/java/org/caosdb/server/jobs/core/CheckChildDependencyExistent.java index 01d5a2de394180ff474600b4597e28e5356d9b3d..d60db5a3ea2f58caefe240894920318e01efc8a6 100644 --- a/src/main/java/org/caosdb/server/jobs/core/CheckChildDependencyExistent.java +++ b/src/main/java/org/caosdb/server/jobs/core/CheckChildDependencyExistent.java @@ -23,7 +23,9 @@ package org.caosdb.server.jobs.core; import java.util.List; +import java.util.Objects; import org.caosdb.server.database.backend.transaction.GetChildren; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.jobs.EntityJob; import org.caosdb.server.utils.EntityStatus; @@ -39,12 +41,13 @@ public class CheckChildDependencyExistent extends EntityJob { @Override public final void run() { - if (getEntity().getDomain() == null || getEntity().getDomain() == 0) { + if (getEntity().getDomain() == null + || Objects.equals(getEntity().getDomain(), EntityID.DEFAULT_DOMAIN)) { - final List<Integer> children = execute(new GetChildren(getEntity().getId())).getList(); + final List<EntityID> children = execute(new GetChildren(getEntity().getId())).getList(); // loop: - for (final Integer id : children) { + for (final EntityID id : children) { final EntityInterface foreign = getEntityById(id); if (foreign == null) { // if the child is not in the container, the test fails. 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 dd87d5298365a4b95abc52c66c17823c5c52687a..40e01d2636509774555f1514c75bb0bf16870539 100644 --- a/src/main/java/org/caosdb/server/jobs/core/CheckDatatypePresent.java +++ b/src/main/java/org/caosdb/server/jobs/core/CheckDatatypePresent.java @@ -134,7 +134,7 @@ public final class CheckDatatypePresent extends EntityJob { assertAllowedToUse(validDatatypeEntity); datatype.setId(validDatatypeEntity.getId()); } - } else if (datatype.getId() < 0) { + } else if (datatype.getId().isTemporary()) { final EntityInterface datatypeEntity = getEntityById(datatype.getId()); // if the container carried a corresponding entity @@ -160,7 +160,7 @@ public final class CheckDatatypePresent extends EntityJob { } private void checkIfOverride() throws Message { - if (getEntity().hasId() && getEntity().getId() > 0) { + if (getEntity().hasId() && !getEntity().getId().isTemporary()) { // get data type from database final EntityInterface foreign = retrieveValidSparseEntityById(getEntity().getId(), null); @@ -188,11 +188,11 @@ public final class CheckDatatypePresent extends EntityJob { private void inheritDatatypeFromAbstractEntity() throws Message { // if this is a record type property or a concrete property, assign // the data type of the corresponding abstract property. - if (getEntity().hasId() && getEntity().getId() > 0) { + if (getEntity().hasId() && !getEntity().getId().isTemporary()) { // get from data base final EntityInterface foreign = retrieveValidSparseEntityById(getEntity().getId(), null); inheritDatatypeFromForeignEntity(foreign); - } else if (getEntity().hasId() && getEntity().getId() < 0) { + } else if (getEntity().hasId() && getEntity().getId().isTemporary()) { // get from container final EntityInterface foreign = getEntityById(getEntity().getId()); inheritDatatypeFromForeignEntity(foreign); @@ -228,7 +228,7 @@ public final class CheckDatatypePresent extends EntityJob { AbstractDatatype datatype = null; for (final EntityInterface parent : getEntity().getParents()) { EntityInterface parentEntity = null; - if (parent.getId() > 0) { + if (!parent.getId().isTemporary()) { parentEntity = retrieveValidSparseEntityById(parent.getId(), null); } else { parentEntity = getEntityById(parent.getId()); diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckParValid.java b/src/main/java/org/caosdb/server/jobs/core/CheckParValid.java index d3b28bd5f158b767469e6d7fcc3cebe9fa75edb8..8895ae9adb4d12da2f7789a8798ca0fb9d183c05 100644 --- a/src/main/java/org/caosdb/server/jobs/core/CheckParValid.java +++ b/src/main/java/org/caosdb/server/jobs/core/CheckParValid.java @@ -66,9 +66,9 @@ public class CheckParValid extends EntityJob { if (parent.hasId()) { // check parent by id - if (parent.getId() >= 0) { - // id >= 0 (parent is yet in the database) - // retrieve parent by id + if (!parent.getId().isTemporary()) { + // id isn't temporary, i.e., parent is already in the database and + // can be retrieved by id final EntityInterface foreign = retrieveValidSparseEntityById(parent.getId(), null); // check permissions for this // parentforeign.acceptObserver(o) 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 eeea52b85b9c1629b426660020c7e65f0e4b96ef..23a92340f5befbfbe7ded2fe95d3244b5ff78594 100644 --- a/src/main/java/org/caosdb/server/jobs/core/CheckPropValid.java +++ b/src/main/java/org/caosdb/server/jobs/core/CheckPropValid.java @@ -56,7 +56,7 @@ public class CheckPropValid extends EntityJob { // does this property have an id at all? if (property.hasId()) { - if (property.getId() >= 0) { + if (!property.getId().isTemporary()) { final EntityInterface abstractProperty = retrieveValidSparseEntityById(property.getId(), null); diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckReferenceDependencyExistent.java b/src/main/java/org/caosdb/server/jobs/core/CheckReferenceDependencyExistent.java index c59eededd391645737b614f5f2e97699160c8cf7..2edbc5a270db93312c73b8c960c615a161e8907b 100644 --- a/src/main/java/org/caosdb/server/jobs/core/CheckReferenceDependencyExistent.java +++ b/src/main/java/org/caosdb/server/jobs/core/CheckReferenceDependencyExistent.java @@ -23,7 +23,9 @@ package org.caosdb.server.jobs.core; import java.util.List; +import java.util.Objects; import org.caosdb.server.database.backend.transaction.GetDependentEntities; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.jobs.EntityJob; import org.caosdb.server.utils.EntityStatus; @@ -39,15 +41,16 @@ import org.caosdb.server.utils.ServerMessages; public class CheckReferenceDependencyExistent extends EntityJob { @Override public final void run() { - if (getEntity().getDomain() == null || getEntity().getDomain() == 0) { + if (getEntity().getDomain() == null + || Objects.equals(getEntity().getDomain(), EntityID.DEFAULT_DOMAIN)) { // if (getContainer().contains(getEntity())) { // retrieve dependent entities - final List<Integer> depends = + final List<EntityID> depends = execute(new GetDependentEntities(getEntity().getId())).getList(); // loop: - for (final Integer id : depends) { + for (final EntityID id : depends) { final EntityInterface foreign = getEntityById(id); if (foreign == null) { // dependent entity is not in the container and will not be diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckRefidIsaParRefid.java b/src/main/java/org/caosdb/server/jobs/core/CheckRefidIsaParRefid.java index e739ffde01a38fb1539c97166014350e9f9c61d7..0b8ba45b1cae19812641ed733be7aacc2fb78575 100644 --- a/src/main/java/org/caosdb/server/jobs/core/CheckRefidIsaParRefid.java +++ b/src/main/java/org/caosdb/server/jobs/core/CheckRefidIsaParRefid.java @@ -29,6 +29,7 @@ import org.caosdb.server.datatype.IndexedSingleValue; import org.caosdb.server.datatype.ReferenceDatatype2; 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.entity.Role; @@ -85,7 +86,7 @@ public class CheckRefidIsaParRefid extends EntityJob implements Observer { && rv.getEntity().hasRole() && rv.getEntity().getRole() == Role.File) { } else if (rv.getId() != null - && rv.getId() < 0 + && rv.getId().isTemporary() && getEntityById(rv.getId()) != null && getEntityById(rv.getId()).getRole() == Role.File) { } else if (rv.getId() == null @@ -93,7 +94,7 @@ public class CheckRefidIsaParRefid extends EntityJob implements Observer { && getEntityByName(rv.getName()) != null && getEntityByName(rv.getName()).getRole() == Role.File) { } else if (rv.getId() != null - && rv.getId() > 0 + && !rv.getId().isTemporary() && retrieveValidSparseEntityById(rv.getId(), rv.getVersion()).getRole() == Role.File) { } else if (rv.getName() != null @@ -125,13 +126,13 @@ public class CheckRefidIsaParRefid extends EntityJob implements Observer { } } - private boolean isSubType(final Integer child, final Integer parent) throws Message { + private boolean isSubType(final EntityID child, final EntityID parent) throws Message { if (child.equals(parent)) { return true; - } else if (child > 0 && parent > 0) { + } else if (!child.isTemporary() && !parent.isTemporary()) { // check with database return isValidSubType(child, parent); - } else if (child < 0) { + } else if (child.isTemporary()) { // get parent of ref from container final EntityInterface refEntity = getEntityById(child); for (final Parent par : refEntity.getParents()) { 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 645f87d0b2eb0bfc045eb3d4237a40b702c044a3..12b545b8e6fd608e20851d37f34e809acfcd1544 100644 --- a/src/main/java/org/caosdb/server/jobs/core/CheckRefidValid.java +++ b/src/main/java/org/caosdb/server/jobs/core/CheckRefidValid.java @@ -84,7 +84,7 @@ public class CheckRefidValid extends EntityJob implements Observer { private void checkRefValue(final ReferenceValue ref) throws Message { if (ref.getId() != null) { - if (ref.getId() >= 0) { + if (!ref.getId().isTemporary()) { final EntityInterface referencedValidEntity = retrieveValidSparseEntityById(ref.getId(), ref.getVersion()); assertAllowedToUse(referencedValidEntity); diff --git a/src/main/java/org/caosdb/server/jobs/core/EntityStateJob.java b/src/main/java/org/caosdb/server/jobs/core/EntityStateJob.java index 16fe593654aad760edc2b8efc2e6889222bfa78e..a4c50f8893935d7bbd6091b970b32a8811a08d93 100644 --- a/src/main/java/org/caosdb/server/jobs/core/EntityStateJob.java +++ b/src/main/java/org/caosdb/server/jobs/core/EntityStateJob.java @@ -44,6 +44,7 @@ import org.caosdb.server.datatype.ReferenceValue; import org.caosdb.server.datatype.TextDatatype; import org.caosdb.server.entity.ClientMessage; import org.caosdb.server.entity.DeleteEntity; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.Message; import org.caosdb.server.entity.Message.MessageType; @@ -148,17 +149,17 @@ public abstract class EntityStateJob extends EntityJob { */ public class Transition { - private String name; - private String description; - private State fromState; - private State toState; - private Map<String, String> transitionProperties; + private final String name; + private final String description; + private final State fromState; + private final State toState; + private final Map<String, String> transitionProperties; /** * @param transition The transition Entity, from which the Transition is created. Relevant * Properties are "to" and "from" */ - public Transition(EntityInterface transition) throws Message { + public Transition(final EntityInterface transition) throws Message { this.name = transition.getName(); this.description = transition.getDescription(); this.fromState = getFromState(transition); @@ -166,9 +167,9 @@ public abstract class EntityStateJob extends EntityJob { this.transitionProperties = getTransitionProperties(transition); } - private Map<String, String> getTransitionProperties(EntityInterface transition) { - Map<String, String> result = new LinkedHashMap<>(); - for (Property p : transition.getProperties()) { + private Map<String, String> getTransitionProperties(final EntityInterface transition) { + final Map<String, String> result = new LinkedHashMap<>(); + for (final Property p : transition.getProperties()) { if (p.getDatatype() instanceof TextDatatype) { result.put(p.getName(), p.getValue().toString()); } @@ -176,8 +177,8 @@ public abstract class EntityStateJob extends EntityJob { return result; } - private State getToState(EntityInterface transition) throws Message { - for (Property p : transition.getProperties()) { + private State getToState(final EntityInterface transition) throws Message { + for (final Property p : transition.getProperties()) { if (p.getName().equals(TO_STATE_PROPERTY_NAME)) { return createState(p); } @@ -185,8 +186,8 @@ public abstract class EntityStateJob extends EntityJob { return null; } - private State getFromState(EntityInterface transition) throws Message { - for (Property p : transition.getProperties()) { + private State getFromState(final EntityInterface transition) throws Message { + for (final Property p : transition.getProperties()) { if (p.getName().equals(FROM_STATE_PROPERTY_NAME)) { return createState(p); } @@ -198,7 +199,7 @@ public abstract class EntityStateJob extends EntityJob { * @param previousState * @return true iff the previous state is a fromState of this transition. */ - public boolean isFromState(State previousState) { + public boolean isFromState(final State previousState) { return this.fromState.equals(previousState); } @@ -206,7 +207,7 @@ public abstract class EntityStateJob extends EntityJob { * @param nextState * @return true iff the next state is a toState of this transition. */ - public boolean isToState(State nextState) { + public boolean isToState(final State nextState) { return this.toState.equals(nextState); } @@ -219,9 +220,9 @@ public abstract class EntityStateJob extends EntityJob { } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { if (obj instanceof Transition) { - Transition that = (Transition) obj; + final Transition that = (Transition) obj; return Objects.equals(this.getName(), that.getName()) && Objects.equals(this.getFromState(), that.getFromState()) && Objects.equals(this.getToState(), that.getToState()); @@ -249,10 +250,10 @@ public abstract class EntityStateJob extends EntityJob { } public Element toElement() { - Element result = new Element(TRANSITION_XML_TAG); + final Element result = new Element(TRANSITION_XML_TAG); if (this.transitionProperties != null) { this.transitionProperties.forEach( - (String key, String value) -> { + (final String key, final String value) -> { result.setAttribute(key, value); }); } @@ -262,17 +263,17 @@ public abstract class EntityStateJob extends EntityJob { if (this.description != null) { result.setAttribute(TRANSITION_ATTRIBUTE_DESCRIPTION, this.description); } - Element to = new Element(TO_XML_TAG); + final Element to = new Element(TO_XML_TAG); to.setAttribute(STATE_ATTRIBUTE_NAME, this.toState.stateName); if (this.toState.stateDescription != null) { to.setAttribute(STATE_ATTRIBUTE_DESCRIPTION, this.toState.stateDescription); } - Element from = new Element(FROM_XML_TAG); + final Element from = new Element(FROM_XML_TAG); from.setAttribute(STATE_ATTRIBUTE_NAME, this.fromState.stateName); return result.addContent(from).addContent(to); } - public boolean isPermitted(Subject user) { + public boolean isPermitted(final Subject user) { return user.isPermitted(PERMISSION_STATE_TRANSION.toString(this.name)); } } @@ -304,11 +305,12 @@ public abstract class EntityStateJob extends EntityJob { private EntityInterface stateModelEntity = null; private StateModel stateModel; private String stateDescription = null; - private Integer stateId = null; + private EntityID stateId = null; private EntityACL stateACL = null; - private Map<String, String> stateProperties; + private final Map<String, String> stateProperties; - public State(EntityInterface stateEntity, EntityInterface stateModelEntity) throws Message { + public State(final EntityInterface stateEntity, final EntityInterface stateModelEntity) + throws Message { this.stateEntity = stateEntity; this.stateDescription = stateEntity.getDescription(); this.stateId = stateEntity.getId(); @@ -319,9 +321,9 @@ public abstract class EntityStateJob extends EntityJob { this.stateProperties = createStateProperties(stateEntity); } - private Map<String, String> createStateProperties(EntityInterface stateEntity) { - Map<String, String> result = new LinkedHashMap<>(); - for (Property p : stateEntity.getProperties()) { + private Map<String, String> createStateProperties(final EntityInterface stateEntity) { + final Map<String, String> result = new LinkedHashMap<>(); + for (final Property p : stateEntity.getProperties()) { if (p.getDatatype() instanceof TextDatatype) { result.put(p.getName(), p.getValue().toString()); } @@ -329,12 +331,12 @@ public abstract class EntityStateJob extends EntityJob { return result; } - private EntityACL createStateACL(EntityACL entityACL) { - LinkedList<EntityACI> rules = new LinkedList<>(); - for (EntityACI aci : entityACL.getRules()) { + private EntityACL createStateACL(final EntityACL entityACL) { + final LinkedList<EntityACI> rules = new LinkedList<>(); + for (final EntityACI aci : entityACL.getRules()) { if (aci.getResponsibleAgent().toString().startsWith(ENTITY_STATE_ROLE_MARKER)) { - int end = aci.getResponsibleAgent().toString().length() - 1; - String role = aci.getResponsibleAgent().toString().substring(7, end); + final int end = aci.getResponsibleAgent().toString().length() - 1; + final String role = aci.getResponsibleAgent().toString().substring(7, end); rules.add( new EntityACI(org.caosdb.server.permissions.Role.create(role), aci.getBitSet())); } @@ -350,14 +352,14 @@ public abstract class EntityStateJob extends EntityJob { return this.stateDescription; } - public Integer getStateId() throws Message { + public EntityID getStateId() throws Message { return this.stateId; } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { if (obj instanceof State) { - State that = (State) obj; + final State that = (State) obj; return Objects.equals(that.getStateName(), this.getStateName()) && Objects.equals(that.getStateModelName(), this.getStateModelName()); } @@ -376,11 +378,11 @@ public abstract class EntityStateJob extends EntityJob { * name"/>} */ @Override - public void addToElement(Element ret) { - Element e = new Element(STATE_XML_TAG); + public void addToElement(final Element ret) { + final Element e = new Element(STATE_XML_TAG); if (this.stateProperties != null) { this.stateProperties.forEach( - (String key, String value) -> { + (final String key, final String value) -> { e.setAttribute(key, value); }); } @@ -394,11 +396,11 @@ public abstract class EntityStateJob extends EntityJob { e.setAttribute(STATE_ATTRIBUTE_DESCRIPTION, this.stateDescription); } if (this.stateId != null) { - e.setAttribute(STATE_ATTRIBUTE_ID, Integer.toString(this.stateId)); + e.setAttribute(STATE_ATTRIBUTE_ID, this.stateId.toString()); } if (this.stateModel != null) { this.stateModel.transitions.forEach( - (Transition t) -> { + (final Transition t) -> { if (t.isFromState(this) && t.isPermitted(getUser())) { e.addContent(t.toElement()); } @@ -445,8 +447,8 @@ public abstract class EntityStateJob extends EntityJob { * @throws Message */ public Property createStateProperty() throws Message { - EntityInterface stateRecordType = getStateRecordType(); - Property stateProperty = new Property(stateRecordType); + final EntityInterface stateRecordType = getStateRecordType(); + final Property stateProperty = new Property(stateRecordType); stateProperty.setDatatype(new ReferenceDatatype2(stateRecordType)); stateProperty.setValue(new ReferenceValue(getStateEntity(), false)); stateProperty.setStatementStatus(StatementStatus.FIX); @@ -467,12 +469,12 @@ public abstract class EntityStateJob extends EntityJob { String isFinal = null; try { isInitial = String.valueOf(isInitial()); - } catch (Message e) { + } catch (final Message e) { isInitial = "null"; } try { isFinal = String.valueOf(isFinal()); - } catch (Message e) { + } catch (final Message e) { isFinal = "null"; } return "State (name=" @@ -503,13 +505,13 @@ public abstract class EntityStateJob extends EntityJob { */ public class StateModel { - private String name; - private Set<State> states; - private Set<Transition> transitions; - private State initialState; - private State finalState; + private final String name; + private final Set<State> states; + private final Set<Transition> transitions; + private final State initialState; + private final State finalState; - public StateModel(EntityInterface stateModelEntity) throws Message { + public StateModel(final EntityInterface stateModelEntity) throws Message { this.name = stateModelEntity.getName(); this.transitions = getTransitions(stateModelEntity); this.states = getStates(transitions, this); @@ -517,9 +519,9 @@ public abstract class EntityStateJob extends EntityJob { this.initialState = getInitialState(stateModelEntity); } - private State getInitialState(EntityInterface stateModelEntity) throws Message { + private State getInitialState(final EntityInterface stateModelEntity) throws Message { // TODO maybe check if there is more than one "initial" Property? - for (Property p : stateModelEntity.getProperties()) { + for (final Property p : stateModelEntity.getProperties()) { if (p.getName().equals(INITIAL_STATE_PROPERTY_NAME)) { return createState(p); } @@ -527,9 +529,9 @@ public abstract class EntityStateJob extends EntityJob { return null; } - private State getFinalState(EntityInterface stateModelEntity) throws Message { + private State getFinalState(final EntityInterface stateModelEntity) throws Message { // TODO maybe check if there is more than one "final" Property? - for (Property p : stateModelEntity.getProperties()) { + for (final Property p : stateModelEntity.getProperties()) { if (p.getName().equals(FINAL_STATE_PROPERTY_NAME)) { return createState(p); } @@ -538,8 +540,8 @@ public abstract class EntityStateJob extends EntityJob { } /** Transitions are taken from list Property with name="Transition". */ - private Set<Transition> getTransitions(EntityInterface stateModelEntity) throws Message { - for (Property p : stateModelEntity.getProperties()) { + private Set<Transition> getTransitions(final EntityInterface stateModelEntity) throws Message { + for (final Property p : stateModelEntity.getProperties()) { if (p.getName().equals(TRANSITION_RECORD_TYPE_NAME)) { return createTransitions(p); } @@ -554,20 +556,20 @@ public abstract class EntityStateJob extends EntityJob { * @return a set of transitions * @throws Message if the transitions could ne be created. */ - private Set<Transition> createTransitions(Property p) throws Message { - Set<Transition> result = new LinkedHashSet<>(); + private Set<Transition> createTransitions(final Property p) throws Message { + final Set<Transition> result = new LinkedHashSet<>(); try { if (!(p.getDatatype() instanceof AbstractCollectionDatatype)) { // FIXME raise an exception instead? return result; } p.parseValue(); - CollectionValue vals = (CollectionValue) p.getValue(); - for (IndexedSingleValue val : vals) { + final CollectionValue vals = (CollectionValue) p.getValue(); + for (final IndexedSingleValue val : vals) { if (val.getWrapped() instanceof ReferenceValue) { - Integer refid = ((ReferenceValue) val.getWrapped()).getId(); + final EntityID refid = ((ReferenceValue) val.getWrapped()).getId(); - String key = "transition" + Integer.toString(refid); + final String key = "transition" + refid.toString(); EntityInterface transition = getCached(key); if (transition == null) { transition = retrieveValidEntity(refid); @@ -576,7 +578,7 @@ public abstract class EntityStateJob extends EntityJob { result.add(new Transition(transition)); } } - } catch (Exception e) { + } catch (final Exception e) { throw COULD_NOT_CONSTRUCT_TRANSITIONS; } return result; @@ -593,13 +595,13 @@ public abstract class EntityStateJob extends EntityJob { * @return set of states. * @throws Message */ - private Set<State> getStates(Set<Transition> transitions, StateModel stateModel) + private Set<State> getStates(final Set<Transition> transitions, final StateModel stateModel) throws Message { // TODO Move outside of this class - Iterator<Transition> it = transitions.iterator(); - Set<State> result = new LinkedHashSet<>(); + final Iterator<Transition> it = transitions.iterator(); + final Set<State> result = new LinkedHashSet<>(); while (it.hasNext()) { - Transition t = it.next(); + final Transition t = it.next(); result.add(t.getFromState()); result.add(t.getToState()); } @@ -627,7 +629,7 @@ public abstract class EntityStateJob extends EntityJob { } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { if (obj instanceof StateModel) { return ((StateModel) obj).getName().equals(this.getName()); } @@ -636,14 +638,14 @@ public abstract class EntityStateJob extends EntityJob { @Override public String toString() { - StringBuilder sb = new StringBuilder("StateModel (name="); + final StringBuilder sb = new StringBuilder("StateModel (name="); sb.append(this.getName()); sb.append(", initial="); sb.append(this.getInitialState().stateName); sb.append(", final="); sb.append(this.getFinalState().stateName); sb.append(", transitions=["); - Iterator<Transition> iterator = this.transitions.iterator(); + final Iterator<Transition> iterator = this.transitions.iterator(); while (iterator.hasNext()) { sb.append(iterator.next().name); sb.append(" -> "); @@ -655,18 +657,18 @@ public abstract class EntityStateJob extends EntityJob { } } - private EntityInterface retrieveStateEntity(String stateName) throws Message { + private EntityInterface retrieveStateEntity(final String stateName) throws Message { try { return retrieveValidEntity(retrieveValidIDByName(stateName)); - } catch (EntityDoesNotExistException e) { + } catch (final EntityDoesNotExistException e) { throw STATE_NOT_IN_STATE_MODEL; } } - private EntityInterface retrieveStateModelEntity(String stateModel) throws Message { + private EntityInterface retrieveStateModelEntity(final String stateModel) throws Message { try { return retrieveValidEntity(retrieveValidIDByName(stateModel)); - } catch (EntityDoesNotExistException e) { + } catch (final EntityDoesNotExistException e) { throw STATE_MODEL_NOT_FOUND; } } @@ -684,14 +686,14 @@ public abstract class EntityStateJob extends EntityJob { return getState(false); } - protected State getState(EntityInterface entity) { + protected State getState(final EntityInterface entity) { return getState(entity, false); } - protected State getState(EntityInterface entity, boolean remove) { - Iterator<ToElementable> messages = entity.getMessages().iterator(); + protected State getState(final EntityInterface entity, final boolean remove) { + final Iterator<ToElementable> messages = entity.getMessages().iterator(); while (messages.hasNext()) { - ToElementable s = messages.next(); + final ToElementable s = messages.next(); if (s instanceof State) { if (remove) { messages.remove(); @@ -702,16 +704,16 @@ public abstract class EntityStateJob extends EntityJob { return null; } - protected State getState(boolean remove) { + protected State getState(final boolean remove) { return getState(getEntity(), remove); } /** Return (and possibly remove) the States Properties of `entity`. */ - protected List<Property> getStateProperties(EntityInterface entity, boolean remove) { - Iterator<Property> it = entity.getProperties().iterator(); - List<Property> result = new ArrayList<>(); + protected List<Property> getStateProperties(final EntityInterface entity, final boolean remove) { + final Iterator<Property> it = entity.getProperties().iterator(); + final List<Property> result = new ArrayList<>(); while (it.hasNext()) { - Property p = it.next(); + final Property p = it.next(); if (Objects.equals(p.getName(), STATE_RECORD_TYPE_NAME)) { if (!(p.getDatatype() instanceof ReferenceDatatype)) { continue; @@ -725,16 +727,17 @@ public abstract class EntityStateJob extends EntityJob { return result; } - protected List<Property> getStateProperties(boolean remove) { + protected List<Property> getStateProperties(final boolean remove) { return getStateProperties(getEntity(), remove); } /** Get the {@code ClientMessage}s which denote a state. */ - protected List<ClientMessage> getStateClientMessages(EntityInterface entity, boolean remove) { - Iterator<ToElementable> stateMessages = entity.getMessages().iterator(); - List<ClientMessage> result = new ArrayList<>(); + protected List<ClientMessage> getStateClientMessages( + final EntityInterface entity, final boolean remove) { + final Iterator<ToElementable> stateMessages = entity.getMessages().iterator(); + final List<ClientMessage> result = new ArrayList<>(); while (stateMessages.hasNext()) { - ToElementable s = stateMessages.next(); + final ToElementable s = stateMessages.next(); if (s instanceof ClientMessage && STATE_XML_TAG.equals(((ClientMessage) s).getType())) { if (remove) { stateMessages.remove(); @@ -745,20 +748,20 @@ public abstract class EntityStateJob extends EntityJob { return result; } - protected List<ClientMessage> getStateClientMessages(boolean remove) { + protected List<ClientMessage> getStateClientMessages(final boolean remove) { return getStateClientMessages(getEntity(), remove); } - protected State createState(ClientMessage s) throws Message { - String stateModel = s.getProperty(STATE_ATTRIBUTE_MODEL); + protected State createState(final ClientMessage s) throws Message { + final String stateModel = s.getProperty(STATE_ATTRIBUTE_MODEL); if (stateModel == null) { throw STATE_MODEL_NOT_SPECIFIED; } - String stateName = s.getProperty(STATE_ATTRIBUTE_NAME); + final String stateName = s.getProperty(STATE_ATTRIBUTE_NAME); if (stateName == null) { throw STATE_NOT_SPECIFIED; } - String stateModelKey = "statemodel:" + stateModel; + final String stateModelKey = "statemodel:" + stateModel; EntityInterface stateModelEntity = getCached(stateModelKey); if (stateModelEntity == null) { @@ -766,7 +769,7 @@ public abstract class EntityStateJob extends EntityJob { putCache(stateModelKey, stateModelEntity); } - String stateKey = "namestate:" + stateName; + final String stateKey = "namestate:" + stateName; EntityInterface stateEntity = getCached(stateKey); if (stateEntity == null) { @@ -786,11 +789,11 @@ public abstract class EntityStateJob extends EntityJob { * @return The state of the entity * @throws Message */ - protected State createState(Property p) throws Message { + protected State createState(final Property p) throws Message { try { p.parseValue(); - ReferenceValue refid = (ReferenceValue) p.getValue(); - String key = "idstate" + Integer.toString(refid.getId()); + final ReferenceValue refid = (ReferenceValue) p.getValue(); + final String key = "idstate" + refid.getId().toString(); EntityInterface stateEntity = getCached(key); if (stateEntity == null) { @@ -798,36 +801,36 @@ public abstract class EntityStateJob extends EntityJob { putCache(key, stateEntity); } - EntityInterface stateModelEntity = findStateModel(stateEntity); + final EntityInterface stateModelEntity = findStateModel(stateEntity); return new State(stateEntity, stateModelEntity); - } catch (Message e) { + } catch (final Message e) { throw e; - } catch (Exception e) { + } catch (final Exception e) { throw COULD_NOT_CONSTRUCT_STATE_MESSAGE; } } private static final Map<String, EntityInterface> cache = new HashMap<>(); - private static final Set<Integer> id_in_cache = new HashSet<>(); + private static final Set<EntityID> id_in_cache = new HashSet<>(); - EntityInterface findStateModel(EntityInterface stateEntity) throws Exception { - boolean cached = true; - String key = "modelof" + Integer.toString(stateEntity.getId()); + EntityInterface findStateModel(final EntityInterface stateEntity) throws Exception { + final boolean cached = true; + final String key = "modelof" + stateEntity.getId().toString(); EntityInterface result = getCached(key); if (result != null && cached) { return result; } // TODO This should throw a meaningful Exception if no matching StateModel can be found. - TransactionContainer c = new TransactionContainer(); - Query query = + final TransactionContainer c = new TransactionContainer(); + final Query query = new Query( "FIND RECORD " + STATE_MODEL_RECORD_TYPE_NAME + " WHICH REFERENCES " + TRANSITION_RECORD_TYPE_NAME + " WHICH REFERENCES " - + Integer.toString(stateEntity.getId()), + + stateEntity.getId().toString(), getUser(), c); query.execute(getTransaction().getAccess()); @@ -836,7 +839,7 @@ public abstract class EntityStateJob extends EntityJob { return result; } - private EntityInterface getCached(String key) { + private EntityInterface getCached(final String key) { EntityInterface result; synchronized (cache) { result = cache.get(key); @@ -844,7 +847,7 @@ public abstract class EntityStateJob extends EntityJob { return result; } - private void putCache(String key, EntityInterface value) { + private void putCache(final String key, final EntityInterface value) { synchronized (cache) { if (value instanceof DeleteEntity) { throw new RuntimeException("Delete entity in cache. This is an implementation error."); @@ -854,18 +857,18 @@ public abstract class EntityStateJob extends EntityJob { } } - protected void removeCached(EntityInterface entity) { + protected void removeCached(final EntityInterface entity) { synchronized (cache) { if (id_in_cache.contains(entity.getId())) { id_in_cache.remove(entity.getId()); - List<String> remove = new LinkedList<>(); - for (Entry<String, EntityInterface> entry : cache.entrySet()) { + final List<String> remove = new LinkedList<>(); + for (final Entry<String, EntityInterface> entry : cache.entrySet()) { if (entry.getValue().getId().equals(entity.getId())) { remove.add(entry.getKey()); } } - for (String key : remove) { + for (final String key : remove) { cache.remove(key); } } diff --git a/src/main/java/org/caosdb/server/jobs/core/History.java b/src/main/java/org/caosdb/server/jobs/core/History.java index d39a6e1f570400194b3a530c3c323a92d0374b7c..c1215db5c9e99b0dbdf43a3dc5ce8bf54bfbeb19 100644 --- a/src/main/java/org/caosdb/server/jobs/core/History.java +++ b/src/main/java/org/caosdb/server/jobs/core/History.java @@ -44,7 +44,7 @@ public class History extends FlagJob { protected void job(final String value) { if (value == null || value.equals("1")) { for (final EntityInterface entity : getContainer()) { - if (entity.getId() != null && entity.getId() > 0) { + if (entity.getId() != null && !entity.getId().isTemporary()) { try { entity.checkPermission(EntityPermission.RETRIEVE_HISTORY); final RetrieveVersionHistory t = new RetrieveVersionHistory(entity); diff --git a/src/main/java/org/caosdb/server/jobs/core/Inheritance.java b/src/main/java/org/caosdb/server/jobs/core/Inheritance.java index 78e89a53593e3f112650ed81e292d0c62f071e24..33c7772811d36a5b9430556fc8926e88e2cd302c 100644 --- a/src/main/java/org/caosdb/server/jobs/core/Inheritance.java +++ b/src/main/java/org/caosdb/server/jobs/core/Inheritance.java @@ -28,11 +28,11 @@ import java.util.ArrayList; import java.util.List; import org.caosdb.api.entity.v1.MessageCode; import org.caosdb.server.database.backend.transaction.RetrieveFullEntityTransaction; -import org.caosdb.server.entity.Entity; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.InsertEntity; import org.caosdb.server.entity.Message; import org.caosdb.server.entity.Message.MessageType; +import org.caosdb.server.entity.RetrieveEntity; import org.caosdb.server.entity.StatementStatus; import org.caosdb.server.entity.UpdateEntity; import org.caosdb.server.entity.wrapper.Property; @@ -136,7 +136,7 @@ public class Inheritance extends EntityJob { break propertyLoop; } - EntityInterface validProperty = new Entity(property.getId()); + EntityInterface validProperty = new RetrieveEntity(property.getId()); if (getEntity().hasParents()) { outer: for (EntityInterface par : getEntity().getParents()) { @@ -165,7 +165,7 @@ public class Inheritance extends EntityJob { outerLoop: for (final Property prop : transfer) { for (final Property eprop : property.getProperties()) { - if (prop.hasId() && eprop.hasId() && prop.getId() == eprop.getId()) { + if (prop.hasId() && eprop.hasId() && prop.getId().equals(eprop.getId())) { continue outerLoop; } } diff --git a/src/main/java/org/caosdb/server/jobs/core/LoadContainerFlagJobs.java b/src/main/java/org/caosdb/server/jobs/core/LoadContainerFlagJobs.java index c04fd21d588c9a9a2f6e59ce7c1fff445a225c67..a07862c0a8ced52a8caa1af2e845497eb64badd7 100644 --- a/src/main/java/org/caosdb/server/jobs/core/LoadContainerFlagJobs.java +++ b/src/main/java/org/caosdb/server/jobs/core/LoadContainerFlagJobs.java @@ -37,7 +37,7 @@ public class LoadContainerFlagJobs extends ContainerJob { if (getContainer().getFlags() != null) { for (final Entry<String, String> flag : getContainer().getFlags().entrySet()) { final Job j = Job.getJob(flag.getKey(), JobFailureSeverity.ERROR, null, getTransaction()); - if (j != null) { + if (j != null && j instanceof ContainerJob) { if (j instanceof FlagJob) { ((FlagJob) j).setValue(flag.getValue()); } diff --git a/src/main/java/org/caosdb/server/jobs/core/ProcessNameProperties.java b/src/main/java/org/caosdb/server/jobs/core/ProcessNameProperties.java index 1cc12c6102f66dda224360554e4ac5c515ae418d..7196f04edc99cf1269603e820975a96703639965 100644 --- a/src/main/java/org/caosdb/server/jobs/core/ProcessNameProperties.java +++ b/src/main/java/org/caosdb/server/jobs/core/ProcessNameProperties.java @@ -29,6 +29,7 @@ import java.util.Collection; import java.util.HashSet; import java.util.Set; import org.caosdb.server.datatype.AbstractDatatype; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.Message; import org.caosdb.server.entity.wrapper.Parent; @@ -80,9 +81,9 @@ public class ProcessNameProperties extends EntityJob { } private boolean isValidAndSubTypeOfName(final Object par) { - if (par != null && par instanceof Integer && (Integer) par > 0) { + if (par != null && par instanceof EntityID && !((EntityID) par).isTemporary()) { final boolean isName = par.equals(NAME.getId()); - return isName || isValidSubType((Integer) par, NAME.getId()); + return isName || isValidSubType((EntityID) par, NAME.getId()); } return false; } @@ -105,7 +106,7 @@ public class ProcessNameProperties extends EntityJob { if (set.add(par.getName())) { getNearestValidParents(par, set); } - } else if (par.hasId() && par.getId() > 0) { + } else if (par.hasId() && !par.getId().isTemporary()) { // parent is valid set.add(par.getId()); } else if (par.hasId()) { @@ -132,7 +133,7 @@ public class ProcessNameProperties extends EntityJob { } private Collection<Object> getNearestValidParents(final Property prop) { - if (prop.hasId() && prop.getId() > 0) { + if (prop.hasId() && !prop.getId().isTemporary()) { final ArrayList<Object> ret = new ArrayList<Object>(); if (prop.hasParents()) { for (final Parent par : prop.getParents()) { diff --git a/src/main/java/org/caosdb/server/jobs/core/ResolveNames.java b/src/main/java/org/caosdb/server/jobs/core/ResolveNames.java index d0a1f0768b77fa7bd110019dd95220f65ad256f2..5ab722c7176e89485e2bd40dfd515a77bc09e38b 100644 --- a/src/main/java/org/caosdb/server/jobs/core/ResolveNames.java +++ b/src/main/java/org/caosdb/server/jobs/core/ResolveNames.java @@ -27,7 +27,9 @@ import java.util.List; import org.caosdb.server.database.backend.transaction.GetIDByName; import org.caosdb.server.database.exceptions.EntityDoesNotExistException; import org.caosdb.server.entity.Entity; +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.jobs.ContainerJob; import org.caosdb.server.utils.EntityStatus; @@ -45,12 +47,12 @@ public class ResolveNames extends ContainerJob { for (final EntityInterface e : container) { if (e.hasName() && !e.hasId()) { try { - final List<Integer> c = execute(new GetIDByName(e.getName(), false)).getList(); + final List<EntityID> c = execute(new GetIDByName(e.getName(), false)).getList(); e.setId(c.get(0)); e.setEntityStatus(EntityStatus.QUALIFIED); for (int i = 1; i < c.size(); i++) { - final Entity e2 = new Entity(c.get(i), e.getRole()); + final Entity e2 = new RetrieveEntity(c.get(i), e.getRole()); e2.setEntityStatus(EntityStatus.QUALIFIED); add.add(e2); } diff --git a/src/main/java/org/caosdb/server/jobs/core/RetrieveACL.java b/src/main/java/org/caosdb/server/jobs/core/RetrieveACL.java index 4664c01b88d361485c342a8fcddca2ab082f0dee..0f25071818ff7de041016942e51705a66c9b7cb5 100644 --- a/src/main/java/org/caosdb/server/jobs/core/RetrieveACL.java +++ b/src/main/java/org/caosdb/server/jobs/core/RetrieveACL.java @@ -24,7 +24,6 @@ package org.caosdb.server.jobs.core; import org.apache.shiro.authz.AuthorizationException; import org.caosdb.server.entity.EntityInterface; -import org.caosdb.server.entity.xml.ToElementable; import org.caosdb.server.jobs.FlagJob; import org.caosdb.server.jobs.JobAnnotation; import org.caosdb.server.jobs.TransactionStage; @@ -32,7 +31,6 @@ import org.caosdb.server.permissions.EntityPermission; import org.caosdb.server.transaction.Retrieve; import org.caosdb.server.utils.EntityStatus; import org.caosdb.server.utils.ServerMessages; -import org.jdom2.Element; @JobAnnotation( stage = TransactionStage.POST_TRANSACTION, @@ -44,19 +42,14 @@ public class RetrieveACL extends FlagJob { protected void job(final String value) { for (final EntityInterface entity : getContainer()) { - if (entity.getId() != null && entity.getId() > 0 && entity.getEntityACL() != null) { + if (entity.getId() != null + && !entity.getId().isTemporary() + && entity.getEntityACL() != null) { try { if (getTransaction() instanceof Retrieve) { entity.checkPermission(EntityPermission.RETRIEVE_ACL); } - entity.addMessage( - new ToElementable() { - - @Override - public void addToElement(final Element ret) { - ret.addContent(entity.getEntityACL().toElement()); - } - }); + entity.addMessage(ret -> ret.addContent(entity.getEntityACL().toElement())); } catch (final AuthorizationException e) { entity.setEntityStatus(EntityStatus.UNQUALIFIED); entity.addError(ServerMessages.AUTHORIZATION_ERROR); diff --git a/src/main/java/org/caosdb/server/jobs/core/RetrieveOwner.java b/src/main/java/org/caosdb/server/jobs/core/RetrieveOwner.java index 8b6412cee5d6e800a78509741d4f3680403008ce..fa094b28ba9a6ed1387710a751be160fa6f53d47 100644 --- a/src/main/java/org/caosdb/server/jobs/core/RetrieveOwner.java +++ b/src/main/java/org/caosdb/server/jobs/core/RetrieveOwner.java @@ -25,7 +25,6 @@ package org.caosdb.server.jobs.core; import java.util.List; import org.apache.shiro.authz.AuthorizationException; import org.caosdb.server.entity.EntityInterface; -import org.caosdb.server.entity.xml.ToElementable; import org.caosdb.server.jobs.FlagJob; import org.caosdb.server.jobs.JobAnnotation; import org.caosdb.server.jobs.TransactionStage; @@ -46,23 +45,19 @@ public class RetrieveOwner extends FlagJob { protected void job(final String value) { for (final EntityInterface entity : getContainer()) { - if (entity.getId() != null && entity.getId() > 0) { + if (entity.getId() != null && !entity.getId().isTemporary()) { try { if (getTransaction() instanceof Retrieve) { entity.checkPermission(EntityPermission.RETRIEVE_OWNER); } entity.addMessage( - new ToElementable() { - - @Override - public void addToElement(final Element ret) { - if (entity.getEntityACL() != null) { - final List<ResponsibleAgent> owners = entity.getEntityACL().getOwners(); - for (final ResponsibleAgent o : owners) { - final Element e = new Element("Owner"); - o.addToElement(e); - ret.addContent(e); - } + ret -> { + if (entity.getEntityACL() != null) { + final List<ResponsibleAgent> owners = entity.getEntityACL().getOwners(); + for (final ResponsibleAgent o : owners) { + final Element e = new Element("Owner"); + o.addToElement(e); + ret.addContent(e); } } }); diff --git a/src/main/java/org/caosdb/server/jobs/core/UniqueName.java b/src/main/java/org/caosdb/server/jobs/core/UniqueName.java index 0ef9792556e2b8b6e3981f66cb697ced5659c7a1..86e6c37e35ec91db647e14e30896abb6b884555b 100644 --- a/src/main/java/org/caosdb/server/jobs/core/UniqueName.java +++ b/src/main/java/org/caosdb/server/jobs/core/UniqueName.java @@ -24,6 +24,7 @@ package org.caosdb.server.jobs.core; import org.caosdb.server.database.exceptions.EntityDoesNotExistException; import org.caosdb.server.database.exceptions.EntityWasNotUniqueException; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.jobs.FlagJob; import org.caosdb.server.jobs.JobAnnotation; @@ -39,7 +40,7 @@ public class UniqueName extends FlagJob { // check against data base try { - final Integer foreign = retrieveValidIDByName(entity.getName()); + final EntityID foreign = retrieveValidIDByName(entity.getName()); if (entity.hasId() && !foreign.equals(entity.getId())) { throw new EntityWasNotUniqueException(); } diff --git a/src/main/java/org/caosdb/server/query/Query.java b/src/main/java/org/caosdb/server/query/Query.java index 81a08a9dbecbd28195172df55dfdd600ae24e53b..7da810c3d8f50ab739dd72a65551b45449b4d183 100644 --- a/src/main/java/org/caosdb/server/query/Query.java +++ b/src/main/java/org/caosdb/server/query/Query.java @@ -59,6 +59,7 @@ import org.caosdb.server.database.backend.transaction.RetrieveSparseEntity; import org.caosdb.server.database.misc.DBHelper; import org.caosdb.server.database.misc.TransactionBenchmark; 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.entity.Message.MessageType; @@ -406,15 +407,15 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac public void applyQueryTemplates(final QueryInterface query, final String resultSet) throws QueryException { try { - final Map<Integer, String> queryTemplates = getQueryTemplates(query, resultSet); + final Map<EntityID, String> queryTemplates = getQueryTemplates(query, resultSet); final PreparedStatement removeQTStmt = query.getConnection().prepareStatement("DELETE FROM `" + resultSet + "` WHERE id=?"); // Run thru all QTs found... - for (final Entry<Integer, String> q : queryTemplates.entrySet()) { + for (final Entry<EntityID, String> q : queryTemplates.entrySet()) { // ... remove the QT from resultSet... - removeQTStmt.setInt(1, q.getKey()); + removeQTStmt.setInt(1, q.getKey().toInteger()); removeQTStmt.execute(); // ... check for RETRIEVE:ENTITY permission... @@ -456,11 +457,11 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac * @return A list of query strings. * @throws SQLException */ - private static Map<Integer, String> getQueryTemplates( + private static Map<EntityID, String> getQueryTemplates( final QueryInterface query, final String resultSet) throws SQLException { ResultSet rs = null; try { - final HashMap<Integer, String> ret = new HashMap<Integer, String>(); + final Map<EntityID, String> ret = new HashMap<>(); final CallableStatement stmt = query .getConnection() @@ -470,7 +471,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac + "` AS r ON (r.id=q.id);"); rs = stmt.executeQuery(); while (rs.next()) { - ret.put(rs.getInt("id"), rs.getString("definition")); + ret.put(new EntityID(rs.getInt("id")), rs.getString("definition")); } return ret; } finally { @@ -724,7 +725,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac if (this.container != null && this.type == Type.FIND) { for (final IdVersionAclTriplet t : this.resultSet) { - final Entity e = new RetrieveEntity(t.id, t.version); + final Entity e = new RetrieveEntity(new EntityID(t.id), t.version); // if query has select-clause: if (this.selections != null && !this.selections.isEmpty()) { diff --git a/src/main/java/org/caosdb/server/resource/FileSystemResource.java b/src/main/java/org/caosdb/server/resource/FileSystemResource.java index f09f97eab5fbb1ea49930bc8cae227cb2b5fba05..1e601cb2116c92ae3aa31aaca4be01b429f9e826 100644 --- a/src/main/java/org/caosdb/server/resource/FileSystemResource.java +++ b/src/main/java/org/caosdb/server/resource/FileSystemResource.java @@ -30,15 +30,11 @@ import java.io.IOException; import org.caosdb.server.database.backend.implementation.MySQL.ConnectionException; import org.caosdb.server.database.exceptions.EntityDoesNotExistException; import org.caosdb.server.database.misc.TransactionBenchmark; -import org.caosdb.server.entity.Entity; -import org.caosdb.server.entity.FileProperties; +import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.Message; import org.caosdb.server.entity.Message.MessageType; -import org.caosdb.server.entity.RetrieveEntity; -import org.caosdb.server.entity.container.TransactionContainer; import org.caosdb.server.permissions.EntityPermission; import org.caosdb.server.transaction.RetrieveSparseEntityByPath; -import org.caosdb.server.transaction.Transaction; import org.caosdb.server.utils.FileUtils; import org.caosdb.server.utils.ServerMessages; import org.jdom2.Attribute; @@ -187,7 +183,7 @@ public class FileSystemResource extends AbstractCaosDBServerResource { } protected String getEntityID(final String path) throws Exception { - final Entity fileEnt = getEntity(path); + final EntityInterface fileEnt = getEntity(path); return fileEnt.getId().toString(); } @@ -198,15 +194,12 @@ public class FileSystemResource extends AbstractCaosDBServerResource { * @return * @throws Exception */ - private Entity getEntity(final String path) throws Exception { + private EntityInterface getEntity(final String path) throws Exception { final long t1 = System.currentTimeMillis(); - final TransactionContainer c = new TransactionContainer(); - final Entity e = new RetrieveEntity(0); - final FileProperties fp = new FileProperties(null, path, null); - e.setFileProperties(fp); - c.add(e); - final Transaction<?> t = new RetrieveSparseEntityByPath(c); + final EntityInterface e; + final RetrieveSparseEntityByPath t = new RetrieveSparseEntityByPath(path); t.execute(); + e = t.getEntity(); final long t2 = System.currentTimeMillis(); getBenchmark().addMeasurement(this.getClass().getSimpleName() + ".getEntity", t2 - t1); return e; diff --git a/src/main/java/org/caosdb/server/resource/transaction/EntityResource.java b/src/main/java/org/caosdb/server/resource/transaction/EntityResource.java index 7003dfc1d9657def48da4295a189e72730ef9fa8..4cd7b2fcbd4ae9e9dd3d047555194172c4224d38 100644 --- a/src/main/java/org/caosdb/server/resource/transaction/EntityResource.java +++ b/src/main/java/org/caosdb/server/resource/transaction/EntityResource.java @@ -32,6 +32,7 @@ import org.caosdb.server.CaosDBException; import org.caosdb.server.FileSystem; import org.caosdb.server.database.backend.implementation.MySQL.ConnectionException; import org.caosdb.server.entity.DeleteEntity; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.FileProperties; import org.caosdb.server.entity.InsertEntity; import org.caosdb.server.entity.Message; @@ -65,20 +66,20 @@ public class EntityResource extends RetrieveEntityResource { final Document doc = new Document(); for (final String item : getRequestedItems()) { - String[] elem = item.split("@", 1); + final String[] elem = item.split("@", 1); Integer id = null; String version = null; try { id = Integer.parseInt(elem[0]); - } catch (NumberFormatException e) { + } catch (final NumberFormatException e) { // pass } if (elem.length > 1) { version = elem[1]; } - if (id != null) { - container.add(new DeleteEntity(id, version)); + if (id != null && id > 0) { + container.add(new DeleteEntity(new EntityID(id), version)); } } @@ -127,7 +128,7 @@ public class EntityResource extends RetrieveEntityResource { * Parse the body of requests with content type "multipart/form-data". This is specific for * requests which also contain file blobs. */ - private Element parseMultipartEntity(WritableContainer container) + private Element parseMultipartEntity(final WritableContainer container) throws FileUploadException, IOException, Message, xmlNotWellFormedException, NoSuchAlgorithmException, CaosDBException { final DiskFileItemFactory factory = new DiskFileItemFactory(); diff --git a/src/main/java/org/caosdb/server/resource/transaction/RetrieveEntityResource.java b/src/main/java/org/caosdb/server/resource/transaction/RetrieveEntityResource.java index 578eca4c855ed067aae7a9f2e18463808558b94d..6527376d71ba31718394f887b7335615d80db5c6 100644 --- a/src/main/java/org/caosdb/server/resource/transaction/RetrieveEntityResource.java +++ b/src/main/java/org/caosdb/server/resource/transaction/RetrieveEntityResource.java @@ -26,6 +26,7 @@ import java.security.NoSuchAlgorithmException; import java.sql.SQLException; import org.caosdb.server.CaosDBException; import org.caosdb.server.database.backend.implementation.MySQL.ConnectionException; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.container.RetrieveContainer; import org.caosdb.server.resource.AbstractCaosDBServerResource; import org.caosdb.server.transaction.Retrieve; @@ -46,16 +47,16 @@ public abstract class RetrieveEntityResource extends AbstractCaosDBServerResourc * * @param container */ - protected void handleRetrieveContainer(RetrieveContainer container) { + protected void handleRetrieveContainer(final RetrieveContainer container) { for (final String item : getRequestedItems()) { - String[] elem = item.split("@", 2); + final String[] elem = item.split("@", 2); Integer id = null; String name = null; String version = null; try { id = Integer.parseInt(elem[0]); - } catch (NumberFormatException e) { + } catch (final NumberFormatException e) { name = elem[0]; } if (elem.length > 1) { @@ -63,7 +64,7 @@ public abstract class RetrieveEntityResource extends AbstractCaosDBServerResourc } if (id != null) { - container.add(id, version); + container.add(new EntityID(id), version); } else { container.add(name); } diff --git a/src/main/java/org/caosdb/server/transaction/ChecksumUpdater.java b/src/main/java/org/caosdb/server/transaction/ChecksumUpdater.java index 56fc07da22d9fac5bfbe713d1a9cd36b2d25a9ba..1f52ca8d8d19abd16848e6506eaa5d3ada32cb6a 100644 --- a/src/main/java/org/caosdb/server/transaction/ChecksumUpdater.java +++ b/src/main/java/org/caosdb/server/transaction/ChecksumUpdater.java @@ -31,6 +31,7 @@ import org.caosdb.server.database.backend.transaction.GetUpdateableChecksums; import org.caosdb.server.database.backend.transaction.RetrieveSparseEntity; import org.caosdb.server.database.backend.transaction.SetFileChecksum; import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.FileProperties; import org.caosdb.server.entity.Message; @@ -137,7 +138,7 @@ public class ChecksumUpdater extends WriteTransaction synchronized (instance.running) { // test for updatable checksums - final Integer id = execute(new GetUpdateableChecksums(), weakAccess).getID(); + final EntityID id = execute(new GetUpdateableChecksums(), weakAccess).getID(); if (id == null) { // nothing to be updated... instance.running = false; diff --git a/src/main/java/org/caosdb/server/transaction/FileStorageConsistencyCheck.java b/src/main/java/org/caosdb/server/transaction/FileStorageConsistencyCheck.java index 1ce1aa566ad28d048a36f91d50bb297b1a709d14..59d12c73ccdcf620f0e7c2f2f3bbb51233f51d84 100644 --- a/src/main/java/org/caosdb/server/transaction/FileStorageConsistencyCheck.java +++ b/src/main/java/org/caosdb/server/transaction/FileStorageConsistencyCheck.java @@ -39,6 +39,7 @@ import org.caosdb.server.database.backend.transaction.RetrieveAllUncheckedFiles; import org.caosdb.server.database.backend.transaction.SetFileCheckedTimestamp; import org.caosdb.server.database.exceptions.EntityDoesNotExistException; import org.caosdb.server.database.proto.SparseEntity; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.Message; import org.caosdb.server.entity.xml.ToElementable; import org.caosdb.server.utils.SHA512; @@ -135,7 +136,7 @@ public class FileStorageConsistencyCheck extends Thread this.results.put(entity.filePath, result); } - execute(new SetFileCheckedTimestamp(entity.id, this.ts), this.access); + execute(new SetFileCheckedTimestamp(new EntityID(entity.id), this.ts), this.access); } } catch (final Exception e) { diff --git a/src/main/java/org/caosdb/server/transaction/InsertUserTransaction.java b/src/main/java/org/caosdb/server/transaction/InsertUserTransaction.java index 8abc2ede52375158c006d0108e9fea2523526006..f3f4c7f5fd583ff0ff16d4fd1ce583394258f35b 100644 --- a/src/main/java/org/caosdb/server/transaction/InsertUserTransaction.java +++ b/src/main/java/org/caosdb/server/transaction/InsertUserTransaction.java @@ -34,6 +34,7 @@ import org.caosdb.server.database.backend.transaction.SetPassword; import org.caosdb.server.database.backend.transaction.UpdateUser; import org.caosdb.server.database.backend.transaction.UpdateUserRoles; import org.caosdb.server.database.proto.ProtoUser; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.Message; import org.caosdb.server.utils.ServerMessages; import org.caosdb.server.utils.Utils; @@ -75,7 +76,7 @@ public class InsertUserTransaction extends AccessControlTransaction { } if (this.user.entity != null) { - UpdateUserTransaction.checkEntityExists(this.user.entity); + UpdateUserTransaction.checkEntityExists(new EntityID(this.user.entity)); } if (this.password != null) { diff --git a/src/main/java/org/caosdb/server/transaction/RetrieveACL.java b/src/main/java/org/caosdb/server/transaction/RetrieveACL.java index cd9c5c0841557da579c3581f876a1180ecd06f8d..ac0a2896451a43ca10985bd38787ad4f847a05cc 100644 --- a/src/main/java/org/caosdb/server/transaction/RetrieveACL.java +++ b/src/main/java/org/caosdb/server/transaction/RetrieveACL.java @@ -26,8 +26,9 @@ import java.util.UUID; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authz.AuthorizationException; import org.caosdb.server.database.backend.transaction.RetrieveEntityACLTransaction; -import org.caosdb.server.entity.Entity; +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.permissions.EntityACL; import org.caosdb.server.permissions.EntityPermission; @@ -39,7 +40,7 @@ public class RetrieveACL extends Transaction<TransactionContainer> { new TransactionContainer( SecurityUtils.getSubject(), System.currentTimeMillis(), UUID.randomUUID().toString())); for (String strId : idList) { - getContainer().add(new Entity(Integer.parseInt(strId))); + getContainer().add(new RetrieveEntity(new EntityID(Integer.parseInt(strId)))); } } diff --git a/src/main/java/org/caosdb/server/transaction/RetrieveSparseEntityByPath.java b/src/main/java/org/caosdb/server/transaction/RetrieveSparseEntityByPath.java index 520787105388d8f1408c2d3b05090c761c8f687c..eca97ce64c7f235fe5b7ec6d26e003301bb53bff 100644 --- a/src/main/java/org/caosdb/server/transaction/RetrieveSparseEntityByPath.java +++ b/src/main/java/org/caosdb/server/transaction/RetrieveSparseEntityByPath.java @@ -29,8 +29,12 @@ import org.caosdb.server.entity.container.TransactionContainer; public class RetrieveSparseEntityByPath extends Transaction<TransactionContainer> { - public RetrieveSparseEntityByPath(final TransactionContainer container) { - super(container); + private EntityInterface entity; + private String path; + + public RetrieveSparseEntityByPath(String path) { + super(new TransactionContainer()); + this.path = path; } @Override @@ -55,12 +59,9 @@ public class RetrieveSparseEntityByPath extends Transaction<TransactionContainer @Override protected void transaction() throws Exception { - for (final EntityInterface e : getContainer()) { - final GetFileRecordByPath r = - execute(new GetFileRecordByPath(e.getFileProperties().getPath()), getAccess()); - e.setId(r.getId()); - execute(new RetrieveSparseEntity(e), getAccess()); - } + final GetFileRecordByPath r = execute(new GetFileRecordByPath(path), getAccess()); + RetrieveSparseEntity e = execute(new RetrieveSparseEntity(r.getEntity()), getAccess()); + entity = e.getEntity(); } @Override @@ -71,4 +72,8 @@ public class RetrieveSparseEntityByPath extends Transaction<TransactionContainer // release weak access getAccess().release(); } + + public EntityInterface getEntity() { + return entity; + } } diff --git a/src/main/java/org/caosdb/server/transaction/UpdateUserTransaction.java b/src/main/java/org/caosdb/server/transaction/UpdateUserTransaction.java index 6e945118c9b0eef7460f41b5062ccb308b0fd956..6808968f20574242cfdaa9b87793d7a4ad4b6914 100644 --- a/src/main/java/org/caosdb/server/transaction/UpdateUserTransaction.java +++ b/src/main/java/org/caosdb/server/transaction/UpdateUserTransaction.java @@ -39,6 +39,7 @@ import org.caosdb.server.database.backend.transaction.UpdateUserRoles; import org.caosdb.server.database.exceptions.TransactionException; import org.caosdb.server.database.proto.ProtoUser; import org.caosdb.server.entity.Entity; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.Message; import org.caosdb.server.entity.RetrieveEntity; import org.caosdb.server.entity.container.RetrieveContainer; @@ -66,9 +67,9 @@ public class UpdateUserTransaction extends AccessControlTransaction { final String password) { this.user = new ProtoUser(); this.user.realm = - (realm == null + realm == null ? UserSources.guessRealm(username, UserSources.getInternalRealm().getName()) - : realm); + : realm; this.user.name = username; this.user.status = status; this.user.email = email; @@ -180,7 +181,7 @@ public class UpdateUserTransaction extends AccessControlTransaction { // this means that the entity is to be reset. this.user.entity = null; } else { - checkEntityExists(this.user.entity); + checkEntityExists(new EntityID(this.user.entity)); } } else if (validUser != null) { this.user.entity = validUser.entity; @@ -189,7 +190,7 @@ public class UpdateUserTransaction extends AccessControlTransaction { return isToBeUpdated; } - public static void checkEntityExists(final int entity) throws Exception { + public static void checkEntityExists(final EntityID entity) throws Exception { final RetrieveContainer c = new RetrieveContainer(null, null, null, null); final Entity e = new RetrieveEntity(entity); c.add(e); diff --git a/src/main/java/org/caosdb/server/transaction/WriteTransaction.java b/src/main/java/org/caosdb/server/transaction/WriteTransaction.java index 3497f912c33a69716a701f6f0d15af732d63870f..47b7a53c71ddebb7c1b062c2c8599cf44eabe039 100644 --- a/src/main/java/org/caosdb/server/transaction/WriteTransaction.java +++ b/src/main/java/org/caosdb/server/transaction/WriteTransaction.java @@ -39,6 +39,7 @@ import org.caosdb.server.database.backend.transaction.RetrieveFullEntityTransact import org.caosdb.server.database.backend.transaction.UpdateEntityTransaction; import org.caosdb.server.database.misc.RollBackHandler; import org.caosdb.server.entity.DeleteEntity; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.FileProperties; import org.caosdb.server.entity.InsertEntity; @@ -49,6 +50,7 @@ import org.caosdb.server.entity.container.TransactionContainer; import org.caosdb.server.entity.container.WritableContainer; import org.caosdb.server.entity.wrapper.Parent; import org.caosdb.server.entity.wrapper.Property; +import org.caosdb.server.jobs.Job; import org.caosdb.server.jobs.Schedule; import org.caosdb.server.permissions.EntityACL; import org.caosdb.server.permissions.EntityPermission; @@ -242,7 +244,7 @@ public class WriteTransaction extends Transaction<WritableContainer> } // no standard entities are to be deleted. - if (entity.hasId() && entity.getId() < 100) { + if (entity.hasId() && EntityID.isReserved(entity.getId())) { entity.setEntityStatus(EntityStatus.UNQUALIFIED); entity.addInfo("This entity cannot be deleted"); } @@ -309,9 +311,6 @@ public class WriteTransaction extends Transaction<WritableContainer> } } - @Override - protected void postCheck() {} - @Override protected void transaction() throws Exception { if (getContainer().getStatus().ordinal() >= EntityStatus.QUALIFIED.ordinal()) { @@ -341,6 +340,9 @@ public class WriteTransaction extends Transaction<WritableContainer> } } + @Override + protected void postCheck() {} + @Override protected void postTransaction() throws Exception { // set entityStatus to DELETED and add deletion info message for deleted entities. diff --git a/src/test/java/org/caosdb/server/database/InsertTest.java b/src/test/java/org/caosdb/server/database/InsertTest.java index d5aa4480a961b849c2cb2ce4b1f395826b563f28..524e7addd20581db349082f91206605a97bdee8e 100644 --- a/src/test/java/org/caosdb/server/database/InsertTest.java +++ b/src/test/java/org/caosdb/server/database/InsertTest.java @@ -33,7 +33,10 @@ import org.caosdb.server.datatype.CollectionValue; import org.caosdb.server.datatype.GenericValue; import org.caosdb.server.datatype.SingleValue; import org.caosdb.server.entity.Entity; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; +import org.caosdb.server.entity.InsertEntity; +import org.caosdb.server.entity.RetrieveEntity; import org.caosdb.server.entity.Role; import org.caosdb.server.entity.StatementStatus; import org.caosdb.server.entity.wrapper.Property; @@ -48,71 +51,71 @@ public class InsertTest { */ @Test public void testTransformation1() throws Exception { - final Entity r = new Entity(-1, Role.Record); - final Property p1 = new Property(1); + final Entity r = new InsertEntity("Test", Role.Record); + final Property p1 = new Property(new RetrieveEntity(new EntityID(1))); p1.setRole("Property"); p1.setValue(new GenericValue("V1")); p1.setDatatype("TEXT"); p1.setStatementStatus(StatementStatus.FIX); r.addProperty(p1); - final Property p2 = new Property(2); + final Property p2 = new Property(new RetrieveEntity(new EntityID(2))); p2.setRole("Property"); p2.setValue(new GenericValue("V2")); p2.setDatatype("TEXT"); p2.setStatementStatus(StatementStatus.RECOMMENDED); r.addProperty(p2); - final Property p3 = new Property(3); + final Property p3 = new Property(new RetrieveEntity(new EntityID(3))); p3.setRole("Property"); p3.setValue(new GenericValue("V3")); p3.setDatatype("TEXT"); p3.setStatementStatus(StatementStatus.OBLIGATORY); p2.addProperty(p3); - final Property p4 = new Property(4); + final Property p4 = new Property(new RetrieveEntity(new EntityID(4))); p4.setRole("Property"); p4.setValue(new GenericValue("V4")); p4.setDatatype("TEXT"); p4.setStatementStatus(StatementStatus.OBLIGATORY); r.addProperty(p4); - final Property p5 = new Property(5); + final Property p5 = new Property(new RetrieveEntity(new EntityID(5))); p5.setRole("Property"); p5.setValue(new GenericValue("V5")); p5.setDatatype("TEXT"); p5.setStatementStatus(StatementStatus.OBLIGATORY); p4.addProperty(p5); - final Property p6 = new Property(6); + final Property p6 = new Property(new RetrieveEntity(new EntityID(6))); p6.setRole("Property"); p6.setValue(new GenericValue("V6")); p6.setDatatype("TEXT"); p6.setStatementStatus(StatementStatus.OBLIGATORY); p5.addProperty(p6); - final Property p7 = new Property(7); + final Property p7 = new Property(new RetrieveEntity(new EntityID(7))); p7.setRole("Property"); p7.setValue(new GenericValue("V7")); p7.setDatatype("TEXT"); p7.setStatementStatus(StatementStatus.OBLIGATORY); r.addProperty(p7); - final Property p8 = new Property(8); + final Property p8 = new Property(new RetrieveEntity(new EntityID(8))); p8.setRole("Property"); p8.setValue(new GenericValue("V8")); p8.setDatatype("TEXT"); p8.setStatementStatus(StatementStatus.OBLIGATORY); p7.addProperty(p8); - final Property p9 = new Property(9); + final Property p9 = new Property(new RetrieveEntity(new EntityID(9))); p9.setRole("Property"); p9.setValue(new GenericValue("V9")); p9.setDatatype("TEXT"); p9.setStatementStatus(StatementStatus.OBLIGATORY); p8.addProperty(p9); - final Property p10 = new Property(10); + final Property p10 = new Property(new RetrieveEntity(new EntityID(10))); p10.setRole("Property"); p10.setValue(new GenericValue("V10")); p10.setDatatype("TEXT"); @@ -126,17 +129,17 @@ public class InsertTest { assertEquals(7, stage1Inserts.size()); assertEquals(Role.Property, stage1Inserts.get(0).getRole()); - assertEquals((Integer) 1, stage1Inserts.get(0).getId()); + assertEquals(new EntityID(1), stage1Inserts.get(0).getId()); assertEquals("V1", ((SingleValue) stage1Inserts.get(0).getValue()).toDatabaseString()); assertFalse(stage1Inserts.get(0).hasReplacement()); assertEquals(Role.Property, stage1Inserts.get(1).getRole()); - assertEquals((Integer) 2, stage1Inserts.get(1).getId()); + assertEquals(new EntityID(2), stage1Inserts.get(1).getId()); assertEquals("V2", ((SingleValue) stage1Inserts.get(1).getValue()).toDatabaseString()); assertFalse(stage1Inserts.get(1).hasReplacement()); assertEquals(Role.Property, stage1Inserts.get(2).getRole()); - assertEquals((Integer) 4, stage1Inserts.get(2).getId()); + assertEquals(new EntityID(4), stage1Inserts.get(2).getId()); assertEquals("V4", ((SingleValue) stage1Inserts.get(2).getValue()).toDatabaseString()); assertFalse(stage1Inserts.get(2).hasReplacement()); @@ -145,7 +148,7 @@ public class InsertTest { assertFalse(stage1Inserts.get(3).hasReplacement()); assertEquals(Role.Property, stage1Inserts.get(4).getRole()); - assertEquals((Integer) 7, stage1Inserts.get(4).getId()); + assertEquals(new EntityID(7), stage1Inserts.get(4).getId()); assertEquals("V7", ((SingleValue) stage1Inserts.get(4).getValue()).toDatabaseString()); assertFalse(stage1Inserts.get(4).hasReplacement()); @@ -161,35 +164,35 @@ public class InsertTest { assertEquals(6, stage2Inserts.size()); assertEquals(Role.Property, stage2Inserts.get(0).getRole()); - assertEquals((Integer) 3, stage2Inserts.get(0).getId()); + assertEquals(new EntityID(3), stage2Inserts.get(0).getId()); assertEquals("V3", ((SingleValue) stage2Inserts.get(0).getValue()).toDatabaseString()); assertFalse(stage2Inserts.get(0).hasReplacement()); assertEquals(Role.Property, stage2Inserts.get(1).getRole()); - assertEquals((Integer) 5, stage2Inserts.get(1).getId()); + assertEquals(new EntityID(5), stage2Inserts.get(1).getId()); assertEquals("V5", ((SingleValue) stage2Inserts.get(1).getValue()).toDatabaseString()); assertTrue(stage2Inserts.get(1).hasReplacement()); assertEquals(stage1Inserts.get(3), stage2Inserts.get(1).getReplacement()); assertEquals(Role.Property, stage2Inserts.get(2).getRole()); - assertEquals((Integer) 6, stage2Inserts.get(2).getId()); + assertEquals(new EntityID(6), stage2Inserts.get(2).getId()); assertEquals("V6", ((SingleValue) stage2Inserts.get(2).getValue()).toDatabaseString()); assertFalse(stage2Inserts.get(2).hasReplacement()); assertEquals(Role.Property, stage2Inserts.get(3).getRole()); - assertEquals((Integer) 8, stage2Inserts.get(3).getId()); + assertEquals(new EntityID(8), stage2Inserts.get(3).getId()); assertEquals("V8", ((SingleValue) stage2Inserts.get(3).getValue()).toDatabaseString()); assertTrue(stage2Inserts.get(3).hasReplacement()); assertEquals(stage1Inserts.get(5), stage2Inserts.get(3).getReplacement()); assertEquals(Role.Property, stage2Inserts.get(4).getRole()); - assertEquals((Integer) 9, stage2Inserts.get(4).getId()); + assertEquals(new EntityID(9), stage2Inserts.get(4).getId()); assertEquals("V9", ((SingleValue) stage2Inserts.get(4).getValue()).toDatabaseString()); assertTrue(stage2Inserts.get(4).hasReplacement()); assertEquals(stage1Inserts.get(6), stage2Inserts.get(4).getReplacement()); assertEquals(Role.Property, stage2Inserts.get(5).getRole()); - assertEquals((Integer) 10, stage2Inserts.get(5).getId()); + assertEquals(new EntityID(10), stage2Inserts.get(5).getId()); assertEquals("V10", ((SingleValue) stage2Inserts.get(5).getValue()).toDatabaseString()); assertFalse(stage2Inserts.get(5).hasReplacement()); } @@ -202,22 +205,22 @@ public class InsertTest { */ @Test public void testTransformation2() throws Exception { - final Entity r = new Entity(-1, Role.Record); - final Property p1 = new Property(1); + final Entity r = new InsertEntity("Test", Role.Record); + final Property p1 = new Property(new RetrieveEntity(new EntityID(1))); p1.setRole("Property"); p1.setValue(new GenericValue("V1-1")); p1.setDatatype("TEXT"); p1.setStatementStatus(StatementStatus.FIX); r.addProperty(p1); - final Property p2 = new Property(1); + final Property p2 = new Property(new RetrieveEntity(new EntityID(1))); p2.setRole("Property"); p2.setValue(new GenericValue("V1-2")); p2.setDatatype("TEXT"); p2.setStatementStatus(StatementStatus.FIX); r.addProperty(p2); - final Property subp = new Property(2); + final Property subp = new Property(new RetrieveEntity(new EntityID(2))); subp.setRole("Property"); subp.setValue(new GenericValue("V2")); subp.setDatatype("TEXT"); @@ -231,13 +234,13 @@ public class InsertTest { assertEquals(3, stage1Inserts.size()); assertEquals(Role.Property, stage1Inserts.get(0).getRole()); - assertEquals((Integer) 1, stage1Inserts.get(0).getId()); + assertEquals(new EntityID(1), stage1Inserts.get(0).getId()); assertEquals("V1-1", ((SingleValue) stage1Inserts.get(0).getValue()).toDatabaseString()); assertFalse(stage1Inserts.get(0).hasReplacement()); assertEquals(Role.Property, stage1Inserts.get(1).getRole()); assertEquals("V1-2", ((SingleValue) stage1Inserts.get(1).getValue()).toDatabaseString()); - assertEquals((Integer) 1, stage1Inserts.get(1).getId()); + assertEquals(new EntityID(1), stage1Inserts.get(1).getId()); assertTrue(stage1Inserts.get(1).hasReplacement()); assertEquals(stage1Inserts.get(2), stage1Inserts.get(1).getReplacement()); @@ -249,7 +252,7 @@ public class InsertTest { assertEquals(1, stage2Inserts.size()); assertEquals(Role.Property, stage2Inserts.get(0).getRole()); - assertEquals((Integer) 2, stage2Inserts.get(0).getId()); + assertEquals(new EntityID(2), stage2Inserts.get(0).getId()); assertEquals("V2", ((SingleValue) stage2Inserts.get(0).getValue()).toDatabaseString()); assertFalse(stage2Inserts.get(0).hasReplacement()); } @@ -262,26 +265,26 @@ public class InsertTest { */ @Test public void testTransformation3() throws Exception { - final Entity r = new Entity(-1, Role.Record); - final Property p1 = new Property(1); + final Entity r = new InsertEntity("Test", Role.Record); + final Property p1 = new Property(new RetrieveEntity(new EntityID(1))); p1.setRole("Property"); p1.setDatatype("TEXT"); p1.setStatementStatus(StatementStatus.FIX); r.addProperty(p1); - final Property p2 = new Property(1); + final Property p2 = new Property(new RetrieveEntity(new EntityID(1))); p2.setRole("Property"); p2.setDatatype("TEXT"); p2.setStatementStatus(StatementStatus.FIX); r.addProperty(p2); - final Property p3 = new Property(1); + final Property p3 = new Property(new RetrieveEntity(new EntityID(1))); p3.setRole("Property"); p3.setDatatype("TEXT"); p3.setStatementStatus(StatementStatus.FIX); r.addProperty(p3); - final Property sub1 = new Property(2); + final Property sub1 = new Property(new RetrieveEntity(new EntityID(2))); sub1.setRole("Property"); sub1.setDatatype("TEXT"); sub1.setValue(new GenericValue("V1")); @@ -295,7 +298,7 @@ public class InsertTest { assertEquals(4, stage1Inserts.size()); assertEquals(Role.Property, stage1Inserts.get(0).getRole()); - assertEquals((Integer) 1, stage1Inserts.get(0).getId()); + assertEquals(new EntityID(1), stage1Inserts.get(0).getId()); assertTrue(stage1Inserts.get(0).hasReplacement()); assertEquals(stage1Inserts.get(1), stage1Inserts.get(0).getReplacement()); assertEquals(null, stage1Inserts.get(0).getValue()); @@ -305,12 +308,12 @@ public class InsertTest { assertEquals(null, stage1Inserts.get(1).getValue()); assertEquals(Role.Property, stage1Inserts.get(2).getRole()); - assertEquals((Integer) 1, stage1Inserts.get(2).getId()); + assertEquals(new EntityID(1), stage1Inserts.get(2).getId()); assertFalse(stage1Inserts.get(2).hasReplacement()); assertEquals(null, stage1Inserts.get(2).getValue()); assertEquals(Role.Property, stage1Inserts.get(3).getRole()); - assertEquals((Integer) 1, stage1Inserts.get(3).getId()); + assertEquals(new EntityID(1), stage1Inserts.get(3).getId()); assertFalse(stage1Inserts.get(3).hasReplacement()); assertEquals(null, stage1Inserts.get(3).getValue()); @@ -318,7 +321,7 @@ public class InsertTest { assertEquals(1, stage2Inserts.size()); assertEquals(Role.Property, stage2Inserts.get(0).getRole()); - assertEquals((Integer) 2, stage2Inserts.get(0).getId()); + assertEquals(new EntityID(2), stage2Inserts.get(0).getId()); assertEquals("V1", ((SingleValue) stage2Inserts.get(0).getValue()).toDatabaseString()); assertFalse(stage2Inserts.get(0).hasReplacement()); } @@ -331,15 +334,15 @@ public class InsertTest { @Test public void testTransformation4() throws Exception { - final Entity r = new Entity(-1, Role.Record); - final Property p1 = new Property(1); + final Entity r = new InsertEntity("Test", Role.Record); + final Property p1 = new Property(new RetrieveEntity(new EntityID(1))); p1.setRole("Property"); p1.setDatatype("TEXT"); p1.setValue(new GenericValue("V1")); p1.setStatementStatus(StatementStatus.FIX); r.addProperty(p1); - final Property p2 = new Property(2); + final Property p2 = new Property(new RetrieveEntity(new EntityID(2))); p2.setRole("Property"); p2.setDatatype("LIST<TEXT>"); p2.setStatementStatus(StatementStatus.FIX); @@ -350,7 +353,7 @@ public class InsertTest { p2.setValue(vals); r.addProperty(p2); - final Property p3 = new Property(3); + final Property p3 = new Property(new RetrieveEntity(new EntityID(3))); p3.setRole("Property"); p3.setDatatype("TEXT"); p3.setValue(new GenericValue("V3")); @@ -364,12 +367,12 @@ public class InsertTest { assertEquals(4, stage1Inserts.size()); assertEquals(Role.Property, stage1Inserts.get(0).getRole()); - assertEquals((Integer) 1, stage1Inserts.get(0).getId()); + assertEquals(new EntityID(1), stage1Inserts.get(0).getId()); assertFalse(stage1Inserts.get(0).hasReplacement()); assertEquals("V1", ((SingleValue) stage1Inserts.get(0).getValue()).toDatabaseString()); assertEquals(Role.Property, stage1Inserts.get(1).getRole()); - assertEquals((Integer) 2, stage1Inserts.get(1).getId()); + assertEquals(new EntityID(2), stage1Inserts.get(1).getId()); assertTrue(stage1Inserts.get(1).hasReplacement()); assertEquals(stage1Inserts.get(2), stage1Inserts.get(1).getReplacement()); assertTrue(stage1Inserts.get(1).getValue() instanceof CollectionValue); @@ -379,7 +382,7 @@ public class InsertTest { assertTrue(stage1Inserts.get(2).getValue() instanceof CollectionValue); assertEquals(Role.Property, stage1Inserts.get(3).getRole()); - assertEquals((Integer) 3, stage1Inserts.get(3).getId()); + assertEquals(new EntityID(3), stage1Inserts.get(3).getId()); assertFalse(stage1Inserts.get(3).hasReplacement()); assertEquals("V3", ((SingleValue) stage1Inserts.get(3).getValue()).toDatabaseString()); diff --git a/src/test/java/org/caosdb/server/database/backend/transaction/RetrieveFullEntityTest.java b/src/test/java/org/caosdb/server/database/backend/transaction/RetrieveFullEntityTest.java index f995f0806ed5c94c9e0ff7c22172c8d4893aed35..72c84d1f7b262a854a257c8ae764d4e3da9b8e80 100644 --- a/src/test/java/org/caosdb/server/database/backend/transaction/RetrieveFullEntityTest.java +++ b/src/test/java/org/caosdb/server/database/backend/transaction/RetrieveFullEntityTest.java @@ -30,7 +30,9 @@ import java.util.ArrayList; import java.util.List; 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.RetrieveEntity; import org.caosdb.server.entity.wrapper.Property; import org.caosdb.server.entity.xml.PropertyToElementStrategyTest; import org.caosdb.server.query.Query.Selection; @@ -40,14 +42,15 @@ public class RetrieveFullEntityTest { @Test public void testRetrieveSubEntities() { - RetrieveFullEntityTransaction r = - new RetrieveFullEntityTransaction(0) { + final RetrieveFullEntityTransaction r = + new RetrieveFullEntityTransaction(new EntityID(0)) { /** Mock-up */ @Override - public void retrieveFullEntity(EntityInterface e, List<Selection> selections) { + public void retrieveFullEntity( + final EntityInterface e, final List<Selection> selections) { // The id of the referenced window - assertEquals(1234, (int) e.getId()); + assertEquals(new EntityID(1234), e.getId()); // The level of selectors has been reduced by 1 assertEquals("description", selections.get(0).getSelector()); @@ -56,23 +59,24 @@ public class RetrieveFullEntityTest { }; }; - Property window = new Property(2345); + final Property window = new Property(new RetrieveEntity(new EntityID(2345))); window.setName("Window"); window.setDatatype("Window"); window.setValue(new ReferenceValue(1234)); - Entity house = new Entity(); + final Entity house = new RetrieveEntity(new EntityID(3456)); house.addProperty(window); - ReferenceValue value = (ReferenceValue) house.getProperties().getEntityById(2345).getValue(); - assertEquals(1234, (int) value.getId()); + final ReferenceValue value = + (ReferenceValue) house.getProperties().getEntityById(new EntityID(2345)).getValue(); + assertEquals(new EntityID(1234), value.getId()); assertNull(value.getEntity()); - List<Selection> selections = new ArrayList<>(); + final List<Selection> selections = new ArrayList<>(); selections.add(PropertyToElementStrategyTest.parse("window.description")); r.retrieveSubEntities(house, selections); - assertEquals(1234, (int) value.getId()); + assertEquals(new EntityID(1234), value.getId()); assertNotNull(value.getEntity()); assertEquals("A heart-shaped window.", value.getEntity().getDescription()); } diff --git a/src/test/java/org/caosdb/server/entity/container/PropertyContainerTest.java b/src/test/java/org/caosdb/server/entity/container/PropertyContainerTest.java index 836ca13f3422e429d1f516a75f7aaf4ebcc373da..a8ccdbdc9f7a9522020332e01cba96a1667d70b6 100644 --- a/src/test/java/org/caosdb/server/entity/container/PropertyContainerTest.java +++ b/src/test/java/org/caosdb/server/entity/container/PropertyContainerTest.java @@ -27,6 +27,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import org.caosdb.server.datatype.GenericValue; import org.caosdb.server.datatype.ReferenceValue; import org.caosdb.server.entity.Entity; +import org.caosdb.server.entity.EntityID; +import org.caosdb.server.entity.RetrieveEntity; import org.caosdb.server.entity.Role; import org.caosdb.server.entity.wrapper.Property; import org.caosdb.server.entity.xml.PropertyToElementStrategyTest; @@ -46,31 +48,31 @@ public class PropertyContainerTest { @BeforeAll public static void setup() { - window = new Entity(1234); - windowHeight = new Property(new Entity("window.height", Role.Property)); + window = new RetrieveEntity(new EntityID(1234)); + windowHeight = new Property(new RetrieveEntity("window.height", Role.Property)); window.addProperty(windowHeight); windowHeight.setValue(new GenericValue("windowHeight")); - houseOwner = new Entity("The Queen", Role.Record); + houseOwner = new RetrieveEntity("The Queen", Role.Record); - house = new Entity("Buckingham Palace", Role.Record); - houseHeight = new Property(new Entity("height", Role.Property)); + house = new RetrieveEntity("Buckingham Palace", Role.Record); + houseHeight = new Property(new RetrieveEntity("height", Role.Property)); houseHeight.setValue(new GenericValue("houseHeight")); house.addProperty(houseHeight); - windowProperty = new Property(2345); + windowProperty = new Property(new RetrieveEntity(new EntityID(2345))); windowProperty.setName("window"); windowProperty.setValue(new ReferenceValue(window.getId())); house.addProperty(windowProperty); - house.addProperty(new Property()); + house.addProperty(new Property(new RetrieveEntity())); house.addProperty(new Property(houseHeight)); } @Test public void test() { - PropertyContainer container = new PropertyContainer(new Entity()); - Element element = new Element("Record"); - SerializeFieldStrategy setFieldStrategy = + final PropertyContainer container = new PropertyContainer(new RetrieveEntity()); + final Element element = new Element("Record"); + final SerializeFieldStrategy setFieldStrategy = new SerializeFieldStrategy() .addSelection(PropertyToElementStrategyTest.parse("window.height")); diff --git a/src/test/java/org/caosdb/server/entity/xml/PropertyToElementStrategyTest.java b/src/test/java/org/caosdb/server/entity/xml/PropertyToElementStrategyTest.java index 7f534892f8e84fae4f2a5e5013852a8a86698cf3..a2c9676b9759fc55fb0d1e089808ab50d016288e 100644 --- a/src/test/java/org/caosdb/server/entity/xml/PropertyToElementStrategyTest.java +++ b/src/test/java/org/caosdb/server/entity/xml/PropertyToElementStrategyTest.java @@ -27,7 +27,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import org.caosdb.server.datatype.GenericValue; 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.RetrieveEntity; import org.caosdb.server.entity.Role; import org.caosdb.server.entity.wrapper.Property; import org.caosdb.server.query.Query.Selection; @@ -50,9 +52,9 @@ public class PropertyToElementStrategyTest { * <p>The returned Selection has nested subselections, so that each subselection corresponds to * the next part and the remainder of the initial <code>select</code> String. */ - public static Selection parse(String select) { - String[] split = select.split("\\."); - Selection result = new Selection(split[0]); + public static Selection parse(final String select) { + final String[] split = select.split("\\."); + final Selection result = new Selection(split[0]); Selection next = result; for (int i = 1; i < split.length; i++) { @@ -64,42 +66,42 @@ public class PropertyToElementStrategyTest { @BeforeEach public void setup() { - window = new Entity(1234, Role.Record); - windowHeight = new Property(new Entity("height", Role.Property)); + window = new RetrieveEntity(new EntityID(1234), Role.Record); + windowHeight = new Property(new RetrieveEntity("height", Role.Property)); window.addProperty(windowHeight); windowHeight.setValue(new GenericValue("windowHeight")); - houseOwner = new Entity("The Queen", Role.Record); + houseOwner = new RetrieveEntity("The Queen", Role.Record); - house = new Entity("Buckingham Palace", Role.Record); - houseHeight = new Property(new Entity("height", Role.Property)); + house = new RetrieveEntity("Buckingham Palace", Role.Record); + houseHeight = new Property(new RetrieveEntity("height", Role.Property)); houseHeight.setValue(new GenericValue("houseHeight")); house.addProperty(houseHeight); - windowProperty = new Property(2345); + windowProperty = new Property(new RetrieveEntity(new EntityID(2345))); windowProperty.setName("window"); windowProperty.setDatatype("window"); windowProperty.setValue(new ReferenceValue(window.getId())); house.addProperty(windowProperty); - house.addProperty(new Property()); + house.addProperty(new Property(new RetrieveEntity())); house.addProperty(new Property(houseHeight)); } @Test public void test() { - PropertyToElementStrategy strategy = new PropertyToElementStrategy(); - SerializeFieldStrategy setFieldStrategy = + final PropertyToElementStrategy strategy = new PropertyToElementStrategy(); + final SerializeFieldStrategy setFieldStrategy = new SerializeFieldStrategy().addSelection(parse("height")); - EntityInterface property = windowProperty; + final EntityInterface property = windowProperty; ((ReferenceValue) property.getValue()).setEntity(window, true); - Element element = strategy.toElement(property, setFieldStrategy); + final Element element = strategy.toElement(property, setFieldStrategy); assertEquals("Property", element.getName()); assertEquals("2345", element.getAttributeValue("id")); assertEquals("window", element.getAttributeValue("name")); assertEquals(1, element.getChildren().size()); assertEquals("Record", element.getChildren().get(0).getName()); - Element recordElement = element.getChild("Record"); + final Element recordElement = element.getChild("Record"); assertEquals("1234", recordElement.getAttributeValue("id")); assertEquals(1, recordElement.getChildren().size()); assertEquals("windowHeight", recordElement.getChild("Property").getText()); diff --git a/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java b/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java index 8a078e8b9f8d7e3590ddeecff762f8fd52fe1df7..d39a803f9cfe3ce0a4cf23265683d121b3bc688d 100644 --- a/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java +++ b/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java @@ -8,6 +8,7 @@ import java.util.TimeZone; import org.caosdb.datetime.DateTimeFactory2; import org.caosdb.server.datatype.GenericValue; import org.caosdb.server.datatype.Value; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.FileProperties; import org.caosdb.server.entity.Message; import org.caosdb.server.entity.RetrieveEntity; @@ -53,7 +54,7 @@ public class CaosDBToGrpcConvertersTest { @Test public void testConvertEntity_FileDescriptor() { - RetrieveEntity entity = new RetrieveEntity(null); + RetrieveEntity entity = new RetrieveEntity(); CaosDBToGrpcConverters converters = new CaosDBToGrpcConverters(null); assertEquals(converters.convert(entity).toString(), "entity {\n}\n"); entity.setFileProperties(new FileProperties("checksum1234", "the/path", 1024L)); @@ -65,23 +66,23 @@ public class CaosDBToGrpcConvertersTest { @Test public void testIdServerMessagesOnlyStrategy() { // @review Florian Spreckelsen 2022-03-22 - RetrieveEntity entity = new RetrieveEntity(null); + RetrieveEntity entity = new RetrieveEntity(); // must be printed - entity.setId(1234); + entity.setId(new EntityID(1234)); entity.addInfo("info"); entity.addWarning(new Message("warning")); entity.addError(new Message("error")); // must not be printed - Parent par = new Parent(); + Parent par = new Parent(new RetrieveEntity()); par.setName("dont print parent"); entity.addParent(par); entity.setName("dont print"); entity.setDescription("dont print"); entity.setRole(Role.File); entity.setFileProperties(new FileProperties("dont print checksum", "dont print path", 1234L)); - Property p = new Property(); + Property p = new Property(new RetrieveEntity()); p.setStatementStatus(StatementStatus.FIX); p.setName("dont print property"); p.setDatatype("TEXT"); diff --git a/src/test/java/org/caosdb/server/jobs/JobConfigTest.java b/src/test/java/org/caosdb/server/jobs/JobConfigTest.java index d182cafaa0db347ea5f0953d5d56f6413bdd381d..e176c2111189fb52ca9946e10ae5ec705549b6c8 100644 --- a/src/test/java/org/caosdb/server/jobs/JobConfigTest.java +++ b/src/test/java/org/caosdb/server/jobs/JobConfigTest.java @@ -5,6 +5,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import java.io.IOException; import org.caosdb.server.CaosDBServer; import org.caosdb.server.entity.DeleteEntity; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.InsertEntity; import org.caosdb.server.entity.RetrieveEntity; import org.caosdb.server.entity.Role; @@ -25,7 +26,7 @@ public class JobConfigTest { final JobConfig jobConfig = JobConfig.getInstance(); assertEquals("Retrieve", jobConfig.getTransactionType(new RetrieveEntity("test"))); assertEquals("Insert", jobConfig.getTransactionType(new InsertEntity("test", Role.Record))); - assertEquals("Delete", jobConfig.getTransactionType(new DeleteEntity(1234))); + assertEquals("Delete", jobConfig.getTransactionType(new DeleteEntity(new EntityID(1234)))); assertEquals("Update", jobConfig.getTransactionType(new UpdateEntity(new Element("Record")))); } } diff --git a/src/test/java/org/caosdb/server/transaction/RetrieveTest.java b/src/test/java/org/caosdb/server/transaction/RetrieveTest.java index d4fab9e1203ce1f45e3d8c027a6107ca42ceea31..a3ac40e1bf1e0fe6489a74f45d6c253b903b4478 100644 --- a/src/test/java/org/caosdb/server/transaction/RetrieveTest.java +++ b/src/test/java/org/caosdb/server/transaction/RetrieveTest.java @@ -16,6 +16,7 @@ import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.interfaces.RetrieveRoleImpl; import org.caosdb.server.database.exceptions.TransactionException; import org.caosdb.server.database.misc.TransactionBenchmark; +import org.caosdb.server.entity.EntityID; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.RetrieveEntity; import org.caosdb.server.entity.container.RetrieveContainer; @@ -61,7 +62,7 @@ public class RetrieveTest { public void testMissingRetrievePermission() { Subject subject = SecurityUtils.getSubject(); subject.login(AnonymousAuthenticationToken.getInstance()); - EntityInterface entity = new RetrieveEntity(1234); + EntityInterface entity = new RetrieveEntity(new EntityID(1234)); EntityACLFactory fac = new EntityACLFactory(); fac.deny(AnonymousAuthenticationToken.PRINCIPAL, "RETRIEVE:ENTITY"); entity.setEntityACL(fac.create()); diff --git a/src/test/java/org/caosdb/server/transaction/UpdateTest.java b/src/test/java/org/caosdb/server/transaction/UpdateTest.java index 860e06b2bf0d9ee41ac2f1ff7be421b6a696f9d8..a0891a3eb34e1759100c78916d0fb250de149ef8 100644 --- a/src/test/java/org/caosdb/server/transaction/UpdateTest.java +++ b/src/test/java/org/caosdb/server/transaction/UpdateTest.java @@ -35,8 +35,11 @@ import org.caosdb.server.datatype.CollectionValue; import org.caosdb.server.datatype.GenericValue; 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.RetrieveEntity; import org.caosdb.server.entity.StatementStatus; +import org.caosdb.server.entity.UpdateEntity; import org.caosdb.server.entity.wrapper.Property; import org.caosdb.server.permissions.EntityPermission; import org.caosdb.server.permissions.Permission; @@ -54,8 +57,8 @@ public class UpdateTest { @Test public void testDeriveUpdate_SameName() throws NoSuchAlgorithmException, IOException, CaosDBException { - final Entity newEntity = new Entity("Name"); - final Entity oldEntity = new Entity("Name"); + final Entity newEntity = new RetrieveEntity("Name"); + final Entity oldEntity = new RetrieveEntity("Name"); new WriteTransaction(null).deriveUpdate(newEntity, oldEntity); assertEquals(newEntity.getEntityStatus(), EntityStatus.VALID); } @@ -63,8 +66,8 @@ public class UpdateTest { @Test public void testDeriveUpdate_DifferentName() throws NoSuchAlgorithmException, IOException, CaosDBException { - final Entity newEntity = new Entity("NewName"); - final Entity oldEntity = new Entity("OldName"); + final Entity newEntity = new RetrieveEntity("NewName"); + final Entity oldEntity = new RetrieveEntity("OldName"); new WriteTransaction(null).deriveUpdate(newEntity, oldEntity); assertEquals(newEntity.getEntityStatus(), EntityStatus.QUALIFIED); } @@ -72,11 +75,11 @@ public class UpdateTest { @Test public void testDeriveUpdate_SameProperty() throws NoSuchAlgorithmException, IOException, CaosDBException { - final Entity newEntity = new Entity(); - final Property newProperty = new Property(1); + final Entity newEntity = new RetrieveEntity(new EntityID(1234)); + final Property newProperty = new Property(new RetrieveEntity(new EntityID(1))); newEntity.addProperty(newProperty); - final Property oldProperty = new Property(1); - final Entity oldEntity = new Entity(); + final Property oldProperty = new Property(new RetrieveEntity(new EntityID(1))); + final Entity oldEntity = new RetrieveEntity(new EntityID(1234)); oldEntity.addProperty(oldProperty); new WriteTransaction(null).deriveUpdate(newEntity, oldEntity); @@ -86,13 +89,13 @@ public class UpdateTest { @Test public void testDeriveUpdate_AnotherProperty() throws NoSuchAlgorithmException, IOException, CaosDBException { - final Entity newEntity = new Entity(); - final Property newProperty = new Property(1); - final Property newProperty2 = new Property(2); + final Entity newEntity = new RetrieveEntity(new EntityID(1234)); + final Property newProperty = new Property(new RetrieveEntity(new EntityID(1))); + final Property newProperty2 = new Property(new RetrieveEntity(new EntityID(2))); newEntity.addProperty(newProperty); newEntity.addProperty(newProperty2); - final Property oldProperty = new Property(1); - final Entity oldEntity = new Entity(); + final Property oldProperty = new Property(new RetrieveEntity(new EntityID(1))); + final Entity oldEntity = new RetrieveEntity(new EntityID(1234)); oldEntity.addProperty(oldProperty); new WriteTransaction(null).deriveUpdate(newEntity, oldEntity); @@ -104,14 +107,15 @@ public class UpdateTest { @Test public void testDeriveUpdate_SameUnit() throws NoSuchAlgorithmException, IOException, CaosDBException { - final EntityInterface magicUnit = new Entity("Unit"); - magicUnit.setId(24); + final EntityInterface magicUnit = new RetrieveEntity(new EntityID(1234)); + magicUnit.setName("Unit"); + magicUnit.setId(new EntityID(24)); magicUnit.setDatatype("TEXT"); - final Entity newEntity = new Entity(); - final Property newProperty = new Property(1); + final Entity newEntity = new RetrieveEntity(new EntityID(1234)); + final Property newProperty = new Property(new RetrieveEntity(new EntityID(1))); - final Property newUnit = new Property(); + final Property newUnit = new Property(new RetrieveEntity(new EntityID(5))); newUnit.setName(magicUnit.getName()); newUnit.setId(magicUnit.getId()); newUnit.setDatatype(magicUnit.getDatatype()); @@ -122,10 +126,10 @@ public class UpdateTest { newEntity.addProperty(newProperty); - final Entity oldEntity = new Entity(); - final Property oldProperty = new Property(1); + final Entity oldEntity = new RetrieveEntity(new EntityID(1234)); + final Property oldProperty = new Property(new RetrieveEntity(new EntityID(1))); - final Property oldUnit = new Property(); + final Property oldUnit = new Property(new RetrieveEntity(new EntityID(5))); oldUnit.setName(magicUnit.getName()); oldUnit.setId(magicUnit.getId()); oldUnit.setDatatype(magicUnit.getDatatype()); @@ -145,14 +149,15 @@ public class UpdateTest { @Test public void testDeriveUpdate_DifferentUnit() throws NoSuchAlgorithmException, IOException, CaosDBException { - final EntityInterface magicUnit = new Entity("Unit"); - magicUnit.setId(24); + final EntityInterface magicUnit = new RetrieveEntity(new EntityID(1234)); + magicUnit.setName("Unit"); + magicUnit.setId(new EntityID(24)); magicUnit.setDatatype("TEXT"); - final Entity newEntity = new Entity(); - final Property newProperty = new Property(1); + final Entity newEntity = new RetrieveEntity(new EntityID(1234)); + final Property newProperty = new Property(new RetrieveEntity(new EntityID(1))); - final Property newUnit = new Property(); + final Property newUnit = new Property(new RetrieveEntity(new EntityID(5))); newUnit.setName(magicUnit.getName()); newUnit.setId(magicUnit.getId()); newUnit.setDatatype(magicUnit.getDatatype()); @@ -163,10 +168,10 @@ public class UpdateTest { newEntity.addProperty(newProperty); - final Entity oldEntity = new Entity(); - final Property oldProperty = new Property(1); + final Entity oldEntity = new RetrieveEntity(new EntityID(1234)); + final Property oldProperty = new Property(new RetrieveEntity(new EntityID(1))); - final Property oldUnit = new Property(); + final Property oldUnit = new Property(new RetrieveEntity(new EntityID(5))); oldUnit.setName(magicUnit.getName()); oldUnit.setId(magicUnit.getId()); oldUnit.setDatatype(magicUnit.getDatatype()); @@ -186,8 +191,8 @@ public class UpdateTest { public void testDeriveUpdate_Collections() throws NoSuchAlgorithmException, CaosDBException, IOException { - final Entity newEntity = new Entity(); - final Property newProperty = new Property(1); + final Entity newEntity = new UpdateEntity(); + final Property newProperty = new Property(new UpdateEntity(new EntityID(1))); newProperty.setDatatype("List<Person>"); CollectionValue newValue = new CollectionValue(); newValue.add(new ReferenceValue(1234)); @@ -200,8 +205,8 @@ public class UpdateTest { newProperty.setEntityStatus(QUALIFIED); // old entity represents the stored entity. - final Entity oldEntity = new Entity(); - final Property oldProperty = new Property(1); + final Entity oldEntity = new UpdateEntity(); + final Property oldProperty = new Property(new UpdateEntity(new EntityID(1))); oldProperty.setDatatype("List<Person>"); CollectionValue oldValue = new CollectionValue(); // Values are shuffled but have the correct index @@ -261,12 +266,12 @@ public class UpdateTest { public void testDeriveUpdate_UpdateList() throws NoSuchAlgorithmException, CaosDBException, IOException { // @review Florian Spreckelsen 2022-03-15 - final Property oldProperty = new Property(1); - final Property newProperty = new Property(1); + final Property oldProperty = new Property(new UpdateEntity(new EntityID(1))); + final Property newProperty = new Property(new UpdateEntity(new EntityID(1))); oldProperty.setDatatype("List<Person>"); newProperty.setDatatype("List<Person>"); - final Entity oldEntity = new Entity(); - final Entity newEntity = new Entity(); + final Entity oldEntity = new UpdateEntity(); + final Entity newEntity = new UpdateEntity(); oldProperty.setRole("Record"); newProperty.setRole("Property");