class AppcOrchestratorPreProcessor {

    public void buildAppcTaskRequest(BuildingBlockExecution execution, String actionName) {
        try {
            Action action = Action.valueOf(actionName);
            ApplicationControllerTaskRequest appcTaskRequest = new ApplicationControllerTaskRequest();
            appcTaskRequest.setAction(action);
            GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
            GenericVnf vnf = null;
            try {
                vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
            } catch (BBObjectNotFoundException e) {
                exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "No valid VNF exists");
            }
            String vnfId = null;
            String vnfName = null;
            String vnfType = null;
            String vnfHostIpAddress = null;

            if (vnf != null) {
                vnfId = vnf.getVnfId();
                vnfName = vnf.getVnfName();
                vnfType = vnf.getVnfType();
                vnfHostIpAddress = vnf.getIpv4OamAddress();
            }
            String msoRequestId = gBBInput.getRequestContext().getMsoRequestId();

            String aicIdentity = execution.getVariable("aicIdentity");
            String identityUrl = execution.getVariable("identityUrl");
            appcTaskRequest.setIdentityUrl(identityUrl);

            String requestorId = gBBInput.getRequestContext().getRequestorId();
            appcTaskRequest.setRequestorId(requestorId);

            if (gBBInput.getRequestContext().getRequestParameters() != null) {
                String payload = gBBInput.getRequestContext().getRequestParameters().getPayload();
                if (payload == null) {
                    payload = "";
                }
                String existingSoftwareVersion = JsonUtils.getJsonValue(payload, "existing_software_version");
                appcTaskRequest.setExistingSoftwareVersion(existingSoftwareVersion);
                String newSoftwareVersion = JsonUtils.getJsonValue(payload, "new_software_version");
                appcTaskRequest.setNewSoftwareVersion(newSoftwareVersion);
                String operationsTimeout = JsonUtils.getJsonValue(payload, "operations_timeout");
                appcTaskRequest.setOperationsTimeout(operationsTimeout);

                Map<String, String> configMap = new HashMap<>();
                ObjectMapper objectMapper = new ObjectMapper();
                String configParamsStr = JsonUtils.getJsonValue(payload, "configuration_parameters");
                if (configParamsStr != null) {
                    configMap =
                            objectMapper.readValue(configParamsStr, new TypeReference<HashMap<String, String>>() {});
                }
                appcTaskRequest.setConfigParams(configMap);
            }
            ControllerSelectionReference controllerSelectionReference = catalogDbClient
                    .getControllerSelectionReferenceByVnfTypeAndActionCategory(vnfType, action.toString());
            String controllerType = null;
            if (controllerSelectionReference != null) {
                controllerType = controllerSelectionReference.getControllerName();
            } else {
                controllerType = CONTROLLER_TYPE_DEFAULT;
            }
            appcTaskRequest.setControllerType(controllerType);

            execution.setVariable("vmIdList", null);
            execution.setVariable("vserverIdList", null);
            execution.setVariable("vmIndex", 0);
            execution.setVariable("vmIdListSize", 0);

            String vfModuleId = null;
            VfModule vfModule = null;
            try {
                vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID);
            } catch (BBObjectNotFoundException e) {
            }
            if (vfModule != null) {
                vfModuleId = vfModule.getVfModuleId();
            }
            if (action.equals(Action.Snapshot)) {
                try {
                    getVserversForAppc(execution, vnf);
                } catch (Exception e) {
                    logger.warn("Unable to retrieve vservers for vnf: " + vnfId);
                }
            }

            ApplicationControllerVnf applicationControllerVnf = new ApplicationControllerVnf();
            applicationControllerVnf.setVnfHostIpAddress(vnfHostIpAddress);
            applicationControllerVnf.setVnfId(vnfId);
            applicationControllerVnf.setVnfName(vnfName);
            appcTaskRequest.setApplicationControllerVnf(applicationControllerVnf);

            verifyApplicationControllerTaskRequest(execution, appcTaskRequest);

            execution.setVariable("appcOrchestratorRequest", appcTaskRequest);
            logger.debug("SET APPC ORCHESTRATOR REQUEST");
        } catch (Exception e) {
            logger.error("Error building ApplicationControllerTaskRequest Object", e.getMessage());
            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, e);
        }
    }

}