EndpointListenerLoader.java

/*
 * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 *
 * Licensed 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.endpoint;

import org.apache.axis2.context.ConfigurationContext;
import org.apache.synapse.inbound.InboundProcessorParams;
import org.wso2.carbon.core.multitenancy.utils.TenantAxisUtils;
import org.wso2.carbon.inbound.endpoint.inboundfactory.InboundRequestProcessorFactoryImpl;
import org.wso2.carbon.inbound.endpoint.persistence.InboundEndpointInfoDTO;
import org.wso2.carbon.inbound.endpoint.persistence.InboundEndpointsDataStore;
import org.wso2.carbon.inbound.endpoint.persistence.PersistenceUtils;
import org.wso2.carbon.inbound.endpoint.persistence.service.InboundEndpointPersistenceServiceDSComponent;
import org.wso2.carbon.inbound.endpoint.protocol.generic.GenericInboundListener;
import org.wso2.carbon.inbound.endpoint.protocol.hl7.management.HL7EndpointManager;
import org.wso2.carbon.inbound.endpoint.protocol.http.InboundHttpConstants;
import org.wso2.carbon.inbound.endpoint.protocol.http.management.HTTPEndpointManager;
import org.wso2.carbon.inbound.endpoint.protocol.websocket.management.WebsocketEndpointManager;
import org.wso2.carbon.utils.ConfigurationContextService;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * This class is responsible for starting Listeners( like HTTP, HTTPS, HL7) on server startup for
 * Listening Inbound Endpoints.
 */
public class EndpointListenerLoader {


    /**
     * Start listeners for all the Listening Inbound Endpoints. This should be called in the
     * server startup to load all the required listeners for endpoints in all tenants
     *
     * Inbound Endpoint Persistence service need to be up and running before calling this method.
     * So the ServiceBusInitializer activate() method is the ideal place as it
     * guarantee that Inbound Endpoint Persistence Service is activated.
     * We cannot make this a osgi service as this is a fragment of synapse-core.
     * So to make sure persistence service is available, we need to depend on some other technique
     * like the one described above
     */
    public static void loadListeners() {

        Map<Integer, List<InboundEndpointInfoDTO>> tenantData =
                InboundEndpointsDataStore.getInstance().getAllListeningEndpointData();

        for (Map.Entry tenantInfoEntry : tenantData.entrySet()) {

            InboundEndpointInfoDTO inboundEndpointInfoDTO =
                       (InboundEndpointInfoDTO) ((ArrayList) tenantInfoEntry.getValue()).get(0);
            int port = (Integer) tenantInfoEntry.getKey() + PersistenceUtils.getPortOffset(inboundEndpointInfoDTO
                    .getInboundParams().getProperties());

            if (inboundEndpointInfoDTO.getProtocol().equals(InboundHttpConstants.HTTP)) {
                HTTPEndpointManager.getInstance().
                        startListener(port, inboundEndpointInfoDTO.getEndpointName(),
                                inboundEndpointInfoDTO.getInboundParams());
            } else if (inboundEndpointInfoDTO.getProtocol().equals(InboundHttpConstants.HTTPS)) {
                HTTPEndpointManager.getInstance().
                        startSSLListener(port, inboundEndpointInfoDTO.getEndpointName(),
                                inboundEndpointInfoDTO.getSslConfiguration(), inboundEndpointInfoDTO.getInboundParams());
            } else if (inboundEndpointInfoDTO.getProtocol().equals(InboundRequestProcessorFactoryImpl.Protocols.ws.toString())) {
                WebsocketEndpointManager.getInstance().
                        startListener(port, inboundEndpointInfoDTO.getEndpointName(),
                                inboundEndpointInfoDTO.getInboundParams());
            } else if (inboundEndpointInfoDTO.getProtocol().equals(InboundRequestProcessorFactoryImpl.Protocols.wss.toString())) {
                WebsocketEndpointManager.getInstance().
                        startSSLListener(port, inboundEndpointInfoDTO.getEndpointName(),
                                inboundEndpointInfoDTO.getInboundParams());
            } else if (inboundEndpointInfoDTO.getProtocol().equals(InboundRequestProcessorFactoryImpl.Protocols.hl7.toString())) {
                HL7EndpointManager.getInstance().
                        startListener(port, inboundEndpointInfoDTO.getEndpointName(),
                                inboundEndpointInfoDTO.getInboundParams());
            } else {
                // Check for custom-listening-InboundEndpoints
                InboundProcessorParams inboundParams = inboundEndpointInfoDTO.getInboundParams();

                if (GenericInboundListener.isListeningInboundEndpoint(inboundParams)) {
                    GenericInboundListener.getInstance(inboundParams).init();
                }
            }
        }
        
        //Load tenats required for polling inbound protocols
        Map<String, Set<String>> mPollingEndpoints =
		                                  InboundEndpointsDataStore.getInstance().getAllPollingingEndpointData();
        ConfigurationContextService configurationContext = 
      	                               InboundEndpointPersistenceServiceDSComponent.getConfigContextService();
        ConfigurationContext mainConfigCtx = configurationContext.getServerConfigContext();
        for (String tenantDomain : mPollingEndpoints.keySet()) {
            TenantAxisUtils.getTenantConfigurationContext(tenantDomain, mainConfigCtx);
        }
    }
}