/* * JBoss, the OpenSource J2EE webOS * * Distributable under LGPL license. * See terms of license at gnu.org. */ // $Id: Deployment.java,v 1.4.2.3 2003/11/06 15:36:04 cgjung Exp $ package org.jboss.net.axis; // axis config and utils import org.apache.axis.deployment.wsdd.WSDDConstants; import org.apache.axis.deployment.wsdd.WSDDDeployment; import org.apache.axis.deployment.wsdd.WSDDNonFatalException; import org.apache.axis.deployment.wsdd.WSDDProvider; import org.apache.axis.deployment.wsdd.WSDDService; import org.apache.axis.deployment.wsdd.WSDDException; import org.apache.axis.deployment.wsdd.WSDDTypeMapping; import org.apache.axis.ConfigurationException; import org.apache.axis.encoding.TypeMappingRegistry; import org.apache.axis.handlers.soap.SOAPService; import javax.xml.rpc.encoding.DeserializerFactory; import org.w3c.dom.Element; // JAXP import javax.xml.namespace.QName; // java utils import java.util.List; import java.util.Map; import java.util.Iterator; import org.jboss.logging.Logger; /** * Represents a wsdd deployment descriptor/registry with * special service-specific classloading features. * @author Christoph G. Jung * @since 09.03.2002 * @version $Revision: 1.4.2.3 $ */ public class Deployment extends WSDDDeployment { // // Attributes // /** for deploymentlogging purposes */ protected static final Logger log = Logger.getLogger(Deployment.class); /** * holds a map of service q-names to classloaders * this map must be initialised lazily, since accesses are already done * in the super-constructor! Newbies! */ protected Map service2ClassLoader; /** whether the type mapping has been registered */ protected boolean tmrCreated = false; static { WSDDProvider.registerProvider( WSDDConstants.QNAME_HANDLER_PROVIDER, new ServiceClassLoaderAwareWSDDHandlerProvider()); } // // Constructors // /** * Constructor for Deployment. * @param e root element of the deployment document * @throws WSDDException */ public Deployment(Element e) throws WSDDException { super(e); Element[] elements = getChildElements(e, "typeMapping"); for (int i = 0; i < elements.length; i++) { TypeMapping mapping = new TypeMapping(elements[i]); deployTypeMapping(mapping); } // JBOSS only feature. Here we have the ability to // specify publish URLs to which we wish to register our // web services. Here we processing those publish URLS elements = getChildElements(e, "publish"); for (int i = 0; i < elements.length; i++) { log.debug("processing publish URL"); // Here we'll call the UDDI4J apis to accomplish this // First, figure out what the implications are for SSL // enabled comminucation and what provisions already // exist for SSL in jboss..? } } // // protected helpers // /** lazily initialises the classloader map */ protected synchronized Map getService2ClassLoader() { if (service2ClassLoader == null) { service2ClassLoader = new java.util.HashMap(); } return service2ClassLoader; } /** installs the typemappings parameter table inside a deserializer */ protected void equipTypeMappingWithOptions(TypeMapping typeMapping) throws ConfigurationException { DeserializerFactory dser = ( (org.apache.axis.encoding.TypeMapping) getTypeMappingRegistry() .getTypeMapping( typeMapping.getEncodingStyle())).getDeserializer( typeMapping.getQName()); if (dser instanceof ParameterizableDeserializerFactory) { // Load up our params ((ParameterizableDeserializerFactory) dser).setOptions( typeMapping.getParametersTable()); } } // // Public API // /* (non-Javadoc) * @see org.apache.axis.deployment.wsdd.WSDDDeployment#deployService(org.apache.axis.deployment.wsdd.WSDDService) */ public void deployService(WSDDService service) { service.deployToRegistry(this); getService2ClassLoader().put( service.getQName(), Thread.currentThread().getContextClassLoader()); } /* (non-Javadoc) * @see org.apache.axis.deployment.wsdd.WSDDDeployment#registerNamespaceForService(java.lang.String, org.apache.axis.deployment.wsdd.WSDDService) */ public void registerNamespaceForService(String arg0, WSDDService arg1) { super.registerNamespaceForService(arg0, arg1); getService2ClassLoader().put( arg0, Thread.currentThread().getContextClassLoader()); } /** deploy the information inside a given target */ public void deployToRegistry(WSDDDeployment target) throws ConfigurationException { super.deployToRegistry(target); if (target instanceof Deployment) { ((Deployment) target).getService2ClassLoader().putAll(getService2ClassLoader()); } } /** * retrieve the classloader that loaded the given service */ public ClassLoader getClassLoader(QName serviceName) { return (ClassLoader) getService2ClassLoader().get(serviceName); } /** * retrieve the classloader that loaded the given namespace */ public ClassLoader getClassLoader(String namespace) { return (ClassLoader) getService2ClassLoader().get(namespace); } /* (non-Javadoc) * @see org.apache.axis.deployment.wsdd.WSDDDeployment#removeNamespaceMapping(java.lang.String) */ public void removeNamespaceMapping(String arg0) { service2ClassLoader.remove(arg0); super.removeNamespaceMapping(arg0); } /* (non-Javadoc) * @see org.apache.axis.deployment.wsdd.WSDDDeployment#undeployService(javax.xml.namespace.QName) */ public void undeployService(QName arg0) { service2ClassLoader.remove(arg0); super.undeployService(arg0); } /** overwrite to equip with options */ public void deployTypeMapping(WSDDTypeMapping typeMapping) throws WSDDException { super.deployTypeMapping(typeMapping); if (typeMapping instanceof TypeMapping) { try { equipTypeMappingWithOptions((TypeMapping) typeMapping); } catch (ConfigurationException e) { throw new WSDDException( "Could not equip typemapping with options because of" + e); } } } /** overwrite to equip with options */ public TypeMappingRegistry getTypeMappingRegistry() throws ConfigurationException { TypeMappingRegistry tmr = super.getTypeMappingRegistry(); if (!tmrCreated) { tmrCreated = true; WSDDTypeMapping[] typeMappings = (WSDDTypeMapping[]) getTypeMappings(); for (int count = 0; count < typeMappings.length; count++) { if (typeMappings[count] instanceof TypeMapping) { equipTypeMappingWithOptions((TypeMapping) typeMappings[count]); } } } return tmr; } /* overrides the getdeployedservices method in order * to address classloading issues when browsing * the services list. * @see org.apache.axis.EngineConfiguration#getDeployedServices() */ public Iterator getDeployedServices() throws ConfigurationException { List serviceDescs = new java.util.ArrayList(); WSDDService[] services=getServices(); ClassLoader old=Thread.currentThread().getContextClassLoader(); try{ for(int count=0;count