Search in sources :

Example 1 with WorkflowExecutorResult

use of org.wso2.carbon.identity.workflow.mgt.WorkflowExecutorResult in project carbon-identity-framework by wso2.

the class AbstractWorkflowRequestHandler method startWorkFlow.

/**
 * Start a new workflow.
 *
 * @param wfParams    Parameters related to workflow
 * @param nonWfParams Other parameters
 * @param uuid        Unique ID of request
 * @return
 * @throws WorkflowException
 */
public WorkflowExecutorResult startWorkFlow(Map<String, Object> wfParams, Map<String, Object> nonWfParams, String uuid) throws WorkflowException {
    if (isWorkflowCompleted()) {
        return new WorkflowExecutorResult(ExecutorResultState.COMPLETED);
    }
    if (!isAssociated()) {
        return new WorkflowExecutorResult(ExecutorResultState.NO_ASSOCIATION);
    }
    WorkflowRequest workFlowRequest = new WorkflowRequest();
    List<RequestParameter> parameters = new ArrayList<RequestParameter>(wfParams.size() + nonWfParams.size() + 1);
    for (Map.Entry<String, Object> paramEntry : wfParams.entrySet()) {
        parameters.add(getParameter(paramEntry.getKey(), paramEntry.getValue(), true));
    }
    for (Map.Entry<String, Object> paramEntry : nonWfParams.entrySet()) {
        parameters.add(getParameter(paramEntry.getKey(), paramEntry.getValue(), false));
    }
    RequestParameter uuidParameter = new RequestParameter();
    uuidParameter.setName(WFConstant.REQUEST_ID);
    uuidParameter.setValue(uuid);
    uuidParameter.setRequiredInWorkflow(true);
    uuidParameter.setValueType(WorkflowDataType.STRING_TYPE);
    parameters.add(uuidParameter);
    workFlowRequest.setRequestParameters(parameters);
    workFlowRequest.setTenantId(CarbonContext.getThreadLocalCarbonContext().getTenantId());
    workFlowRequest.setUuid(uuid);
    engageWorkflow(workFlowRequest);
    WorkflowExecutorResult workflowExecutorResult = WorkFlowExecutorManager.getInstance().executeWorkflow(workFlowRequest);
    if (workflowExecutorResult.getExecutorResultState() == ExecutorResultState.FAILED) {
        throw new WorkflowException(workflowExecutorResult.getMessage());
    }
    return workflowExecutorResult;
}
Also used : WorkflowExecutorResult(org.wso2.carbon.identity.workflow.mgt.WorkflowExecutorResult) RequestParameter(org.wso2.carbon.identity.workflow.mgt.bean.RequestParameter) InternalWorkflowException(org.wso2.carbon.identity.workflow.mgt.exception.InternalWorkflowException) WorkflowException(org.wso2.carbon.identity.workflow.mgt.exception.WorkflowException) ArrayList(java.util.ArrayList) HashMap(java.util.HashMap) Map(java.util.Map) WorkflowRequest(org.wso2.carbon.identity.workflow.mgt.dto.WorkflowRequest)

Example 2 with WorkflowExecutorResult

use of org.wso2.carbon.identity.workflow.mgt.WorkflowExecutorResult in project carbon-identity-framework by wso2.

the class WorkFlowExecutorManager method executeWorkflow.

/**
 * Called when initiate a request that can be engaged with a workflow. Here it determine if operation has engaged
 * with a workflow or not. If workflows engaged this will deploy communicate with relevant workflow engine and
 * return false which will stop continuation of operation. Otherwise this will return true.
 *
 * @param workFlowRequest Workflow request object with request attributes.
 * @return
 * @throws WorkflowException
 */
