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)])