diff --git a/.gitignore b/.gitignore index fb8d1973e9a07d5509be333713413aa355f2f17b..af5f56533fa51f59bd52b39a413b9b11a88bf4f9 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,6 @@ target/ .classpath .project .settings + +# logfiles +screen*log* diff --git a/caosdb-webui b/caosdb-webui index 32fa3b8af945d4d0bf4e98818b2456bdc8f375c0..519e9f868d299ca0d7477e423e71e3f080000a00 160000 --- a/caosdb-webui +++ b/caosdb-webui @@ -1 +1 @@ -Subproject commit 32fa3b8af945d4d0bf4e98818b2456bdc8f375c0 +Subproject commit 519e9f868d299ca0d7477e423e71e3f080000a00 diff --git a/makefile b/makefile index 78541e6bec549dcf0676520bd79739172afd4735..a972dcbb5edc2b3a4c1cb760327c4bfba8b46b82 100644 --- a/makefile +++ b/makefile @@ -21,9 +21,13 @@ # ** end header # +<<<<<<< HEAD runserver: mvn exec:exec +======= +SHELL:=/bin/bash +>>>>>>> 619a505b48586e03fd34f65da12d6ff1b32138c6 run: compile mvn exec:exec @@ -62,9 +66,14 @@ clean: clean-antlr clean-antlr: rm -rf target/generated-sources/antlr4/ -run-debug-screen: +.PHONY: run-server-screen +run-server-screen: + @if test "$$(screen -ls | grep -c 'caosdb-screen')" -eq "1"; then \ + echo "server is probably running. try 'screen -ls'"; \ + exit 1 ; \ + fi # start and wait for server - @screen -L -S caosdb-screen -t server -d -m -A make run-debug + @screen -L -S caosdb-screen -t server -d -m -A make run @sleep 2 @while [ 1 -eq 1 ] ; do \ screen -S caosdb-screen -X hardcopy .screen.log || break ; \ @@ -72,11 +81,33 @@ run-debug-screen: done; \ -stop-debug-screen: - # stop screen session with debug server +.PHONY: stop-server-screen +stop-server-screen: + # stop screen session with server @screen -S caosdb-screen -X hardcopy screen.log || true @screen -S caosdb-screen -p server -X stuff "^C" +.PHONY: run-debug-screen +run-debug-screen: + @if test "$$(screen -ls | grep -c 'caosdb-debug-screen')" -eq "1"; then \ + echo "server is probably running. try 'screen -ls'"; \ + exit 1 ; \ + fi + # start and wait for server + @screen -L -S caosdb-debug-screen -t server -d -m -A make run-debug + @sleep 2 + @while [ 1 -eq 1 ] ; do \ + screen -S caosdb-debug-screen -X hardcopy .screen.log || break ; \ + [ $$(grep -c "org.restlet.ext.jetty.JettyServerHelper start" .screen.log) -eq 0 ] || break ; \ + done; \ + + +.PHONY: stop-debug-screen +stop-debug-screen: + # stop screen session with debug server + @screen -S caosdb-debug-screen -X hardcopy screen.log || true + @screen -S caosdb-debug-screen -p server -X stuff "^C" + .m2-local: mkdir .m2-local diff --git a/misc/pam_authentication/makefile b/misc/pam_authentication/makefile index 7c7adf6b2060fc5827c917a38f804d226ce764c1..26bd0e9fcab2420c0f88219248bf57f768d64068 100644 --- a/misc/pam_authentication/makefile +++ b/misc/pam_authentication/makefile @@ -23,5 +23,5 @@ # Makefile for pam_authentication.c main: pam_authentication.c - mkdir ./bin + mkdir -p ./bin gcc -o ./bin/pam_authentication pam_authentication.c -lpam -lpam_misc diff --git a/src/main/java/caosdb/server/ServerProperties.java b/src/main/java/caosdb/server/ServerProperties.java index a4f93ec1c1207e21b0d282974fbf23c1a028053e..761dc4a3f78898b259547a60975d9eeca9915e43 100644 --- a/src/main/java/caosdb/server/ServerProperties.java +++ b/src/main/java/caosdb/server/ServerProperties.java @@ -117,6 +117,10 @@ public class ServerProperties extends Properties { public static final String KEY_SERVER_SIDE_SCRIPTING_WORKING_DIR = "SERVER_SIDE_SCRIPTING_WORKING_DIR"; + public static final String KEY_NO_REPLY_EMAIL = "NO_REPLY_EMAIL"; + + public static final String KEY_NO_REPLY_NAME = "NO_REPLY_NAME"; + /** * This init_server_properties method reads the config file which contains key-value-pairs for * such variables like the user name of the database, the port the server will be listening on diff --git a/src/main/java/caosdb/server/database/backend/implementation/MySQL/MySQLRetrievePermissionRules.java b/src/main/java/caosdb/server/database/backend/implementation/MySQL/MySQLRetrievePermissionRules.java index d4b35ae65f2f4fb92a02dade22a0c06aee14ffae..7428157e45156e18e0ce1819f731dd4729faee99 100644 --- a/src/main/java/caosdb/server/database/backend/implementation/MySQL/MySQLRetrievePermissionRules.java +++ b/src/main/java/caosdb/server/database/backend/implementation/MySQL/MySQLRetrievePermissionRules.java @@ -59,7 +59,7 @@ public class MySQLRetrievePermissionRules extends MySQLTransaction } catch (final ConnectionException e) { throw new TransactionException(e); } - return null; + return new HashSet<>(); } @SuppressWarnings("unchecked") diff --git a/src/main/java/caosdb/server/database/backend/transaction/DeleteEntityProperties.java b/src/main/java/caosdb/server/database/backend/transaction/DeleteEntityProperties.java index addcb4e7e73a46125a5938f30cf8c307af99b645..15ace2b9820398cb270a6a1e098e6f642b66ab9d 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/DeleteEntityProperties.java +++ b/src/main/java/caosdb/server/database/backend/transaction/DeleteEntityProperties.java @@ -23,6 +23,7 @@ package caosdb.server.database.backend.transaction; import static caosdb.server.transaction.Transaction.ERROR_INTEGRITY_VIOLATION; + import caosdb.server.database.BackendTransaction; import caosdb.server.database.backend.interfaces.DeleteEntityPropertiesImpl; import caosdb.server.database.exceptions.IntegrityException; diff --git a/src/main/java/caosdb/server/database/backend/transaction/DeleteFile.java b/src/main/java/caosdb/server/database/backend/transaction/DeleteFile.java index 1123599561dad58fc9ae8a4c3218e05d4c7b0507..82c022bef0f321f5a1be81e5f58207c9d06cd427 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/DeleteFile.java +++ b/src/main/java/caosdb/server/database/backend/transaction/DeleteFile.java @@ -22,12 +22,12 @@ */ package caosdb.server.database.backend.transaction; -import java.io.IOException; import caosdb.server.CaosDBException; import caosdb.server.database.BackendTransaction; import caosdb.server.database.exceptions.TransactionException; import caosdb.server.entity.EntityInterface; import caosdb.server.entity.Message; +import java.io.IOException; public class DeleteFile extends BackendTransaction { diff --git a/src/main/java/caosdb/server/database/backend/transaction/DeleteSparseEntity.java b/src/main/java/caosdb/server/database/backend/transaction/DeleteSparseEntity.java index f777a124c3bc9f64d81333c4298477e45b92a076..4bd6e5b9706fe743be6c924c3e1f86cb6ff83371 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/DeleteSparseEntity.java +++ b/src/main/java/caosdb/server/database/backend/transaction/DeleteSparseEntity.java @@ -23,6 +23,7 @@ package caosdb.server.database.backend.transaction; import static caosdb.server.transaction.Transaction.ERROR_INTEGRITY_VIOLATION; + import caosdb.server.database.BackendTransaction; import caosdb.server.database.backend.interfaces.DeleteSparseEntityImpl; import caosdb.server.database.exceptions.IntegrityException; @@ -38,7 +39,7 @@ public class DeleteSparseEntity extends BackendTransaction { } @Override - protected void execute() { + protected void execute() { RetrieveSparseEntity.removeCached(this.entity.getId()); final DeleteSparseEntityImpl ret = getImplementation(DeleteSparseEntityImpl.class); diff --git a/src/main/java/caosdb/server/database/backend/transaction/GetChildren.java b/src/main/java/caosdb/server/database/backend/transaction/GetChildren.java index 2952b98567d260f4a54965fdbed08852cb723b89..d476345c2e05cf75d5bcfdf333edf760ff991e3a 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/GetChildren.java +++ b/src/main/java/caosdb/server/database/backend/transaction/GetChildren.java @@ -22,10 +22,10 @@ */ package caosdb.server.database.backend.transaction; -import java.util.List; import caosdb.server.database.BackendTransaction; import caosdb.server.database.backend.interfaces.GetChildrenImpl; import caosdb.server.database.exceptions.TransactionException; +import java.util.List; public class GetChildren extends BackendTransaction { diff --git a/src/main/java/caosdb/server/database/backend/transaction/GetDependentEntities.java b/src/main/java/caosdb/server/database/backend/transaction/GetDependentEntities.java index 60143ec8fb84cb3e78bec44b7d989adb73e2ab42..e4e6e96f999d5ceb3402d1235de04ae6f32e358b 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/GetDependentEntities.java +++ b/src/main/java/caosdb/server/database/backend/transaction/GetDependentEntities.java @@ -22,10 +22,10 @@ */ package caosdb.server.database.backend.transaction; -import java.util.List; import caosdb.server.database.BackendTransaction; import caosdb.server.database.backend.interfaces.GetDependentEntitiesImpl; import caosdb.server.database.exceptions.TransactionException; +import java.util.List; public class GetDependentEntities extends BackendTransaction { diff --git a/src/main/java/caosdb/server/database/backend/transaction/GetFileIterator.java b/src/main/java/caosdb/server/database/backend/transaction/GetFileIterator.java index d8f47b18a6705d6c86ad6a61b43c293dcbb17ff2..7e28ff243575f75ea577ec80029507cfa1d49d17 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/GetFileIterator.java +++ b/src/main/java/caosdb/server/database/backend/transaction/GetFileIterator.java @@ -22,10 +22,10 @@ */ package caosdb.server.database.backend.transaction; -import java.util.Iterator; import caosdb.server.database.BackendTransaction; import caosdb.server.database.backend.interfaces.GetFileIteratorImpl; import caosdb.server.database.exceptions.TransactionException; +import java.util.Iterator; public class GetFileIterator extends BackendTransaction { diff --git a/src/main/java/caosdb/server/database/backend/transaction/GetIDByName.java b/src/main/java/caosdb/server/database/backend/transaction/GetIDByName.java index 1adda922cf449d84404b6284507cb00a660f99dd..895cd707b57d70693ec6a80396b26bce391027af 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/GetIDByName.java +++ b/src/main/java/caosdb/server/database/backend/transaction/GetIDByName.java @@ -22,12 +22,12 @@ */ package caosdb.server.database.backend.transaction; -import java.util.List; import caosdb.server.database.BackendTransaction; import caosdb.server.database.backend.interfaces.GetIDByNameImpl; import caosdb.server.database.exceptions.EntityDoesNotExistException; import caosdb.server.database.exceptions.EntityWasNotUniqueException; import caosdb.server.database.exceptions.TransactionException; +import java.util.List; public class GetIDByName extends BackendTransaction { diff --git a/src/main/java/caosdb/server/database/backend/transaction/InsertEntityDatatype.java b/src/main/java/caosdb/server/database/backend/transaction/InsertEntityDatatype.java index f0f7dbe2fa9303076541403628c17f8b5f24f4e4..58aa4d88498e7493466cde844d241336b29e3896 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/InsertEntityDatatype.java +++ b/src/main/java/caosdb/server/database/backend/transaction/InsertEntityDatatype.java @@ -1,6 +1,7 @@ package caosdb.server.database.backend.transaction; import static caosdb.server.transaction.Transaction.ERROR_INTEGRITY_VIOLATION; + import caosdb.server.database.BackendTransaction; import caosdb.server.database.backend.interfaces.InsertEntityDatatypeImpl; import caosdb.server.database.exceptions.IntegrityException; diff --git a/src/main/java/caosdb/server/database/backend/transaction/InsertEntityProperties.java b/src/main/java/caosdb/server/database/backend/transaction/InsertEntityProperties.java index d5e32df192db6373d50710d760953bc0f651d37c..05e4dbce0087ce8073d124136419f760a66d581c 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/InsertEntityProperties.java +++ b/src/main/java/caosdb/server/database/backend/transaction/InsertEntityProperties.java @@ -22,9 +22,6 @@ */ package caosdb.server.database.backend.transaction; -import java.util.ArrayList; -import java.util.Deque; -import java.util.List; import caosdb.server.database.BackendTransaction; import caosdb.server.database.DatabaseUtils; import caosdb.server.database.backend.interfaces.InsertEntityPropertiesImpl; @@ -38,6 +35,9 @@ import caosdb.server.entity.EntityInterface; import caosdb.server.entity.Role; import caosdb.server.entity.StatementStatus; import caosdb.server.entity.wrapper.Property; +import java.util.ArrayList; +import java.util.Deque; +import java.util.List; public class InsertEntityProperties extends BackendTransaction { diff --git a/src/main/java/caosdb/server/database/backend/transaction/InsertFile.java b/src/main/java/caosdb/server/database/backend/transaction/InsertFile.java index fe479b20e9a6541b6c2dae2a62165e512247db37..fe9b930e7a51391e3379f76b6393081edbcc0583 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/InsertFile.java +++ b/src/main/java/caosdb/server/database/backend/transaction/InsertFile.java @@ -22,12 +22,12 @@ */ package caosdb.server.database.backend.transaction; -import java.io.IOException; import caosdb.server.database.BackendTransaction; import caosdb.server.database.exceptions.TransactionException; import caosdb.server.entity.EntityInterface; import caosdb.server.entity.Message; import caosdb.server.utils.EntityStatus; +import java.io.IOException; public class InsertFile extends BackendTransaction { @@ -38,7 +38,7 @@ public class InsertFile extends BackendTransaction { } @Override - public void execute(){ + public void execute() { try { if (this.entity.getEntityStatus() == EntityStatus.QUALIFIED) { diff --git a/src/main/java/caosdb/server/database/backend/transaction/InsertLogRecord.java b/src/main/java/caosdb/server/database/backend/transaction/InsertLogRecord.java index c951712a055e70495b58fc63eccec8ef4947f3f7..43a21d481d954d34dba66a2f9b824acfaac2aabd 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/InsertLogRecord.java +++ b/src/main/java/caosdb/server/database/backend/transaction/InsertLogRecord.java @@ -22,11 +22,11 @@ */ package caosdb.server.database.backend.transaction; -import java.util.List; -import java.util.logging.LogRecord; import caosdb.server.database.BackendTransaction; import caosdb.server.database.backend.interfaces.InsertLogRecordImpl; import caosdb.server.database.exceptions.TransactionException; +import java.util.List; +import java.util.logging.LogRecord; public class InsertLogRecord extends BackendTransaction { diff --git a/src/main/java/caosdb/server/database/backend/transaction/InsertSparseEntity.java b/src/main/java/caosdb/server/database/backend/transaction/InsertSparseEntity.java index 1d11d85c449c2862eb18be6aa2752b79b642831a..f8711197064a88dd92c408f329d1a36df55c5ed2 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/InsertSparseEntity.java +++ b/src/main/java/caosdb/server/database/backend/transaction/InsertSparseEntity.java @@ -23,6 +23,7 @@ package caosdb.server.database.backend.transaction; import static caosdb.server.transaction.Transaction.ERROR_INTEGRITY_VIOLATION; + import caosdb.server.database.BackendTransaction; import caosdb.server.database.backend.interfaces.InsertSparseEntityImpl; import caosdb.server.database.exceptions.IntegrityException; diff --git a/src/main/java/caosdb/server/database/backend/transaction/RegisterSubDomain.java b/src/main/java/caosdb/server/database/backend/transaction/RegisterSubDomain.java index f5cd5604cd27b88b87cc1c039708ce4c760aff52..08b999d0e0c1e36d108c89a0cf9eed513d3290e4 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/RegisterSubDomain.java +++ b/src/main/java/caosdb/server/database/backend/transaction/RegisterSubDomain.java @@ -22,10 +22,10 @@ */ package caosdb.server.database.backend.transaction; -import java.util.Deque; import caosdb.server.database.BackendTransaction; import caosdb.server.database.backend.interfaces.RegisterSubDomainImpl; import caosdb.server.database.exceptions.TransactionException; +import java.util.Deque; public class RegisterSubDomain extends BackendTransaction { diff --git a/src/main/java/caosdb/server/database/backend/transaction/RetrieveAll.java b/src/main/java/caosdb/server/database/backend/transaction/RetrieveAll.java index 28f8e3442df30ed4c36ad4305b7143f01ad89cc9..5820547c853247245b398778fab97bd854a5a126 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/RetrieveAll.java +++ b/src/main/java/caosdb/server/database/backend/transaction/RetrieveAll.java @@ -22,12 +22,12 @@ */ package caosdb.server.database.backend.transaction; -import java.util.List; import caosdb.server.database.BackendTransaction; import caosdb.server.database.backend.interfaces.RetrieveAllImpl; import caosdb.server.database.exceptions.TransactionException; import caosdb.server.entity.RetrieveEntity; import caosdb.server.entity.container.TransactionContainer; +import java.util.List; public class RetrieveAll extends BackendTransaction { diff --git a/src/main/java/caosdb/server/database/backend/transaction/RetrieveAllUncheckedFiles.java b/src/main/java/caosdb/server/database/backend/transaction/RetrieveAllUncheckedFiles.java index 192428e743a8ca34aa6e2cbdebd321b90855ea6f..b99694243d9b6571c1c96ac4ce3114543380c434 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/RetrieveAllUncheckedFiles.java +++ b/src/main/java/caosdb/server/database/backend/transaction/RetrieveAllUncheckedFiles.java @@ -22,11 +22,11 @@ */ package caosdb.server.database.backend.transaction; -import java.util.Iterator; import caosdb.server.database.BackendTransaction; import caosdb.server.database.backend.interfaces.RetrieveAllUncheckedFilesImpl; import caosdb.server.database.exceptions.TransactionException; import caosdb.server.database.proto.SparseEntity; +import java.util.Iterator; public class RetrieveAllUncheckedFiles extends BackendTransaction { diff --git a/src/main/java/caosdb/server/database/backend/transaction/RetrieveDatatypes.java b/src/main/java/caosdb/server/database/backend/transaction/RetrieveDatatypes.java index 08eac872e3ecc2521756f49fc4ad8cf134bb03db..44f8427aeb2911c0483be3824a1e3fe831350cb5 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/RetrieveDatatypes.java +++ b/src/main/java/caosdb/server/database/backend/transaction/RetrieveDatatypes.java @@ -22,7 +22,6 @@ */ package caosdb.server.database.backend.transaction; -import java.util.ArrayList; import caosdb.server.database.BackendTransaction; import caosdb.server.database.backend.interfaces.RetrieveDatatypesImpl; import caosdb.server.database.exceptions.TransactionException; @@ -31,6 +30,7 @@ import caosdb.server.entity.Entity; import caosdb.server.entity.EntityInterface; import caosdb.server.entity.RetrieveEntity; import caosdb.server.entity.container.Container; +import java.util.ArrayList; public class RetrieveDatatypes extends BackendTransaction { diff --git a/src/main/java/caosdb/server/database/backend/transaction/RetrieveFullEntity.java b/src/main/java/caosdb/server/database/backend/transaction/RetrieveFullEntity.java index 62edee0d15fef47e92a2bbc6b7d1fa8d3e92eb92..7ac8c1592e0cb275e60008532cdabb33919369a9 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/RetrieveFullEntity.java +++ b/src/main/java/caosdb/server/database/backend/transaction/RetrieveFullEntity.java @@ -64,7 +64,7 @@ public class RetrieveFullEntity extends BackendTransaction { } } } - + public Container<? extends EntityInterface> getContainer() { return container; } diff --git a/src/main/java/caosdb/server/database/backend/transaction/RetrieveLogRecord.java b/src/main/java/caosdb/server/database/backend/transaction/RetrieveLogRecord.java index a08d737fcec38d1c1251514e12ac49ef2806408d..42211d4312af6370c0f0335dd823f6129719dafd 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/RetrieveLogRecord.java +++ b/src/main/java/caosdb/server/database/backend/transaction/RetrieveLogRecord.java @@ -22,12 +22,12 @@ */ package caosdb.server.database.backend.transaction; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.LogRecord; import caosdb.server.database.BackendTransaction; import caosdb.server.database.backend.interfaces.RetrieveLogRecordImpl; import caosdb.server.database.exceptions.TransactionException; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.LogRecord; public class RetrieveLogRecord extends BackendTransaction { diff --git a/src/main/java/caosdb/server/database/backend/transaction/RetrieveParents.java b/src/main/java/caosdb/server/database/backend/transaction/RetrieveParents.java index 0169b087230250c9470909dc6f480b052bfd1429..5d1545d29b9bab295c9f335fe4eb083f12f748b2 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/RetrieveParents.java +++ b/src/main/java/caosdb/server/database/backend/transaction/RetrieveParents.java @@ -22,8 +22,6 @@ */ package caosdb.server.database.backend.transaction; -import java.util.ArrayList; -import org.apache.commons.jcs.access.CacheAccess; import caosdb.server.CaosDBServer; import caosdb.server.ServerProperties; import caosdb.server.database.CacheableBackendTransaction; @@ -33,6 +31,8 @@ import caosdb.server.database.exceptions.TransactionException; import caosdb.server.database.misc.Cache; import caosdb.server.database.proto.VerySparseEntity; import caosdb.server.entity.EntityInterface; +import java.util.ArrayList; +import org.apache.commons.jcs.access.CacheAccess; public class RetrieveParents extends CacheableBackendTransaction<Integer, ArrayList<VerySparseEntity>> { diff --git a/src/main/java/caosdb/server/database/backend/transaction/RetrievePermissionRules.java b/src/main/java/caosdb/server/database/backend/transaction/RetrievePermissionRules.java index ef99a55b8c05eb5b291c0022fb10df3d5d03a84a..c0daecbc46ac90630eac83d0c7334d7da148d429 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/RetrievePermissionRules.java +++ b/src/main/java/caosdb/server/database/backend/transaction/RetrievePermissionRules.java @@ -22,8 +22,6 @@ */ package caosdb.server.database.backend.transaction; -import java.util.HashSet; -import org.apache.commons.jcs.access.CacheAccess; import caosdb.server.CaosDBServer; import caosdb.server.ServerProperties; import caosdb.server.database.CacheableBackendTransaction; @@ -31,6 +29,8 @@ import caosdb.server.database.backend.interfaces.RetrievePermissionRulesImpl; import caosdb.server.database.exceptions.TransactionException; import caosdb.server.database.misc.Cache; import caosdb.server.permissions.PermissionRule; +import java.util.HashSet; +import org.apache.commons.jcs.access.CacheAccess; public class RetrievePermissionRules extends CacheableBackendTransaction<String, HashSet<PermissionRule>> { diff --git a/src/main/java/caosdb/server/database/backend/transaction/RetrieveProperties.java b/src/main/java/caosdb/server/database/backend/transaction/RetrieveProperties.java index 98f7994cb001c7f1fbe22e6bbeb34e119537a940..b75d91acba76a4d97b16395701afe42ff05c5fac 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/RetrieveProperties.java +++ b/src/main/java/caosdb/server/database/backend/transaction/RetrieveProperties.java @@ -22,8 +22,6 @@ */ package caosdb.server.database.backend.transaction; -import java.util.ArrayList; -import org.apache.commons.jcs.access.CacheAccess; import caosdb.server.CaosDBServer; import caosdb.server.ServerProperties; import caosdb.server.database.CacheableBackendTransaction; @@ -35,6 +33,8 @@ import caosdb.server.database.proto.ProtoProperty; import caosdb.server.entity.EntityInterface; import caosdb.server.entity.Role; import caosdb.server.entity.wrapper.Property; +import java.util.ArrayList; +import org.apache.commons.jcs.access.CacheAccess; public class RetrieveProperties extends CacheableBackendTransaction<Integer, ArrayList<ProtoProperty>> { diff --git a/src/main/java/caosdb/server/database/backend/transaction/RetrieveRole.java b/src/main/java/caosdb/server/database/backend/transaction/RetrieveRole.java index ef5a5ec60947b1e5ba7b0030e0a9c2b1e43fa3d8..e45879964ef8bafad0106238073ff8c9d87e2287 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/RetrieveRole.java +++ b/src/main/java/caosdb/server/database/backend/transaction/RetrieveRole.java @@ -22,7 +22,6 @@ */ package caosdb.server.database.backend.transaction; -import org.apache.commons.jcs.access.CacheAccess; import caosdb.server.CaosDBServer; import caosdb.server.ServerProperties; import caosdb.server.accessControl.Role; @@ -30,6 +29,7 @@ import caosdb.server.database.CacheableBackendTransaction; import caosdb.server.database.backend.interfaces.RetrieveRoleImpl; import caosdb.server.database.exceptions.TransactionException; import caosdb.server.database.misc.Cache; +import org.apache.commons.jcs.access.CacheAccess; public class RetrieveRole extends CacheableBackendTransaction<String, Role> { diff --git a/src/main/java/caosdb/server/database/backend/transaction/RetrieveSparseEntity.java b/src/main/java/caosdb/server/database/backend/transaction/RetrieveSparseEntity.java index 4d533068a39b03a03aad887387c6ee5d5e648ed7..df9f58671184fb70fca99ca7707f9270f75c87a1 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/RetrieveSparseEntity.java +++ b/src/main/java/caosdb/server/database/backend/transaction/RetrieveSparseEntity.java @@ -22,7 +22,6 @@ */ package caosdb.server.database.backend.transaction; -import org.apache.commons.jcs.access.CacheAccess; import caosdb.server.CaosDBServer; import caosdb.server.ServerProperties; import caosdb.server.database.CacheableBackendTransaction; @@ -34,6 +33,7 @@ import caosdb.server.database.proto.SparseEntity; import caosdb.server.entity.Entity; import caosdb.server.entity.EntityInterface; import caosdb.server.utils.EntityStatus; +import org.apache.commons.jcs.access.CacheAccess; public class RetrieveSparseEntity extends CacheableBackendTransaction<Integer, SparseEntity> { diff --git a/src/main/java/caosdb/server/database/backend/transaction/RetrieveTransactionHistory.java b/src/main/java/caosdb/server/database/backend/transaction/RetrieveTransactionHistory.java index 795e1691282ad325288623c22f6578f9035f9d6f..cb9cdd9e993b9399f2bec5c9bff7316e0754b9ed 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/RetrieveTransactionHistory.java +++ b/src/main/java/caosdb/server/database/backend/transaction/RetrieveTransactionHistory.java @@ -22,8 +22,6 @@ */ package caosdb.server.database.backend.transaction; -import java.util.ArrayList; -import org.apache.commons.jcs.access.CacheAccess; import caosdb.datetime.UTCDateTime; import caosdb.server.database.CacheableBackendTransaction; import caosdb.server.database.backend.interfaces.RetrieveTransactionHistoryImpl; @@ -31,6 +29,8 @@ import caosdb.server.database.exceptions.TransactionException; import caosdb.server.database.proto.ProtoTransactionLogMessage; import caosdb.server.entity.EntityInterface; import caosdb.server.utils.TransactionLogMessage; +import java.util.ArrayList; +import org.apache.commons.jcs.access.CacheAccess; public class RetrieveTransactionHistory extends CacheableBackendTransaction<Integer, ArrayList<ProtoTransactionLogMessage>> { diff --git a/src/main/java/caosdb/server/database/backend/transaction/RetrieveUser.java b/src/main/java/caosdb/server/database/backend/transaction/RetrieveUser.java index 9ccc45821560f83f84fa18f6f9bf8e9f18916cde..7492df38adfcfd24d18f1a263be5070a8916c9c8 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/RetrieveUser.java +++ b/src/main/java/caosdb/server/database/backend/transaction/RetrieveUser.java @@ -22,7 +22,6 @@ */ package caosdb.server.database.backend.transaction; -import org.apache.commons.jcs.access.CacheAccess; import caosdb.server.CaosDBServer; import caosdb.server.ServerProperties; import caosdb.server.accessControl.Principal; @@ -31,6 +30,7 @@ import caosdb.server.database.backend.interfaces.RetrieveUserImpl; import caosdb.server.database.exceptions.TransactionException; import caosdb.server.database.misc.Cache; import caosdb.server.database.proto.ProtoUser; +import org.apache.commons.jcs.access.CacheAccess; public class RetrieveUser extends CacheableBackendTransaction<Principal, ProtoUser> { diff --git a/src/main/java/caosdb/server/database/backend/transaction/RuleLoader.java b/src/main/java/caosdb/server/database/backend/transaction/RuleLoader.java index 888cefc5a8101b4236f59f91e4701f6c9e2b418b..1a8698ac1d698946e7a3e239c03e386bc200e2b6 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/RuleLoader.java +++ b/src/main/java/caosdb/server/database/backend/transaction/RuleLoader.java @@ -22,8 +22,6 @@ */ package caosdb.server.database.backend.transaction; -import java.util.ArrayList; -import org.apache.commons.jcs.access.CacheAccess; import caosdb.server.CaosDBServer; import caosdb.server.ServerProperties; import caosdb.server.database.CacheableBackendTransaction; @@ -35,6 +33,8 @@ import caosdb.server.entity.EntityInterface; import caosdb.server.entity.container.TransactionContainer; import caosdb.server.jobs.Job; import caosdb.server.transaction.Transaction; +import java.util.ArrayList; +import org.apache.commons.jcs.access.CacheAccess; public class RuleLoader extends CacheableBackendTransaction<String, ArrayList<Rule>> { diff --git a/src/main/java/caosdb/server/database/backend/transaction/SetPermissionRules.java b/src/main/java/caosdb/server/database/backend/transaction/SetPermissionRules.java index 4cb7e8525ee79a610bcd637424a144a104df45ce..a632f299e223d2b46105b81f9b6b784b0cd58204 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/SetPermissionRules.java +++ b/src/main/java/caosdb/server/database/backend/transaction/SetPermissionRules.java @@ -22,11 +22,11 @@ */ package caosdb.server.database.backend.transaction; -import java.util.Set; import caosdb.server.database.BackendTransaction; import caosdb.server.database.backend.interfaces.SetPermissionRulesImpl; import caosdb.server.database.exceptions.TransactionException; import caosdb.server.permissions.PermissionRule; +import java.util.Set; public class SetPermissionRules extends BackendTransaction { diff --git a/src/main/java/caosdb/server/database/backend/transaction/UpdateUserRoles.java b/src/main/java/caosdb/server/database/backend/transaction/UpdateUserRoles.java index fc6abf16f021f4d847b1729c3f8107df116fc910..359bbb3a3efa35e37d38b733c204ff8ca2840028 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/UpdateUserRoles.java +++ b/src/main/java/caosdb/server/database/backend/transaction/UpdateUserRoles.java @@ -22,11 +22,11 @@ */ package caosdb.server.database.backend.transaction; -import java.util.HashSet; import caosdb.server.accessControl.Principal; import caosdb.server.database.BackendTransaction; import caosdb.server.database.backend.interfaces.UpdateUserRolesImpl; import caosdb.server.database.exceptions.TransactionException; +import java.util.HashSet; public class UpdateUserRoles extends BackendTransaction { diff --git a/src/main/java/caosdb/server/entity/Entity.java b/src/main/java/caosdb/server/entity/Entity.java index c18d79ecffc97c73f7e9415bf9a9defc839ec770..bf1022dad1c0e6b954ea876ecce674a87ff7650e 100644 --- a/src/main/java/caosdb/server/entity/Entity.java +++ b/src/main/java/caosdb/server/entity/Entity.java @@ -256,7 +256,7 @@ public class Entity extends AbstractObservable implements EntityInterface { @Override public final boolean hasDescription() { - return !(this.description == null || this.description.isEmpty() || this.description.equals("")); + return !(this.description == null || this.description.isEmpty() || this.description.equals("")); } @Override @@ -302,8 +302,9 @@ public class Entity extends AbstractObservable implements EntityInterface { if (hasEntityStatus() && getEntityStatus() == entityStatus) { return; } - if(this.entityStatus == EntityStatus.UNQUALIFIED ) { - throw new CaosDBException("It is not allowed to change the state again, once an UNQUALIFIED state has been reached."); + if (this.entityStatus == EntityStatus.UNQUALIFIED) { + throw new CaosDBException( + "It is not allowed to change the state again, once an UNQUALIFIED state has been reached."); } this.entityStatus = entityStatus; notifyObservers(ENTITY_STATUS_CHANGED_EVENT); @@ -616,8 +617,8 @@ public class Entity extends AbstractObservable implements EntityInterface { public final boolean hasMessage(final String type) { for (final ToElementable m : this.messages) { if (m instanceof Message && ((Message) m).getType().equalsIgnoreCase(type)) { - return true; - } + return true; + } } return false; } @@ -632,7 +633,7 @@ public class Entity extends AbstractObservable implements EntityInterface { final LinkedList<Message> ret = new LinkedList<>(); for (final ToElementable m : this.messages) { if (m instanceof Message && ((Message) m).getType().equalsIgnoreCase(type)) { - ret.add((Message) m); + ret.add((Message) m); } } return ret; @@ -641,9 +642,11 @@ public class Entity extends AbstractObservable implements EntityInterface { @Override public final Message getMessage(final String type, final Integer code) { for (final ToElementable m : this.messages) { - if (m instanceof Message&& ((Message) m).getType().equalsIgnoreCase(type) && ((Message) m).getCode() == code) { - return (Message) m; - } + if (m instanceof Message + && ((Message) m).getType().equalsIgnoreCase(type) + && ((Message) m).getCode() == code) { + return (Message) m; + } } return null; } @@ -748,7 +751,6 @@ public class Entity extends AbstractObservable implements EntityInterface { this.setDatatype(element.getAttributeValue("datatype")); } catch (final IllegalArgumentException e) { addError(ServerMessages.UNKNOWN_DATATYPE); - } } diff --git a/src/main/java/caosdb/server/entity/EntityInterface.java b/src/main/java/caosdb/server/entity/EntityInterface.java index 2bfe32a4a94dbe406ee839c366045e3b946e5bb9..76c6c51eaabb3ee5864d9cb538f43338e96ce914 100644 --- a/src/main/java/caosdb/server/entity/EntityInterface.java +++ b/src/main/java/caosdb/server/entity/EntityInterface.java @@ -22,9 +22,6 @@ */ package caosdb.server.entity; -import java.util.List; -import org.apache.shiro.authz.Permission; -import org.apache.shiro.subject.Subject; import caosdb.server.database.proto.SparseEntity; import caosdb.server.database.proto.VerySparseEntity; import caosdb.server.datatype.AbstractDatatype; @@ -40,6 +37,9 @@ import caosdb.server.permissions.EntityACL; import caosdb.server.utils.Observable; import caosdb.server.utils.TransactionLogMessage; import caosdb.unit.Unit; +import java.util.List; +import org.apache.shiro.authz.Permission; +import org.apache.shiro.subject.Subject; public interface EntityInterface extends JobTarget, Observable, ToElementable, WriteEntity, TransactionEntity { 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/entity/TransactionEntity.java b/src/main/java/caosdb/server/entity/TransactionEntity.java index 36c581b5cadbf1596598d9ffacbdf5e5fefa9b79..458a1031cf7039c66b3db228813c9a552d6cc53c 100644 --- a/src/main/java/caosdb/server/entity/TransactionEntity.java +++ b/src/main/java/caosdb/server/entity/TransactionEntity.java @@ -22,14 +22,14 @@ */ package caosdb.server.entity; -import java.util.List; -import java.util.Map; -import java.util.Set; -import org.jdom2.Element; import caosdb.server.entity.xml.ToElementStrategy; import caosdb.server.entity.xml.ToElementable; import caosdb.server.query.Query.Selection; import caosdb.server.utils.EntityStatus; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.jdom2.Element; public interface TransactionEntity { diff --git a/src/main/java/caosdb/server/entity/container/TransactionContainer.java b/src/main/java/caosdb/server/entity/container/TransactionContainer.java index 20668f548db5c4b6e054e9e1b7d69407ea43f3fa..ff799a4df5eb74a0d15e48a990e735af609925ec 100644 --- a/src/main/java/caosdb/server/entity/container/TransactionContainer.java +++ b/src/main/java/caosdb/server/entity/container/TransactionContainer.java @@ -158,6 +158,13 @@ public class TransactionContainer extends Container<Entity> implements ToElement return this.owner; } + /** + * Get the first entity from this container which has this name. + * + * <p>Return null if no matching is in this container. + * + * @param name + */ public EntityInterface getEntityByName(final String name) { for (final EntityInterface e : this) { if (e.hasName() && e.getName().equals(name)) { @@ -182,5 +189,4 @@ public class TransactionContainer extends Container<Entity> implements ToElement public boolean skipJob() { return false; } - } diff --git a/src/main/java/caosdb/server/entity/wrapper/EntityWrapper.java b/src/main/java/caosdb/server/entity/wrapper/EntityWrapper.java index 8b6ec0315c85669773c94e68da654f7f39d56949..1feeafdb7c158edd35a2eddd16af85b40e35211c 100644 --- a/src/main/java/caosdb/server/entity/wrapper/EntityWrapper.java +++ b/src/main/java/caosdb/server/entity/wrapper/EntityWrapper.java @@ -22,12 +22,6 @@ */ package caosdb.server.entity.wrapper; -import java.util.List; -import java.util.Map; -import java.util.Set; -import org.apache.shiro.authz.Permission; -import org.apache.shiro.subject.Subject; -import org.jdom2.Element; import caosdb.server.database.proto.SparseEntity; import caosdb.server.database.proto.VerySparseEntity; import caosdb.server.datatype.AbstractDatatype; @@ -47,6 +41,12 @@ import caosdb.server.utils.EntityStatus; import caosdb.server.utils.Observer; import caosdb.server.utils.TransactionLogMessage; import caosdb.unit.Unit; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.apache.shiro.authz.Permission; +import org.apache.shiro.subject.Subject; +import org.jdom2.Element; public class EntityWrapper implements EntityInterface { diff --git a/src/main/java/caosdb/server/jobs/ContainerJob.java b/src/main/java/caosdb/server/jobs/ContainerJob.java index 6cef06e3f62e55c33d9a797e218e74592b3b23f2..26588b682501d6675d40f5a0bd41974409e1e5c3 100644 --- a/src/main/java/caosdb/server/jobs/ContainerJob.java +++ b/src/main/java/caosdb/server/jobs/ContainerJob.java @@ -29,8 +29,7 @@ import caosdb.server.utils.EntityStatus; public abstract class ContainerJob extends Job { @Override - public - final TransactionContainer getContainer() { + public final TransactionContainer getContainer() { return super.getContainer(); } diff --git a/src/main/java/caosdb/server/jobs/Job.java b/src/main/java/caosdb/server/jobs/Job.java index 132093357746344fd8e52c09cff5933f4a9f0bd8..681098b76a9deb90bc05dbea6f13ad2acd937ea6 100644 --- a/src/main/java/caosdb/server/jobs/Job.java +++ b/src/main/java/caosdb/server/jobs/Job.java @@ -22,15 +22,6 @@ */ package caosdb.server.jobs; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; -import org.apache.shiro.SecurityUtils; -import org.apache.shiro.authz.Permission; -import org.apache.shiro.subject.Subject; -import org.reflections.Reflections; import caosdb.server.CaosDBException; import caosdb.server.database.Database; import caosdb.server.database.backend.transaction.GetIDByName; @@ -53,6 +44,15 @@ import caosdb.server.utils.EntityStatus; import caosdb.server.utils.Observable; import caosdb.server.utils.Observer; import caosdb.server.utils.ServerMessages; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authz.Permission; +import org.apache.shiro.subject.Subject; +import org.reflections.Reflections; public abstract class Job extends AbstractObservable implements Observer { private Transaction<? extends TransactionContainer> transaction = null; @@ -66,15 +66,15 @@ public abstract class Job extends AbstractObservable implements Observer { return getTransaction().getCache(name); } - protected void appendJob(final Class<? extends Job> clazz) { - appendJob(getEntity(), clazz); + protected ScheduledJob appendJob(final Class<? extends Job> clazz) { + return appendJob(getEntity(), clazz); } protected String getRequestId() { return getContainer().getRequestId(); } - - protected Subject getUser(){ + + protected Subject getUser() { return getTransaction().getTransactor(); } @@ -121,9 +121,9 @@ public abstract class Job extends AbstractObservable implements Observer { final EntityInterface entity, final Class<? extends Job> jobclass) { getTransaction().getSchedule().runJob(entity, jobclass); } - - protected void runJobFromSchedule(ScheduledJob job){ - getTransaction().getSchedule().runJob(job); + + protected void runJobFromSchedule(ScheduledJob job) { + getTransaction().getSchedule().runJob(job); } public EntityInterface getEntity() { @@ -156,7 +156,8 @@ public abstract class Job extends AbstractObservable implements Observer { } protected final boolean isValidSubTypeNoCache(final int child, final int parent) { - return child==parent || Database.execute(new IsSubType(child, parent), getTransaction().getAccess()).isSubType(); + return child == parent + || Database.execute(new IsSubType(child, parent), getTransaction().getAccess()).isSubType(); } protected final EntityInterface retrieveValidSparseEntityByName(final String name) @@ -173,9 +174,12 @@ public abstract class Job extends AbstractObservable implements Observer { return ret; } - protected final EntityInterface retrieveValidEntity(Integer id){ - return Database.execute(new RetrieveFullEntity(id), getTransaction().getAccess()).getContainer().get(0); + protected final EntityInterface retrieveValidEntity(Integer id) { + return Database.execute(new RetrieveFullEntity(id), getTransaction().getAccess()) + .getContainer() + .get(0); } + protected final Integer retrieveValidIDByName(final String name) { return Database.execute(new GetIDByName(name), getTransaction().getAccess()).getId(); } @@ -215,7 +219,7 @@ public abstract class Job extends AbstractObservable implements Observer { } private static void scanJobClasspath() { - + if (allClasses == null || loadAlways == null) { allClasses = new HashMap<>(); loadAlways = new ArrayList<>(); @@ -229,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) { @@ -240,7 +248,7 @@ public abstract class Job extends AbstractObservable implements Observer { if (flagName.length() > 0) { allClasses.put(flagName.toLowerCase(), c); } - if (c.getAnnotation(JobAnnotation.class).loadAlways()){ + if (c.getAnnotation(JobAnnotation.class).loadAlways()) { loadAlways.add(c); } } @@ -253,8 +261,7 @@ public abstract class Job extends AbstractObservable implements Observer { } public static List<Job> loadDataTypeSpecificJobs( - final EntityInterface entity, - final Transaction<? extends TransactionContainer> transaction) { + final EntityInterface entity, final Transaction<? extends TransactionContainer> transaction) { return loadDataTypeSpecificJobs(entity.getDatatype(), entity, transaction); } @@ -281,17 +288,17 @@ public abstract class Job extends AbstractObservable implements Observer { } public static List<Job> loadStandardJobs( - final EntityInterface entity, - final Transaction<? extends TransactionContainer> transaction) { + final EntityInterface entity, final Transaction<? extends TransactionContainer> transaction) { - final ArrayList<Job> jobs = new ArrayList<>(); + 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)); } } - + // load general rules { final RuleLoader t = new RuleLoader(0, 0, entity, transaction); @@ -300,8 +307,7 @@ public abstract class Job extends AbstractObservable implements Observer { // load Role specific rules if (entity.hasRole()) { - final RuleLoader t = - new RuleLoader(0, entity.getRole().getId(), entity, transaction); + final RuleLoader t = new RuleLoader(0, entity.getRole().getId(), entity, transaction); jobs.addAll(Database.execute(t, transaction.getAccess()).getJobs()); } @@ -311,11 +317,14 @@ public abstract class Job extends AbstractObservable implements Observer { return jobs; } - private static Job getJob(Class<? extends Job> jobClass, Mode mode, EntityInterface entity, + private static Job getJob( + Class<? extends Job> jobClass, + Mode mode, + EntityInterface entity, Transaction<? extends TransactionContainer> transaction) { Job ret; try { - + if (jobClass != null) { ret = jobClass.newInstance(); ret.init(mode, entity, transaction); @@ -328,8 +337,7 @@ public abstract class Job extends AbstractObservable implements Observer { } public static List<Job> loadJobs( - final EntityInterface entity, - final Transaction<? extends TransactionContainer> transaction) { + final EntityInterface entity, final Transaction<? extends TransactionContainer> transaction) { final LinkedList<Job> jobs = new LinkedList<>(); // general rules, role rules, data type rules @@ -422,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/JobAnnotation.java b/src/main/java/caosdb/server/jobs/JobAnnotation.java index 97263aebcc24222e80f60037eb722cfcdee71122..96f4afcd46c2f80fe2c959bf815ca523a71cb52d 100644 --- a/src/main/java/caosdb/server/jobs/JobAnnotation.java +++ b/src/main/java/caosdb/server/jobs/JobAnnotation.java @@ -50,7 +50,7 @@ public @interface JobAnnotation { /** * Load for every transaction that is a subclass of 'transaction'. - * + * * @return false per default. */ boolean loadAlways() default false; diff --git a/src/main/java/caosdb/server/jobs/core/AccessControl.java b/src/main/java/caosdb/server/jobs/core/AccessControl.java index eb513b811a3ef1f6b3cae0bc9e3c734ea1dd3b1a..8b51cd582933d9c993c2427be7c399e7dc553df2 100644 --- a/src/main/java/caosdb/server/jobs/core/AccessControl.java +++ b/src/main/java/caosdb/server/jobs/core/AccessControl.java @@ -65,14 +65,14 @@ 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()) { + if (par1.hasId() && par1.getId() > 0) { Database.execute(new RetrieveSparseEntity(par1), getTransaction().getAccess()); } - if (par1.getName().equals("CommentAnnotation")) { - if (subject.isPermitted( - getTransaction().getClass().getSimpleName() + ":CommentAnnotation")) { - continue; - } + if (par1.hasName() + && par1.getName().equals("CommentAnnotation") + && subject.isPermitted( + getTransaction().getClass().getSimpleName() + ":CommentAnnotation")) { + continue; } } e.setEntityStatus(EntityStatus.UNQUALIFIED); diff --git a/src/main/java/caosdb/server/jobs/core/Atomic.java b/src/main/java/caosdb/server/jobs/core/Atomic.java index cf6d99a005deb3449419feb30e22ccfbe3d32e0f..cdc9f25d7367a9732dcdcc9a0e03dd5e359acaa2 100644 --- a/src/main/java/caosdb/server/jobs/core/Atomic.java +++ b/src/main/java/caosdb/server/jobs/core/Atomic.java @@ -27,17 +27,21 @@ 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() { if (getContainer().getStatus() == EntityStatus.QUALIFIED) { for (final EntityInterface entity : getContainer()) { - if(entity.getEntityStatus() == EntityStatus.UNQUALIFIED) { + if (entity.getEntityStatus() == EntityStatus.UNQUALIFIED) { getContainer().setStatus(EntityStatus.UNQUALIFIED); getContainer().addMessage(ServerMessages.ATOMICITY_ERROR); // job done. remove observer. diff --git a/src/main/java/caosdb/server/jobs/core/CheckDatatypePresent.java b/src/main/java/caosdb/server/jobs/core/CheckDatatypePresent.java index ca6ced6e6c0f7948cb2720a87b1858c7246755e7..69d36f42fa2f457b05dcc394659b5c088976bff4 100644 --- a/src/main/java/caosdb/server/jobs/core/CheckDatatypePresent.java +++ b/src/main/java/caosdb/server/jobs/core/CheckDatatypePresent.java @@ -22,7 +22,6 @@ */ package caosdb.server.jobs.core; -import java.util.List; import caosdb.server.database.exceptions.EntityDoesNotExistException; import caosdb.server.database.exceptions.EntityWasNotUniqueException; import caosdb.server.datatype.AbstractCollectionDatatype; @@ -36,6 +35,7 @@ import caosdb.server.jobs.Job; import caosdb.server.permissions.EntityPermission; import caosdb.server.utils.EntityStatus; import caosdb.server.utils.ServerMessages; +import java.util.List; /** * Check whether the entity has a data type. Assign the data type of the abstract property if @@ -48,10 +48,11 @@ public final class CheckDatatypePresent extends EntityJob { @Override public final void run() { try { - resolveId(getEntity()); // inherit datatype if (!getEntity().hasDatatype()) { + resolveId(getEntity()); + inheritDatatypeFromAbstractEntity(); // still no data type ??? try to get it from parent... @@ -199,7 +200,9 @@ public final class CheckDatatypePresent extends EntityJob { if (!entity.hasId() && entity.hasName()) { try { entity.setId(retrieveValidIDByName(entity.getName())); - entity.setEntityStatus(EntityStatus.VALID); + if (entity.getEntityStatus() != EntityStatus.UNQUALIFIED) { + entity.setEntityStatus(EntityStatus.VALID); + } } catch (final EntityDoesNotExistException exc) { entity.addError(ServerMessages.ENTITY_DOES_NOT_EXIST); } catch (final EntityWasNotUniqueException exc) { diff --git a/src/main/java/caosdb/server/jobs/core/CheckNamePresent.java b/src/main/java/caosdb/server/jobs/core/CheckNamePresent.java index 813c7dc88bab149204b5410a45bffd654339f8be..d63a9cc54d4c413a0c827a562afa023b610ff872 100644 --- a/src/main/java/caosdb/server/jobs/core/CheckNamePresent.java +++ b/src/main/java/caosdb/server/jobs/core/CheckNamePresent.java @@ -42,6 +42,7 @@ public class CheckNamePresent extends EntityJob { break; case SHOULD: getEntity().addWarning(ServerMessages.ENTITY_HAS_NO_NAME); + break; default: break; } diff --git a/src/main/java/caosdb/server/jobs/core/CheckNoAdditionalPropertiesPresent.java b/src/main/java/caosdb/server/jobs/core/CheckNoAdditionalPropertiesPresent.java index 1557401dcb4a0a9cdad4fb742bfd126b25c6a5f1..1eb4941d47314f7f67bbe874784f2427cecdca92 100644 --- a/src/main/java/caosdb/server/jobs/core/CheckNoAdditionalPropertiesPresent.java +++ b/src/main/java/caosdb/server/jobs/core/CheckNoAdditionalPropertiesPresent.java @@ -1,48 +1,51 @@ package caosdb.server.jobs.core; -import java.util.HashSet; -import java.util.Set; import caosdb.server.entity.EntityInterface; import caosdb.server.entity.Message; import caosdb.server.jobs.EntityJob; 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(flag="noAdditionalProperties", description="Fail if this entity has any property which has not been defined by the parents of this entity.") +@JobAnnotation( + flag = "noAdditionalProperties", + description = + "Fail if this entity has any property which has not been defined by the parents of this entity.") public class CheckNoAdditionalPropertiesPresent extends EntityJob { private Set<EntityInterface> used = new HashSet<>(); @Override protected void run() { - + // validate all parents and properties runJobFromSchedule(getEntity(), CheckParOblPropPresent.class); - - - if(getEntity().getEntityStatus() == EntityStatus.QUALIFIED && getEntity().hasProperties()){ - for(EntityInterface property : getEntity().getProperties()){ + + if (getEntity().getEntityStatus() == EntityStatus.QUALIFIED && getEntity().hasProperties()) { + for (EntityInterface property : getEntity().getProperties()) { checkProperty(property); } } - } - - public void checkProperty(EntityInterface property){ - for(EntityInterface parent : getEntity().getParents()){ - for(EntityInterface parentProperty : parent.getProperties()){ - if(sameProperty(property, parentProperty) && !used.contains(parentProperty)){ - used .add(parentProperty); + + public void checkProperty(EntityInterface property) { + for (EntityInterface parent : getEntity().getParents()) { + for (EntityInterface parentProperty : parent.getProperties()) { + if (sameProperty(property, parentProperty) && !used.contains(parentProperty)) { + used.add(parentProperty); + return; } } // not found! - addMessage(property,ServerMessages.ADDITIONAL_PROPERTY); + addMessage(property, ServerMessages.ADDITIONAL_PROPERTY); } } private void addMessage(EntityInterface property, Message message) { - if(getMode()==Mode.MUST) { + if (getMode() == Mode.MUST) { property.addError(message); } else { property.addWarning(message); @@ -50,7 +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/jobs/core/CheckNoOverridesPresent.java b/src/main/java/caosdb/server/jobs/core/CheckNoOverridesPresent.java index d640f19fb15bd2d448c9d8cd8e31d935f4b959f8..c6b16210e7517c69c26ed6f2e8c556bf5687f7f4 100644 --- a/src/main/java/caosdb/server/jobs/core/CheckNoOverridesPresent.java +++ b/src/main/java/caosdb/server/jobs/core/CheckNoOverridesPresent.java @@ -6,31 +6,32 @@ import caosdb.server.jobs.EntityJob; import caosdb.server.jobs.JobAnnotation; import caosdb.server.utils.ServerMessages; -@JobAnnotation(flag="noOverrides", description="Fail if this entity has any properties with overrides.") +@JobAnnotation( + flag = "noOverrides", + description = "Fail if this entity has any properties with overrides.") public class CheckNoOverridesPresent extends EntityJob { @Override protected void run() { runJobFromSchedule(this.getEntity(), CheckPropValid.class); - for(Property p : getEntity().getProperties()){ - if(p.isDatatypeOverride()){ + for (Property p : getEntity().getProperties()) { + if (p.isDatatypeOverride()) { addMessage(p, ServerMessages.PROPERTY_WITH_DATATYPE_OVERRIDE); } - if(p.isNameOverride()){ + if (p.isNameOverride()) { addMessage(p, ServerMessages.PROPERTY_WITH_NAME_OVERRIDE); } - if(p.isDescOverride()){ + if (p.isDescOverride()) { addMessage(p, ServerMessages.PROPERTY_WITH_DESC_OVERRIDE); } } } private void addMessage(Property p, Message message) { - if(getMode()==Mode.MUST){ + if (getMode() == Mode.MUST) { p.addError(message); } else { p.addWarning(message); } } - } diff --git a/src/main/java/caosdb/server/jobs/core/PickUp.java b/src/main/java/caosdb/server/jobs/core/PickUp.java index 8d200ac5a2a375f0630c2dbb59fa51d895100b0c..542e7ee5cbb022c2456af0e305ef37ca02482dda 100644 --- a/src/main/java/caosdb/server/jobs/core/PickUp.java +++ b/src/main/java/caosdb/server/jobs/core/PickUp.java @@ -70,11 +70,14 @@ public class PickUp extends EntityJob { @Override public boolean notifyObserver(final String e, final Observable o) { - if (e == Entity.ENTITY_STATUS_CHANGED_EVENT && o == getEntity() && this.rollBack && getEntity().getEntityStatus() == EntityStatus.UNQUALIFIED) { - final File target = new File(FileSystem.getDropOffBox() + this.dropOffBoxPath); - getEntity().getFileProperties().getFile().renameTo(target); - this.rollBack = false; - return false; + if (e == Entity.ENTITY_STATUS_CHANGED_EVENT + && o == getEntity() + && this.rollBack + && getEntity().getEntityStatus() == EntityStatus.UNQUALIFIED) { + final File target = new File(FileSystem.getDropOffBox() + this.dropOffBoxPath); + getEntity().getFileProperties().getFile().renameTo(target); + this.rollBack = false; + return false; } return true; } diff --git a/src/main/java/caosdb/server/jobs/core/TestMail.java b/src/main/java/caosdb/server/jobs/core/TestMail.java index 4f36cf08585f5400ad5a5d15baad6315f6e79e07..e529265a36cac6b483215500edc5b9793ef60afc 100644 --- a/src/main/java/caosdb/server/jobs/core/TestMail.java +++ b/src/main/java/caosdb/server/jobs/core/TestMail.java @@ -28,9 +28,9 @@ import caosdb.server.entity.Message; import caosdb.server.entity.Message.MessageType; import caosdb.server.jobs.FlagJob; import caosdb.server.jobs.JobAnnotation; +import caosdb.server.utils.ServerMessages; +import caosdb.server.utils.Utils; import caosdb.server.utils.mail.Mail; -import java.util.regex.Matcher; -import java.util.regex.Pattern; @JobAnnotation( flag = "testMail", @@ -38,27 +38,21 @@ import java.util.regex.Pattern; "Value may be any mail address. Send a test mail to the given mail address. Works only if server is in debug mode.") public class TestMail extends FlagJob { - private static final String ADMIN_NAME = - CaosDBServer.getServerProperty(ServerProperties.KEY_ADMIN_NAME); - private static final String ADMIN_EMAIL = - CaosDBServer.getServerProperty(ServerProperties.KEY_ADMIN_EMAIL); + private static final String NAME = + CaosDBServer.getServerProperty(ServerProperties.KEY_NO_REPLY_NAME); + private static final String EMAIL = + CaosDBServer.getServerProperty(ServerProperties.KEY_NO_REPLY_EMAIL); @Override protected void job(final String value) { if (CaosDBServer.isDebugMode() && value != null) { - final Pattern p = - Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$", Pattern.CASE_INSENSITIVE); - final Matcher matcher = p.matcher(value); - if (matcher.matches()) { - final Mail m = - new Mail(ADMIN_NAME, ADMIN_EMAIL, null, value, "Test mail", "This is a test mail."); + if (Utils.isRFC822Compliant(value)) { + final Mail m = new Mail(NAME, EMAIL, null, value, "Test mail", "This is a test mail."); m.send(); getContainer() .addMessage(new Message(MessageType.Info, 0, "A mail has been send to " + value)); } else { - getContainer() - .addMessage( - new Message(MessageType.Error, 0, "Value did not match our email regexp pattern.")); + getContainer().addMessage(ServerMessages.EMAIL_NOT_WELL_FORMED); } } } diff --git a/src/main/java/caosdb/server/jobs/extension/SQLiteTransaction.java b/src/main/java/caosdb/server/jobs/extension/SQLiteTransaction.java index 1712566913b273e828d10627927771223b30d2e5..907700ee53423a2d8d0088aaf6beb2e6b175f240 100644 --- a/src/main/java/caosdb/server/jobs/extension/SQLiteTransaction.java +++ b/src/main/java/caosdb/server/jobs/extension/SQLiteTransaction.java @@ -22,6 +22,11 @@ */ package caosdb.server.jobs.extension; +import caosdb.server.CaosDBException; +import caosdb.server.entity.FileProperties; +import caosdb.server.entity.Message; +import caosdb.server.jobs.EntityJob; +import caosdb.server.utils.FileUtils; import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.sql.Connection; @@ -34,11 +39,6 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.concurrent.locks.ReentrantLock; -import caosdb.server.CaosDBException; -import caosdb.server.entity.FileProperties; -import caosdb.server.entity.Message; -import caosdb.server.jobs.EntityJob; -import caosdb.server.utils.FileUtils; public class SQLiteTransaction extends EntityJob { private static HashMap<String, ReentrantLock> lockedTables = new HashMap<String, ReentrantLock>(); diff --git a/src/main/java/caosdb/server/permissions/AbstractEntityACLFactory.java b/src/main/java/caosdb/server/permissions/AbstractEntityACLFactory.java index d9657d9ce7fd5e781f2643185554090f076af0f0..5d8174711c2dfd06798c5f5690b61540f55e5c56 100644 --- a/src/main/java/caosdb/server/permissions/AbstractEntityACLFactory.java +++ b/src/main/java/caosdb/server/permissions/AbstractEntityACLFactory.java @@ -26,26 +26,15 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.Map; import java.util.Map.Entry; -class EntityACLFactory extends AbstractEntityACLFactory<EntityACL> { - - @Override - protected EntityACL create(final Collection<EntityACI> acis) { - return new EntityACL(acis); - } -} - public abstract class AbstractEntityACLFactory<T extends EntityACL> { - private final HashMap<ResponsibleAgent, Long> normal_grants = - new HashMap<ResponsibleAgent, Long>(); - private final HashMap<ResponsibleAgent, Long> priority_grants = - new HashMap<ResponsibleAgent, Long>(); - private final HashMap<ResponsibleAgent, Long> normal_denials = - new HashMap<ResponsibleAgent, Long>(); - private final HashMap<ResponsibleAgent, Long> priority_denials = - new HashMap<ResponsibleAgent, Long>(); + private final Map<ResponsibleAgent, Long> normalGrants = new HashMap<>(); + private final Map<ResponsibleAgent, Long> priorityGrants = new HashMap<>(); + private final Map<ResponsibleAgent, Long> normalDenials = new HashMap<>(); + private final Map<ResponsibleAgent, Long> priorityDenials = new HashMap<>(); public void grant(final ResponsibleAgent role, final int... permissionBitNumber) { grant(role, false, permissionBitNumber); @@ -120,23 +109,23 @@ public abstract class AbstractEntityACLFactory<T extends EntityACL> { public void grant( final ResponsibleAgent role, final boolean priority, final EntityPermission... permission) { if (priority) { - addACI(this.priority_grants, role, permission); + addACI(this.priorityGrants, role, permission); } else { - addACI(this.normal_grants, role, permission); + addACI(this.normalGrants, role, permission); } } public void deny( final ResponsibleAgent role, final boolean priority, final EntityPermission... permission) { if (priority) { - addACI(this.priority_denials, role, permission); + addACI(this.priorityDenials, role, permission); } else { - addACI(this.normal_denials, role, permission); + addACI(this.normalDenials, role, permission); } } private static void addACI( - final HashMap<ResponsibleAgent, Long> map, + final Map<ResponsibleAgent, Long> map, final ResponsibleAgent role, final EntityPermission permission) { long bitSet = permission.getBitSet(); @@ -149,7 +138,7 @@ public abstract class AbstractEntityACLFactory<T extends EntityACL> { } private static void addACI( - final HashMap<ResponsibleAgent, Long> map, + final Map<ResponsibleAgent, Long> map, final ResponsibleAgent role, final EntityPermission[] permission) { for (final EntityPermission p : permission) { @@ -158,7 +147,7 @@ public abstract class AbstractEntityACLFactory<T extends EntityACL> { } private EntityACI[] toEntityACIArray( - final HashMap<ResponsibleAgent, Long> map, final long modBitSet) { + final Map<ResponsibleAgent, Long> map, final long modBitSet) { final EntityACI[] ret = new EntityACI[map.size()]; int i = 0; for (final Entry<ResponsibleAgent, Long> e : map.entrySet()) { @@ -169,54 +158,51 @@ public abstract class AbstractEntityACLFactory<T extends EntityACL> { public T create() { normalize(); - final ArrayList<EntityACI> acis = new ArrayList<EntityACI>(); - Collections.addAll(acis, toEntityACIArray(this.normal_grants, 0)); - Collections.addAll(acis, toEntityACIArray(this.normal_denials, Long.MIN_VALUE)); - Collections.addAll(acis, toEntityACIArray(this.priority_grants, EntityACL.MIN_PRIORITY_BITSET)); + final ArrayList<EntityACI> acis = new ArrayList<>(); + Collections.addAll(acis, toEntityACIArray(this.normalGrants, 0)); + Collections.addAll(acis, toEntityACIArray(this.normalDenials, Long.MIN_VALUE)); + Collections.addAll(acis, toEntityACIArray(this.priorityGrants, EntityACL.MIN_PRIORITY_BITSET)); Collections.addAll( acis, - toEntityACIArray(this.priority_denials, Long.MIN_VALUE | EntityACL.MIN_PRIORITY_BITSET)); + toEntityACIArray(this.priorityDenials, Long.MIN_VALUE | EntityACL.MIN_PRIORITY_BITSET)); return create(acis); } private void normalize() { - for (final Entry<ResponsibleAgent, Long> set : this.priority_denials.entrySet()) { - if (this.priority_grants.containsKey(set.getKey())) { - this.priority_grants.put( - set.getKey(), this.priority_grants.get(set.getKey()) & ~set.getValue()); + for (final Entry<ResponsibleAgent, Long> set : this.priorityDenials.entrySet()) { + if (this.priorityGrants.containsKey(set.getKey())) { + this.priorityGrants.put( + set.getKey(), this.priorityGrants.get(set.getKey()) & ~set.getValue()); } - if (this.normal_denials.containsKey(set.getKey())) { - this.normal_denials.put( - set.getKey(), this.normal_denials.get(set.getKey()) & ~set.getValue()); + if (this.normalDenials.containsKey(set.getKey())) { + this.normalDenials.put( + set.getKey(), this.normalDenials.get(set.getKey()) & ~set.getValue()); } - if (this.normal_grants.containsKey(set.getKey())) { - this.normal_grants.put( - set.getKey(), this.normal_grants.get(set.getKey()) & ~set.getValue()); + if (this.normalGrants.containsKey(set.getKey())) { + this.normalGrants.put(set.getKey(), this.normalGrants.get(set.getKey()) & ~set.getValue()); } } - for (final Entry<ResponsibleAgent, Long> set : this.priority_grants.entrySet()) { - if (this.normal_denials.containsKey(set.getKey())) { - this.normal_denials.put( - set.getKey(), this.normal_denials.get(set.getKey()) & ~set.getValue()); + for (final Entry<ResponsibleAgent, Long> set : this.priorityGrants.entrySet()) { + if (this.normalDenials.containsKey(set.getKey())) { + this.normalDenials.put( + set.getKey(), this.normalDenials.get(set.getKey()) & ~set.getValue()); } - if (this.normal_grants.containsKey(set.getKey())) { - this.normal_grants.put( - set.getKey(), this.normal_grants.get(set.getKey()) & ~set.getValue()); + if (this.normalGrants.containsKey(set.getKey())) { + this.normalGrants.put(set.getKey(), this.normalGrants.get(set.getKey()) & ~set.getValue()); } } - for (final Entry<ResponsibleAgent, Long> set : this.normal_denials.entrySet()) { - if (this.normal_grants.containsKey(set.getKey())) { - this.normal_grants.put( - set.getKey(), this.normal_grants.get(set.getKey()) & ~set.getValue()); + for (final Entry<ResponsibleAgent, Long> set : this.normalDenials.entrySet()) { + if (this.normalGrants.containsKey(set.getKey())) { + this.normalGrants.put(set.getKey(), this.normalGrants.get(set.getKey()) & ~set.getValue()); } } } public void clear() { - this.normal_grants.clear(); - this.normal_denials.clear(); - this.priority_grants.clear(); - this.priority_denials.clear(); + this.normalGrants.clear(); + this.normalDenials.clear(); + this.priorityGrants.clear(); + this.priorityDenials.clear(); } protected abstract T create(Collection<EntityACI> acis); diff --git a/src/main/java/caosdb/server/permissions/EntityACL.java b/src/main/java/caosdb/server/permissions/EntityACL.java index 79008947823e9625283c03e1dd539328a58fef7f..f2f89765a91cb182b0627dc41356c93b341aba47 100644 --- a/src/main/java/caosdb/server/permissions/EntityACL.java +++ b/src/main/java/caosdb/server/permissions/EntityACL.java @@ -32,7 +32,6 @@ import java.util.ArrayList; import java.util.BitSet; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -49,11 +48,11 @@ 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 { - this.acl = new ArrayList<EntityACI>(); + this.acl = new ArrayList<>(); } } @@ -61,14 +60,17 @@ 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) { - this.acl = new ArrayList<EntityACI>(); + public EntityACL(final EntityACI... aci) { + this.acl = new ArrayList<>(); for (final EntityACI a : aci) { this.acl.add(a); } @@ -88,7 +90,7 @@ public class EntityACL { } public static final Set<EntityPermission> getPermissionsFromBitSet(final long bitSet) { - final HashSet<EntityPermission> ret = new HashSet<EntityPermission>(); + final Set<EntityPermission> ret = new HashSet<>(); final boolean[] ba = convertToArray(bitSet); for (int i = 0; i < 62; i++) { if (ba[i]) { @@ -104,9 +106,9 @@ public class EntityACL { return true; } if (permission instanceof EntityPermission) { - final ArrayList<EntityACI> acl = new ArrayList<EntityACI>(this.acl); - acl.addAll(GLOBAL_PERMISSIONS.acl); - final Set<EntityPermission> permissions = getPermissionsFor(subject, acl); + final List<EntityACI> localAcl = new ArrayList<>(this.acl); + localAcl.addAll(GLOBAL_PERMISSIONS.acl); + final Set<EntityPermission> permissions = getPermissionsFor(subject, localAcl); return permissions.contains(permission); } return false; @@ -114,15 +116,13 @@ public class EntityACL { public static final Set<EntityPermission> getPermissionsFor( final Subject subject, final Collection<EntityACI> entityACL) { - final ArrayList<Long> acl = new ArrayList<Long>(); + final List<Long> acl = new ArrayList<>(); final List<ResponsibleAgent> owners = getOwners(entityACL); - final ArrayList<Long> forOthers = new ArrayList<Long>(); + final List<Long> forOthers = new ArrayList<>(); for (final EntityACI aci : entityACL) { - if (aci.getResponsibleAgent().equals(OWNER_ROLE)) { - if (subjectIsOwner(subject, owners)) { - acl.add(aci.getBitSet()); - break; - } + if (aci.getResponsibleAgent().equals(OWNER_ROLE) && subjectIsOwner(subject, owners)) { + acl.add(aci.getBitSet()); + break; } if (subjectHasRole(subject, aci.getResponsibleAgent())) { acl.add(aci.getBitSet()); @@ -157,9 +157,8 @@ public class EntityACL { private static boolean subjectIsOwner( final Subject subject, final List<ResponsibleAgent> owners) { for (final ResponsibleAgent owner : owners) { - if (owner instanceof Role && subject.hasRole(owner.toString())) { - return true; - } else if (owner instanceof Principal && subject.getPrincipal().equals(owner)) { + if ((owner instanceof Role && subject.hasRole(owner.toString())) + || (owner instanceof Principal && subject.getPrincipal().equals(owner))) { return true; } } @@ -171,7 +170,7 @@ public class EntityACL { } public static final List<ResponsibleAgent> getOwners(final Collection<EntityACI> acl) { - final ArrayList<ResponsibleAgent> owners = new ArrayList<ResponsibleAgent>(); + final List<ResponsibleAgent> owners = new ArrayList<>(); for (final EntityACI aci : acl) { if (isOwnerBitSet(aci.getBitSet()) && !aci.getResponsibleAgent().equals(OWNER_ROLE)) { owners.add(aci.getResponsibleAgent()); @@ -187,15 +186,15 @@ public class EntityACL { public static final long getResultingACL(final Collection<Long> acl) { long allowance = 0; long denial = Long.MIN_VALUE; - long priority_allowance = 0; - long priority_denial = Long.MIN_VALUE; + long priorityAllowance = 0; + long priorityDenial = Long.MIN_VALUE; for (final long aci : acl) { if (isPriorityBitSet(aci)) { if (isDenial(aci)) { - priority_denial = priority_denial | aci; + priorityDenial = priorityDenial | aci; } else { - priority_allowance = priority_allowance | aci; + priorityAllowance = priorityAllowance | aci; } } else { if (isDenial(aci)) { @@ -205,7 +204,7 @@ public class EntityACL { } } } - return ((allowance & ~denial) | (priority_allowance & ~MIN_PRIORITY_BITSET)) & ~priority_denial; + return ((allowance & ~denial) | (priorityAllowance & ~MIN_PRIORITY_BITSET)) & ~priorityDenial; } public static final boolean isPriorityBitSet(final long bitSet) { @@ -254,13 +253,13 @@ public class EntityACL { } public static final EntityACL getPriorityEntityACL(final EntityACL acl) { - final ArrayList<EntityACI> priority_acl = new ArrayList<EntityACI>(); + final List<EntityACI> priorityAcl = new ArrayList<>(); for (final EntityACI aci : acl.acl) { if (isPriorityBitSet(aci.getBitSet())) { - priority_acl.add(aci); + priorityAcl.add(aci); } } - return new EntityACL(priority_acl); + return new EntityACL(priorityAcl); } public static final EntityACL parseFromElement(final Element e) { @@ -322,7 +321,7 @@ public class EntityACL { } public static final EntityACL combine(final EntityACL... acls) { - final ArrayList<EntityACI> newACL = new ArrayList<EntityACI>(); + final List<EntityACI> newACL = new ArrayList<>(); for (final EntityACL acl : acls) { newACL.addAll(acl.acl); } @@ -341,11 +340,11 @@ public class EntityACL { public boolean equals(final Object obj) { if (obj instanceof EntityACL) { final EntityACL that = (EntityACL) obj; - final HashSet<EntityACI> that_acis = new HashSet<EntityACI>(); - that_acis.addAll(that.acl); - final HashSet<EntityACI> this_acis = new HashSet<EntityACI>(); - this_acis.addAll(this.acl); - return that_acis.equals(this_acis); + final Set<EntityACI> thatAcis = new HashSet<>(); + thatAcis.addAll(that.acl); + final Set<EntityACI> thisAcis = new HashSet<>(); + thisAcis.addAll(this.acl); + return thatAcis.equals(thisAcis); } return false; } @@ -361,7 +360,7 @@ public class EntityACL { public static EntityACL fromJSON(final String input) { final Object parse = JSON.parse(input); - final ArrayList<EntityACI> acl = new ArrayList<EntityACI>(); + final List<EntityACI> acl = new ArrayList<>(); if (parse.getClass().isArray()) { final Object[] array = (Object[]) parse; for (final Object aci : array) { @@ -386,7 +385,7 @@ public class EntityACL { } public static String toJSON(final EntityACL acl) { - final ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>(); + final List<Map<String, Object>> list = new ArrayList<>(); for (final EntityACI aci : acl.acl) { list.add(aci.toMap()); diff --git a/src/main/java/caosdb/server/permissions/EntityACLFactory.java b/src/main/java/caosdb/server/permissions/EntityACLFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..eeacb1260729f78f490e592891c0a93a334b42fa --- /dev/null +++ b/src/main/java/caosdb/server/permissions/EntityACLFactory.java @@ -0,0 +1,11 @@ +package caosdb.server.permissions; + +import java.util.Collection; + +public class EntityACLFactory extends AbstractEntityACLFactory<EntityACL> { + + @Override + protected EntityACL create(final Collection<EntityACI> acis) { + return new EntityACL(acis); + } +} diff --git a/src/main/java/caosdb/server/permissions/EntityPermission.java b/src/main/java/caosdb/server/permissions/EntityPermission.java index c4fd82245d32a488a4e2155e2c3171441f4a2d30..7fae8a76a8cc87cbfb2525c34102d5418d58e94e 100644 --- a/src/main/java/caosdb/server/permissions/EntityPermission.java +++ b/src/main/java/caosdb/server/permissions/EntityPermission.java @@ -22,9 +22,11 @@ */ package caosdb.server.permissions; +import caosdb.server.CaosDBException; import caosdb.server.entity.xml.ToElementable; import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -33,7 +35,7 @@ import org.jdom2.Element; public class EntityPermission extends Permission { private static final long serialVersionUID = 1L; - private static ArrayList<EntityPermission> instances = new ArrayList<EntityPermission>(); + private static List<EntityPermission> instances = new ArrayList<>(); private final int bitNumber; public static ToElementable getAllEntityPermissions() { @@ -59,11 +61,11 @@ public class EntityPermission extends Permission { super(shortName, description); this.bitNumber = bitNumber; if (bitNumber > 61) { - throw new RuntimeException( + throw new CaosDBException( "This bitNumber is too big. This implementation only handles bitNumbers up to 61."); } if (instances.contains(this)) { - throw new RuntimeException("This EntityPermission is defined yet."); + throw new CaosDBException("This EntityPermission is defined yet."); } else { instances.add(this); } @@ -72,7 +74,7 @@ public class EntityPermission extends Permission { public static Set<EntityPermission> getPermissionsPerWildCard(final String s) { final Pattern pattern = Pattern.compile(s.replaceAll("\\*", ".*")); - final HashSet<EntityPermission> ret = new HashSet<EntityPermission>(); + final Set<EntityPermission> ret = new HashSet<>(); for (final EntityPermission p : instances) { final Matcher m = pattern.matcher(p.getShortName()); if (m.matches()) { diff --git a/src/main/java/caosdb/server/permissions/Role.java b/src/main/java/caosdb/server/permissions/Role.java index eed068fc6bed1f8a3e5fd18bcdc6ef30bb9447a1..70e1a61f754b4beeffe8f8fe203b42842d49cb6d 100644 --- a/src/main/java/caosdb/server/permissions/Role.java +++ b/src/main/java/caosdb/server/permissions/Role.java @@ -22,6 +22,7 @@ */ package caosdb.server.permissions; +import caosdb.server.accessControl.UserSources; import java.util.HashMap; import org.jdom2.Attribute; import org.jdom2.Element; @@ -30,6 +31,7 @@ public class Role implements ResponsibleAgent { public static final Role OWNER_ROLE = new Role("?OWNER?"); public static final Role OTHER_ROLE = new Role("?OTHER?"); + public static final Role ANONYMOUS_ROLE = new Role(UserSources.ANONYMOUS_ROLE); private final String role; 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 396cf061502022e06fd2080525e1245c0a95ea68..de1e5e279ee4b1cd252dda0fdf6bb23e8f93e57f 100644 --- a/src/main/java/caosdb/server/transaction/Transaction.java +++ b/src/main/java/caosdb/server/transaction/Transaction.java @@ -22,9 +22,6 @@ */ package caosdb.server.transaction; -import java.util.HashMap; -import java.util.List; -import org.apache.shiro.subject.Subject; import caosdb.datetime.UTCDateTime; import caosdb.server.accessControl.AuthenticationUtils; import caosdb.server.accessControl.Principal; @@ -41,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; @@ -49,6 +45,9 @@ import caosdb.server.jobs.core.PickUp; import caosdb.server.utils.AbstractObservable; import caosdb.server.utils.Info; import caosdb.server.utils.Observer; +import java.util.HashMap; +import java.util.List; +import org.apache.shiro.subject.Subject; public abstract class Transaction<C extends TransactionContainer> extends AbstractObservable implements TransactionInterface { @@ -66,11 +65,10 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra protected Transaction(final C container) { this(container, Info.getInstance()); } - - protected Transaction(C container, Observer o){ + + protected Transaction(C container, Observer o) { this.container = container; - if(o!=null) - acceptObserver(o); + if (o != null) acceptObserver(o); } public static DatabaseMonitor getMonitor() { @@ -83,21 +81,16 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra protected void makeSchedule() throws Exception { // load flag jobs - final Job loadContainerFlags = - Job.getJob("LoadContainerFlagJobs", Mode.MUST, null, this); + final Job loadContainerFlags = Job.getJob("LoadContainerFlagJobs", Mode.MUST, null, this); 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)); + 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); diff --git a/src/main/java/caosdb/server/utils/ServerMessages.java b/src/main/java/caosdb/server/utils/ServerMessages.java index d4a0f7133d351ad3fc2e358af265327600d46841..63cadf5f3a0eedca04e8dab21a0213a81bf2bd3c 100644 --- a/src/main/java/caosdb/server/utils/ServerMessages.java +++ b/src/main/java/caosdb/server/utils/ServerMessages.java @@ -419,11 +419,18 @@ public class ServerMessages { public static final Message SERVER_SIDE_SCRIPT_MISSING_CALL = new Message(MessageType.Error, 400, "You must specify the `call` field."); - public static final Message ADDITIONAL_PROPERTY = new Message(MessageType.Warning,0,"This property is an additional property which has no corresponding properties among the properties of the parents."); + public static final Message ADDITIONAL_PROPERTY = + new Message( + MessageType.Warning, + 0, + "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."); + + public static final Message PROPERTY_WITH_DESC_OVERRIDE = + new Message(MessageType.Warning, 0, "This property overrides the description."); - public static final Message PROPERTY_WITH_DATATYPE_OVERRIDE = new Message(MessageType.Warning,0,"This property overrides the datatype."); - - public static final Message PROPERTY_WITH_DESC_OVERRIDE = new Message(MessageType.Warning,0,"This property overrides the description."); - - public static final Message PROPERTY_WITH_NAME_OVERRIDE = new Message(MessageType.Warning,0,"This property overrides the name."); + public static final Message PROPERTY_WITH_NAME_OVERRIDE = + new Message(MessageType.Warning, 0, "This property overrides the name."); }