public WorkflowExecutorResult executeWorkflow(WorkflowRequest workFlowRequest) throws WorkflowException {
    WorkflowRequestAssociationDAO workflowRequestAssociationDAO = new WorkflowRequestAssociationDAO();
    List<WorkflowExecutorManagerListener> workflowListenerList = WorkflowServiceDataHolder.getInstance().getExecutorListenerList();
    for (WorkflowExecutorManagerListener workflowListener : workflowListenerList) {
        if (workflowListener.isEnable()) {
            workflowListener.doPreExecuteWorkflow(workFlowRequest);
        }
    }
    if (StringUtils.isBlank(workFlowRequest.getUuid())) {
        workFlowRequest.setUuid(UUID.randomUUID().toString());
    }
    OMElement xmlRequest = WorkflowRequestBuilder.buildXMLRequest(workFlowRequest);
    WorkflowRequestAssociationDAO requestAssociationDAO = new WorkflowRequestAssociationDAO();
    WorkflowDAO workflowDAO = new WorkflowDAO();
    List<WorkflowAssociation> associations = requestAssociationDAO.getWorkflowAssociationsForRequest(workFlowRequest.getEventType(), workFlowRequest.getTenantId());
    if (CollectionUtils.isEmpty(associations)) {
        return new WorkflowExecutorResult(ExecutorResultState.NO_ASSOCIATION);
    }
    boolean workflowEngaged = false;
    boolean requestSaved = false;
    for (WorkflowAssociation association : associations) {
        try {
            AXIOMXPath axiomxPath = new AXIOMXPath(association.getAssociationCondition());
            if (axiomxPath.booleanValueOf(xmlRequest)) {
                workflowEngaged = true;
                if (!requestSaved) {
                    WorkflowRequestDAO requestDAO = new WorkflowRequestDAO();
                    int tenant = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
                    String currentUser = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
                    requestDAO.addWorkflowEntry(workFlowRequest, currentUser, tenant);
                    requestSaved = true;
                }
                String relationshipId = UUID.randomUUID().toString();
                WorkflowRequest requestToSend = workFlowRequest.clone();
                requestToSend.setUuid(relationshipId);
                Workflow workflow = workflowDAO.getWorkflow(association.getWorkflowId());
                AbstractWorkflow templateImplementation = WorkflowServiceDataHolder.getInstance().getWorkflowImpls().get(workflow.getTemplateId()).get(workflow.getWorkflowImplId());
                List<Parameter> parameterList = workflowDAO.getWorkflowParams(association.getWorkflowId());
                templateImplementation.execute(requestToSend, parameterList);
                workflowRequestAssociationDAO.addNewRelationship(relationshipId, association.getWorkflowId(), workFlowRequest.getUuid(), WorkflowRequestStatus.PENDING.toString(), workFlowRequest.getTenantId());
            }
        } catch (JaxenException e) {
            String errorMsg = "Error when executing the xpath expression:" + association.getAssociationCondition() + " , on " + xmlRequest;
            log.error(errorMsg, e);
            return new WorkflowExecutorResult(ExecutorResultState.FAILED, errorMsg);
        } catch (CloneNotSupportedException e) {
            String errorMsg = "Error while cloning workflowRequest object at executor manager.";
            log.error(errorMsg, e);
            return new WorkflowExecutorResult(ExecutorResultState.FAILED, errorMsg);
        }
    }
    if (!workflowEngaged) {
        // handleCallback(workFlowRequest, WorkflowRequestStatus.SKIPPED.toString(), null, "");
        return new WorkflowExecutorResult(ExecutorResultState.CONDITION_FAILED);
    }
    WorkflowExecutorResult finalResult = new WorkflowExecutorResult(ExecutorResultState.STARTED_ASSOCIATION);
    for (WorkflowExecutorManagerListener workflowListener : workflowListenerList) {
        if (workflowListener.isEnable()) {
            workflowListener.doPostExecuteWorkflow(workFlowRequest, finalResult);
        }
    }
    return finalResult;
}
Also used : WorkflowRequestDAO(org.wso2.carbon.identity.workflow.mgt.dao.WorkflowRequestDAO) AbstractWorkflow(org.wso2.carbon.identity.workflow.mgt.workflow.AbstractWorkflow) Workflow(org.wso2.carbon.identity.workflow.mgt.bean.Workflow) OMElement(org.apache.axiom.om.OMElement) AbstractWorkflow(org.wso2.carbon.identity.workflow.mgt.workflow.AbstractWorkflow) WorkflowDAO(org.wso2.carbon.identity.workflow.mgt.dao.WorkflowDAO) WorkflowRequestAssociationDAO(org.wso2.carbon.identity.workflow.mgt.dao.WorkflowRequestAssociationDAO) JaxenException(org.jaxen.JaxenException) WorkflowExecutorManagerListener(org.wso2.carbon.identity.workflow.mgt.listener.WorkflowExecutorManagerListener) Parameter(org.wso2.carbon.identity.workflow.mgt.bean.Parameter) WorkflowAssociation(org.wso2.carbon.identity.workflow.mgt.bean.WorkflowAssociation) AXIOMXPath(org.apache.axiom.om.xpath.AXIOMXPath) WorkflowRequest(org.wso2.carbon.identity.workflow.mgt.dto.WorkflowRequest)

Aggregations

WorkflowRequest (org.wso2.carbon.identity.workflow.mgt.dto.WorkflowRequest)2 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1 OMElement (org.apache.axiom.om.OMElement)1 AXIOMXPath (org.apache.axiom.om.xpath.AXIOMXPath)1 JaxenException (org.jaxen.JaxenException)1 WorkflowExecutorResult (org.wso2.carbon.identity.workflow.mgt.WorkflowExecutorResult)1 Parameter (org.wso2.carbon.identity.workflow.mgt.bean.Parameter)1 RequestParameter (org.wso2.carbon.identity.workflow.mgt.bean.RequestParameter)1 Workflow (org.wso2.carbon.identity.workflow.mgt.bean.Workflow)1 WorkflowAssociation (org.wso2.carbon.identity.workflow.mgt.bean.WorkflowAssociation)1 WorkflowDAO (org.wso2.carbon.identity.workflow.mgt.dao.WorkflowDAO)1 WorkflowRequestAssociationDAO (org.wso2.carbon.identity.workflow.mgt.dao.WorkflowRequestAssociationDAO)1 WorkflowRequestDAO (org.wso2.carbon.identity.workflow.mgt.dao.WorkflowRequestDAO)1 InternalWorkflowException (org.wso2.carbon.identity.workflow.mgt.exception.InternalWorkflowException)1 WorkflowException (org.wso2.carbon.identity.workflow.mgt.exception.WorkflowException)1 WorkflowExecutorManagerListener (org.wso2.carbon.identity.workflow.mgt.listener.WorkflowExecutorManagerListener)1 AbstractWorkflow (org.wso2.carbon.identity.workflow.mgt.workflow.AbstractWorkflow)1