diff --git a/caosdb-webui b/caosdb-webui index 8c59cc861d646cbdba0ec749ba052656f67fd58d..5dfe879722bd01acc5209c581b60bf0ac49635b6 160000 --- a/caosdb-webui +++ b/caosdb-webui @@ -1 +1 @@ -Subproject commit 8c59cc861d646cbdba0ec749ba052656f67fd58d +Subproject commit 5dfe879722bd01acc5209c581b60bf0ac49635b6 diff --git a/src/main/java/org/caosdb/server/query/Query.java b/src/main/java/org/caosdb/server/query/Query.java index 0a877fc83e2f680565181655ed92c3a61cda393b..deee34bfea87f15167689c602ab4a238cea547fe 100644 --- a/src/main/java/org/caosdb/server/query/Query.java +++ b/src/main/java/org/caosdb/server/query/Query.java @@ -39,6 +39,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.UUID; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; import org.apache.commons.jcs.access.behavior.ICacheAccess; @@ -238,6 +239,8 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac */ private boolean cachable = true; + private static String cacheETag = UUID.randomUUID().toString(); + public Type getType() { return this.type; } @@ -668,6 +671,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac /** Remove all cached queries from the cache. */ public static void clearCache() { + cacheETag = UUID.randomUUID().toString(); cache.clear(); } @@ -678,10 +682,12 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac * @param resultSet */ private void setCache(String key, List<IdVersionPair> resultSet) { - if (resultSet instanceof Serializable) { - cache.put(key, (Serializable) resultSet); - } else { - cache.put(key, new ArrayList<>(resultSet)); + synchronized (cache) { + if (resultSet instanceof Serializable) { + cache.put(key, (Serializable) resultSet); + } else { + cache.put(key, new ArrayList<>(resultSet)); + } } } @@ -859,6 +865,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac ret.setAttribute("results", "0"); } ret.setAttribute("cached", Boolean.toString(this.cached)); + ret.setAttribute("etag", cacheETag); final Element parseTreeElem = new Element("ParseTree"); if (this.el.hasErrors()) { diff --git a/src/main/java/org/caosdb/server/transaction/WriteTransaction.java b/src/main/java/org/caosdb/server/transaction/WriteTransaction.java index abda78b6feeb0de7104de5365877b28d474058fe..570fce2c2b001699fdb48c1379e807ae05d62996 100644 --- a/src/main/java/org/caosdb/server/transaction/WriteTransaction.java +++ b/src/main/java/org/caosdb/server/transaction/WriteTransaction.java @@ -215,13 +215,7 @@ public class WriteTransaction extends Transaction<WritableContainer> .setFile(oldEntity.getFileProperties().retrieveFromFileSystem()); } - try { - checkPermissions(entity, deriveUpdate(entity, oldEntity)); - } catch (final AuthorizationException exc) { - entity.setEntityStatus(EntityStatus.UNQUALIFIED); - entity.addError(ServerMessages.AUTHORIZATION_ERROR); - entity.addInfo(exc.getMessage()); - } + ((UpdateEntity) entity).setOriginal(oldEntity); } break innerLoop; } @@ -290,6 +284,18 @@ public class WriteTransaction extends Transaction<WritableContainer> @Override protected void preCheck() throws InterruptedException, Exception { for (final EntityInterface entity : getContainer()) { + try { + 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); + entity.addInfo(exc.getMessage()); + } catch (ClassCastException exc) { + // not an update entity. ignore. + } + // set default EntityACL if none present if (entity.getEntityACL() == null) { entity.setEntityACL(EntityACL.getOwnerACLFor(SecurityUtils.getSubject()));