org.wso2.carbon.inbound.ui.internal.InboundManagementClient.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.carbon.inbound.ui.internal.InboundManagementClient.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.inbound.ui.internal;

import java.io.IOException;
import java.io.InputStream;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.regex.Pattern;

import javax.servlet.ServletConfig;
import javax.servlet.http.HttpSession;

import org.apache.axis2.AxisFault;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.CarbonConstants;
import org.wso2.carbon.inbound.stub.InboundAdminInboundManagementException;
import org.wso2.carbon.inbound.stub.InboundAdminStub;
import org.wso2.carbon.inbound.stub.types.carbon.InboundEndpointDTO;
import org.wso2.carbon.inbound.stub.types.carbon.ParameterDTO;
import org.wso2.carbon.ui.CarbonUIUtil;
import org.wso2.carbon.utils.ServerConstants;

public class InboundManagementClient {

    private static final Log log = LogFactory.getLog(InboundManagementClient.class);

    private InboundAdminStub stub;

    private Properties prop = null;

    private InboundManagementClient(String cookie, String backendServerURL, ConfigurationContext configCtx)
            throws AxisFault {

        String serviceURL = backendServerURL + "InboundAdmin";
        stub = new InboundAdminStub(configCtx, serviceURL);
        ServiceClient client = stub._getServiceClient();
        Options option = client.getOptions();
        option.setManageSession(true);
        option.setProperty(org.apache.axis2.transport.http.HTTPConstants.COOKIE_STRING, cookie);
    }

    private void loadProperties() {
        if (prop == null) {
            prop = new Properties();
            InputStream is = getClass().getClassLoader().getResourceAsStream("/config/inbound.properties");
            if (is != null) {
                try {
                    prop.load(is);
                } catch (IOException e) {
                    log.error("Unable to load properties.", e);
                }
            }
        }
    }

    public static InboundManagementClient getInstance(ServletConfig config, HttpSession session) throws AxisFault {

        String backendServerURL = CarbonUIUtil.getServerURL(config.getServletContext(), session);
        ConfigurationContext configContext = (ConfigurationContext) config.getServletContext()
                .getAttribute(CarbonConstants.CONFIGURATION_CONTEXT);

        String cookie = (String) session.getAttribute(ServerConstants.ADMIN_SERVICE_COOKIE);
        return new InboundManagementClient(cookie, backendServerURL, configContext);
    }

    public List<InboundDescription> getAllInboundDescriptions() throws Exception {

        InboundEndpointDTO[] inboundEndpointDTOs = stub.getAllInboundEndpointNames();
        if (log.isDebugEnabled()) {
            log.debug("All Inbound configurations :" + inboundEndpointDTOs);
        }
        List<InboundDescription> descriptions = new ArrayList<InboundDescription>();
        if (inboundEndpointDTOs == null || inboundEndpointDTOs.length == 0) {
            return descriptions;
        }

        for (InboundEndpointDTO inboundEndpointDTO : inboundEndpointDTOs) {
            InboundDescription inboundDescription = new InboundDescription(inboundEndpointDTO.getName());
            if (inboundEndpointDTO.getArtifactContainerName() != null) {
                inboundDescription.setArtifactContainerName(inboundEndpointDTO.getArtifactContainerName());
                inboundDescription.setIsEdited(inboundEndpointDTO.getIsEdited());
            }
            inboundDescription.setStatisticsEnable(inboundEndpointDTO.getStatisticsEnable());
            inboundDescription.setTracingEnable(inboundEndpointDTO.getTracingEnable());
            descriptions.add(inboundDescription);
        }
        if (log.isDebugEnabled()) {
            log.debug("All Inbound Descriptions :" + descriptions);
        }
        return descriptions;
    }

    public List<String> getDefaultParameters(String strType) {
        List<String> rtnList = new ArrayList<String>();

        if (!strType.equals(InboundClientConstants.TYPE_CLASS)) {
            rtnList.addAll(getList(strType, true));
        }
        return rtnList;
    }

