org.wso2.carbon.apimgt.impl.workflow.ApplicationRegistrationWSWorkflowExecutor.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.carbon.apimgt.impl.workflow.ApplicationRegistrationWSWorkflowExecutor.java

Source

/*
 * Copyright (c) 2005-2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 * 
 * WSO2 Inc. licenses this file to you under the Apache License,
 * Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License.
 * You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.wso2.carbon.apimgt.impl.workflow;

import org.apache.axiom.om.util.AXIOMUtil;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.transport.http.HTTPConstants;
import org.apache.axis2.transport.http.HttpTransportProperties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.apimgt.api.APIManagementException;
import org.wso2.carbon.apimgt.api.WorkflowResponse;
import org.wso2.carbon.apimgt.api.model.Application;
import org.wso2.carbon.apimgt.impl.dto.ApplicationRegistrationWorkflowDTO;
import org.wso2.carbon.apimgt.impl.dto.WorkflowDTO;
import org.wso2.carbon.apimgt.impl.internal.ServiceReferenceHolder;

import javax.xml.stream.XMLStreamException;
import java.util.ArrayList;
import java.util.List;

/**
 * This is the class to call external workflow to have human interaction on
 * Application Registration process.
 */
public class ApplicationRegistrationWSWorkflowExecutor extends AbstractApplicationRegistrationWorkflowExecutor {
    private String serviceEndpoint;
    private String username;
    private char[] password;
    private String contentType;
    private static final Log log = LogFactory.getLog(ApplicationRegistrationWSWorkflowExecutor.class);

    @Override
    public WorkflowResponse execute(WorkflowDTO workflowDTO) throws WorkflowException {
        if (log.isDebugEnabled()) {
            log.debug("Executing Application registration Workflow..");
        }
        try {
            String action = WorkflowConstants.CREATE_REGISTRATION_WS_ACTION;
            ServiceClient client = getClient(action);
            String payload = "<wor:ApplicationRegistrationWorkFlowProcessRequest xmlns:wor=\"http://workflow.application.apimgt.carbon.wso2.org\">\n"
                    + "        <wor:applicationName>$1</wor:applicationName>\n"
                    + "        <wor:applicationTier>$2</wor:applicationTier>\n"
                    + "        <wor:applicationCallbackUrl>$3</wor:applicationCallbackUrl>\n"
                    + "        <wor:applicationDescription>$4</wor:applicationDescription>\n"
                    + "        <wor:tenantDomain>$5</wor:tenantDomain>\n"
                    + "        <wor:userName>$6</wor:userName>\n"
                    + "        <wor:workflowExternalRef>$7</wor:workflowExternalRef>\n"
                    + "        <wor:callBackURL>$8</wor:callBackURL>\n" + "        <wor:keyType>$9</wor:keyType>\n"
                    + "      </wor:ApplicationRegistrationWorkFlowProcessRequest>";

            ApplicationRegistrationWorkflowDTO appRegDTO = (ApplicationRegistrationWorkflowDTO) workflowDTO;
            Application application = appRegDTO.getApplication();
            String callBackURL = appRegDTO.getCallbackUrl();
            String applicationCallbackUrl = application.getCallbackUrl();
            String applicationDescription = application.getDescription();

            payload = payload.replace("$1", application.getName());
            payload = payload.replace("$2", application.getTier());
            payload = payload.replace("$3", applicationCallbackUrl != null ? applicationCallbackUrl : "?");
            payload = payload.replace("$4", applicationDescription != null ? applicationDescription : "?");
            payload = payload.replace("$5", appRegDTO.getTenantDomain());
            payload = payload.replace("$6", appRegDTO.getUserName());
            payload = payload.replace("$7", appRegDTO.getExternalWorkflowReference());
            payload = payload.replace("$8", callBackURL != null ? callBackURL : "?");
            payload = payload.replace("$9", appRegDTO.getKeyType());

            client.fireAndForget(AXIOMUtil.stringToOM(payload));
            super.execute(workflowDTO);
        } catch (AxisFault axisFault) {
            log.error("Error sending out message", axisFault);
            throw new WorkflowException("Error sending out message", axisFault);
        } catch (XMLStreamException e) {
            log.error("Error converting String to OMElement", e);
            throw new WorkflowException("Error converting String to OMElement", e);
        }
        return new GeneralWorkflowResponse();
    }

