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..71062816a57129d37dbc44806e30da9c22f33ae1 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 @@ -29,6 +29,7 @@ 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 ArrayList<EntityID> ret = new ArrayList<>(); 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/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/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/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/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/RetrieveEntityACLImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveEntityACLImpl.java index 230d4d34103603d5499532a7dc1a941cf82068e7..43266922ccc97584871f7b9ffa1559a442afd565 100644 --- a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveEntityACLImpl.java +++ b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveEntityACLImpl.java @@ -25,5 +25,5 @@ import org.caosdb.server.database.proto.VerySparseEntity; public interface RetrieveEntityACLImpl extends BackendTransactionImpl { - public VerySparseEntity execute(Integer id); + public VerySparseEntity execute(Integer string); } 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..fdda7c542c644ccefe6fb83f8b30a043a74d6b54 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,23 @@ package org.caosdb.server.database.backend.interfaces; +import org.caosdb.server.entity.EntityID; +import org.caosdb.server.filesystem.Hash; + +/** + * 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 + * @param timestamp + */ + void execute(EntityID id, Hash hash); } 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/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/InsertEntityProperties.java b/src/main/java/org/caosdb/server/database/backend/transaction/InsertEntityProperties.java index bd5bf63a5eb7b194e119c56293e756ff0c4b6a20..f16e5f6b664f366917a42e387c112c8b4705297c 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; @@ -71,12 +72,12 @@ public class InsertEntityProperties extends BackendTransaction { final InsertEntityPropertiesImpl t, final Deque<Integer> 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/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/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..e82f1185d44bca9126ad7e19da5fe756060a4888 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,8 +59,8 @@ 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); } 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/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/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..289fae6e9164c66a8921b765a7275a0ac6a493e3 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; @@ -30,29 +31,39 @@ import org.caosdb.server.transaction.Retrieve; public enum MagicTypes { UNIT, NAME, - DESCRIPTION; + DESCRIPTION, + ROOT_DIRECTORY; - 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); + private static final EntityID ROOT_DIRECTORY_ID = new EntityID(51); + + 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; + case ROOT_DIRECTORY: + return ROOT_DIRECTORY_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: return NAME; case 24: return DESCRIPTION; + case 51: + return ROOT_DIRECTORY; default: return null; } @@ -85,7 +96,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..2c689500b3c1120bf74ae8d37f83718ac2c94d0d 100644 --- a/src/main/java/org/caosdb/server/entity/Role.java +++ b/src/main/java/org/caosdb/server/entity/Role.java @@ -36,18 +36,19 @@ public enum Role { File, Property, DataType, - QueryTemplate; - private static HashMap<Role, Integer> ids = null; + QueryTemplate, + Directory; + 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 +63,7 @@ public enum Role { throw new NoSuchRoleException("No such role '" + str + "'."); } - public Integer getId() { + public EntityID getId() { return ids.get(this); } @@ -74,4 +75,8 @@ public enum Role { return new EntityToElementStrategy(toString()); } } + + public boolean hasFSODescriptor() { + return this == File || this == Directory; + } } 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/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..9a959e3528393c12c735ea4f9cb193137501b480 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(); } 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/jobs/Job.java b/src/main/java/org/caosdb/server/jobs/Job.java index 675686aa797cd2a00cf7a921a29e81ce144db179..e709d0746eb7d159dece2b5bebe2818615fe072e 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); } @@ -457,19 +467,21 @@ public abstract class Job { // general rules, role rules, data type rules jobs.addAll(loadStandardJobs(entity, transaction)); + // TODO move to job // load flag jobs if (!entity.getFlags().isEmpty()) { for (final String key : entity.getFlags().keySet()) { final Job j = getJob(key, JobFailureSeverity.ERROR, entity, transaction); if (j != null) { - if (j instanceof FlagJob) { - ((FlagJob) j).setValue(entity.getFlag(key)); + if (j instanceof EntityFlagJob) { + ((EntityFlagJob) j).setValue(entity.getFlag(key)); } jobs.add(j); } } } + // TODO move to job // load parent flag jobs if (entity.hasParents()) { for (final EntityInterface p : entity.getParents()) { @@ -477,8 +489,8 @@ public abstract class Job { for (final String key : p.getFlags().keySet()) { final Job j = getJob(key, JobFailureSeverity.ERROR, entity, transaction); if (j != null) { - if (j instanceof FlagJob) { - ((FlagJob) j).setValue(p.getFlag(key)); + if (j instanceof EntityFlagJob) { + ((EntityFlagJob) j).setValue(p.getFlag(key)); } jobs.add(j); } @@ -553,7 +565,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 +573,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..7045c7df43d0831a99e7acea5e6dc8c7d4abee9e 100644 --- a/src/main/java/org/caosdb/server/jobs/core/CheckParValid.java +++ b/src/main/java/org/caosdb/server/jobs/core/CheckParValid.java @@ -66,7 +66,7 @@ public class CheckParValid extends EntityJob { if (parent.hasId()) { // check parent by id - if (parent.getId() >= 0) { + if (!parent.getId().isTemporary()) { // id >= 0 (parent is yet in the database) // retrieve parent by id final EntityInterface foreign = retrieveValidSparseEntityById(parent.getId(), null); 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/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/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..6784ae65bcbb9e6af7c5de4db2b9409f7a1d742c 100644 --- a/src/main/java/org/caosdb/server/transaction/RetrieveSparseEntityByPath.java +++ b/src/main/java/org/caosdb/server/transaction/RetrieveSparseEntityByPath.java @@ -22,15 +22,19 @@ */ package org.caosdb.server.transaction; -import org.caosdb.server.database.backend.transaction.GetFileRecordByPath; -import org.caosdb.server.database.backend.transaction.RetrieveSparseEntity; +import org.caosdb.server.database.backend.transaction.GetFileEntityByPath; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.container.TransactionContainer; +import org.caosdb.server.filesystem.Path; public class RetrieveSparseEntityByPath extends Transaction<TransactionContainer> { - public RetrieveSparseEntityByPath(final TransactionContainer container) { - super(container); + private final Path path; + private EntityInterface entity; + + public RetrieveSparseEntityByPath(final Path path) { + super(new TransactionContainer()); + this.path = path; } @Override @@ -55,12 +59,8 @@ 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 GetFileEntityByPath r = execute(new GetFileEntityByPath(path), getAccess()); + entity = r.getEntity(); } @Override @@ -71,4 +71,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/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..9814a9be62fde2a466acb290a71ad00881e5d81a 100644 --- a/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java +++ b/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java @@ -8,7 +8,6 @@ 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.FileProperties; import org.caosdb.server.entity.Message; import org.caosdb.server.entity.RetrieveEntity; import org.caosdb.server.entity.Role; @@ -16,6 +15,10 @@ import org.caosdb.server.entity.StatementStatus; import org.caosdb.server.entity.wrapper.Parent; import org.caosdb.server.entity.wrapper.Property; import org.caosdb.server.entity.xml.IdAndServerMessagesOnlyStrategy; +import org.caosdb.server.filesystem.FSODescriptor; +import org.caosdb.server.filesystem.FSODescriptorInterface; +import org.caosdb.server.filesystem.Hash; +import org.caosdb.server.filesystem.Path; import org.junit.jupiter.api.Test; public class CaosDBToGrpcConvertersTest { @@ -53,10 +56,13 @@ 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)); + FSODescriptorInterface fsoDescriptor = new FSODescriptor(new Path("the/path")); + fsoDescriptor.setSize(1024L); + fsoDescriptor.setHash(Hash.create("checksum1234", 0, "SHA-512")); + entity.setFSODescriptor(fsoDescriptor); assertEquals( converters.convert(entity).toString(), "entity {\n file_descriptor {\n path: \"the/path\"\n size: 1024\n }\n}\n"); @@ -65,7 +71,7 @@ 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); @@ -74,14 +80,15 @@ public class CaosDBToGrpcConvertersTest { 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(); + entity.setFSODescriptor( + new FSODescriptor(null, new Path("dont print path"), 0L, "tmpid", false)); + 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..710b218b9c57ff6fbf201015d6caf9be4493d7b3 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"); + final EntityInterface magicUnit = new RetrieveEntity(new EntityID(1234)); + magicUnit.setName("Unit"); magicUnit.setId(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"); + final EntityInterface magicUnit = new RetrieveEntity(new EntityID(1234)); + magicUnit.setName("Unit"); magicUnit.setId(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");