diff --git a/src/doc/development/structure.rst b/src/doc/development/structure.rst index 7661647562e35a21eba3c5569a8de6c2433f65b3..3848e983fca5d05871212e0985b98d539c04b7fe 100644 --- a/src/doc/development/structure.rst +++ b/src/doc/development/structure.rst @@ -130,7 +130,7 @@ The request handling in CaosDB is organized in the following way: :java:ref:`Containers<Container>`, enriched with some metadata). - The Transaction keeps a :java:ref:`Schedule` of related :java:ref:`Jobs<Job>` (each also wrapping a specific Transaction), which may be called at different stages, called - :java:ref:`JobExecutionTimes<JobExecutionTime>`. + :java:ref:`TransactionStages<TransactionStage>`. - The Transaction's ``execute()`` method, when called, in turn calls a number of methods for initialization, checks, preparations, cleanup etc. Additionally the scheduled jobs are executed at their specified stages, for example all jobs scheduled for ``INIT`` are executed immediately @@ -163,7 +163,7 @@ Summarized, the classes are connected like this: class Schedule class ScheduledJob abstract Job { - ExecutionTime time + TransactionStage stage Transaction transaction execute(BackendTransaction t)\n // -> transaction.execute(t, transaction.access) } diff --git a/src/main/java/org/caosdb/server/jobs/Job.java b/src/main/java/org/caosdb/server/jobs/Job.java index 34ad4966af0c1272f4ef8468700d9d2d7f6207d9..9432fc3916606cddbf64922850d7f2f9ff5284c2 100644 --- a/src/main/java/org/caosdb/server/jobs/Job.java +++ b/src/main/java/org/caosdb/server/jobs/Job.java @@ -67,7 +67,7 @@ public abstract class Job { private Transaction<? extends TransactionContainer> transaction = null; private Mode mode = null; - private final JobExecutionTime time; + private final TransactionStage stage; private EntityInterface entity = null; public abstract JobTarget getTarget(); @@ -117,9 +117,9 @@ public abstract class Job { protected Job() { if (this.getClass().isAnnotationPresent(JobAnnotation.class)) { - this.time = this.getClass().getAnnotation(JobAnnotation.class).time(); + this.stage = this.getClass().getAnnotation(JobAnnotation.class).stage(); } else { - this.time = JobExecutionTime.CHECK; + this.stage = TransactionStage.CHECK; } } @@ -468,8 +468,8 @@ public abstract class Job { System.out.println(toString()); } - public JobExecutionTime getExecutionTime() { - return this.time; + public TransactionStage getTransactionStage() { + return this.stage; } /** diff --git a/src/main/java/org/caosdb/server/jobs/JobAnnotation.java b/src/main/java/org/caosdb/server/jobs/JobAnnotation.java index 8acdaccb9f56b0b779474c510b0216a1a327971a..bebebd75ed386c19f8abfb7c09e802dda5ec2941 100644 --- a/src/main/java/org/caosdb/server/jobs/JobAnnotation.java +++ b/src/main/java/org/caosdb/server/jobs/JobAnnotation.java @@ -31,10 +31,12 @@ import org.caosdb.server.transaction.TransactionInterface; * * <p>Without a JobAnnotation, the Job will run at the default {@link * org.caosdb.server.transaction.Transaction#check() CHECK} stage. + * + * @see {@link TransactionStage} */ @Retention(RetentionPolicy.RUNTIME) public @interface JobAnnotation { - JobExecutionTime time() default JobExecutionTime.CHECK; + TransactionStage stage() default TransactionStage.CHECK; String flag() default ""; diff --git a/src/main/java/org/caosdb/server/jobs/JobExecutionTime.java b/src/main/java/org/caosdb/server/jobs/JobExecutionTime.java deleted file mode 100644 index 5d79d72b872bb6045bf9d884add79d563c8d14be..0000000000000000000000000000000000000000 --- a/src/main/java/org/caosdb/server/jobs/JobExecutionTime.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * ** header v3.0 - * This file is a part of the CaosDB Project. - * - * Copyright (C) 2018 Research Group Biomedical Physics, - * Max-Planck-Institute for Dynamics and Self-Organization Göttingen - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <https://www.gnu.org/licenses/>. - * - * ** end header - */ -package org.caosdb.server.jobs; - -/** Not really a time (measured in seconds), but rather the execution stage. */ -public enum JobExecutionTime { - INIT, - PRE_CHECK, - CHECK, - POST_CHECK, - PRE_TRANSACTION, - TRANSACTION, - POST_TRANSACTION, - CLEANUP, - ROLL_BACK -} diff --git a/src/main/java/org/caosdb/server/jobs/Schedule.java b/src/main/java/org/caosdb/server/jobs/Schedule.java index 892f590fe4497bf1083a002eedccc2bcb374cf13..0090ec92dffb310052b5b8cc82424e2edd0288f9 100644 --- a/src/main/java/org/caosdb/server/jobs/Schedule.java +++ b/src/main/java/org/caosdb/server/jobs/Schedule.java @@ -33,9 +33,9 @@ import org.caosdb.server.entity.EntityInterface; /** * Keeps track of Jobs. * - * <p>The Schedule class orders jobs by "time" and also assures that jobs are skipped when - * appropriate and to prevent that jobs run more than once (because sometimes they trigger each - * other). + * <p>The Schedule class orders jobs by {@link TransactionStage} and also assures that jobs are + * skipped when appropriate and to prevent that jobs run more than once (because sometimes they + * trigger each other). */ public class Schedule { @@ -43,7 +43,7 @@ public class Schedule { private ScheduledJob running = null; public List<ScheduledJob> addAll(final Collection<Job> jobs) { - List<ScheduledJob> result = new ArrayList<ScheduledJob>(jobs.size()); + final List<ScheduledJob> result = new ArrayList<ScheduledJob>(jobs.size()); for (final Job j : jobs) { result.add(add(j)); } @@ -51,19 +51,19 @@ public class Schedule { } public ScheduledJob add(final Job j) { - ScheduledJob ret = new ScheduledJob(j); - List<ScheduledJob> jobs = jobLists.get(ret.getExecutionTime().ordinal()); + final ScheduledJob ret = new ScheduledJob(j); + List<ScheduledJob> jobs = jobLists.get(ret.getTransactionStage().ordinal()); if (jobs == null) { jobs = new CopyOnWriteArrayList<ScheduledJob>(); - jobLists.put(ret.getExecutionTime().ordinal(), jobs); + jobLists.put(ret.getTransactionStage().ordinal(), jobs); } jobs.add(ret); return ret; } - /** Run all Jobs with the specified JobExecutionTime. */ - public void runJobs(final JobExecutionTime time) { - List<ScheduledJob> jobs = this.jobLists.get(time.ordinal()); + /** Run all Jobs from the specified {@link TransactionStage}. */ + public void runJobs(final TransactionStage stage) { + final List<ScheduledJob> jobs = this.jobLists.get(stage.ordinal()); if (jobs != null) { for (final ScheduledJob scheduledJob : jobs) { runJob(scheduledJob); @@ -89,16 +89,14 @@ public class Schedule { } } - /** - * Run all scheduled Jobs for the given entity. - * - * <p>Execution time: Either CHECK or what is given as jobclass' annotation. - */ + /** Run all scheduled Jobs of a given class for the given entity. */ public void runJob(final EntityInterface entity, final Class<? extends Job> jobclass) { - List<ScheduledJob> jobs = + + // the jobs of this class are in the jobList for the TransactionStage of the jobClass. + final List<ScheduledJob> jobs = jobclass.isAnnotationPresent(JobAnnotation.class) - ? this.jobLists.get(jobclass.getAnnotation(JobAnnotation.class).time().ordinal()) - : this.jobLists.get(JobExecutionTime.CHECK.ordinal()); + ? this.jobLists.get(jobclass.getAnnotation(JobAnnotation.class).stage().ordinal()) + : this.jobLists.get(TransactionStage.CHECK.ordinal()); for (final ScheduledJob scheduledJob : jobs) { if (jobclass.isInstance(scheduledJob.job)) { if (scheduledJob.job.getEntity() == entity) { diff --git a/src/main/java/org/caosdb/server/jobs/ScheduledJob.java b/src/main/java/org/caosdb/server/jobs/ScheduledJob.java index defd1d68d15bc160e7bfae9dc7fd732c7d25922a..65bc3a1947baf5b76539f281e0d855e878a3bdfd 100644 --- a/src/main/java/org/caosdb/server/jobs/ScheduledJob.java +++ b/src/main/java/org/caosdb/server/jobs/ScheduledJob.java @@ -81,8 +81,8 @@ public class ScheduledJob { } /** Return the state of the inner Job. */ - public JobExecutionTime getExecutionTime() { - return this.job.getExecutionTime(); + public TransactionStage getTransactionStage() { + return this.job.getTransactionStage(); } public boolean skip() { diff --git a/src/main/java/org/caosdb/server/jobs/TransactionStage.java b/src/main/java/org/caosdb/server/jobs/TransactionStage.java new file mode 100644 index 0000000000000000000000000000000000000000..8248140d913e08acfb699cbb553a14749c8e2f1f --- /dev/null +++ b/src/main/java/org/caosdb/server/jobs/TransactionStage.java @@ -0,0 +1,63 @@ +/* + * ** header v3.0 + * This file is a part of the CaosDB Project. + * + * Copyright (C) 2018 Research Group Biomedical Physics, + * Max-Planck-Institute for Dynamics and Self-Organization Göttingen + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + * + * ** end header + */ +package org.caosdb.server.jobs; + +import org.caosdb.server.jobs.core.Strict; +import org.caosdb.server.transaction.Transaction; +import org.caosdb.server.utils.UndoHandler; + +/** + * Any {@link Transaction} of an Entity consists of sequence of stages. Jobs which have a {@link + * JobAnnotation} can specify the transaction stage in which they are to be executed. By default, + * any job is executed during the CHECK stage. + * <li>INIT - The transaction is being initialized (create schedule, aquire locks (one writing + * thread, many reading threads permitted). + * <li>PRE_CHECK - Prepare entities (e.g. check if any updates are to be processed, load/generate + * acl, cast objects into more specialized classes.) + * <li>CHECK - Do the actual consistency checking. + * <li>POST_CHECK - Do more consistency checking (reserved for those jobs which need the normal + * checks to be done already, e.g. the {@link Strict} job). + * <li>PRE_TRANSACTION - Prepare the entities for the transaction (e.g. for paging, translate the + * state messages into state properties). Also, in this stage, the full read and write lock is + * aquired. + * <li>TRANSACTION - Do the actual transaction. + * <li>POST_TRANSACTION - Post-process entities (Success messages, write history, transform stage + * properties into messages). + * <li>CLEANUP - Release all locks, remove temporary files, clean-up the {@link UndoHandler}s. + * <li>ROLL_BACK - In case an error occured in any of the stages, this special stage rolls-back any + * changes and calls the {@link UndoHandler#undo()} of the {@link UndoHandler}s. + * + * @see {@link Transaction#execute()}. + * @author Timm Fitschen <t.fitschen@indiscale.com> + */ +public enum TransactionStage { + INIT, + PRE_CHECK, + CHECK, + POST_CHECK, + PRE_TRANSACTION, + TRANSACTION, + POST_TRANSACTION, + CLEANUP, + ROLL_BACK +} diff --git a/src/main/java/org/caosdb/server/jobs/core/AccessControl.java b/src/main/java/org/caosdb/server/jobs/core/AccessControl.java index d1a2113a2f87018cec63d381cce64ad6c8ad09f2..408384f416e1249501d5383ea1028ced56914ded 100644 --- a/src/main/java/org/caosdb/server/jobs/core/AccessControl.java +++ b/src/main/java/org/caosdb/server/jobs/core/AccessControl.java @@ -29,12 +29,12 @@ import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.wrapper.Parent; import org.caosdb.server.jobs.ContainerJob; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; import org.caosdb.server.transaction.Retrieve; import org.caosdb.server.utils.EntityStatus; import org.caosdb.server.utils.ServerMessages; -@JobAnnotation(time = JobExecutionTime.INIT) +@JobAnnotation(stage = TransactionStage.INIT) public class AccessControl extends ContainerJob { @Override diff --git a/src/main/java/org/caosdb/server/jobs/core/Atomic.java b/src/main/java/org/caosdb/server/jobs/core/Atomic.java index 45b5de8e4d5835bd835a797290e2d3c875687e44..8639615ee6ac4ddd648a19d15262a1c526ef10c6 100644 --- a/src/main/java/org/caosdb/server/jobs/core/Atomic.java +++ b/src/main/java/org/caosdb/server/jobs/core/Atomic.java @@ -26,7 +26,7 @@ import org.caosdb.server.entity.Entity; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.jobs.ContainerJob; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; import org.caosdb.server.transaction.WriteTransaction; import org.caosdb.server.utils.EntityStatus; import org.caosdb.server.utils.Observable; @@ -34,7 +34,7 @@ import org.caosdb.server.utils.Observer; import org.caosdb.server.utils.ServerMessages; @JobAnnotation( - time = JobExecutionTime.PRE_TRANSACTION, + stage = TransactionStage.PRE_TRANSACTION, transaction = WriteTransaction.class, loadAlways = true) public class Atomic extends ContainerJob implements Observer { diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckParValid.java b/src/main/java/org/caosdb/server/jobs/core/CheckParValid.java index 02cb96fc1214712c7a8ef1bb98327ba9fb39e9d0..e663874189ee0301a5b30452468391711624b606 100644 --- a/src/main/java/org/caosdb/server/jobs/core/CheckParValid.java +++ b/src/main/java/org/caosdb/server/jobs/core/CheckParValid.java @@ -33,7 +33,7 @@ import org.caosdb.server.entity.wrapper.Parent; import org.caosdb.server.entity.wrapper.Property; import org.caosdb.server.jobs.EntityJob; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; import org.caosdb.server.permissions.EntityPermission; import org.caosdb.server.utils.EntityStatus; import org.caosdb.server.utils.ServerMessages; @@ -43,7 +43,7 @@ import org.caosdb.server.utils.ServerMessages; * * @author tf */ -@JobAnnotation(time = JobExecutionTime.PRE_CHECK) +@JobAnnotation(stage = TransactionStage.PRE_CHECK) public class CheckParValid extends EntityJob { @Override public final void run() { diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckPropValid.java b/src/main/java/org/caosdb/server/jobs/core/CheckPropValid.java index f95104bd2f2552a642e7e4bcd2fc13f7fd2788d4..390deedde211c0931eca1c3677ac5ff9c8ee9d8f 100644 --- a/src/main/java/org/caosdb/server/jobs/core/CheckPropValid.java +++ b/src/main/java/org/caosdb/server/jobs/core/CheckPropValid.java @@ -32,7 +32,7 @@ import org.caosdb.server.entity.Message; import org.caosdb.server.entity.wrapper.Property; import org.caosdb.server.jobs.EntityJob; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; import org.caosdb.server.permissions.EntityPermission; import org.caosdb.server.utils.EntityStatus; import org.caosdb.server.utils.ServerMessages; @@ -42,7 +42,7 @@ import org.caosdb.server.utils.ServerMessages; * * @author tf */ -@JobAnnotation(time = JobExecutionTime.PRE_CHECK) +@JobAnnotation(stage = TransactionStage.PRE_CHECK) public class CheckPropValid extends EntityJob { @Override public final void run() { diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckStateTransition.java b/src/main/java/org/caosdb/server/jobs/core/CheckStateTransition.java index cd187cf17ad72c5431fcd3f2eb0b95890941faf9..d82a8a5be4baf265e6af263391751a68458a91f4 100644 --- a/src/main/java/org/caosdb/server/jobs/core/CheckStateTransition.java +++ b/src/main/java/org/caosdb/server/jobs/core/CheckStateTransition.java @@ -30,7 +30,7 @@ import org.caosdb.server.entity.Message; import org.caosdb.server.entity.Message.MessageType; import org.caosdb.server.entity.UpdateEntity; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; import org.caosdb.server.transaction.WriteTransaction; import org.caosdb.server.utils.ServerMessages; @@ -42,7 +42,7 @@ import org.caosdb.server.utils.ServerMessages; * * @author Timm Fitschen (t.fitschen@indiscale.com) */ -@JobAnnotation(time = JobExecutionTime.POST_CHECK, transaction = WriteTransaction.class) +@JobAnnotation(stage = TransactionStage.POST_CHECK, transaction = WriteTransaction.class) public class CheckStateTransition extends EntityStateJob { private static final String PERMISSION_STATE_FORCE_FINAL = "STATE:FORCE:FINAL"; diff --git a/src/main/java/org/caosdb/server/jobs/core/DebugCalls.java b/src/main/java/org/caosdb/server/jobs/core/DebugCalls.java index 8527560d02e498bf3812162a8b01b9641aad7260..8e0ae7435693ba1010f023da6c585911825f5a5e 100644 --- a/src/main/java/org/caosdb/server/jobs/core/DebugCalls.java +++ b/src/main/java/org/caosdb/server/jobs/core/DebugCalls.java @@ -25,11 +25,11 @@ package org.caosdb.server.jobs.core; import org.caosdb.server.CaosDBServer; import org.caosdb.server.jobs.FlagJob; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; @JobAnnotation( flag = "debug", - time = JobExecutionTime.INIT, + stage = TransactionStage.INIT, values = {DebugCalls.ex_null_p}, description = "This job for debugging and is available in debug mode only. Otherwise the flag is ignored. It throws an exception on purpose.", diff --git a/src/main/java/org/caosdb/server/jobs/core/ExecuteQuery.java b/src/main/java/org/caosdb/server/jobs/core/ExecuteQuery.java index 7f5444b36104526101ebf9b3f2aa547b3d91cbc9..399039a072d2fd7b5f54566b2f448791169a356b 100644 --- a/src/main/java/org/caosdb/server/jobs/core/ExecuteQuery.java +++ b/src/main/java/org/caosdb/server/jobs/core/ExecuteQuery.java @@ -26,13 +26,13 @@ import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.Message; import org.caosdb.server.jobs.FlagJob; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; import org.caosdb.server.query.Query; import org.caosdb.server.query.Query.ParsingException; import org.caosdb.server.utils.EntityStatus; import org.caosdb.server.utils.ServerMessages; -@JobAnnotation(flag = "query", time = JobExecutionTime.INIT) +@JobAnnotation(flag = "query", stage = TransactionStage.INIT) public class ExecuteQuery extends FlagJob { @Override diff --git a/src/main/java/org/caosdb/server/jobs/core/History.java b/src/main/java/org/caosdb/server/jobs/core/History.java index 5594b5afdb841436dbdd63f96b8e2c44faef51c6..d39a6e1f570400194b3a530c3c323a92d0374b7c 100644 --- a/src/main/java/org/caosdb/server/jobs/core/History.java +++ b/src/main/java/org/caosdb/server/jobs/core/History.java @@ -27,7 +27,7 @@ import org.caosdb.server.database.backend.transaction.RetrieveVersionHistory; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.jobs.FlagJob; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; import org.caosdb.server.permissions.EntityPermission; import org.caosdb.server.utils.EntityStatus; import org.caosdb.server.utils.ServerMessages; @@ -37,7 +37,7 @@ import org.caosdb.server.utils.ServerMessages; * * @author Timm Fitschen (t.fitschen@indiscale.com) */ -@JobAnnotation(time = JobExecutionTime.POST_TRANSACTION, flag = "H") +@JobAnnotation(stage = TransactionStage.POST_TRANSACTION, flag = "H") public class History extends FlagJob { @Override diff --git a/src/main/java/org/caosdb/server/jobs/core/InheritInitialState.java b/src/main/java/org/caosdb/server/jobs/core/InheritInitialState.java index bda4b8ebe885aa49df13ecf36ab14663c7ead270..39b66e35330a485bbd8eb4c40724ab3b250ccc45 100644 --- a/src/main/java/org/caosdb/server/jobs/core/InheritInitialState.java +++ b/src/main/java/org/caosdb/server/jobs/core/InheritInitialState.java @@ -5,9 +5,9 @@ import org.caosdb.server.entity.Message; import org.caosdb.server.entity.wrapper.Parent; import org.caosdb.server.entity.wrapper.Property; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; -@JobAnnotation(time = JobExecutionTime.CHECK) +@JobAnnotation(stage = TransactionStage.CHECK) public class InheritInitialState extends EntityStateJob { @Override diff --git a/src/main/java/org/caosdb/server/jobs/core/InitEntityStateJobs.java b/src/main/java/org/caosdb/server/jobs/core/InitEntityStateJobs.java index 7dbff695a342e5dcd2a19a2d72116c14fba78a6c..d3a1fc636761298f1b0586a4036be09ced835021 100644 --- a/src/main/java/org/caosdb/server/jobs/core/InitEntityStateJobs.java +++ b/src/main/java/org/caosdb/server/jobs/core/InitEntityStateJobs.java @@ -39,7 +39,7 @@ import org.caosdb.server.entity.UpdateEntity; import org.caosdb.server.entity.WritableEntity; import org.caosdb.server.entity.wrapper.Property; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; import org.caosdb.server.transaction.WriteTransaction; import org.caosdb.server.utils.EntityStatus; import org.caosdb.server.utils.Observable; @@ -57,7 +57,7 @@ import org.caosdb.server.utils.Observer; */ @JobAnnotation( loadAlways = true, - time = JobExecutionTime.INIT, + stage = TransactionStage.INIT, transaction = WriteTransaction.class) public class InitEntityStateJobs extends EntityStateJob implements Observer { diff --git a/src/main/java/org/caosdb/server/jobs/core/InsertFilesInDir.java b/src/main/java/org/caosdb/server/jobs/core/InsertFilesInDir.java index 35ce49297291accd41a7c293fc909cc0a27f9317..8133e4659d55caf29faa56eeb80ced194cd26cfc 100644 --- a/src/main/java/org/caosdb/server/jobs/core/InsertFilesInDir.java +++ b/src/main/java/org/caosdb/server/jobs/core/InsertFilesInDir.java @@ -46,7 +46,7 @@ import org.caosdb.server.entity.Role; import org.caosdb.server.jobs.FlagJob; import org.caosdb.server.jobs.Job; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; import org.caosdb.server.transaction.Retrieve; import org.caosdb.server.transaction.WriteTransactionInterface; import org.caosdb.server.utils.EntityStatus; @@ -57,7 +57,7 @@ import org.caosdb.server.utils.Utils; @JobAnnotation( flag = "InsertFilesInDir", loadOnDefault = false, - time = JobExecutionTime.INIT, + stage = TransactionStage.INIT, description = "For expert users only! Risk of creating spam records!\nValue of this flag might be any directory on the servers local file system which is part of the server's back-end file storage. This job will insert every readable, nonhidden file in said directory into the database and link the file with a symlink. This is useful to add a huge amount of files without actully copying them to the back-end file storage. If you call this job on a directory more than once every file that was recently added to the source directory is inserted. Every yet known file is left untouched. \nOptional parameter -e EXCLUDE: A regular expression of files which are to be ignored. \n Optional parameter -i INCLUDE: a regular expression of files which are to be included. By default, all files are included. The -e takes precedence. \nOptional parameter -p PREFIX: Stores all new files into the directory PREFIX in the server's file system.\nOptional parameter --force-allow-symlinks: Simlinks in your data are a source of problems for the database. Therefore, simlinks are ignored by default. This option allows symlinks (but still generates simlink warnings). \nPrepend/Dry run: Call this flag with a retrieve transaction (HTTP GET) and it will only count all files and list them without actually inserting them.") public class InsertFilesInDir extends FlagJob { diff --git a/src/main/java/org/caosdb/server/jobs/core/LoadContainerFlagJobs.java b/src/main/java/org/caosdb/server/jobs/core/LoadContainerFlagJobs.java index 89f381d648144e274325c5c71a57c9f4daf04895..ef8df214c804fb1d55c3ed088c5f7f6e998aca07 100644 --- a/src/main/java/org/caosdb/server/jobs/core/LoadContainerFlagJobs.java +++ b/src/main/java/org/caosdb/server/jobs/core/LoadContainerFlagJobs.java @@ -27,9 +27,9 @@ import org.caosdb.server.jobs.ContainerJob; import org.caosdb.server.jobs.FlagJob; import org.caosdb.server.jobs.Job; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; -@JobAnnotation(time = JobExecutionTime.INIT) +@JobAnnotation(stage = TransactionStage.INIT) public class LoadContainerFlagJobs extends ContainerJob { @Override diff --git a/src/main/java/org/caosdb/server/jobs/core/MakeStateMessage.java b/src/main/java/org/caosdb/server/jobs/core/MakeStateMessage.java index 6e98704a5f6d73199993f2ed531e6d6277934e64..855d6a139aa80fa0b67cda652708b3e56ef5eb2b 100644 --- a/src/main/java/org/caosdb/server/jobs/core/MakeStateMessage.java +++ b/src/main/java/org/caosdb/server/jobs/core/MakeStateMessage.java @@ -30,7 +30,7 @@ import org.caosdb.server.entity.Message; import org.caosdb.server.entity.wrapper.Property; import org.caosdb.server.entity.xml.ToElementable; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; import org.caosdb.server.transaction.Retrieve; import org.jdom2.Element; @@ -46,7 +46,7 @@ import org.jdom2.Element; @JobAnnotation( loadAlways = true, transaction = Retrieve.class, - time = JobExecutionTime.POST_TRANSACTION) + stage = TransactionStage.POST_TRANSACTION) public class MakeStateMessage extends EntityStateJob { public static final String SPARSE_FLAG = "sparseState"; diff --git a/src/main/java/org/caosdb/server/jobs/core/MakeStateProperty.java b/src/main/java/org/caosdb/server/jobs/core/MakeStateProperty.java index 56682921563d77f462903567a2c128fcd5d92555..c2aebc681b38a9902bede69883cce4025bc8afe6 100644 --- a/src/main/java/org/caosdb/server/jobs/core/MakeStateProperty.java +++ b/src/main/java/org/caosdb/server/jobs/core/MakeStateProperty.java @@ -25,14 +25,14 @@ package org.caosdb.server.jobs.core; import org.caosdb.server.entity.Message; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; import org.caosdb.server.transaction.WriteTransaction; /** * This job constructs an ordinary Property from the State right before the entity is being written * to the back-end and after any checks run. */ -@JobAnnotation(transaction = WriteTransaction.class, time = JobExecutionTime.PRE_TRANSACTION) +@JobAnnotation(transaction = WriteTransaction.class, stage = TransactionStage.PRE_TRANSACTION) public class MakeStateProperty extends EntityStateJob { @Override diff --git a/src/main/java/org/caosdb/server/jobs/core/NoCache.java b/src/main/java/org/caosdb/server/jobs/core/NoCache.java index a4f639392ac63a97f2f025dfe6717a664114c561..e408330ee2639d1c5d7dc5f145848e292daa9b3b 100644 --- a/src/main/java/org/caosdb/server/jobs/core/NoCache.java +++ b/src/main/java/org/caosdb/server/jobs/core/NoCache.java @@ -24,7 +24,7 @@ package org.caosdb.server.jobs.core; import org.caosdb.server.jobs.FlagJob; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; @JobAnnotation( flag = "cache", @@ -32,7 +32,7 @@ import org.caosdb.server.jobs.JobExecutionTime; description = "Depending on the configuraion of the server some transactions with the backend database might be cached internally for performance reasons. Disable the internal caching for this transaction with 'false'. Note: You cannot enable the caching with 'true', if the server is not configured to use caching.", values = {"true", "false"}, - time = JobExecutionTime.INIT) + stage = TransactionStage.INIT) public class NoCache extends FlagJob { @Override diff --git a/src/main/java/org/caosdb/server/jobs/core/Paging.java b/src/main/java/org/caosdb/server/jobs/core/Paging.java index 43683639f75c08be394a38ce03e91282405f333d..5f2a6ed62f48f20d09c34c8ee34190231903ffe7 100644 --- a/src/main/java/org/caosdb/server/jobs/core/Paging.java +++ b/src/main/java/org/caosdb/server/jobs/core/Paging.java @@ -27,11 +27,11 @@ import java.util.regex.Pattern; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.jobs.FlagJob; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; import org.caosdb.server.transaction.Retrieve; import org.caosdb.server.utils.EntityStatus; -@JobAnnotation(flag = "P", time = JobExecutionTime.PRE_TRANSACTION) +@JobAnnotation(flag = "P", stage = TransactionStage.PRE_TRANSACTION) public class Paging extends FlagJob { public static final int DEFAULT_LENGTH = 100; diff --git a/src/main/java/org/caosdb/server/jobs/core/PickUp.java b/src/main/java/org/caosdb/server/jobs/core/PickUp.java index b91fccf72d54022c6f6d19ba26c2b0974a54829f..94a80836c863ea226a88e035201a2e2fb9fd1039 100644 --- a/src/main/java/org/caosdb/server/jobs/core/PickUp.java +++ b/src/main/java/org/caosdb/server/jobs/core/PickUp.java @@ -30,12 +30,12 @@ import org.caosdb.server.entity.FileProperties; import org.caosdb.server.entity.Message; import org.caosdb.server.jobs.EntityJob; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; import org.caosdb.server.utils.EntityStatus; import org.caosdb.server.utils.Observable; import org.caosdb.server.utils.Observer; -@JobAnnotation(time = JobExecutionTime.INIT) +@JobAnnotation(stage = TransactionStage.INIT) public class PickUp extends EntityJob implements Observer { @Override diff --git a/src/main/java/org/caosdb/server/jobs/core/ProcessNameProperties.java b/src/main/java/org/caosdb/server/jobs/core/ProcessNameProperties.java index e7e8f0e4d6aab3f3d0b3e9392d408a88aaa0abcc..1cc12c6102f66dda224360554e4ac5c515ae418d 100644 --- a/src/main/java/org/caosdb/server/jobs/core/ProcessNameProperties.java +++ b/src/main/java/org/caosdb/server/jobs/core/ProcessNameProperties.java @@ -35,7 +35,7 @@ import org.caosdb.server.entity.wrapper.Parent; import org.caosdb.server.entity.wrapper.Property; import org.caosdb.server.jobs.EntityJob; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; import org.caosdb.server.utils.EntityStatus; import org.caosdb.server.utils.ServerMessages; @@ -44,7 +44,7 @@ import org.caosdb.server.utils.ServerMessages; * * @author tf */ -@JobAnnotation(time = JobExecutionTime.PRE_TRANSACTION) +@JobAnnotation(stage = TransactionStage.PRE_TRANSACTION) public class ProcessNameProperties extends EntityJob { @Override diff --git a/src/main/java/org/caosdb/server/jobs/core/RetrieveACL.java b/src/main/java/org/caosdb/server/jobs/core/RetrieveACL.java index f59b2c1ec94de846714575537516c41d18bf4629..4664c01b88d361485c342a8fcddca2ab082f0dee 100644 --- a/src/main/java/org/caosdb/server/jobs/core/RetrieveACL.java +++ b/src/main/java/org/caosdb/server/jobs/core/RetrieveACL.java @@ -27,7 +27,7 @@ import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.xml.ToElementable; import org.caosdb.server.jobs.FlagJob; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; import org.caosdb.server.permissions.EntityPermission; import org.caosdb.server.transaction.Retrieve; import org.caosdb.server.utils.EntityStatus; @@ -35,7 +35,7 @@ import org.caosdb.server.utils.ServerMessages; import org.jdom2.Element; @JobAnnotation( - time = JobExecutionTime.POST_TRANSACTION, + stage = TransactionStage.POST_TRANSACTION, flag = "ACL", description = "Adds an XML representation of the EntityACL to the output of this entity.") public class RetrieveACL extends FlagJob { diff --git a/src/main/java/org/caosdb/server/jobs/core/RetrieveAllJob.java b/src/main/java/org/caosdb/server/jobs/core/RetrieveAllJob.java index 603d861ad24b659fab262291d888420c02f6bcf5..7cd7791e0b27f1ec1d5e67e047e7f1cbe177948c 100644 --- a/src/main/java/org/caosdb/server/jobs/core/RetrieveAllJob.java +++ b/src/main/java/org/caosdb/server/jobs/core/RetrieveAllJob.java @@ -26,9 +26,9 @@ import org.caosdb.server.database.backend.transaction.RetrieveAll; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.jobs.FlagJob; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; -@JobAnnotation(flag = "all", time = JobExecutionTime.INIT) +@JobAnnotation(flag = "all", stage = TransactionStage.INIT) public class RetrieveAllJob extends FlagJob { @Override diff --git a/src/main/java/org/caosdb/server/jobs/core/RetrieveIdOnlyFlag.java b/src/main/java/org/caosdb/server/jobs/core/RetrieveIdOnlyFlag.java index 1712950dff9403df54f26457d0b6a763d7ce4de8..844468c5473b4d2dff6e59777f925f2701505749 100644 --- a/src/main/java/org/caosdb/server/jobs/core/RetrieveIdOnlyFlag.java +++ b/src/main/java/org/caosdb/server/jobs/core/RetrieveIdOnlyFlag.java @@ -25,10 +25,10 @@ package org.caosdb.server.jobs.core; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.jobs.FlagJob; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; import org.caosdb.server.utils.EntityStatus; -@JobAnnotation(flag = "IdOnly", time = JobExecutionTime.PRE_TRANSACTION) +@JobAnnotation(flag = "IdOnly", stage = TransactionStage.PRE_TRANSACTION) public class RetrieveIdOnlyFlag extends FlagJob { @Override diff --git a/src/main/java/org/caosdb/server/jobs/core/RetrieveOwner.java b/src/main/java/org/caosdb/server/jobs/core/RetrieveOwner.java index 7377805805ec55e2c3c3928cc42b0c053d8a9c9d..8b6412cee5d6e800a78509741d4f3680403008ce 100644 --- a/src/main/java/org/caosdb/server/jobs/core/RetrieveOwner.java +++ b/src/main/java/org/caosdb/server/jobs/core/RetrieveOwner.java @@ -28,7 +28,7 @@ import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.xml.ToElementable; import org.caosdb.server.jobs.FlagJob; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; import org.caosdb.server.permissions.EntityPermission; import org.caosdb.server.permissions.ResponsibleAgent; import org.caosdb.server.transaction.Retrieve; @@ -37,7 +37,7 @@ import org.caosdb.server.utils.ServerMessages; import org.jdom2.Element; @JobAnnotation( - time = JobExecutionTime.POST_TRANSACTION, + stage = TransactionStage.POST_TRANSACTION, flag = "owner", description = "Adds an XML representation of the owner(s) to the output of this entity.") public class RetrieveOwner extends FlagJob { diff --git a/src/main/java/org/caosdb/server/jobs/core/RetriveAllNames.java b/src/main/java/org/caosdb/server/jobs/core/RetriveAllNames.java index dfd69a5cb5a40a6e6be35e345f17e38f3dbb7e2e..b5787246cbafba0df31056d2da15adb330ef0c50 100644 --- a/src/main/java/org/caosdb/server/jobs/core/RetriveAllNames.java +++ b/src/main/java/org/caosdb/server/jobs/core/RetriveAllNames.java @@ -4,7 +4,7 @@ import org.caosdb.server.database.backend.transaction.GetAllNames; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.jobs.FlagJob; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; import org.caosdb.server.permissions.EntityPermission; import org.caosdb.server.utils.EntityStatus; @@ -15,7 +15,7 @@ import org.caosdb.server.utils.EntityStatus; * <p>The entites' status are set to VALID because the entities parents and properties do not have * to be retrieved. */ -@JobAnnotation(flag = "names", time = JobExecutionTime.INIT) +@JobAnnotation(flag = "names", stage = TransactionStage.INIT) public class RetriveAllNames extends FlagJob { @Override diff --git a/src/main/java/org/caosdb/server/jobs/core/Strict.java b/src/main/java/org/caosdb/server/jobs/core/Strict.java index aebbecf86a89476339dbdef8892b074aebc8196d..bb69063c116e5c14aa9fad2b0bbf881d2481b394 100644 --- a/src/main/java/org/caosdb/server/jobs/core/Strict.java +++ b/src/main/java/org/caosdb/server/jobs/core/Strict.java @@ -27,11 +27,11 @@ import org.caosdb.server.entity.Message; import org.caosdb.server.entity.xml.ToElementable; import org.caosdb.server.jobs.ContainerJob; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; import org.caosdb.server.utils.EntityStatus; import org.caosdb.server.utils.ServerMessages; -@JobAnnotation(time = JobExecutionTime.POST_CHECK) +@JobAnnotation(stage = TransactionStage.POST_CHECK) public class Strict extends ContainerJob { // TODO load strict job via unified flag interface diff --git a/src/main/java/org/caosdb/server/jobs/core/UpdateUnitConverters.java b/src/main/java/org/caosdb/server/jobs/core/UpdateUnitConverters.java index b3ef80adb64fcf3c1007a33a64bde691c9ff9c1d..0b71d2102c98188d875d52d3bbc3e0f79a23043b 100644 --- a/src/main/java/org/caosdb/server/jobs/core/UpdateUnitConverters.java +++ b/src/main/java/org/caosdb/server/jobs/core/UpdateUnitConverters.java @@ -25,12 +25,12 @@ package org.caosdb.server.jobs.core; import org.caosdb.server.database.backend.transaction.InsertLinCon; import org.caosdb.server.jobs.EntityJob; import org.caosdb.server.jobs.JobAnnotation; -import org.caosdb.server.jobs.JobExecutionTime; +import org.caosdb.server.jobs.TransactionStage; import org.caosdb.unit.Converter; import org.caosdb.unit.LinearConverter; import org.caosdb.unit.Unit; -@JobAnnotation(time = JobExecutionTime.PRE_TRANSACTION) +@JobAnnotation(stage = TransactionStage.PRE_TRANSACTION) public class UpdateUnitConverters extends EntityJob { @Override diff --git a/src/main/java/org/caosdb/server/transaction/Transaction.java b/src/main/java/org/caosdb/server/transaction/Transaction.java index fdc4e646e3bef6404dd83e254558d239a72fb81a..99c305fa17b37878cc5f3277c93623a915be4ea3 100644 --- a/src/main/java/org/caosdb/server/transaction/Transaction.java +++ b/src/main/java/org/caosdb/server/transaction/Transaction.java @@ -39,14 +39,15 @@ import org.caosdb.server.entity.Message; import org.caosdb.server.entity.Message.MessageType; import org.caosdb.server.entity.container.TransactionContainer; import org.caosdb.server.jobs.Job; -import org.caosdb.server.jobs.JobExecutionTime; import org.caosdb.server.jobs.Schedule; import org.caosdb.server.jobs.ScheduledJob; +import org.caosdb.server.jobs.TransactionStage; import org.caosdb.server.jobs.core.AccessControl; import org.caosdb.server.jobs.core.CheckDatatypePresent; import org.caosdb.server.jobs.core.CheckEntityACLRoles; import org.caosdb.server.jobs.core.Mode; import org.caosdb.server.jobs.core.PickUp; +import org.caosdb.server.permissions.EntityACL; import org.caosdb.server.utils.AbstractObservable; import org.caosdb.server.utils.Info; import org.caosdb.server.utils.Observer; @@ -73,9 +74,11 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra this(container, Info.getInstance()); } - protected Transaction(C container, Observer o) { + protected Transaction(final C container, final Observer o) { this.container = container; - if (o != null) acceptObserver(o); + if (o != null) { + acceptObserver(o); + } } public static DatabaseAccessManager getAccessManager() { @@ -94,7 +97,7 @@ 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); - ScheduledJob scheduledJob = this.schedule.add(loadContainerFlags); + final ScheduledJob scheduledJob = this.schedule.add(loadContainerFlags); this.schedule.runJob(scheduledJob); // AccessControl @@ -126,31 +129,36 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra * <p>This method calls the following other internal methods and scheduled jobs stored in the * {@link getSchedule() internal Schedule object}: * - * <ul> - * <li>{@link init} - * <li>{@link Schedule.runJobs(INIT)} - * <li>{@link preCheck} - * <li>{@link Schedule.runJobs(PRE_CHECK)} - * <li>{@link check} - * <li>{@link Schedule.runJobs(POST_CHECK)} - * <li>{@link postCheck} - * <li>{@link preTransaction} - * <li>{@link Schedule.runJobs(PRE_TRANSACTION)} + * <ol> + * <li>{@link init} - Make {@link Schedule}, resolve names to ids, aquire read access. + * <li>{@link Schedule.runJobs(INIT)} - See {@link TransactionStage#INIT}. + * <li>{@link preCheck} - Load/generate {@link EntityACL}s, check if any updates are to be + * processed. + * <li>{@link Schedule.runJobs(PRE_CHECK)} - See {@link TransactionStage#PRE_CHECK}. + * <li>{@link check} - only run the jobs in the CHECK stage, see {@link TransactionStage#CHECK}. + * <li>{@link Schedule.runJobs(POST_CHECK)} - See {@link TransactionStage#POST_CHECK}. + * <li>{@link postCheck} - currently, nothing happens here (just there for consistency). + * <li>{@link preTransaction} - acquire write access (if necessary) + * <li>{@link Schedule.runJobs(PRE_TRANSACTION)} - See {@link TransactionStage#PRE_TRANSACTION}. * <li>{@link transaction}: This is typically the main method of a Transaction. - * <li>{@link Schedule.runJobs(POST_TRANSACTION)} - * <li>{@link postTransaction} - * <li>{@link writeHistory} - * <li>{@link commit} - * <li>{@link rollBack}: Only in the case of errors. - * <li>{@link cleanUp}: Always. - * <li>{@link notifyObservers(CLEAN_UP)}: Also always. + * <li>{@link Schedule.runJobs(POST_TRANSACTION)} - See {@link + * TransactionStage#POST_TRANSACTION}. + * <li>{@link postTransaction} - Add success messages + * <li>{@link writeHistory} - write the transaction history logs + * <li>{@link commit} - commit the changes + * <li>{@link rollBack}: Only in the case of errors - rollback any changes (also file-system + * changes). + * <li>{@link cleanUp}: Always - cleanup the transaction (e.g. remove temporary files). + * <li>{@link notifyObservers(CLEAN_UP)}: Also always - for any jobs that do their own clean-up. + * + * @see {@link TransactionStage}. */ @Override public final void execute() throws Exception { long t1 = System.currentTimeMillis(); try { init(); - this.schedule.runJobs(JobExecutionTime.INIT); + this.schedule.runJobs(TransactionStage.INIT); getContainer() .getTransactionBenchmark() .addMeasurement( @@ -158,7 +166,7 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra t1 = System.currentTimeMillis(); preCheck(); - this.schedule.runJobs(JobExecutionTime.PRE_CHECK); + this.schedule.runJobs(TransactionStage.PRE_CHECK); getContainer() .getTransactionBenchmark() .addMeasurement( @@ -172,7 +180,7 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra this.getClass().getSimpleName() + ".check", System.currentTimeMillis() - t1); t1 = System.currentTimeMillis(); - this.schedule.runJobs(JobExecutionTime.POST_CHECK); + this.schedule.runJobs(TransactionStage.POST_CHECK); postCheck(); getContainer() .getTransactionBenchmark() @@ -181,7 +189,7 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra t1 = System.currentTimeMillis(); preTransaction(); - this.schedule.runJobs(JobExecutionTime.PRE_TRANSACTION); + this.schedule.runJobs(TransactionStage.PRE_TRANSACTION); getContainer() .getTransactionBenchmark() .addMeasurement( @@ -196,7 +204,7 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra this.getClass().getSimpleName() + ".transaction", System.currentTimeMillis() - t1); t1 = System.currentTimeMillis(); - this.schedule.runJobs(JobExecutionTime.POST_TRANSACTION); + this.schedule.runJobs(TransactionStage.POST_TRANSACTION); postTransaction(); getContainer() .getTransactionBenchmark() @@ -246,6 +254,7 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra return getContainer().getOwner(); } + /** Return true iff this transaction should be logged in the transaction history logs. */ public abstract boolean logHistory(); public UTCDateTime getTimestamp() { @@ -255,36 +264,46 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra // TODO move to post-transaction job private void writeHistory() throws TransactionException, Message { if (logHistory()) { - String realm = ((Principal) getTransactor().getPrincipal()).getRealm(); - String username = ((Principal) getTransactor().getPrincipal()).getUsername(); + final String realm = ((Principal) getTransactor().getPrincipal()).getRealm(); + final String username = ((Principal) getTransactor().getPrincipal()).getUsername(); execute( new InsertTransactionHistory(getContainer(), realm, username, getTimestamp()), getAccess()); } } + /** @see {@link #execute()} */ protected void rollBack() { - this.schedule.runJobs(JobExecutionTime.ROLL_BACK); + this.schedule.runJobs(TransactionStage.ROLL_BACK); } + /** @see {@link #execute()} */ protected abstract void init() throws Exception; + /** @see {@link #execute()} */ protected abstract void preCheck() throws InterruptedException, Exception; + /** @see {@link #execute()} */ protected final void check() { - this.schedule.runJobs(JobExecutionTime.CHECK); + this.schedule.runJobs(TransactionStage.CHECK); } + /** @see {@link #execute()} */ protected abstract void postCheck(); + /** @see {@link #execute()} */ protected abstract void preTransaction() throws InterruptedException; + /** @see {@link #execute()} */ protected abstract void transaction() throws Exception; + /** @see {@link #execute()} */ protected abstract void postTransaction() throws Exception; + /** @see {@link #execute()} */ protected abstract void cleanUp(); + /** @see {@link #execute()} */ protected void commit() throws Exception {} public boolean useCache() { diff --git a/src/main/java/org/caosdb/server/utils/FlagInfo.java b/src/main/java/org/caosdb/server/utils/FlagInfo.java index 164c6aabe9c4fafff26f93db30d791fa91389eee..60697cb90df0bcf0da0588c580c49664ec0b0f52 100644 --- a/src/main/java/org/caosdb/server/utils/FlagInfo.java +++ b/src/main/java/org/caosdb/server/utils/FlagInfo.java @@ -55,7 +55,7 @@ public class FlagInfo { for (final JobAnnotation a : as) { final Element aElem = new Element(a.flag()); aElem.setAttribute("description", a.description()); - aElem.setAttribute("time", a.time().toString()); + aElem.setAttribute("stage", a.stage().toString()); if (!a.transaction().equals(TransactionInterface.class)) { aElem.setAttribute("transaction", a.transaction().getSimpleName()); } diff --git a/src/test/java/org/caosdb/server/jobs/ScheduleTest.java b/src/test/java/org/caosdb/server/jobs/ScheduleTest.java index 7ad1d6112e8b7bd3a29042d5f6ca82709ae4100a..cef0ec3e076f38893ada35bbad881ccfe8a02331 100644 --- a/src/test/java/org/caosdb/server/jobs/ScheduleTest.java +++ b/src/test/java/org/caosdb/server/jobs/ScheduleTest.java @@ -46,6 +46,6 @@ public class ScheduleTest { } }); - schedule.runJobs(JobExecutionTime.ROLL_BACK); + schedule.runJobs(TransactionStage.ROLL_BACK); } }