    /**
     * Complete the external process status.
     * Based on the workflow , we will update the status column of the
     * AM_APPLICATION_KEY_MAPPING table
     *
     * @param workFlowDTO
     */
    @Override
    public WorkflowResponse complete(WorkflowDTO workFlowDTO) throws WorkflowException {
        workFlowDTO.setUpdatedTime(System.currentTimeMillis());
        super.complete(workFlowDTO);
        log.info("Application Registration [Complete] Workflow Invoked. Workflow ID : "
                + workFlowDTO.getExternalWorkflowReference() + "Workflow State : " + workFlowDTO.getStatus());

        if (WorkflowStatus.APPROVED.equals(workFlowDTO.getStatus())) {
            try {
                generateKeysForApplication((ApplicationRegistrationWorkflowDTO) workFlowDTO);
            } catch (APIManagementException e) {
                String msg = "Error occurred when updating the status of the Application Registration process";
                log.error(msg, e);
                throw new WorkflowException(msg, e);
            }
        }
        return new GeneralWorkflowResponse();
    }

    @Override
    public List<WorkflowDTO> getWorkflowDetails(String workflowStatus) throws WorkflowException {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void cleanUpPendingTask(String workflowExtRef) throws WorkflowException {
        super.cleanUpPendingTask(workflowExtRef);
        String errorMsg = null;

        try {
            String action = WorkflowConstants.DELETE_REGISTRATION_WS_ACTION;
            ServiceClient client = getClient(action);
            String payload = "  <p:CancelApplicationRegistrationWorkflowProcessRequest "
                    + "   xmlns:p=\"http://workflow.application.apimgt.carbon.wso2.org\">\n"
                    + "      <p:workflowRef>" + workflowExtRef + "</p:workflowRef>\n"
                    + "   </p:CancelApplicationRegistrationWorkflowProcessRequest>";

            client.fireAndForget(AXIOMUtil.stringToOM(payload));
        } catch (AxisFault axisFault) {
            errorMsg = "Error sending out cancel pending registration approval process message. Cause: "
                    + axisFault.getMessage();
            throw new WorkflowException(errorMsg, axisFault);
        } catch (XMLStreamException e) {
            errorMsg = "Error converting registration cleanup String to OMElement. Cause: " + e.getMessage();
            throw new WorkflowException(errorMsg, e);
        }
    }

    /**
     * Retrieves configured ServiceClient for communication with external services
     *
     * @param action web service action to use
     * @return configured service client
     * @throws AxisFault
     */
    public ServiceClient getClient(String action) throws AxisFault {
        ServiceClient client = new ServiceClient(
                ServiceReferenceHolder.getInstance().getContextService().getClientConfigContext(), null);
        Options options = new Options();
        options.setAction(action);
        options.setTo(new EndpointReference(serviceEndpoint));

        if (contentType != null) {
            options.setProperty(Constants.Configuration.MESSAGE_TYPE, contentType);
        } else {
            options.setProperty(Constants.Configuration.MESSAGE_TYPE, HTTPConstants.MEDIA_TYPE_TEXT_XML);
        }

        HttpTransportProperties.Authenticator auth = new HttpTransportProperties.Authenticator();

        // Assumes authentication is required if username and password is given
        if (username != null && !username.isEmpty() && password != null && password.length != 0) {
            auth.setUsername(username);
            auth.setPassword(String.valueOf(password));
            auth.setPreemptiveAuthentication(true);
            List<String> authSchemes = new ArrayList<String>();
            authSchemes.add(HttpTransportProperties.Authenticator.BASIC);
            auth.setAuthSchemes(authSchemes);

            if (contentType == null) {
                options.setProperty(Constants.Configuration.MESSAGE_TYPE, HTTPConstants.MEDIA_TYPE_TEXT_XML);
            }
            options.setProperty(org.apache.axis2.transport.http.HTTPConstants.AUTHENTICATE, auth);
            options.setManageSession(true);
        }
        client.setOptions(options);

        return client;
    }

    public String getServiceEndpoint() {
        return serviceEndpoint;
    }

    public void setServiceEndpoint(String serviceEndpoint) {
        this.serviceEndpoint = serviceEndpoint;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public char[] getPassword() {
        return password;
    }

    public void setPassword(char[] password) {
        this.password = password;
    }

    public String getContentType() {
        return contentType;
    }

    public void setContentType(String contentType) {
        this.contentType = contentType;
    }

}