    public List<String> getAdvParameters(String strType) {
        List<String> rtnList = new ArrayList<String>();
        if (!strType.equals(InboundClientConstants.TYPE_CLASS)) {
            rtnList.addAll(getList(strType, false));
        }
        return rtnList;
    }

    public boolean addInboundEndpoint(String name, String sequence, String onError, String protocol,
            String classImpl, String suspended, List<ParamDTO> lParameters) throws Exception {
        try {
            lParameters = validateParameterList(lParameters);
            ParameterDTO[] parameterDTOs = new ParameterDTO[lParameters.size()];
            int i = 0;
            for (ParamDTO parameter : lParameters) {
                ParameterDTO parameterDTO = new ParameterDTO();
                parameterDTO.setName(parameter.getName());
                String strValue = parameter.getValue();
                if (strValue != null && strValue.startsWith(InboundDescription.REGISTRY_KEY_PREFIX)) {
                    parameterDTO.setKey(
                            strValue.replaceFirst(Pattern.quote(InboundDescription.REGISTRY_KEY_PREFIX), ""));
                }
                parameterDTO.setValue(strValue);
                parameterDTOs[i++] = parameterDTO;
            }
            if (canAdd(name, protocol, parameterDTOs, true)) {
                stub.addInboundEndpoint(name, sequence, onError, protocol, classImpl, suspended, parameterDTOs);
                return true;
            } else {
                log.warn("Cannot add Inbound endpoint " + name + " may be duplicate inbound already exists");
                return false;
            }
        } catch (Exception e) {
            log.error(e);
            throw e;
        }
    }

    private List<String> getList(String strProtocol, boolean mandatory) {
        List<String> rtnList = new ArrayList<String>();
        loadProperties();
        if (prop != null) {
            String strKey = strProtocol;
            if (mandatory) {
                strKey += ".mandatory";
            } else {
                strKey += ".optional";
            }
            String strLength = prop.getProperty(strKey);
            Integer iLength = null;
            if (strLength != null) {
                try {
                    iLength = Integer.parseInt(strLength);
                } catch (Exception e) {
                    iLength = null;
                }
            }
            if (iLength != null) {
                for (int i = 1; i <= iLength; i++) {
                    String tmpString = strKey + "." + i;
                    String strVal = prop.getProperty(tmpString);
                    if (strVal != null) {
                        if ((strProtocol.equals(InboundClientConstants.TYPE_KAFKA)
                                && ((mandatory && !strVal.contains("highlevel.") && !strVal.contains("simple.")
                                        && !strVal.contains("filter.from ~:~ ")) || !mandatory))
                                || !strProtocol.equals(InboundClientConstants.TYPE_KAFKA)) {
                            rtnList.add(strVal);
                        }
                    }
                }
            }
        }
        return rtnList;
    }

    public boolean removeInboundEndpoint(String name) throws Exception {
        try {
            stub.removeInboundEndpoint(name);
            return true;
        } catch (Exception e) {
            log.error(e);
            return false;
        }
    }

