org.ow2.petals.binding.soap.SoapSUManager Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of petals-bc-soap Show documentation
Show all versions of petals-bc-soap Show documentation
The PEtALS SOAP JBI binding component based on Axis2 and Jetty.
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();
}
}