Descriptores de Despliegue
Apache SOAP utiliza documentos XML llamados Descriptores de Despliegue para proporcionar información al sistema de ejecución SOAP sobre los servicios que deberían estar disponibles para los clientes. Pueden proporcionar un amplio conjunto de información como la URN para el servicio (que se utiliza para enrutar las solicitudes que le vienen), los detalles de la clase y del método si el servicio está siendo proporcionado por una clase Java, o el nombre del script si el servicio está implementado por cualquiera de los lenguajes de script BSF soportados. El contenido exacto del descriptor de despliegue depende del tipo de artefacto que está siendo expuesto mediante SOAP. Abajo encontraremos detalles sobre los diferentes tipos de descriptores de despliegue que pueden usarse en esta versión.
Descriptores de Despliegue para Clases Java Estándards
Un descriptor de despliegue que expone un servicio que está implementado mediante una clase Java estándard (incluyendo un Java Bean normal) se parece a este:
<isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment"
id="urn:service-urn>" [type="message"] [checkMustUnderstands="true|false"]>
<isd:provider type="java"
scope="Request | Session | Application"
methods="exposed-methods">
<isd:java class="implementing-class" [static="true|false"]/>
</isd:provider>
<isd:faultListener>org.apache.soap.server.DOMFaultListener</isd:faultListener>
</isd:service>
Donde service-urn es la URN donde queremos dar un servicio, exposed-methods es una lista de métodos separados por espacios que desamos exponer, e implementing-class es el nombre totalmente cualificado de la clase (por ejemplo packagename.classname) que proporciona los métodos que están siendo expuestos. Sobre el elemento <service>, hay un atributo opcional llamado type que podría ser configurado con el valor message si el servicio está orientado a documento en lugar de ser un servicio RPC, y un atributo opcional llamado checkMustUnderstands que podría ser true o false dependiendo de si queremos o no que el servidor lance un Fault si había cabeceras SOAP en la solicitud que fueron marcadas como MustUnderstand. En el elemento <java> hay un atributo opcional llamado static, que podría seleccionarse a true o false, dependiendo de si los métodos que están siendo expuestos son estáticos o no. El elemento <provider> también acepta un atributo scope que indica el tiempo de vida de la ejemplarización de la clase implementada. Request indica que el objeto se eliminará después de que se haya completado la solicitud, Session indica que el objeto vivirá todo el tiempo de vida de la sesión HTTP actual, y Application indica que el objeto vivirá hasta que se haya cerrado el servidor de servicios.
Descriptor de Despliegue EJB
Un descriptor de despliegue que expone un servicio que está implementado mediante un Enterprise Java Bean se parecería a esto:
<isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment"
id="urn:service-urn">
<isd:provider type="provider-class"
scope="Application"
methods="exposed-methods">
<isd:option key="JNDIName" value="jndi-name"/>
<isd:option key="FullHomeInterfaceName" value="home-name" />
<isd:option key="ContextProviderURL" value="context-provider" />
<isd:option key="FullContextFactoryName" value="factory-name" />
</isd:provider>
<isd:faultListener>org.apache.soap.server.DOMFaultListener</isd:faultListener>
</isd:service>
Donde service-urn y exposed-methods tienen el mismo significado que en el descriptor de despliegue de una clase Java estándard, provider-class es org.apache.soap.providers.StatelessEJBProvider, org.apache.soap.providers.StatefulEJBProvider, o org.apache.soap.providers.EntityEJBProvider, dependiendo de si la implementación es o no un bean de sesión sin estado, un bean de sesión con estado, o un bean de entidad, respectivamente, jndi-name es el nombre JNDI registrado del EJB, home-name es el nombre totalmente cualificado de la clase home del EJB, context-provider es la URL asociada con el proveedor de contexto JNDI, y factory-name es el nombre de la factoría de contextos JNDI. Por campatibilidad con versiones anteriores, el jndi-name también podría especificarse en el atributo class del elemento <java>.
Descriptor de Despliegue de un Script BSF
Un descriptor de despliegue que expone un servicio que está implementado mediante un Script BSF se parece a esto:
<isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment"
id="urn:service-urn">
<isd:provider type="script"
scope="Request | Session | Application"
methods="exposed-methods">
<isd:script language="language-name" [source="source-filename"]>
[script-body]
</isd:script>
</isd:provider>
<isd:faultListener>org.apache.soap.server.DOMFaultListener</isd:faultListener>
</isd:service>
Donde service-urn, exposed-methods, tienen el mismo significado que en el descriptor de despliegue de una clase Java estándard, y language-name es el nombre del lenguaje BSF soportado en el que está escrito el script. El descriptor de despliegue también debe tener un atributo source sobre el elemento <script>, o contener un script-body, que tenga el script real a utilizar para proporcionar el servicio. Si el descriptor de despliegue tiene un atributo source, entonces source-filename se refiere al fichero que contiene la implementación del servicio.
Especificar Oyentes de Fault
En todos los ejemplos de arriba se ha registrado un sólo oyente de fault, org.apache.soap.server.DOMFaultListener, cualquier clase que implemente el interface org.apache.soap.server.SOAPFaultListener podría ser registrada mediante el elemento <faultListener>. Se podrían especificar múltiples oyentes de fault simplemente añadiendo elementos <faultListener> adicionales. Para más información sobre oyentes de fault de Apache SOAP, mira aquí.
Especificar el Mapeo de Tipos en un Descriptor de Despliegue
La información de mapeo de tipos para servicios RPC también podría especificarse en los descriptores de despliegue. Los mapeos se especifican a través del uso de un elemento <mappings> que opcionalmente podría aparecer como hijo del elemento <service>. Los mapeos especificados de esta forma están sólo disponibles para el servicio descrito por el descriptor de despliegue en el que aparecen. Un descriptor de despliegue con mapeo de tipos, se parece a esto:
<isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment" id="...">
<isd:provider .../>
<isd:faultListener .../>
<isd:mappings [defaultRegistryClass="registry-class"]>
<isd:map encodingStyle="encoding-uri" xmlns:x="qname-namespace" qname="x:qname-element"
javaType="java-type" java2XMLClassName="serializer" xml2JavaClassName="deserializer"/>
...
</isd:mappings>
Donde encoding-uri es la URI para el método de codificación (por ejemplo http://schemas.xmlsoap.org/soap/encoding para la codificación estándard SOAP), qname-namespace es el espacio de nombres del elemento, qname-element es el nombre del elemento XML, java-type es la clase Java totalmente cualificada que hemos proporcionado para el mapeo (por ejemplo, samples.Date,) serializer es la clase Java totalmente cualificada que implementa org.apache.soap.util.xml.Serializer, y deserializer es la clase totalmente caulificada que implementa org.apache.soap.util.xml.Deserializer. El elemento <mappings> es un atributo opcional llamado defaultRegistryClass, cuyo valor (indicado por registry-class) es la clase Java totalmente cualificada (que es una subclase de org.apache.soap.encoding.SOAPMappingRegistry) que deseamos usar como tipo por defecto en registro de mapeo. Para más información sobre el soporte de mapeo de tipos en Apache SOAP, mira aquí.