    /**
     * We can add an endpoint on following criteria:
     * - Protocol can be polling or listener:
     *      - If two endpoints have the same name do not allow.
     * - If protocol is listener:
     *      - If two endpoints have same protocol do no allow.
     * these.
     * @param name
     * @param protocol
     * @param parameterDTOs
     * @param addMode Use when new endpoint is being added (not update).
     * @return boolean on whether endpoint can be added.
     */
    private boolean canAdd(String name, String protocol, ParameterDTO[] parameterDTOs, boolean addMode) {
        try {
            String port = null;
            if (protocol != null && (isListener(protocol))) {
                for (ParameterDTO paramDTO : parameterDTOs) {
                    if (isListenerPortParam(paramDTO.getName())) {
                        Integer.parseInt(paramDTO.getValue());
                    }
                }
            }

            InboundEndpointDTO[] inboundEndpointDTOs = stub.getAllInboundEndpointNames();
            if (inboundEndpointDTOs != null) {
                for (InboundEndpointDTO inboundEndpointDTO : inboundEndpointDTOs) {
                    if (addMode && inboundEndpointDTO.getName().equals(name)) { // if two names are same, we can't add.
                        return false;
                    }

                    if (!addMode && inboundEndpointDTO.getName().equals(name)
                            && inboundEndpointDTO.getProtocol() != null
                            && inboundEndpointDTO.getProtocol().equals(protocol)) { // an update on existing
                        return true;
                    }

                    if (protocol != null && isListener(protocol)) { // if listener, only allow if no other endpoint has port in use
                        ParameterDTO[] existingParameterDTOs = inboundEndpointDTO.getParameters();
                        for (ParameterDTO parameterDTO : existingParameterDTOs) {
                            if (isListenerPortParam(parameterDTO.getName())) {
                                port = parameterDTO.getValue();
                                if (isListenerPortInUse(port, parameterDTOs)) {
                                    log.warn("Port " + port
                                            + " already in use by another endpoint. Inbound endpoint " + name
                                            + " deployment failed");
                                    return false;
                                }
                            }
                        }

                        return true;
                    }
                }
            }

            return true;
        } catch (Exception e) {
            log.error("Error occured while validating the inbound endpoint.", e);
            return false;
        }
    }

    private boolean isListenerPortInUse(String port, ParameterDTO[] parameterDTOs) {
        for (ParameterDTO parameterDTO : parameterDTOs) {
            if (isListenerPortParam(parameterDTO.getName()) && parameterDTO.getValue().equals(port)) {
                return true;
            }
        }

        return false;
    }

    private boolean isListener(String protocolName) {
        for (String listener : InboundClientConstants.LISTENER_TYPES) {
            if (protocolName.equals(listener)) {
                return true;
            }
        }

        return false;
    }

    private boolean isListenerPortParam(String portParam) {
        for (String listenerPortParam : InboundClientConstants.LISTENER_PORT_PARAMS) {
            if (portParam.equals(listenerPortParam)) {
                return true;
            }
        }

        return false;
    }

    public InboundDescription getInboundDescription(String name) {
        try {
            InboundEndpointDTO inboundEndpointDTO = stub.getInboundEndpointbyName(name);
            return new InboundDescription(inboundEndpointDTO);
        } catch (Exception e) {
            log.error(e);
        }
        return null;
    }

