From bc33c1e7a5733dc2aa8796cade39e0118bf45feb Mon Sep 17 00:00:00 2001 From: Timm Fitschen <t.fitschen@indiscale.com> Date: Fri, 11 Jun 2021 12:50:45 +0200 Subject: [PATCH] Rename JobExecutionTime->TransactionStage, +Docs --- src/doc/development/structure.rst | 4 +- src/main/java/org/caosdb/server/jobs/Job.java | 10 +-- .../org/caosdb/server/jobs/JobAnnotation.java | 4 +- .../caosdb/server/jobs/JobExecutionTime.java | 36 --------- .../java/org/caosdb/server/jobs/Schedule.java | 34 ++++---- .../org/caosdb/server/jobs/ScheduledJob.java | 4 +- .../caosdb/server/jobs/TransactionStage.java | 63 +++++++++++++++ .../server/jobs/core/AccessControl.java | 4 +- .../org/caosdb/server/jobs/core/Atomic.java | 4 +- .../server/jobs/core/CheckParValid.java | 4 +- .../server/jobs/core/CheckPropValid.java | 4 +- .../jobs/core/CheckStateTransition.java | 4 +- .../caosdb/server/jobs/core/DebugCalls.java | 4 +- .../caosdb/server/jobs/core/ExecuteQuery.java | 4 +- .../org/caosdb/server/jobs/core/History.java | 4 +- .../server/jobs/core/InheritInitialState.java | 4 +- .../server/jobs/core/InitEntityStateJobs.java | 4 +- .../server/jobs/core/InsertFilesInDir.java | 4 +- .../jobs/core/LoadContainerFlagJobs.java | 4 +- .../server/jobs/core/MakeStateMessage.java | 4 +- .../server/jobs/core/MakeStateProperty.java | 4 +- .../org/caosdb/server/jobs/core/NoCache.java | 4 +- .../org/caosdb/server/jobs/core/Paging.java | 4 +- .../org/caosdb/server/jobs/core/PickUp.java | 4 +- .../jobs/core/ProcessNameProperties.java | 4 +- .../caosdb/server/jobs/core/RetrieveACL.java | 4 +- .../server/jobs/core/RetrieveAllJob.java | 4 +- .../server/jobs/core/RetrieveIdOnlyFlag.java | 4 +- .../server/jobs/core/RetrieveOwner.java | 4 +- .../server/jobs/core/RetriveAllNames.java | 4 +- .../org/caosdb/server/jobs/core/Strict.java | 4 +- .../jobs/core/UpdateUnitConverters.java | 4 +- .../server/transaction/Transaction.java | 79 ++++++++++++------- .../org/caosdb/server/utils/FlagInfo.java | 2 +- .../org/caosdb/server/jobs/ScheduleTest.java | 2 +- 35 files changed, 192 insertions(+), 146 deletions(-) delete mode 100644 src/main/java/org/caosdb/server/jobs/JobExecutionTime.java create mode 100644 src/main/java/org/caosdb/server/jobs/TransactionStage.java diff --git a/src/doc/development/structure.rst b/src/doc/development/structure.rst index 76616475..3848e983 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 34ad4966..9432fc39 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 8acdaccb..bebebd75 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 5d79d72b..00000000 --- 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 892f590f..0090ec92 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 defd1d68..65bc3a19 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 00000000..8248140d --- /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 d1a2113a..408384f4 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 45b5de8e..8639615e 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 02cb96fc..e6638741 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 f95104bd..390deedd 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 cd187cf1..d82a8a5b 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 8527560d..8e0ae743 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 7f5444b3..399039a0 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 5594b5af..d39a6e1f 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 bda4b8eb..39b66e35 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 7dbff695..d3a1fc63 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 35ce4929..8133e465 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 89f381d6..ef8df214 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 6e98704a..855d6a13 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 56682921..c2aebc68 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 a4f63939..e408330e 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 43683639..5f2a6ed6 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 b91fccf7..94a80836 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 e7e8f0e4..1cc12c61 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 f59b2c1e..4664c01b 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 603d861a..7cd7791e 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 1712950d..844468c5 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 73778058..8b6412ce 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 dfd69a5c..b5787246 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 aebbecf8..bb69063c 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 b3ef80ad..0b71d210 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 fdc4e646..99c305fa 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 164c6aab..60697cb9 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 7ad1d611..cef0ec3e 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); } } -- GitLab