Sample Processor script
This is a sample processor script:
import com.workbrain2.ion.publ.api.bod.BodLoggerPubl
import com.workbrain2.ion.publ.api.bod.BodProcessorContext
import com.workbrain2.ion.publ.api.bod.BodProcessorException
import com.workbrain2.ion.publ.api.bod.BodProcessorRetryException
import com.workbrain2.ion.publ.api.bod.BodProcessorScriptable
import com.workbrain2.ion.publ.api.bod.BodChangePubl
import com.workbrain2.ion.publ.api.bod.BodProcessorSkipBodException
import com.workbrain2.ion.publ.api.bod.BodPubl
import com.workbrain2.platform.publ.api.WorkbrainUserPublService
import com.workbrain2.platform.publ.api.domain.WorkbrainUserPubl
import com.workbrain2.platform.publ.api.SystemPublicServiceAccess
import com.workbrain2.platform.publ.api.exceptions.RecordNotFoundPublException
// This is a tutorial for implementing a custom BOD processor which sets a user flag to Y
class BodProcessorUpdateUserSample extends BodProcessorScriptable {
WorkbrainUserPublService userService = SystemPublicServiceAccess.getWorkbrainUserPublService()
// Use any available publ API services
@Override
void processBodInScript(BodProcessorContext context) {
BodPubl bod = context.getBodPubl() // Get access to the BOD data
if (bod.bodVerb != "Sync") throw new BodProcessorSkipBodException("Skipping this BOD, only handling Sync verbs")
BodLoggerPubl logger = context.getBodLogger()
// Run XPaths to find information in the BOD XML
String distinguishedName = context.findXPath(bod.getXmlDocument(), "//SecurityUserMaster/DistinguishedName")
String creationDateTime = context.toDateOrThrow(context.findXPath(bod.getXmlDocument(), "//CreationDateTime"))
logger.warn("Testing warning: Creation date time is $creationDateTime", null)
// Set this BOD to error status, send an error BOD
if (distinguishedName == null) throw new BodProcessorException("Sample-MissingDistinguished", "Missing distinguished name in BOD")
// Print the user's roles to demonstrate handling multiple XPath results and logging
// Role XML example:
// <SecurityRole>
// <ID lid="lid://infor.wfm.OnPremInstanceId-Placeholder">WFM-Employee</ID>
// <Description>Users with this role have access to Portal</Description>
// </SecurityRole>
org.w3c.dom.NodeList securityRoleNodes = context.findXPathAsNodeList(bod.getXmlDocument(), "//SecurityRole")
for (int i = 0; i < securityRoleNodes.getLength(); i++) {
def securityRoleNode = context.createDocumentFromNode(securityRoleNodes.item(i));
def desc = context.findXPath(securityRoleNode, "*/Description")
logger.info("Found role: " + desc, null)
}
// Remember the changes for logging purposes, will log to BOD Auditing logs
def changes = [:] as Map<String, String>
WorkbrainUserPubl user
try {
user = userService.getWorkbrainUserByName(distinguishedName)
} catch (RecordNotFoundPublException e) {
user = null
}
// One strategy, if appropriate, is to keep retrying until something exists in the database
if (user == null) throw new BodProcessorRetryException("Sample-UserNotFound", "Retrying BOD waiting for user to be found", "Timed out waiting for user to be found")
// Apply changes with publ services
user.setFlag1("Y")
changes["Flag1"] = "Y"
userService.update(user)
context.setResults([new BodChangePubl("Updated user $distinguishedName", changes)])