    public boolean updteInboundEndpoint(String name, String sequence, String onError, String protocol,
            String classImpl, String suspended, List<ParamDTO> lParameters) throws Exception {
        try {
            lParameters = validateParameterList(lParameters);
            ParameterDTO[] parameterDTOs = new ParameterDTO[lParameters.size()];
            int i = 0;
            for (ParamDTO parameter : lParameters) {
                ParameterDTO parameterDTO = new ParameterDTO();
                parameterDTO.setName(parameter.getName());
                String strValue = parameter.getValue();
                if (strValue != null && strValue.startsWith(InboundDescription.REGISTRY_KEY_PREFIX)) {
                    parameterDTO.setKey(
                            strValue.replaceFirst(Pattern.quote(InboundDescription.REGISTRY_KEY_PREFIX), ""));
                }
                parameterDTO.setValue(strValue);
                parameterDTOs[i++] = parameterDTO;
            }

            if (canAdd(name, protocol, parameterDTOs, false)) {
                stub.updateInboundEndpoint(name, sequence, onError, protocol, classImpl, suspended, parameterDTOs);
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            log.error(e);
            throw e;
        }
    }

    private List<ParamDTO> validateParameterList(List<ParamDTO> paramDTOList) {
        List<ParamDTO> paramDTOs = new ArrayList<ParamDTO>();
        for (ParamDTO paramDTO : paramDTOList) {
            if (paramDTO.getValue() != null && paramDTO.getValue().trim().length() > 0) {
                paramDTOs.add(paramDTO);
            }
        }
        return paramDTOs;
    }

    public String[] getAllInboundNames() {
        String[] inboundNameList = null;
        try {
            InboundEndpointDTO[] inboundEndpointDTOs = stub.getAllInboundEndpointNames();
            if (inboundEndpointDTOs != null) {
                inboundNameList = new String[inboundEndpointDTOs.length];
                if (inboundEndpointDTOs != null) {
                    for (int i = 0; i < inboundEndpointDTOs.length; i++) {
                        inboundNameList[i] = inboundEndpointDTOs[i].getName();
                    }
                }
            }
        } catch (RemoteException e) {
            log.error(e);
        } catch (InboundAdminInboundManagementException e) {
            log.error(e);
        }
        return inboundNameList;
    }

    public String getKAFKASpecialParameters() {
        String specialParamsList = "";
        loadProperties();
        if (prop != null) {
            String strKey = "kafka.mandatory";
            String strLength = prop.getProperty(strKey);
            Integer iLength = null;
            if (strLength != null) {
                try {
                    iLength = Integer.parseInt(strLength);
                } catch (Exception e) {
                    iLength = null;
                }
            }
            if (iLength != null) {
                for (int i = 1; i <= iLength; i++) {
                    String tmpString = strKey + "." + i;
                    String strVal = prop.getProperty(tmpString);
                    if (strVal.contains("highlevel.") || strVal.contains("simple.")) {
                        if (specialParamsList.equals("")) {
                            if (strVal.contains("highlevel.")) {
                                specialParamsList = strVal.replace("highlevel.", "");
                            } else {
                                specialParamsList = strVal;
                            }
                        } else {
                            if (strVal.contains("highlevel.")) {
                                specialParamsList = strVal.replace("highlevel.", "");
                            } else {
                                specialParamsList = specialParamsList + "," + strVal;
                            }
                        }
                    }
                }
            }
        }
        return specialParamsList;
    }

    public String getKAFKATopicListParameters() {
        String topicListParams = "";
        loadProperties();
        if (prop != null) {
            String strKey = "kafka.mandatory";
            String strLength = prop.getProperty(strKey);
            Integer iLength = null;
            if (strLength != null) {
                try {
                    iLength = Integer.parseInt(strLength);
                } catch (Exception e) {
                    iLength = null;
                }
            }
            if (iLength != null) {
                for (int i = 1; i <= iLength; i++) {
                    String tmpString = strKey + "." + i;
                    String strVal = prop.getProperty(tmpString);
                    if (strVal.contains("filter.from ~:~ ")) {
                        if (topicListParams.equals("")) {
                            topicListParams = strVal;
                        } else {
                            topicListParams = topicListParams + "," + strVal;
                        }
                    }
                }
            }
        }
        return topicListParams;
    }

    public String enableStatistics(String inboundName) throws AxisFault {
        try {
            stub.enableStatistics(inboundName);
        } catch (Exception e) {
            log.error("Could not enable statistics for the selected Inbound Endpoint", e);
        }
        return null;
    }

    public String disableStatistics(String inboundName) throws AxisFault {
        try {
            stub.disableStatistics(inboundName);
        } catch (Exception e) {
            log.error("Could not disable statistics for the selected Inbound Endpoint", e);
        }
        return null;
    }

    public String enableTracing(String inboundName) throws AxisFault {
        try {
            stub.enableTracing(inboundName);
        } catch (Exception e) {
            log.error("Could not enable tracing for the selected Inbound Endpoint", e);
        }
        return null;
    }

    public String disableTracing(String inboundName) throws AxisFault {
        try {
            stub.disableTracing(inboundName);
        } catch (Exception e) {
            log.error("Could not disable tracing for the selected Inbound Endpoint", e);
        }
        return null;
    }
}