All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.ow2.petals.binding.soap.SoapSUManager Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (c) 2006-2012 EBM WebSourcing, 2012-2023 Linagora
 * 
 * This program/library is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 2.1 of the License, or (at your
 * option) any later version.
 * 
 * This program/library is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
 * for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program/library; If not, see http://www.gnu.org/licenses/
 * for the GNU Lesser General Public License version 2.1.
 */
package org.ow2.petals.binding.soap;

import java.net.URISyntaxException;
import java.net.URLClassLoader;
import java.util.Collection;
import java.util.List;
import java.util.MissingResourceException;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.jbi.JBIException;

import org.ow2.easywsdl.extensions.wsdl4complexwsdl.WSDL4ComplexWsdlFactory;
import org.ow2.easywsdl.extensions.wsdl4complexwsdl.api.WSDL4ComplexWsdlException;
import org.ow2.petals.binding.soap.listener.incoming.SoapExternalListener;
import org.ow2.petals.binding.soap.util.SUPropertiesHelper;
import org.ow2.petals.component.framework.api.configuration.SuConfigurationParameters;
import org.ow2.petals.component.framework.api.exception.PEtALSCDKException;
import org.ow2.petals.component.framework.bc.AbstractBindingComponent;
import org.ow2.petals.component.framework.bc.BindingComponentServiceUnitManager;
import org.ow2.petals.component.framework.jbidescriptor.generated.Consumes;
import org.ow2.petals.component.framework.jbidescriptor.generated.Jbi;
import org.ow2.petals.component.framework.jbidescriptor.generated.Provides;
import org.ow2.petals.component.framework.listener.AbstractExternalListener;
import org.ow2.petals.component.framework.su.ServiceUnitDataHandler;
import org.ow2.petals.component.framework.util.ClassLoaderUtil;
import org.w3c.dom.Document;

/**
 * A service unit listener used to register new service into Axis Engine during SU deployment.
 * @author Christophe HAMERLING - EBM WebSourcing
 */
public class SoapSUManager extends BindingComponentServiceUnitManager {

    public SoapSUManager(final AbstractBindingComponent bindingComponent) {
        super(bindingComponent);
    }

    @Override
    protected AbstractExternalListener createExternalListener() {
        return new SoapExternalListener();
    }

    /**
     * Check and display warning for Consume parameters
     * 
     * @param configurationParams
     * @throws PEtALSCDKException
     */
    private String checkConsumesAndGetName(final SuConfigurationParameters configurationParams)
            throws PEtALSCDKException {
        // just check the service name parameter
        String serviceName = SUPropertiesHelper.getServiceName(configurationParams);
        if (serviceName == null) {
            // allow address
            serviceName = SUPropertiesHelper.getAddress(configurationParams);
            if (serviceName == null) {
                throw new PEtALSCDKException(
                        "The field " + SoapConstants.ServiceUnit.SERVICE_NAME + " can't be found in the consumes");
            } else {
                logger.info("The field " + SoapConstants.ServiceUnit.ADDRESS
                        + " is deprecated in a consumes, please use "
                        + SoapConstants.ServiceUnit.SERVICE_NAME);
            }
        }
        return serviceName;
    }

    /**
     * Check and display warnings for Provide parameters
     * 
     * @param extensions
     * @throws PEtALSCDKException
     */
    private void checkProvide(final SuConfigurationParameters extensions)
            throws PEtALSCDKException {
        if (SUPropertiesHelper.getWSATo(extensions) == null) {
            if (SUPropertiesHelper.getAddress(extensions) == null) {
                throw new PEtALSCDKException(
                        "The field " + SoapConstants.ServiceUnit.WSA.TO + " can't be found into the provides");
            } else {
                logger.info("The field " + SoapConstants.ServiceUnit.ADDRESS
                        + " in the a provides is deprecated, please use "
                        + SoapConstants.ServiceUnit.WSA.TO);
            }
        }
    }

