4.2 API JAXR
4.2.2 Gerenciamento dos registros UDDI
A seguir serão mostrados os passos para a criação, manutenção e consulta de registros UDDI usando um provedor de serviços. Para alguns exemplos é necessário fazer um cadastro para obter os dados do usuário e senha. Dois sites que podem ser usados para teste e que implementam a definição UDDI são: http://uddi.rte.microsoft.com e http://www- 3.ibm.com/services/uddi/v2beta/protect/registry.html.
4.2.2.1 Criando uma conexão
Inicialmente deve ser criada uma instância da classe ConnectionFactory. Depois
devemos especificar as URL, que serão usadas para criar a conexão com o provedor de serviços como um conjunto de propriedades. Essas URLs devem ser atribuídas à instância
ConnectionFactory para finalmente criar a conexão. Quando a conexão for feita com o uso
de um firewall, devemos especificar nas propriedades o host e a porta.
...
// criação da instância de ConnectionFactory
ConnectionFactory connFactory = ConnectionFactory.newInstance(); // definição das propriedades
Properties props = new Properties();
props.setProperty(“javax.xml.registry.queryManagerURL”, “http://www-3.ibm.com/services/uddi/v2beta/inquiryapi”); props.setProperty(“javax.xml.registry.lifeCycleManagerURL”, “http://www-3.ibm.com/services/uddi/v2beta/protect/publishapi”); props.setProperty(“javax.xml.registry.factoryClass”, “com.sum.xml.registry.uddi.ConnectionFactoryImpl”); // definição quando o cliente está atras de um firewall
props.setProperty(“javax.xml.registry.http.proxyHost”,”host.dominio”); props.setProperty(“javax.xml.registry.http.proxyPort”,”8080”);
//atribuição das propriedades connFactory.setProperties(props); // criação da conexão
Connection connection = connFactory.createConnection(); ...
4.2.2.2 Obtendo o objeto RegistryService
Depois da criação da conexão o cliente pode obter o objeto RegistryService que
dará acesso aos objetos BusinessQueryManager e BusinessLifeCycleManager para
permitir a consulta e a manutenção dos registros, respectivamente.
...
RegistryService rs = connection.getRegistryService();
// objeto para consulta no registro
BusinessQueryManager bqm = rs.getBusinessQueryManager(); // objeto para manutenção dos dados do registro
BusinessLifeCycleManager blcm = rs.getBusinessLifeCycleManager(); ...
4.2.2.3 Consultando registros
A interface BusinessQueryManager permite a consulta de registros baseados em
métodos que retornam um objeto BulkResponse, que é na verdade uma coleção de objetos.
Os métodos mais utilizados são:
findOrganization, retorna um conjunto de organizações que preenchem um
determinado critério, como por exemplo o nome;
findServices, retorna um conjunto de serviços oferecidos pela organização;
findServiceBinding, retorna as informação de acesso para um determinado serviço.
A seguir temos o exemplo de uma consulta de organizações usando como critério de pesquisa o nome:
...
// definir os critérios de pesquisa
Collection findQualifiers = new ArrayList();
FindQualifiers.add(FindQualifier.SORT_BY_NAME_DESC); Collection namePatterns = new ArrayList();
// procurar empresas que tenham a frase “web service” em qualquer posição NamePatterns.add(“%web service%”);
// aplicar os critérios ao BusinessQueryManager
BulkResponse response = bqm.findOrganization(namePatterns, null, null, null, null); // a resposta é uma coleção de objetos
Collection orgs = response.getCollection(); ...
Depois de encontrar as organizações é possível obter os serviços publicados e a sua forma de acesso. A seguir temos o trecho de um programa que permite a consulta de service
e de serviceBinding.
...
// obter os registros das organizações Iterator orgIter = orgs.iterator(); while ( orgIter.hasNext() ) {
Organization org = (Organization) orgIter.next(); Collection services = org.getServices;
// obter os serviços de cada organização Iterator svcIter = services.iterator(); while ( svc.hasNext() ) {
Service svc = (Service) svcIter.next();
Collection serviceBinding = svc.getServiceBinding();
// obter os serviceBinding de cada serviço Iterator sbIter = serviceBinding.iterator(); while ( sbIter.hasNext() ) {
ServiceBinding sb = (ServiceBinding) sbIter.next(); }
} } ...
4.2.2.4 Manutenção de registros
Para que um usuário possa criar, editar ou remover registros, ele deve possuir uma autorização que é obtida mediante um cadastro no provedor de serviços. No ato do cadastramento, o usuário informará o nome do usuário (username) e a senha (password) que permitirá ter acesso a manutenção dos registros. Estes dois parâmetros devem ser enviados para o provedor de serviços para conseguir uma autorização. Segue o trecho de um programa que tenta abrir uma conexão com autorização:
...
// definição dos dados da autorização String username = “nome_usuario”; String password = “senha_usuario”; // atribuindo os dados da autenticação
PasswordAuthentication passwdAuth = new PasswordAuthentication( username,
password.toCharArray() ); // abertura da conexão autenticada
Set creds = new HashSet(); creds.add(passwdAuth);
connection.setCredentials(creds); ...
A estrutura de dados mais complexa do registro UDDI é a organização. Ela é geralmente composta de: nome (name), descrição (description), chave (key), pessoa de contato (PrimaryContact), classificação (classification), serviços (service) e pontos de
acesso (serviceBindings). A seguir temos um exemplo de como adicionar dados a uma
estrutura do tipo Organization.
...
// Adicionando o nome e a descrição
Organization org = blcm.createOrganization("Andrés Web Service");
InternationalString s = blcm.createInternationalString("criação de web services"); org.setDescription(s);
// Adicionando o contato
User primaryContact = blcm.createUser();
PersonName pName = blcm.createPersonName("Andrés Menéndez"); primaryContact.setPersonName(pName);
TelephoneNumber tNum = blcm.createTelephoneNumber(); tNum.setNumber("(79) 234-5678");
Collection phoneNums = new ArrayList(); phoneNums.add(tNum);
primaryContact.setTelephoneNumbers(phoneNums);
Collection emailAddresses = new ArrayList(); emailAddresses.add(emailAddress);
primaryContact.setEmailAddresses(emailAddresses); // Adicionando o contato à organização
org.setPrimaryContact(primaryContact); ...
As organizações normalmente pertencem a uma ou mais classificações dentro de uma ou mais esquemas de classificação (taxonomia) [11]. O exemplo abaixo adiciona uma classificação usando a taxonomia NAICS (North American Industry Classification System).
...
// Adicionar o esquema de classificação NAICS
ClassificationScheme cScheme = bqm.findClassificationSchemeByName("ntis-gov:naics");
// criar a classificação
Classification classification = (Classification)
blcm.createClassification(cScheme, "Desenvolvimento de Software", "123456"); Collection classifications = new ArrayList();
classifications.add(classification); //adicionar a classificação
org.addClassifications(classifications); ...
Da mesma forma que o objeto Organization, o objeto Service possui um nome e
uma descrição, além disso possui o campo key que é gerado automaticamente quando o
serviço é inserido. Cada serviço pode ter um serviceBinding para informar como ele deve ser acessado, estas informações são compostas de uma descrição, uma URI e um link para maiores informações sobre o serviço. O seguinte exemplo mostra como adicionar um
service e um serviceBinding para uma organização.
...
// Criar o serviço
Collection services = new ArrayList();
Service service = blcm.createService("Reserva");
InternationalString is = blcm.createInternationalString("Reserva de Hotel"); service.setDescription(is);
// Criar o serviceBindings
Collection serviceBindings = new ArrayList();
ServiceBinding binding = blcm.createServiceBinding();
is = blcm.createInternationalString("Descrição da reserva do hotel"); binding.setDescription(is); binding.setAccessURI("http://hotel.com.br:8080/webservice"); serviceBindings.add(binding); // Adicionar o serviceBinding service.addServiceBindings(serviceBindings); // adicionar o serviço services.add(service); org.addServices(services); ...
Para poder adicionar uma organização no provedor de serviços devemos enviar uma solicitação usando o método saveOrganizations. A resposta é a chave do registro que foi
inserido ou uma exceção indicando o tipo do erro. No exemplo a seguir podemos ver como publicar os dados de uma organização.
...
// Publicar a organização
Collection orgs = new ArrayList(); orgs.add(org);
BulkResponse response = blcm.saveOrganization(orgs); // obter as possíveis exceções
Collection exceptions = response.getException(); // verificar se ocorreu alguma exceção
if ( exceptions == null ) { // obter a chave do registro
Collections keys = response.getCollection(); Iterator keyIter = keys.iterator();
if ( keyIter.hasNext() ) {
javax.xml.registry.infomodel.Key orgKey =
(javax.xml.registry.infomodel.Key) keyIter.next();
// obter a chave da organização Org.setKey(orgKey);
} } ...
Para remover os dados do registro é necessário passar como parâmetro a chave que foi retornada pelo método saveOrganization, para um dos métodos de remoção do BusinessLifeCycleManager: deleteOrganization, deleteService e deleteServiceBinding. No seguinte trecho de programa podemos ver a remoção de todos
os dados de uma organização.
...
// obter a chave da organização Collection keys = new ArrayList(); keys.add(key);
//remover a organização
BulkResponse response = blcm.deleteOrganization(keys); // obter as possíveis exceções
Collection exceptions = response.getException();
// verificar se ocorreu alguma exceção if ( exceptions == null ) {
... } ...