Sample Preprocessor script

This is a sample preprocessor script

import com.workbrain2.clocks.publ.api.ClocksPublicServiceAccess
import com.workbrain2.clocks.publ.api.ReaderGroupPublService
import com.workbrain2.clocks.publ.api.domain.ReaderGroupPubl
import com.workbrain2.ion.publ.api.bod.BodPreprocessorPublService
import com.workbrain2.ion.publ.api.bod.BodProcessorRetryException
import com.workbrain2.ion.publ.api.bod.BodProcessorServiceAccess
import com.workbrain2.ion.publ.api.domain.HRPersonnelEmployeeReaderGroupsPubl
import com.workbrain2.ion.publ.api.domain.HRPersonnelEmployeeReaderGroupsPublBuilder
import com.workbrain2.ion.publ.api.domain.HRPersonnelUpdateEmployeePubl
import com.workbrain2.ion.publ.api.domain.HRPersonnelUpdatePendingEmployeePubl
import com.workbrain2.ion.publ.api.bod.BodProcessorContext
import com.workbrain2.ion.publ.api.bod.BodPreprocessorScriptable
import com.workbrain2.ta.publ.api.EmployeePublService
import com.workbrain2.ta.publ.api.JobPublService
import com.workbrain2.ta.publ.api.TAPublicServiceAccess

// This is a tutorial for implementing custom BOD preprocessors.
// The preprocessor modifies core processor objects
// before they are processed by the core BOD processor.
class BodPreprocessorMultipleProcessorsSamplea extends BodPreprocessorScriptable {

    ReaderGroupPublService readerGroupPublService = ClocksPublicServiceAccess.getReaderGroupService()
    BodPreprocessorPublService bodPreprocessorService = BodProcessorServiceAccess.getBodPreprocessorService()
    EmployeePublService employeeService = TAPublicServiceAccess.getEmployeePublService();
    JobPublService jobService = TAPublicServiceAccess.getJobService()

    Object preprocessBodInScript(mappedObject, BodProcessorContext context) {
        // mappedObject - Contains XML data already parsed by core processor
        // Only certain BOD processors support preprocessing. When supported, cast mappedObject into the appropriate class to read or update it.
        // If not supported, this script will still run but mappedObject cannot be read.

        // This preprocessor demonstrates preprocessing for several BOD processors together,
        // you may also use multiple preprocessors instead

        // This username check demonstrates how a preprocessor can only apply to a particular user/employee if necessary
        if (mappedObject instanceof HRPersonnelUpdatePendingEmployeePubl && mappedObject.username == "70042819") {
            // HRPersonnelUpdatePendingEmployeePubl - This is preprocessing the HRPersonnel employee basic processor's update pending employee scenario,
            // which occurs when a pending/dummy employee turns into a full employee for the first time

            // Use builder to modify the immutable mapped object
            def updateBuilder = bodPreprocessorService.getHRPersonnelUpdatePendingEmployeePublBuilder(mappedObject)
            // Prepare a replacement list for employee overrides
            List overrides = new ArrayList(mappedObject.overrides)
            // Prepare a new override
            def fieldsBuilder = bodPreprocessorService.getHRPersonnelEmployeeOverridePublBuilder()
            fieldsBuilder.setFirstName("Isabel")
            fieldsBuilder.setLastName("Custom Last Name")
            overrides.add(fieldsBuilder.build())
            // Replace the original override list
            updateBuilder.setOverrides(overrides)
            return updateBuilder.build()
        } else if (mappedObject instanceof HRPersonnelUpdateEmployeePubl && mappedObject.existingEmployee == "70042819") {
            // HRPersonnelUpdateEmployeePubl - This is preprocessing the HRPersonnel employee basic processor's update employee scenario,
            // which occurs after the update pending employee scenario above

            def employee = employeeService.getEmployeeByName("70042819")
            def job = jobService.getJobByName("70042819-JOB")
            if (job == null) {
                // Block employee basic processor from running unless this job is found
                throw new BodProcessorRetryException("JobRetry", "Waiting for job to be added", "Timed out waiting for job 70042819-JOB to be found")
            }
            // Return null means returning the original mapped object without any edits
            return null
        } else if (mappedObject instanceof HRPersonnelEmployeeReaderGroupsPubl && mappedObject.empName == "70042819") {
            // HRPersonnelEmployeeReaderGroupsPubl - This is preprocessing the HRPersonnel reader group processor

            ReaderGroupPubl readerGroup = readerGroupPublService.getReaderGroupByName("VC_GROUP2")
            if (readerGroup == null) {
                throw new BodProcessorRetryException("ReaderRetry", "Waiting for reader group VC_GROUP2 to be added", "Timed out waiting for reader group VC_GROUP2 to be found")
            }
            // Use builder to modify the immutable mapped object
            HRPersonnelEmployeeReaderGroupsPublBuilder employeeReaderGroupBuilder = bodPreprocessorService.getHRPersonnelEmployeeReaderGroupsPublBuilder(mappedObject)
            // Prepare a replacement list for reader group IDs
            List<Long> groups = new ArrayList<>(mappedObject.readerGroupIdsInBod);
            // Include VC_GROUP2
            groups.add(readerGroup.id)
            employeeReaderGroupBuilder.setReaderGroupIdsInBod(groups)
            return employeeReaderGroupBuilder.build()
        }
        // If this preprocessor is used on an unsupported processor, no preprocessing will happen
        // because returning null will cause the original mapped object to be returned
        return null
    }
}