    @Override
    protected void doDeploy(final ServiceUnitDataHandler suDH) throws PEtALSCDKException {
        logger.log(Level.FINE, "Deploying a new AxisService for SU " + suDH.getName());

        // Local service configuration
        final Jbi descriptor = suDH.getDescriptor();

        final List providesList = descriptor.getServices().getProvides();
        for (final Provides provides : providesList) {
            // TODO maybe register it after it has been inialised...
            final ServiceContext context = getContext().getProvidersManager()
                    .createServiceContext(provides);
            final SuConfigurationParameters extensions = suDH.getConfigurationExtensions(provides);

            checkProvide(extensions);

            context.setExtensions(extensions);
            context.setModules(SUPropertiesHelper.getModules(extensions));
            context.setServiceParams(SUPropertiesHelper.getServiceParameters(extensions));
            context.setClassloader(getServiceClassloader(suDH.getInstallRoot()));

            // let's have a logger just for this service
            try {
                final Logger serviceLogger = getComponent().getContext().getLogger(provides.getEndpointName(), null);
                context.setLogger(serviceLogger);
            } catch (MissingResourceException | JBIException e) {
                throw new PEtALSCDKException("Can't get logger for Provides " + provides.getEndpointName(), e);
            }

            try {
                Document doc = suDH.getEndpointDescription(provides);
                context.setServiceDescription(WSDL4ComplexWsdlFactory.newInstance().newWSDLReader().read(doc));
            } catch (final WSDL4ComplexWsdlException e) {
                logger.log(Level.WARNING, "Wsdl reading error", e);
            } catch (final URISyntaxException e) {
                logger.warning("Wsdl reading error" + e.getMessage());
            }
        }

        final List consumesList = descriptor.getServices().getConsumes();
        for (final Consumes consumes : consumesList) {
            final ServiceContext context = getContext().getConsumersManager()
                    .createServiceContext(consumes);
            final SuConfigurationParameters extensions = suDH.getConfigurationExtensions(consumes);

            final String newServiceName = checkConsumesAndGetName(extensions);

            context.setExtensions(extensions);
            context.setModules(SUPropertiesHelper.getModules(extensions));
            context.setServiceParams(SUPropertiesHelper.getServiceParameters(extensions));
            context.setClassloader(getServiceClassloader(suDH.getInstallRoot()));
            // let's have a logger just for this service
            try {
                final Logger serviceLogger = getComponent().getContext().getLogger(newServiceName, null);
                context.setLogger(serviceLogger);
            } catch (MissingResourceException | JBIException e) {
                throw new PEtALSCDKException("Can't get logger for Consumes " + newServiceName, e);
            }
        }
    }

    @Override
    protected void doUndeploy(final ServiceUnitDataHandler suDH) throws PEtALSCDKException {

        final Jbi descriptor = suDH.getDescriptor();

        for (final Provides provides : descriptor.getServices().getProvides()) {
            getContext().deleteServiceClientPools(provides);
            if (logger.isLoggable(Level.FINE)) {
                logger.fine("Cleaning context for " + provides);
            }
            getContext().getProvidersManager().deleteServiceContext(provides);
        }

        for (final Consumes consumes : descriptor.getServices().getConsumes()) {
            if (logger.isLoggable(Level.FINE)) {
                logger.fine("Cleaning context for " + consumes);
            }
            getContext().getConsumersManager().deleteServiceContext(consumes);
        }
    }

    /**
     * Get the service class loader
     * 
     * @param suRootPath
     * @param extensions
     */
    private URLClassLoader getServiceClassloader(final String suRootPath) {
        return ClassLoaderUtil.createClassLoader(suRootPath, Thread.currentThread()
                .getContextClassLoader());
    }

    @Override
    public void onPlaceHolderValuesReloaded() {
        // the urls used as key to the pools could have changed!
        // We destroy web-service client pools. It will be recreate with the new right values if needed
        final Collection suDatahandlers = this.getServiceUnitDataHandlers();
        for (final ServiceUnitDataHandler suDatahandler : suDatahandlers) {
            final List providesList = suDatahandler.getDescriptor().getServices().getProvides();
            for (final Provides provides : providesList) {
                getComponent().getSoapContext().deleteServiceClientPools(provides);
            }
        }
    }

    @Override
    protected SoapComponent getComponent() {
        return (SoapComponent) super.getComponent();
    }

    private SoapComponentContext getContext() {
        return getComponent().getSoapContext();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy