Skip to content

Instantly share code, notes, and snippets.

@adam17amo
Created April 16, 2018 00:51
Show Gist options
  • Select an option

  • Save adam17amo/a5e6a07b8950d40d3b7285c8860f7ff9 to your computer and use it in GitHub Desktop.

Select an option

Save adam17amo/a5e6a07b8950d40d3b7285c8860f7ff9 to your computer and use it in GitHub Desktop.
public virtual class TriggerHandler {
// Current context of the trigger, overridable in tests
@TestVisible
private TriggerContext context;
// Constructor
public TriggerHandler() {
this.setTriggerContext();
}
// Main method that will be called during execution
public void run() {
// Dispatch to the correct handler method
if(this.context == TriggerContext.BEFORE_INSERT) {
this.beforeInsert();
} else if(this.context == TriggerContext.BEFORE_UPDATE) {
this.beforeUpdate();
} else if(this.context == TriggerContext.BEFORE_DELETE) {
this.beforeDelete();
} else if(this.context == TriggerContext.AFTER_INSERT) {
this.afterInsert();
} else if(this.context == TriggerContext.AFTER_UPDATE) {
this.afterUpdate();
} else if(this.context == TriggerContext.AFTER_DELETE) {
this.afterDelete();
} else if(this.context == TriggerContext.AFTER_UNDELETE) {
this.afterUndelete();
}
}
@TestVisible
private void setTriggerContext() {
this.setTriggerContext(false);
}
// Determine the Trigger Context
@TestVisible
private void setTriggerContext(Boolean testMode) {
if(Trigger.isExecuting && Trigger.isBefore && Trigger.isInsert) {
this.context = TriggerContext.BEFORE_INSERT;
} else if(Trigger.isExecuting && Trigger.isBefore && Trigger.isUpdate) {
this.context = TriggerContext.BEFORE_UPDATE;
} else if(Trigger.isExecuting && Trigger.isBefore && Trigger.isDelete) {
this.context = TriggerContext.BEFORE_DELETE;
} else if(Trigger.isExecuting && Trigger.isAfter && Trigger.isInsert) {
this.context = TriggerContext.AFTER_INSERT;
} else if(Trigger.isExecuting && Trigger.isAfter && Trigger.isUpdate) {
this.context = TriggerContext.AFTER_UPDATE;
} else if(Trigger.isExecuting && Trigger.isAfter && Trigger.isDelete) {
this.context = TriggerContext.AFTER_DELETE;
} else if(Trigger.isExecuting && Trigger.isAfter && Trigger.isUndelete) {
this.context = TriggerContext.AFTER_UNDELETE;
}
}
// Context-specific methods for override
@TestVisible
protected virtual void beforeInsert(){}
@TestVisible
protected virtual void beforeUpdate(){}
@TestVisible
protected virtual void beforeDelete(){}
@TestVisible
protected virtual void afterInsert(){}
@TestVisible
protected virtual void afterUpdate(){}
@TestVisible
protected virtual void afterDelete(){}
@TestVisible
protected virtual void afterUndelete(){}
// Possible trigger contexts
@TestVisible
private enum TriggerContext {
BEFORE_INSERT, BEFORE_UPDATE, BEFORE_DELETE,
AFTER_INSERT, AFTER_UPDATE, AFTER_DELETE,
AFTER_UNDELETE
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment