From 202e89bf0eaaa723a4b794b8102374713c510304 Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Fri, 19 Mar 2021 20:13:32 +0100
Subject: [PATCH] fix tests

---
 .../caosdb/server/entity/UpdateEntity.java    | 18 +++++++++++++++++
 .../permissions/AbstractEntityACLFactory.java | 20 +++++++++++++++----
 .../server/transaction/WriteTransaction.java  | 19 +++---------------
 3 files changed, 37 insertions(+), 20 deletions(-)

diff --git a/src/main/java/org/caosdb/server/entity/UpdateEntity.java b/src/main/java/org/caosdb/server/entity/UpdateEntity.java
index aa6d5916..884632b5 100644
--- a/src/main/java/org/caosdb/server/entity/UpdateEntity.java
+++ b/src/main/java/org/caosdb/server/entity/UpdateEntity.java
@@ -22,11 +22,21 @@
  */
 package org.caosdb.server.entity;
 
+import org.caosdb.server.transaction.WriteTransaction;
 import org.caosdb.server.utils.EntityStatus;
 import org.jdom2.Element;
 
+/**
+ * UpdateEntity class represents entities which are to be updated. The previous version is appeded
+ * during the {@link WriteTransaction} transactions initialization.
+ *
+ * @author Timm Fitschen (t.fitschen@indiscale.com)
+ */
 public class UpdateEntity extends WritableEntity {
 
+  /** The previous version of this entity. */
+  private EntityInterface original = null;
+
   public UpdateEntity(final Element element) {
     super(element);
   }
@@ -35,4 +45,12 @@ public class UpdateEntity extends WritableEntity {
   public boolean skipJob() {
     return getEntityStatus() != EntityStatus.QUALIFIED;
   }
+
+  public void setOriginal(EntityInterface original) {
+    this.original = original;
+  }
+
+  public EntityInterface getOriginal() {
+    return this.original;
+  }
 }
diff --git a/src/main/java/org/caosdb/server/permissions/AbstractEntityACLFactory.java b/src/main/java/org/caosdb/server/permissions/AbstractEntityACLFactory.java
index 675d65dc..7d7120eb 100644
--- a/src/main/java/org/caosdb/server/permissions/AbstractEntityACLFactory.java
+++ b/src/main/java/org/caosdb/server/permissions/AbstractEntityACLFactory.java
@@ -242,13 +242,19 @@ public abstract class AbstractEntityACLFactory<T extends EntityACL> {
       for (EntityACI aci : permissions.getRules()) {
         if (EntityACL.isAllowance(aci.getBitSet())) {
           if (EntityACL.isPriorityBitSet(aci.getBitSet())) {
-            long bitset = this.priorityGrants.get(aci.getResponsibleAgent());
+            Long bitset = this.priorityGrants.get(aci.getResponsibleAgent());
+            if (bitset == null) {
+              continue;
+            }
             long bitset2 = bitset;
             bitset2 &= aci.getBitSet();
             bitset ^= bitset2;
             this.priorityGrants.put(aci.getResponsibleAgent(), bitset);
           } else {
-            long bitset = this.normalGrants.get(aci.getResponsibleAgent());
+            Long bitset = this.normalGrants.get(aci.getResponsibleAgent());
+            if (bitset == null) {
+              continue;
+            }
             long bitset2 = bitset;
             bitset2 &= aci.getBitSet();
             bitset ^= bitset2;
@@ -256,13 +262,19 @@ public abstract class AbstractEntityACLFactory<T extends EntityACL> {
           }
         } else {
           if (EntityACL.isPriorityBitSet(aci.getBitSet())) {
-            long bitset = this.priorityDenials.get(aci.getResponsibleAgent());
+            Long bitset = this.priorityDenials.get(aci.getResponsibleAgent());
+            if (bitset == null) {
+              continue;
+            }
             long bitset2 = bitset;
             bitset2 &= aci.getBitSet();
             bitset ^= bitset2;
             this.priorityDenials.put(aci.getResponsibleAgent(), bitset);
           } else {
-            long bitset = this.normalDenials.get(aci.getResponsibleAgent());
+            Long bitset = this.normalDenials.get(aci.getResponsibleAgent());
+            if (bitset == null) {
+              continue;
+            }
             long bitset2 = bitset;
             bitset2 &= aci.getBitSet();
             bitset ^= bitset2;
diff --git a/src/main/java/org/caosdb/server/transaction/WriteTransaction.java b/src/main/java/org/caosdb/server/transaction/WriteTransaction.java
index 87e15e92..570fce2c 100644
--- a/src/main/java/org/caosdb/server/transaction/WriteTransaction.java
+++ b/src/main/java/org/caosdb/server/transaction/WriteTransaction.java
@@ -285,7 +285,9 @@ public class WriteTransaction extends Transaction<WritableContainer>
   protected void preCheck() throws InterruptedException, Exception {
     for (final EntityInterface entity : getContainer()) {
       try {
-        checkPermissions(entity, deriveUpdate(entity, ((UpdateEntity) entity).getOriginal()));
+        if (entity.getEntityStatus() == EntityStatus.QUALIFIED) {
+          checkPermissions(entity, deriveUpdate(entity, ((UpdateEntity) entity).getOriginal()));
+        }
       } catch (final AuthorizationException exc) {
         entity.setEntityStatus(EntityStatus.UNQUALIFIED);
         entity.addError(ServerMessages.AUTHORIZATION_ERROR);
@@ -377,21 +379,6 @@ public class WriteTransaction extends Transaction<WritableContainer>
       newEntity.setEntityACL(oldEntity.getEntityACL());
     }
 
-    // new acl?
-    if (newEntity.hasEntityACL() && !newEntity.getEntityACL().equals(oldEntity.getEntityACL())) {
-      oldEntity.checkPermission(EntityPermission.EDIT_ACL);
-      if (!newEntity
-          .getEntityACL()
-          .getPriorityEntityACL()
-          .equals(oldEntity.getEntityACL().getPriorityEntityACL())) {
-        // priority acl is to be changed?
-        oldEntity.checkPermission(Permission.EDIT_PRIORITY_ACL);
-      }
-      updatetable = true;
-    } else if (!newEntity.hasEntityACL()) {
-      newEntity.setEntityACL(oldEntity.getEntityACL());
-    }
-
     // new query template definition?
     if (!Objects.equals(
         newEntity.getQueryTemplateDefinition(), oldEntity.getQueryTemplateDefinition())) {
-- 
GitLab