Package org.wso2.carbon.tenant.dispatcher.internal

Source Code of org.wso2.carbon.tenant.dispatcher.internal.TenantDispatcherServiceComponent

/*                                                                            
* Copyright 2004,2005 The Apache Software Foundation.                        
*                                                                            
* 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.tenant.dispatcher.internal;

import org.apache.axis2.AxisFault;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.description.AxisOperation;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.description.AxisServiceGroup;
import org.apache.axis2.description.HandlerDescription;
import org.apache.axis2.description.InOutAxisOperation;
import org.apache.axis2.description.PhaseRule;
import org.apache.axis2.dispatchers.HTTPLocationBasedDispatcher;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.axis2.engine.Handler;
import org.apache.axis2.engine.Phase;
import org.apache.axis2.phaseresolver.PhaseException;
import org.apache.axis2.phaseresolver.PhaseMetadata;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.osgi.service.component.ComponentContext;
import org.wso2.carbon.CarbonConstants;
import org.wso2.carbon.core.multitenancy.MultitenantDispatcher;
import org.wso2.carbon.core.multitenancy.MultitenantMessageReceiver;
import org.wso2.carbon.utils.ConfigurationContextService;
import org.wso2.carbon.utils.multitenancy.MultitenantConstants;

import java.util.List;

/**
* @scr.component
*                name="org.wso2.carbon.tenant.dispatcher.internal.TenantDispatcherServiceComponent"
*                immediate="true"
* @scr.reference name="org.wso2.carbon.configCtx"
*                interface="org.wso2.carbon.utils.ConfigurationContextService"
*                cardinality="1..1" policy="dynamic"
*                bind="setConfigurationContext"
*                unbind="unsetConfigurationContext"
*/
public class TenantDispatcherServiceComponent {
    private Log log = LogFactory.getLog(TenantDispatcherServiceComponent.class);

    private ConfigurationContext configCtx;

    protected void activate(ComponentContext ctxt) {
        try {
            deployMultitenantService(configCtx.getAxisConfiguration());
            addDispatchers(configCtx.getAxisConfiguration());
        } catch (Throwable e) {
            log.error("Failed to activate the TenantDispatcherServiceComponent", e);
        }
    }


    private void deployMultitenantService(AxisConfiguration axisCfg) throws AxisFault {
        AxisService service = new AxisService(MultitenantConstants.MULTITENANT_DISPATCHER_SERVICE);
        AxisOperation operation =
                new InOutAxisOperation(MultitenantConstants.MULTITENANT_DISPATCHER_OPERATION);
        operation.setMessageReceiver(new MultitenantMessageReceiver());
        service.addOperation(operation);
        AxisServiceGroup multitenantSvcGroup = new AxisServiceGroup(axisCfg);
        multitenantSvcGroup.setServiceGroupName(MultitenantConstants.MULTITENANT_DISPATCHER_SERVICE);
        multitenantSvcGroup.addParameter(CarbonConstants.HIDDEN_SERVICE_PARAM_NAME, "true");
        multitenantSvcGroup.addService(service);
        axisCfg.addServiceGroup(multitenantSvcGroup);
        log.info("Deployed " + MultitenantConstants.MULTITENANT_DISPATCHER_SERVICE);
    }

    /**
     * Add the MultitenantDispatcher to the inFlow phase.
     *
     * @param mainAxisConfig super-tenant AxisConfiguration
     * @throws org.apache.axis2.AxisFault if an error occurs while adding the dispatcher
     */
    private void addDispatchers(AxisConfiguration mainAxisConfig) throws AxisFault {
        HandlerDescription handlerDescription = new HandlerDescription(MultitenantDispatcher.NAME);
        PhaseRule rule = new PhaseRule(PhaseMetadata.PHASE_DISPATCH);
        rule.setAfter(HTTPLocationBasedDispatcher.NAME);
        rule.setBefore("SynapseDispatcher");
        handlerDescription.setRules(rule);

        MultitenantDispatcher multitenantDispatcher = new MultitenantDispatcher();
        multitenantDispatcher.initDispatcher();
        handlerDescription.setHandler(multitenantDispatcher);

        List<Phase> inflowPhases
                = mainAxisConfig.getInFlowPhases();
        for (Phase inPhase : inflowPhases) {
            // we are interested about the Dispatch phase in the inflow
            if (PhaseMetadata.PHASE_DISPATCH.equals(inPhase.getPhaseName())) {
                boolean handlerFound = false;
                for (Handler handler : inPhase.getHandlers()) {
                    if (handler.getHandlerDesc().getName() != null &&
                            handler.getHandlerDesc().getName().equals(MultitenantDispatcher.NAME)) {
                        handlerFound = true;
                    }
                }
                if (!handlerFound) {
                    try {
                        inPhase.addHandler(handlerDescription);
                    } catch (PhaseException e) {
                        String msg = "Couldn't start Carbon, Cannot add " +
                                "the required Carbon handlers";
                        log.fatal(msg, e);
                        throw new AxisFault(msg);
                    }
                }
            }
        }
        log.info("Added multitenant dispatchers");
    }

    protected void deactivate(ComponentContext ctxt) {
        if (log.isDebugEnabled()) {
            log.debug("Deactivated TenantDispatcherServiceComponent");
        }
    }

    protected void setConfigurationContext(ConfigurationContextService configCtx) {
        this.configCtx = configCtx.getServerConfigContext();
    }

    protected void unsetConfigurationContext(ConfigurationContextService configCtx) {
        this.configCtx = null;
    }
}
TOP

Related Classes of org.wso2.carbon.tenant.dispatcher.internal.TenantDispatcherServiceComponent

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.