Trigger.java
/*
** Module : Trigger.java
** Abstract : base class for all delegated trigger block objects
**
** Copyright (c) 2008-2019, Golden Code Development Corporation.
**
** -#- -I- --Date-- --JPRM-- ---------------------------Description-----------------------------
** 001 GES 20080509 @38528 Created initial version as the base class forall delegated trigger
** block objects.
** 002 GES 20081017 @40160 Added a setter for transaction level.
** 003 GES 20160907 Changes to match BlockManager API change.
** 004 GES 20161004 Made the class non-abstract and added constructors to allow lambda
** use cases.
** 005 CA 20190122 topLevelBlock signature change.
** 006 CA 20191119 Track the executing class, to be able to register any buffer to its
** source definition class.
*/
/*
** 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 may find a copy of the GNU Affero GPL version 3 at the following
** location: https://www.gnu.org/licenses/agpl-3.0.en.html
**
** Additional terms under GNU Affero GPL version 3 section 7:
**
** Under Section 7 of the GNU Affero GPL version 3, the following additional
** terms apply to the works covered under the License. These additional terms
** are non-permissive additional terms allowed under Section 7 of the GNU
** Affero GPL version 3 and may not be removed by you.
**
** 0. Attribution Requirement.
**
** You must preserve all legal notices or author attributions in the covered
** work or Appropriate Legal Notices displayed by works containing the covered
** work. You may not remove from the covered work any author or developer
** credit already included within the covered work.
**
** 1. No License To Use Trademarks.
**
** This license does not grant any license or rights to use the trademarks
** Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
** of Golden Code Development Corporation. You are not authorized to use the
** name Golden Code, FWD, or the names of any author or contributor, for
** publicity purposes without written authorization.
**
** 2. No Misrepresentation of Affiliation.
**
** You may not represent yourself as Golden Code Development Corporation or FWD.
**
** You may not represent yourself for publicity purposes as associated with
** Golden Code Development Corporation, FWD, or any author or contributor to
** the covered work, without written authorization.
**
** 3. No Misrepresentation of Source or Origin.
**
** You may not represent the covered work as solely your work. All modified
** versions of the covered work must be marked in a reasonable way to make it
** clear that the modified work is not originating from Golden Code Development
** Corporation or FWD. All modified versions must contain the notices of
** attribution required in this license.
*/
package com.goldencode.p2j.util;
import static com.goldencode.p2j.util.BlockManager.*;
/**
* Base class for all trigger blocks. This implements the "scaffolding" that
* promperly manages a trigger's code execution.
*/
public class Trigger
extends Block
implements Runnable
{
/** Transaction level for this code block. */
protected TransactionType level = TransactionType.SUB;
/**
* Default constructor, equivalent to an empty trigger (one with no code in the block).
*/
public Trigger()
{
// nothing to do
}
/**
* Constructor.
*
* @param body
* The code to be executed as the block's {@link #body} method.
*/
public Trigger(Body body)
{
super(null, null, null, body, null);
}
/**
* Constructor.
*
* @param pre
* The code to be executed as the block's {@link #pre} method.
* @param body
* The code to be executed as the block's {@link #body} method.
*/
public Trigger(Pre pre, Body body)
{
super(pre, null, null, body, null);
}
/**
* Constructor.
*
* @param init
* The code to be executed as the block's {@link #init} method.
* @param body
* The code to be executed as the block's {@link #body} method.
*/
public Trigger(Init init, Body body)
{
super(null, init, null, body, null);
}
/**
* Constructor.
*
* @param pre
* The code to be executed as the block's {@link #pre} method.
* @param init
* The code to be executed as the block's {@link #init} method.
* @param body
* The code to be executed as the block's {@link #body} method.
*/
public Trigger(Pre pre, Init init, Body body)
{
super(pre, init, null, body, null);
}
/**
* Constructor.
*
* @param body
* The code to be executed as the block's {@link #body} method.
* @param fini
* The code to be executed as the block's {@link #fini} method.
*/
public Trigger(Body body, Fini fini)
{
super(null, null, null, body, fini);
}
/**
* Constructor.
*
* @param pre
* The code to be executed as the block's {@link #pre} method.
* @param body
* The code to be executed as the block's {@link #body} method.
* @param fini
* The code to be executed as the block's {@link #fini} method.
*/
public Trigger(Pre pre, Body body, Fini fini)
{
super(pre, null, null, body, fini);
}
/**
* Constructor.
*
* @param init
* The code to be executed as the block's {@link #init} method.
* @param body
* The code to be executed as the block's {@link #body} method.
* @param fini
* The code to be executed as the block's {@link #fini} method.
*/
public Trigger(Init init, Body body, Fini fini)
{
super(null, init, null, body, fini);
}
/**
* Constructor.
*
* @param pre
* The code to be executed as the block's {@link #pre} method.
* @param init
* The code to be executed as the block's {@link #init} method.
* @param body
* The code to be executed as the block's {@link #body} method.
* @param fini
* The code to be executed as the block's {@link #fini} method.
*/
public Trigger(Pre pre, Init init, Body body, Fini fini)
{
super(pre, init, null, body, fini);
}
/**
* Constructor.
*
* @param pre
* The code to be executed as the block's {@link #pre} method.
*/
public Trigger(Pre pre)
{
super(pre, null, null, null, null);
}
/**
* Constructor.
*
* @param init
* The code to be executed as the block's {@link #init} method.
*/
public Trigger(Init init)
{
super(null, init, null, null, null);
}
/**
* Constructor.
*
* @param pre
* The code to be executed as the block's {@link #pre} method.
* @param init
* The code to be executed as the block's {@link #init} method.
*/
public Trigger(Pre pre, Init init)
{
super(pre, init, null, null, null);
}
/**
* Constructor.
*
* @param fini
* The code to be executed as the block's {@link #fini} method.
*/
public Trigger(Fini fini)
{
super(null, null, null, null, fini);
}
/**
* Constructor.
*
* @param pre
* The code to be executed as the block's {@link #pre} method.
* @param fini
* The code to be executed as the block's {@link #fini} method.
*/
public Trigger(Pre pre, Fini fini)
{
super(pre, null, null, null, fini);
}
/**
* Constructor.
*
* @param init
* The code to be executed as the block's {@link #init} method.
* @param fini
* The code to be executed as the block's {@link #fini} method.
*/
public Trigger(Init init, Fini fini)
{
super(null, init, null, null, fini);
}
/**
* Constructor.
*
* @param pre
* The code to be executed as the block's {@link #pre} method.
* @param init
* The code to be executed as the block's {@link #init} method.
* @param fini
* The code to be executed as the block's {@link #fini} method.
*/
public Trigger(Pre pre, Init init, Fini fini)
{
super(pre, init, null, null, fini);
}
/**
* Sets the transaction level for the associated block of code.
* <p>
* This MUST be called before invocation of the trigger <code>init</code>
* or the trigger's <code>body</code>. Otherwise it will be ignored.
*
* @param level
* The transaction level.
*
* @return This instance. This is provided to facilitate chaining.
*/
public Trigger setLevel(TransactionType level)
{
this.level = level;
return this;
}
/**
* Primary driver method that executes the trigger's contained block
* body, managing the execution using the proper transaction manager
* scaffolding to yield Progress-compatible behavior.
*/
public void run()
{
topLevelBlock(null, null, null, level, BlockType.TRIGGER, this);
}
}