diff --git a/caosdb-webui b/caosdb-webui index 32fa3b8af945d4d0bf4e98818b2456bdc8f375c0..d02f34facc0409817daeac8a3a226a6cfcd0b895 160000 --- a/caosdb-webui +++ b/caosdb-webui @@ -1 +1 @@ -Subproject commit 32fa3b8af945d4d0bf4e98818b2456bdc8f375c0 +Subproject commit d02f34facc0409817daeac8a3a226a6cfcd0b895 diff --git a/src/main/java/caosdb/datetime/UTCDateTime.java b/src/main/java/caosdb/datetime/UTCDateTime.java index 886080dd48718bcfdc9f2f8d032dd35b624671c7..846c8f9f266d4b834314b95e00973993d9031224 100644 --- a/src/main/java/caosdb/datetime/UTCDateTime.java +++ b/src/main/java/caosdb/datetime/UTCDateTime.java @@ -292,7 +292,7 @@ public class UTCDateTime implements Interval { @Override public String toString() { - return toDateTimeString(TimeZone.getDefault()); + throw new NullPointerException("toString method!!!"); } public static UTCDateTime UTCSeconds(final Long utcseconds, final Integer nanosecond) { diff --git a/src/main/java/caosdb/server/entity/Message.java b/src/main/java/caosdb/server/entity/Message.java index 002a2cb174a4714b3c2658b375610480ccbcab5f..03e788251620b6c192eb86f1bbd172564a66235f 100644 --- a/src/main/java/caosdb/server/entity/Message.java +++ b/src/main/java/caosdb/server/entity/Message.java @@ -79,20 +79,20 @@ public class Message extends Exception implements Comparable<Message>, ToElement this(type, code, null, null); } - public Message(final int code, final String description) { + public Message(final Integer code, final String description) { this("Message", code, description, null); } - public Message(final MessageType type, final int code, final String description) { + public Message(final MessageType type, final Integer code, final String description) { this(type.toString(), code, description, null); } public Message( - final MessageType type, final int code, final String description, final String body) { + final MessageType type, final Integer code, final String description, final String body) { this(type.toString(), code, description, body); } - public Message(final String type, final int code, final String description) { + public Message(final String type, final Integer code, final String description) { this(type, code, description, null); } diff --git a/src/main/java/caosdb/server/jobs/Job.java b/src/main/java/caosdb/server/jobs/Job.java index 29d052a3cda7ba696e8a792fa8a5de3bd9135bcb..681098b76a9deb90bc05dbea6f13ad2acd937ea6 100644 --- a/src/main/java/caosdb/server/jobs/Job.java +++ b/src/main/java/caosdb/server/jobs/Job.java @@ -233,8 +233,12 @@ public abstract class Job extends AbstractObservable implements Observer { if (flagName.length() > 0) { allClasses.put(flagName.toLowerCase(), c); } + if (c.getAnnotation(JobAnnotation.class).loadAlways()) { + loadAlways.add(c); + } } } + // TODO merge these two parts of this function. Its the same! jobPackage = new Reflections("caosdb.server.jobs.extension"); allClassesSet = jobPackage.getSubTypesOf(Job.class); for (final Class<? extends Job> c : allClassesSet) { @@ -289,7 +293,8 @@ public abstract class Job extends AbstractObservable implements Observer { final ArrayList<Job> jobs = new ArrayList<>(); // load permanent jobs for (Class<? extends Job> j : loadAlways) { - if (j.getAnnotation(JobAnnotation.class).transaction().isInstance(transaction)) { + if (EntityJob.class.isAssignableFrom(j) + && j.getAnnotation(JobAnnotation.class).transaction().isInstance(transaction)) { jobs.add(getJob(j, Mode.MUST, entity, transaction)); } } @@ -425,4 +430,16 @@ public abstract class Job extends AbstractObservable implements Observer { public JobExecutionTime getExecutionTime() { return this.time; } + + public static List<Job> loadPermanentContainerJobs(Transaction<?> transaction) { + final ArrayList<Job> jobs = new ArrayList<>(); + // load permanent jobs + for (Class<? extends Job> j : loadAlways) { + if (ContainerJob.class.isAssignableFrom(j) + && j.getAnnotation(JobAnnotation.class).transaction().isInstance(transaction)) { + jobs.add(getJob(j, Mode.MUST, null, transaction)); + } + } + return jobs; + } } diff --git a/src/main/java/caosdb/server/jobs/core/Atomic.java b/src/main/java/caosdb/server/jobs/core/Atomic.java index f41eba282f750e6ec0f388d801e0eeabc7c60352..cdc9f25d7367a9732dcdcc9a0e03dd5e359acaa2 100644 --- a/src/main/java/caosdb/server/jobs/core/Atomic.java +++ b/src/main/java/caosdb/server/jobs/core/Atomic.java @@ -27,11 +27,15 @@ import caosdb.server.entity.EntityInterface; import caosdb.server.jobs.ContainerJob; import caosdb.server.jobs.JobAnnotation; import caosdb.server.jobs.JobExecutionTime; +import caosdb.server.transaction.WriteTransaction; import caosdb.server.utils.EntityStatus; import caosdb.server.utils.Observable; import caosdb.server.utils.ServerMessages; -@JobAnnotation(time = JobExecutionTime.POST_CHECK) +@JobAnnotation( + time = JobExecutionTime.POST_CHECK, + transaction = WriteTransaction.class, + loadAlways = true) public class Atomic extends ContainerJob { private boolean doCheck() { diff --git a/src/main/java/caosdb/server/jobs/core/CheckNoAdditionalPropertiesPresent.java b/src/main/java/caosdb/server/jobs/core/CheckNoAdditionalPropertiesPresent.java index 7904e47d52d4b92dc527d2cf8f7247df51d0edaf..1eb4941d47314f7f67bbe874784f2427cecdca92 100644 --- a/src/main/java/caosdb/server/jobs/core/CheckNoAdditionalPropertiesPresent.java +++ b/src/main/java/caosdb/server/jobs/core/CheckNoAdditionalPropertiesPresent.java @@ -7,6 +7,7 @@ import caosdb.server.jobs.JobAnnotation; import caosdb.server.utils.EntityStatus; import caosdb.server.utils.ServerMessages; import java.util.HashSet; +import java.util.Objects; import java.util.Set; @JobAnnotation( @@ -35,6 +36,7 @@ public class CheckNoAdditionalPropertiesPresent extends EntityJob { for (EntityInterface parentProperty : parent.getProperties()) { if (sameProperty(property, parentProperty) && !used.contains(parentProperty)) { used.add(parentProperty); + return; } } // not found! @@ -51,6 +53,6 @@ public class CheckNoAdditionalPropertiesPresent extends EntityJob { } private boolean sameProperty(EntityInterface property, EntityInterface parentProperty) { - return property.getId() == parentProperty.getId(); + return property.getId() != null && Objects.equals(property.getId(), parentProperty.getId()); } } diff --git a/src/main/java/caosdb/server/permissions/EntityACL.java b/src/main/java/caosdb/server/permissions/EntityACL.java index 86346bdfa3c3846e7951e41268e117ec2a99aaab..f2f89765a91cb182b0627dc41356c93b341aba47 100644 --- a/src/main/java/caosdb/server/permissions/EntityACL.java +++ b/src/main/java/caosdb/server/permissions/EntityACL.java @@ -48,7 +48,7 @@ public class EntityACL { public static final long OWNER_BITSET = 1; private final Collection<EntityACI> acl; - EntityACL(final Collection<EntityACI> acl) { + public EntityACL(final Collection<EntityACI> acl) { if (acl != null) { this.acl = acl; } else { @@ -60,13 +60,16 @@ public class EntityACL { final EntityACLFactory f = new EntityACLFactory(); f.grant(OWNER_ROLE, "*"); f.grant(OTHER_ROLE, "RETRIEVE:*"); + f.grant(OTHER_ROLE, "USE:*"); + f.grant(Role.ANONYMOUS_ROLE, "RETRIEVE:*"); + f.grant(Role.ANONYMOUS_ROLE, "USE:*"); f.deny(OTHER_ROLE, "UPDATE:*"); f.deny(OTHER_ROLE, "DELETE"); f.deny(OTHER_ROLE, true, "EDIT:ACL"); return f.create(); } - EntityACL(final EntityACI... aci) { + public EntityACL(final EntityACI... aci) { this.acl = new ArrayList<>(); for (final EntityACI a : aci) { this.acl.add(a); diff --git a/src/main/java/caosdb/server/query/CQLParser.g4 b/src/main/java/caosdb/server/query/CQLParser.g4 index 12fa0fc7663efca549a8306dd68ca7e910040172..48205d1fece3309570f40e566078f51c96cab1bd 100644 --- a/src/main/java/caosdb/server/query/CQLParser.g4 +++ b/src/main/java/caosdb/server/query/CQLParser.g4 @@ -236,10 +236,12 @@ pov returns [POV filter] locals [Query.Pattern p, String o, String v, String a] ( property {$p = $property.pp; $a=$property.agg;} ( - ( LIKE {$o = $LIKE.text;} + ( + LIKE {$o = $LIKE.text;} ( like_pattern {$v = $like_pattern.ep.toString();} - | value {$v = $value.str;} ) - | OPERATOR {$o = $OPERATOR.text;} value {$v = $value.str;}) + | value {$v = $value.str;} ) + | OPERATOR {$o = $OPERATOR.text;} value {$v = $value.str;} + ) | IS_NULL {$o = "0";} | IS_NOT_NULL {$o = "!0";} | IN datetime {$o = "("; $v=$datetime.text;} @@ -248,11 +250,14 @@ pov returns [POV filter] locals [Query.Pattern p, String o, String v, String a] ) | ( - OPERATOR {$o = $OPERATOR.text;} value {$v = $value.str;} - ( - AS_A - property {$p = $property.pp;} - )? + ( LIKE {$o = $LIKE.text;} + ( like_pattern {$v = $like_pattern.ep.toString();} + | value {$v = $value.str;} ) + ) + | ( OPERATOR {$o = $OPERATOR.text;} value {$v = $value.str;} + ( AS_A + property {$p = $property.pp;} )? + ) ) ; diff --git a/src/main/java/caosdb/server/transaction/Transaction.java b/src/main/java/caosdb/server/transaction/Transaction.java index 9e03b7750c4f34f70754001862f6da9adf0a90ef..de1e5e279ee4b1cd252dda0fdf6bb23e8f93e57f 100644 --- a/src/main/java/caosdb/server/transaction/Transaction.java +++ b/src/main/java/caosdb/server/transaction/Transaction.java @@ -38,7 +38,6 @@ import caosdb.server.jobs.Job; import caosdb.server.jobs.JobExecutionTime; import caosdb.server.jobs.Schedule; import caosdb.server.jobs.core.AccessControl; -import caosdb.server.jobs.core.Atomic; import caosdb.server.jobs.core.CheckDatatypePresent; import caosdb.server.jobs.core.CheckEntityACLRoles; import caosdb.server.jobs.core.Mode; @@ -86,13 +85,13 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra this.schedule.add(loadContainerFlags); this.schedule.runJob(loadContainerFlags); - // all transactions are atomic - this.schedule.add(Job.getJob(Atomic.class.getSimpleName(), Mode.MUST, null, this)); - // AccessControl this.schedule.add(Job.getJob(AccessControl.class.getSimpleName(), Mode.MUST, null, this)); this.schedule.add(Job.getJob(CheckEntityACLRoles.class.getSimpleName(), Mode.MUST, null, this)); + // load permanent container jobs + this.schedule.addAll(Job.loadPermanentContainerJobs(this)); + for (final EntityInterface e : getContainer()) { final List<Job> loadJobs = Job.loadJobs(e, this); this.schedule.addAll(loadJobs); diff --git a/src/main/java/caosdb/server/utils/ServerMessages.java b/src/main/java/caosdb/server/utils/ServerMessages.java index ac1d47a3e58c3c1158a6e4c1bf3e6ffea1425689..63cadf5f3a0eedca04e8dab21a0213a81bf2bd3c 100644 --- a/src/main/java/caosdb/server/utils/ServerMessages.java +++ b/src/main/java/caosdb/server/utils/ServerMessages.java @@ -423,7 +423,7 @@ public class ServerMessages { new Message( MessageType.Warning, 0, - "This property is an additional property which has no corresponding properties among the properties of the parents."); + "This property is an additional property which has no corresponding property among the properties of the parents."); public static final Message PROPERTY_WITH_DATATYPE_OVERRIDE = new Message(MessageType.Warning, 0, "This property overrides the datatype.");