Un registro es una infraestructura que nos permitirá publicar y localizar Servicios Web. Esta capacidad de localizar el servicio que necesitemos nos permitirá crear una integración dinámica y débilmente acoplada de nuestras aplicaciones. Será dinámica en cuanto que podremos localizar el servicio que necesitamos para realizar una determinada tarea en tiempo de ejecución, accediendo al registro y solicitando un servicio que realice la tarea que buscamos. Decimos que es débilmente acoplado ya que la implementación de nuestro módulo no dependerá del servicio que estemos invocando, ni siquiera tendrá que conocer a priori su interfaz, sino que podrá interrogarlo dinámicamente para obtenerla, y a continuación invocar el método de dicha interfaz que necesitemos.
UDDI (Universal Descriptión, Discovery and Integration) es un conjunto de registros en web donde se almacena información sobre diversas organizaciones, y sobre los productos y servicios que ofrecen. En ellos podemos registrar cualquier tipo de servicios que ofrezcan dichas organizaciones, como pueden ser servicios para el acceso manual a través de la web de la empresa o por teléfono, pero está principalmente destinado al registro de Servicios Web.
Podemos encontrar los registros en diferentes sitios de Internet, proporcionados por diferentes operadores (IBM, Microsoft, SAP, etc). Cada operador ofrece su propia implementación de la especificación UDDI. Todos los nodos comparten la misma información, ya que ésta es replicada entre ellos. Estos registros son de libre acceso para que cualquiera pueda consultarlos. Podremos acceder a ellos o bien mediante una interfaz web (acceso manual) o mediante mensajes SOAP (mediante un programa).
Información contenida
Es importante contar con información sobre el negocio, ya que está nos permitirá determinar si la información proporcionada por el servicio nos va a servir. Por ejemplo, si buscamos información meteorológica, será recomendable buscar una organización que se encuentre en nuestra zona geográfica.
La información que contiene el registro nos permite responder a las siguientes preguntas sobre el negocio:
Esta información contenida en el registro se define mediante los siguientes tipos de esquemas XML:
Estos tModels se utilizan para facilitar la integración de servicios, ya que si un servicio pertenece a un determinado tModel conocido por varios desarrolladores, todos ellos sabrán como integrar dicho servicio dentro de su aplicación.
Un tModel puede ser publicado por una determinada organización, de forma que sea accesible para todo el mundo.
Si tenemos una aplicación que soporta la especificación de un cierto tModel, podremos buscar servicios que sepamos que cumplan dicha especificación y que por lo tanto puedan integrarse en nuestra aplicación.
Los tModel son una forma de describir los Servicios Web, para lo cual puede hacer referencia a un documento WSDL por ejemplo. No hay ninguna especificación formal de donde debe enlazarse un documento WSDL dentro del registro. Podemos tenerlo o bien directamente como un enlace del servicio, o como descripción de un tModel, aunque será recomendable utilizar esta segunda forma.
Sin embargo, no se utilizan únicamente para especificaciones técnicas de servicios. Podemos utilizarla para hacer referencia a cualquier especificación externa, como pueden ser los tipos de identificadores y de clasificaciones de las organizaciones que referenciamos mediante un tModel.
Categorías
Como hemos dicho, los elementos registrados tienen varias categorías asignadas. Esta clasificación puede darse según diferentes esquemas, llamados taxonomías. Podemos encontrar especificadas distintas taxonomías, cada una de las cuales clasifica los elementos según distintos criterios. En el caso de las organizaciones, podemos clasificarlas según las siguientes taxonomías:
Taxonomía | Nombre | Descripción |
NAICS | ntis-gov:naics:1997 | Clasifica las organizaciones mediante un código de industria |
UNSPSC | unspsc-org:unspcs:3-1 | Clasifica según el tipo de productos y servicios que ofrece la organización. |
ISO 3166 | uddi-org:iso-ch:3166:1999 | Clasifica según la localización geográfica de la organización. |
Por ejemplo, si seguimos el esquema (taxonomía) NAICS (ntis-gov:naics) tendremos las siguientes clases:
Accommodation and Food Services Administrative and Support and Waste Management and Remediation Services Agriculture, Forestry, Fishing and Hunting Arts, Entertainment, and Recreation Construction Educational Services Finance and Insurance Health Care and Social Assistance Information Management of Companies and Enterprises Manufacturing Manufacturing Manufacturing Mining Other Services (except Public Administration) Professional, Scientific, and Technical Services Public Administration Real Estate and Rental and Leasing Retail Trade Retail Trade Transportation and Warehousing Transportation and Warehousing Utilities Wholesale Trade
Cada una de estas clases puede contener subclases, y éstas a su vez dividirse en más subclases. Por lo tanto, tendremos una serie de conceptos organizados en forma de árbol.
Búsqueda en el registro
Cuando buscamos una organización o servicio en el registro, podremos establecer una serie de criterios de búsqueda, como el nombre y/o la categoría, según un determinado esquema de categorización. Para buscar una organización podemos restringir la búsqueda con los siguientes criterios:
Cuando localicemos una organización, obtendremos una clave de dicha organización, que podremos utilizar para localizar los servicios que pertenezcan a ella dentro de nuestro programa. Para buscar servicios debemos proporcionar la clave de la organización dentro de la cual queremos buscar, y podemos utilizar los siguientes criterios de búsqueda:
Una vez localizado el servicio, podremos obtener un clave asociada a dicho servicio que nos permitirá localizar los enlaces de dicho servicio. Para buscar enlaces deberemos proporcional la clave del servicio dentro del cuál queremos buscar, y podemos proporcionar los siguientes criterios de búsqueda:
En lugar de buscar organizaciones, y posteriormente descender a sus servicios y enlaces, podemos buscar directamente tModels en el registro. De esta forma podremos encontrar elementos que cumplan una determinada especificación. Por ejemplo, podremos buscar servicios definidos mediante un documento WSDL. Para buscar un tModel podremos proporcionar los siguientes criterios de búsqueda:
JAXR nos permitirá acceder a registros XML mediante una interfaz única y estándar a través de Java. Podremos acceder a varios tipos de registros, como pueden ser UDDI y ebXML.
Figura 1. Arquitectura de JAXR
En la arquitectura de JAXR podemos distinguir dos elementos:
La librería JAXR se encuentra en el paquete javax.xml.registry y subpaquetes de éste, por lo que para utilizarla deberemos importar estos paquetes.
Lo primero que deberemos hacer para acceder a un registro será conectarnos a un proveedor JAXR. Para ello obtendremos un objeto ConnectionFactory que nos proporcione conexiones a registros:
ConnectionFactory cf = ConnectionFactory.newInstance();
Antes de crear la conexión, deberemos establecer una serie de propiedades como configuración para la conexión que vamos a crear. Estas propiedades deben añadirse a un objeto Properties de Java. Debemos recordar que estas propiedades en Java son pares <nombre, valor>, que pueden añadirse al invocar la aplicación en la línea de comando mediante el parámetro -D, o bien crearse dentro del código como sigue a continuación:
Properties p = new Properties();
p.setProperty("nombre", "valor");
...
Las propiedades que debemos establecer de forma obligatoria son las siguientes:
Nombre de la propiedad |
Valor |
"javax.xml.registry.queryManagerURL" |
Deberemos asignar una cadena (String)
con la URL del proveedor de la API para consultar el registro. |
"javax.xml.registry.lifeCycleManagerURL" |
Deberemos asignar una cadena (String)
con la URL del proveedor de la API para publicar y modificar el registro.
Por defecto toma el mismo valor que se le haya asignado a la anterior
propiedad. |
"javax.xml.registry.semanticEquivalences" |
Nos permite añadir una cadena (String)
con equivalencias semánticas. El formato será una cadena
donde los identificadores de conceptos equivalentes estará separados
por comas, y las tuplas de diferentes conceptos por |, como por ejemplo
"id1,id2|id3,id4". Por defecto no toma ningún valor. |
"javax.xml.registry.security.authenticationMethod" |
Cadena (String) con el método de
autentificación utilizado para acceder al registro. Sólo
soporta UDDI_GET_AUTHTOKEN. Por defecto no toma ningún valor. |
"javax.xml.registry.uddi.maxRows" |
Permite especificar, como un objeto entero (Integer),
el máximo número de filas que podrá devolver una
búsqueda. |
"javax.xml.registry.postalAddressScheme" |
Cadena (String) |
Una vez establecidas las propiedades en el objeto Properties, podemos asignarlas al ConnectionFactory de JAXR y por último crear la conexión:
cf.setProperties(props);
Connection con = cf.createConnection();
Una vez obtenida la conexión, el siguiente paso será acceder al proveedor JAXR, obteniendo acceso a la interfaz RegistryService:
RegistryService rs = con.getRegistryService();
BusinessQueryManager bqm = rs.getBusinessQueryManager();
BusinessLifeCycleManager blcm = rs.getBusinessLifeCycleManager();
Vemos que mediante RegistryService podemos obtener dos interfaces. Cada una de estas interfaces tendrá una utilidad distinta:
Vamos a utilizar la interfaz BusinessQueryManager obtenida previamente para realizar una consulta del registro.
Esta interfaz nos permitirá buscar distintos elementos en el registro con los siguientes métodos que nos ofrece:
findOrganizations | Busca organizaciones en el registro. |
findServices | Busca servicios pertenecientes a una organización dada. |
findServiceBindings | Busca enlaces de un determinado servicio. |
findConcepts | Busca conceptos (tModels) dentro del registro. |
En la búsqueda de los distintos elementos podemos establecer distintos criterios de búsqueda:
En todos estos parámetros debemos indicar una colección (Collection) de elementos. La búsqueda se realizará mediante una operación lógica AND de todos los parámetros distintos de null, y de todos los elementos que contenga cada colección. Como colecciones podemos utilizar por ejemplo objetos de tipo ArrayList.
Todas las clases que representan elementos del registro heredan de la clase RegistryObject.
Los métodos de búsqueda de elementos en el registro devuelven un objeto BulkObject, del que podremos extraer los resultados de la búsqueda.
Vamos a ver ahora una serie de ejemplos de búsquedas en el registro.
Búsqueda de organizaciones por nombre
Proporcionamos el patrón de nombre de organización que buscamos dentro de una colección. Podemos utilizar el carácter '%' como comodín en los nombres que buscamos. Si especificamos por ejemplo "%patron%" estaremos buscando todos los nombres que contengan la subcadena patron.
Collection nombres = new ArrayList(); nombres.add("%patron_nombre%");
Invocamos findOrganizations proporcionándole la colección que hemos creado como parámetro de nombre de la organización buscada.
BulkResponse resp = bqm.findOrganizations(null, nombres, null, null, null, null); Collection orgs = resp.getCollection();
Del objeto BulkResponse obtenido podemos obtener una colección de organizaciones encontradas. Podemos consultar todas estas organizaciones que nos ha devuelto recorriendo esta colección.
Iterator orgIter = orgs.iterator(); while (orgIter.hasNext()) { Organization org = (Organization) orgIter.next(); ... }
Para cada organización obtenida, podremos obtener todos los servicios que ofrece. Podremos recorrer la colección de servicios obtenida para obtener información sobre los servicios.
Collection servicios = org.getServices(); Iterator servIter = servicios.iterator(); while (servIter.hasNext()) { Service serv = (Service) servIter.next(); ... }
Una vez obtenido un servicio, podemos obtener todos sus enlaces (bindings) y recorrer esta lista de enlaces para obtener información sobre ellos.
Collection bindings = serv.getServiceBindings(); Iterator sbIter = bindings.iterator(); while (sbIter.hasNext()) { ServiceBinding sb = (ServiceBinding) sbIter.next(); ... }
De esta forma, a partir del objeto de una organización, podemos obtener toda su información y servicios que contiene.
Búsqueda de organizaciones por clasificación
Podemos buscar organizaciones que pertenezcan a unas determinadas clasificaciones dentro de una taxonomía.
Lo primero que deberemos hacer es localizar la taxonomía que vamos a usar, obteniendo un objeto ClassificationScheme que represente dicha taxonomía. En el siguiente ejemplo obtenemos un objeto encapsulando la taxonomía NAICS:
ClassificationScheme taxonomia = bqm.findClassificationSchemeByName(null, "ntis-gov:naics");
El siguiente paso será obtener la clasificación que queramos buscar dentro de la taxonomía especificada. Esto lo obtendremos como un objeto Classification, para lo cual necesitaremos la interfaz BusinessLifeCycleManager. Para crear la clasificación deberemos pasar el código y la descripción de dicha clasificación dentro de la taxonomía.
Classification clase = (Classification) blcm.createClassification(taxonomia, "Automobile Manufacturing", "336111");
Podemos encontrar los códigos de la taxonomía NAICS en:
http://www.census.gov/epcd/naics/naicscod.txt
Añadimos la clasificación creada en una colección.
Collection clases = new ArrayList(); clases.add(classification);
Y por último, buscamos las organizaciones pasando dicha colección como parámetro de clasificaciones a la búsqueda.
BulkResponse resp = bqm.findOrganizations(null, null, clases, null, null, null);
Podremos extraer las organizaciones devueltas por la búsqueda y sus servicios igual que hicimos en el caso anterior, a partir del objeto BulkResponse.
Búsqueda de tModels
Si estamos interesados en localizar Servicios Web que podamos integrar a nuestra aplicación, será conveniente restringir la búsqueda a elementos que contengan un documento WSDL.
Para hacer esto buscaremos tModels (conceptos) dentro del registro que pertenezcan a la clase de especificación WSDL. Esta clase la encontramos en la taxonomía uddi-org:types.
String taxonomia = "uddi-org:types"; ClassificationScheme tiposUDDI = bqm.findClassificationSchemeByName(null, taxonomia);
Creamos la clasificación correspondiente a la especificación WSDL:
Classification claseWSDL = blcm.createClassification(tiposUDDI, "wsdlSpec", "wsdlSpec");
Construimos una colección con la clasificación creada.
Collection clases = new ArrayList(); clases.add(claseWSDL);
Buscamos dentro del registro conceptos que pertenezcan a esta clase.
BulkResponse resp = bqm.findConcepts(null, null, clases, null, null);
Una vez obtenidos los conceptos, podremos recorrer la lista de conceptos devueltos para obtener los datos de cada uno:
Collection conceptos = resp.getCollection(); Iterator iter = conceptos.iterator(); while (iter.hasNext()) { Concept concepto = (Concept) iter.next(); }
Para obtener el WSDL asociado al concepto podremos acceder a sus enlaces externos.
Collection enlaces = concepto.getExternalLinks(); ExternalLink enlace = (ExternalLink) enlaces.iterator().next(); String uri_wsdl = enlace.getExternalURI();
Dado un concepto o lista de conceptos, que se refiere a una determinada especificación técnica, podemos especificarlo en la búsqueda de organizaciones para obtener las organizaciones con servicios que cumplan dicha especificación.
resp= bqm.findOrganizations(null, null, null, conceptos , null, null);
Podremos consultar las organizaciones que nos ha devuelto la búsqueda igual que hicimos anteriormente.
Mediante el objeto BusinessLifeCycleManager obtenido previamente, podremos hacer modificaciones en el registro. Para poder modificar el registro, deberemos autentificarnos como usuario. Para ello debemos crear un objeto PasswordAuthentication con la información de login de nuestro usuario (login y password):
String login = "MiLogin"; String password = "MiPassword"; PasswordAuthentication autentificacion = new PasswordAuthentication(login, password.toCharArray());
Una vez hecho esto introduciremos esta autentificación en un conjunto (Set) de credenciales, y proporcionaremos dichos credenciales a la conexión (objeto Connection):
Set cred = new HashSet(); cred.add(autentificacion); con.setCredentials(cred);
Una vez autentificados como usuario, podremos modificar el registro mediante los métodos que proporciona el objeto BusinessLifeCycleManager. Encontramos dos grandes grupos de métodos dentro de este objeto:
Los elementos que podemos añadir o eliminar del registro son:
Añadir datos al registro
Por ejemplo, para añadir una nueva organización al registro primero deberemos crear esta organización. Para crear nuevas instancias de los diferentes elementos del registro utilizaremos una serie de métodos create* definidos en la superclase del objeto BusinessLifeCycleManager:
Organization org = blcm.createOrganization("Mi organizacion");
De esta forma tenemos creado un objeto que representa la nueva organización que vamos a registrar, al que podremos añadir una descripción, información de contacto, clasificaciones (mediante un objeto Classification), etc.
Además podremos añadir servicios y enlaces de estos servicios a la nueva organización. Para ello deberemos crear los objetos Service y ServiceBinding correspondiente mediante nuestro objeto BusinessLifeCycleManager:
Collection servicios = new ArrayList(); Service servicio = blcm.createService("Mi servicio"); servicios.add(servicio); Collection enlaces = new ArrayList(); ServiceBinding enlace = blcm.createServiceBinding(); enlace.setAccessURI("http://www.rvg.ua.es:7001/sw"); enlaces.add(enlace);
A continuación añadiremos los enlaces al servicio, y los servicios a la organización a la que pertenecen, mediante los métodos:
servicio.addServiceBindings(enlaces); org.addServices(servicios);
Una vez creada la nueva organización con todos sus datos, servicios y enlaces, deberemos grabarla en el registro:
Collection orgs = new ArrayList(); orgs.add(org); BulkResponse res = blcm.saveOrganizations(orgs);
Esta operación puede haber tenido algún problema y no haberse realizado correctamente. Podemos comprobar si ha ocurrido algún error consultando las excepciones del objeto devuelto como respuesta:
Collection excep = res.getException();
Eliminar datos del registro
En el caso de que queramos eliminar una organización, deberemos previamente obtener la clave de dicha organización en forma de un objeto Key.
Key key = // Obtener clave de la organización a eliminar. Collection keys = new ArrayList(); keys.add(key);
Una vez obtenida esta clave (por ejemplo mediante una búsqueda en el registro, como vimos en el punto anterior), podremos eliminar la organización del registro mediante:
BulkResponse res = blcm.deleteOrganizations(keys);
Durante esta operación pueden haberse producido errores. Para comprobar si algo ha fallado podemos consultar las excepciones de la respuesta que nos ha dado con:
Collection excep = res.getException();
Podemos conectarnos a diferentes registros UDDI públicos donde podremos buscar servicios o publicar nuestros propios servicios para que otros desarrolladores sean capaces de localizarlos e integrarlos en sus aplicaciones. Podemos conectarnos a los servidores de registros de distintos vendedores:
Además de estas direcciones, la mayoría de los vendedores anteriores proporcionan un registro de prueba (test) que podremos utilizar para probar nuestras aplicaciones que publican servicios en registros. Estas direcciones son:
Para poder acceder a estos servicios desde nuestras aplicaciones, deberemos conocer la URL de la API para consultar (Inquiry API) y la URL de la API para publicar (Publish API) en el registro. Estas direcciones son las siguientes:
Registro | API de consulta | API de publicación |
Microsoft | http://uddi.microsoft.com/inquire | https://uddi.microsoft.com/publish |
IBM | http://uddi.ibm.com/ubr/inquiryapi | https://uddi.ibm.com/ubr/publishapi |
SAP | http://uddi.sap.com/uddi/api/inquiry | https://uddi.sap.com/uddi/api/publish |
NTT-Com | http://www.uddi.ne.jp/ubr/inquiryapi | https://www.uddi.ne.jp/ubr/publishapi |
Microsoft (test) | http://test.uddi.microsoft.com/inquire | https://test.uddi.microsoft.com/publish |
IBM (test) | http://uddi.ibm.com/testregistry/inquiryapi | https://uddi.ibm.com/testregistry/publishapi |
SAP (test) | http://udditest.sap.com/UDDI/api/inquiry | https://udditest.sap.com/UDDI/api/publish |
Sin embargo, es posible que no queramos que nuestros servicios sean accesibles por todo el mundo públicamente. Para ello podemos utilizar un registro privado. Tanto JWSDP como WebLogic incorporan su propio servidor de registro.
El servidor de registro incluido en WSDP utiliza una base de datos Xindice para almacenar los datos del registro.
Xindice
Xindice es una base de datos nativa XML. Esta base de datos pertenece al proyecto XML de Apache. Antes de ponerla en marcha deberemos iniciar tomcat con el comando
startup // Windows startup.sh // Linux
Ponemos en marcha la base de datos Xindice con
xindice-start // Windows xindice-start.sh // Linux
En las nuevas versiones de JWSDP no hace falta iniciar Xindice por separado, ya que se ejecuta se encuentra integrada en Tomcat.
Con esto tendremos nuestro registro funcionando. Ahora necesitaremos configurar el registro, y agregar datos a éste.
Dentro de nuestra aplicación, para conectar al registro utilizaremos la siguiente URL, tanto para consultar como para publicar:
"http://localhost:8080/registry-server/RegistryServerServlet"
Esto nos permitirá añadir datos al registro o consultar los que ya tiene registrados a través de nuestros propios programas. Para poder publicar, deberemos utilizar un nombre de usuario y password dado de alta en el registro. Cuando hayamos instalado el registro, tendremos un usuario por defecto:
Login: testuser Password: testuser
Será recomendable añadir nuestro propio usuario, y eliminar este usuario por defecto de forma que nadie más pueda acceder al registro sin nuestro permiso. Para añadir o eliminar usuarios podemos utilizar una serie de herramientas para el acceso al registro incluidas en JWSDP.
Acceso al registro
En el subdirectorio registry-server-x.x/samples, dentro del directorio donde hayamos instalado JWSDP, tenemos un script mediante el que podemos realizar diferentes operaciones con el registro. Este script es:
registry-server-test // Windows registry-server-test.sh // Linux
Con este script podremos enviar al registro diferentes mensajes, desde línea de comandos, o bien invocar la aplicación Indri, que nos permite acceder al registro a través de una interfaz gráfica. En las últimas versiones de JWSDP está aplicación gráfica Indri ya no está disponible.
Podemos enviar mensajes UDDI mediante línea de comandos. Para ello tenemos plantillas de diferentes mensajes UDDI en el subdirectorio xml. Para enviar uno de estos comandos deberemos:
Fichero del mensaje | Función |
DeleteBinding.xml | Elimina un enlace. Deberemos proporcionar el código de autentificación del usuario en authInfo y la clave del enlace en bindingKey. |
DeleteBusiness.xml | Elimina una organización. Deberemos proporcionar el código de autentificación del usuario en authInfo y la clave de la organización en businessKey. |
DeletePublisherAssertions.xml | Elimina una relación entre elementos del registro. Deberemos proporcionar el código de autentificación del usuario en authInfo y los datos de la relación. |
DeleteService.xml | Elimina un servicio. Deberemos proporcionar el código de autentificación del usuario en authInfo y la clave del servicio en serviceKey. |
DeleteTModel.xml | Elimina un tModel. Deberemos proporcionar el código de autentificación del usuario en authInfo y la clave del tModel en tModelKey. |
SaveBinding.xml | Registra un nuevo enlace. Deberemos proporcionar el código de autentificación del usuario en authInfo y la información sobre el nuevo enlace y la clave del servicio al que pertenece dentro del elemento bindingTemplate. |
SaveBusiness.xml | Registra una nueva organización. Deberemos proporcionar el código de autentificación del usuario en authInfo y la información sobre la nueva organización dentro del elemento businessEntity. |
SaveService.xml | Registra un nuevo servicio. Deberemos proporcionar el código de autentificación del usuario en authInfo y la información sobre el nuevo servicio y la clave de la organización a la que pertenece dentro del elemento businessService. |
SaveTModel.xml | Registra un nuevo tModel. Deberemos proporcionar el código de autentificación del usuario en authInfo y la información sobre el nuevo tModel dentro del elemento tModel. |
FindBinding.xml | Busca un enlace perteneciente a un servicio en el registro. Deberemos especificar la clave del servicio al que pertenece en serviceKey, e incluir las características del enlace buscado dentro de find_binding. |
FindBusiness.xml | Busca una organización en el registro. Deberemos especificar las características de la organización buscada dentro de find_business. |
FindService.xml | Busca un servicio perteneciente a una organización en el registro. Deberemos especificar la clave de la organización a la que pertenece en businessKey, e incluir las características del servicio buscado dentro de find_service. |
FindTModel.xml | Busca un tModel en el registro. Deberemos especificar las características del tModel buscada dentro de find_tModel. |
GetAssertionStatusReport.xml | Obtiene información sobre el estado de la relaciones publicadas, informando acerca de si están completas o no. Deberemos proporcionar el código de autentificación del usuario en authInfo. |
GetAuthToken.xml | Valida un usuario. Debemos especificar el nombre del usuario como userID y su password en cred. Nos devolverá el código de autentificación del usuario en authInfo, que podremos usar en próximos accesos al registro. |
GetBindingDetail.xml | Nos devuelve información detallada sobre un enlace. Deberemos especificar la clave del enlace en bindingKey. |
GetBusinessDetail.xml | Nos devuelve información detallada sobre una organización. Deberemos especificar la clave de la organización en businessKey. |
GetBusinessDetailExt.xml | Nos devuelve información detallada ampliada sobre una organización. Deberemos especificar la clave de la organización en businessKey. |
GetPublisherAssertions.xml | Devuelve la lista de relaciones publicadas entre elementos del registro. Deberemos proporcionar el código de autentificación del usuario en authInfo. |
GetRegisteredInfo.xml | Devuelve la lista de elementos publicados por el usuario actual. Deberemos proporcionar el código de autentificación del usuario en authInfo. |
GetServiceDetail.xml | Nos devuelve información detallada sobre un servicio. Deberemos especificar la clave del servicio en serviceKey. |
GetTModelDetail.xml | Nos devuelve información detallada sobre un tModel. Deberemos especificar la clave del tModel en tModelKey. |
DiscardAuthToken.xml | Cierra la sesión del usuario actual, dejando de tener validez el código de autentificación correspondiente. Deberemos proporcionar el código de autentificación del usuario en authInfo. |
UserInfo.xml | Información para registrar un nuevo usuario. Se debe introducir la información sobre el nuevo usuario (nombre, apellidos, ID, password). El password debe estar codificado en MD5. Más adelante veremos como obtener está codificación. |
UserDelete.xml | (A partir de JWSDP 1.1) Permite eliminar un usuario del registro, proporcionando los datos (nombre, login, password) del usuario a eliminar. |
Por ejemplo, para validarnos como usuario deberemos modificar el fichero xml/GetAuthToken.xml de la siguiente forma:
<?xml version="1.0"?>
<!--
Copyright 2002 Sun Microsystems, Inc. All rights reserved.
SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
-->
<get_authToken generic="2.0" xmlns="urn:uddi-org:api_v2"
userID="testuser" cred="testuser"/>
registry-server-test run-validate -Dinstance=<fichero_del_mensaje>
registry-server-test run-cli-request -Drequest=<fichero_del_mensaje>
Esto nos mostrará por pantalla el mensaje de respuesta que nos ha devuelto el servidor. En el caso de que hayamos enviado un mensaje GetAuthToken.xml, si el usuario se ha validado correctamente nos devolverá la siguiente respuesta:
run-cli-request:
[echo] -- Running CLI client to process request: xml\GetAuthToken.xml --
[java]
[java] CLIClient: request =
[java] <?xml version="1.0" encoding="UTF-8"?>
[java] <soap-env:Envelope xmlns:soap-env=
"http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:Header/><soap-env:Body>
<get_authToken xmlns="urn:uddi-org:api_v2" cred="testuser"
generic="2.0" userID="testuser"/></soap-env:Body>
</soap-env:Envelope>
[java] --------
[java]
[java] CLIClient: response =
[java] <?xml version="1.0" encoding="UTF-8"?>
[java] <soap-env:Envelope xmlns:soap-env=
"http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:Header/><soap-env:Body>
<authToken xmlns="urn:uddi-org:api_v2" generic="2.0"
operator="Sun Microsystems Inc.">
<authInfo>3793a3253793a32</authInfo></authToken>
</soap-env:Body></soap-env:Envelope>
[java] --------
BUILD SUCCESSFUL
Total time: 2 seconds
De aquí podremos copiar el código de authInfo, que podremos usar como código de autentificación de usuario en los próximos mensajes que enviemos, que requieran una autentificación.
Indri
La aplicación Indri se incluye con JWSDP 1.0.X, pero ha sido eliminada en la versión 1.1. Para invocar Indri deberemos ejecutar el siguiente comando:
registry-server-test run-indri // Windows registry-server-test.sh run-indri // Linux
Una vez hecho esto aparecerá la siguiente ventana:
En la parte izquierda de la ventana vemos dos listas que contienen la siguiente información:
En la parte superior de la ventana vemos una serie de campos, donde encontramos:
En la parte central de la pantalla tenemos el área de texto Node, donde se muestra el contenido XML del nodo seleccionado actualmente.
En la parte inferior vemos un área para mensajes de log, donde se indicará si las operaciones que realizamos se han realizado correctamente o se ha producido algún error.
En la barra de menú encontramos las siguientes opciones:
Para añadir datos al registro UDDI:
Para registrar un nuevo usuario:
MD5
El password que especifiquemos para los usuarios creados deberá estar encriptado con MD5. El script anterior nos da acceso a una herramienta para codificar nuestro password con MD5. Escribiendo
registry-server-test run-md5 -Dpassword=mi_password // Windows registry-server-test.sh run-md5 -Dpassword=mi_password // Linux
Donde especificamos como propiedad password el password que queremos codificar. Esto nos producirá una salida similar a la siguiente:
run-md5: [echo] -- Running md5 for auth -- [java] [java] The Value of the MD5 Hash is: ee43f1335fcc90fb BUILD SUCCESSFUL Total time: 1 second
De aquí podremos copiar directamente el valor MD5 de nuestro password. De esta forma, una vez generado este valor sólo tendremos que copiarlo y pegarlo en el campo password al registrar un nuevo usuario.
Weblogic incorpora un servidor de registro privado propio, que podremos utilizar para añadir datos que queramos que sean accesibles sólo de forma privada, como pueden ser por ejemplo datos de prueba, mientras probamos nuestras aplicaciones.
Para acceder a este registro privado podemos usar la herramienta UDDI Directory Explorer, a la que podemos acceder a través de nuestro servidor Weblogic mediante la dirección:
http://localhost:7001/uddiexplorer
Suponiendo que tenemos instalado Weblogic en nuestra máquina local, escuchando en el puerto por defecto 7001. Si queremos conectarnos a este registro en nuestros programas, las direcciones para la API de consulta y la de publicación son:
Estas direcciones son modificables desde la página de configuración del registro UDDI de WebLogic.
Una vez introducida la dirección de la herramienta UDDI Directory Explorer en el navegador, aparecerá la siguiente página:
En el menú de la izquierda nos ofrece las siguientes opciones:
Podremos seleccionar el registro donde vamos a realizar la búsqueda de una lista. Podremos añadir nuevos registros públicos a esta lista desde la página de configuración, como veremos más adelante. La búsqueda se podrá hacer por nombre de la organización, por clave, o por otros criterios según distintas clasificaciones.
La búsqueda se realizará de la misma forma que en el caso de registros públicos, con la diferencia de que no tendremos que seleccionar el registro en el que vamos a buscar.
Una vez hayamos introducido nuestro usuario de WebLogic, podremos publicar nuevos servicios o información de contacto mediante la siguiente página:
Podemos añadir un servicio o un contacto a una organización existente en el registro, seleccionando la organización entre una de las de la lista que se muestra, o bien introducir el nombre de una nueva organización, para que ésta sea introducida en el registro.
Aquí podremos eliminarlas, modificar su nombre, o bien añadir una nueva organización. Pinchando sobre el nombre de la organización podremos añadir o eliminar datos dentro de ella:
Aquí se podrá añadir o eliminar servicios o información de contacto a la organización, así como editar los existentes.
Podremos cambiar las URL de la API de consulta (Search URL) y de la API de modificación (Publish URL) del registro, así como añadir o eliminar registros públicos a la lista.