管理注册中心数据
JAXR客户端可以提交数据到注册中心、修改现存的注册中心数据、以及从注册中心删除数据。JAXR客户端必须通过认证才能管理注册中心数据。只有已经向数据中心提交了数据的客户端才能够修改或删除它。
本节讲述了以下任务:
获得注册中心的授权
JAXR客户端通过连接上的一组证书发送它的用户名和密码到注册中心。提供者可能会使用这些证书与注册中心进行认证。
// Edit to provide your own username and password
String username = "";
String password = "";
// Get authorization from the registry
PasswordAuthentication passwdAuth = new PasswordAuthentication(username, password.toCharArray());
Set creds = new HashSet();
creds.add(passwdAuth);
connection.setCredentials(creds);
创建一个机构
A JAXR client creates the organization and populates it with the data before saving it. The Organization object is used to create an organization. This object includes the following objects:
JAXR客户端创建机构,并在保存它之前为其添入数据。使用Organization对象来创建机构,该对象中包含了以下对象:
一个Name对象
一个Description对象
一个Key 对象,代表注册中心唯一标识机构的ID。Key是由注册中心而不是用户生成的。
一个PrimaryContactObject -代表注册中心授权用户的用户对象。该对象包含以下关于授权用户的信息:
PersonName, TelephoneNumber, EmailAddress, 和/或PostalAddress
一组classification对象
Service对象及其相关的服务绑定对象
以下代码演示了如何使用Organization的方法创建一个机构:
// Create Organization in memory
Organization org = businessLifeCycleManager.createOrganization ("Sun Microsystems");
// Create User -- maps to Contact for UDDI
User user = businessLifeCycleManager.createUser();
PersonName personName = businessLifeCycleManager.createPersonName("Bob");
TelephoneNumber telephoneNumber = businessLifeCycleManager.createTelephoneNumber();
telephoneNumber.setNumber("650-241-8979");
telephoneNumber.setType("office");
Collection numbers = new ArrayList();
numbers.add(telephoneNumber);
EmailAddress email = businessLifeCycleManager.createEmailAddress("bob@sun.com", "office");
Collection emailAddresses = new ArrayList(); emailAddresses.add(email);
user.setPersonName(personName);
Collection telephoneNumbers = new ArrayList();
telephoneNumbers.add(telephoneNumber);
user.setTelephoneNumbers(telephoneNumbers);
user.setEmailAddresses(emailAddresses);
org.setPrimaryContact(user);
添加类别
机构一般属于一个或多个类别模式或分类体系中的一个或者多个类别。为了为一个机构在分类体系中指定类别,客户端首先使用BusinessQueryManager来定位分类体系。FindClassificationSchemeByName方法接收一组FindQualifier对象作为第一个参数,该参数也可以为空。
// Set classification scheme to NAICS
ClassificationScheme cScheme = bqm.findClassificationSchemeByName(null, "ntis-gov:naics");
然后,客户端创建一个类别。例如,以下代码为NAICS分类体系内的机构设定了类别。
// Create and add classification
Classification classification = (Classification) blcm.createClassification(cScheme, "Snack and Nonalcoholic Beverage Bars", "722213");
Collection classifications = new ArrayList(); classifications.add(classification); org.addClassifications(classifications);
服务也要用到类别,所以你可以使用相似的代码为Service对象添加类别。
使用分类体系
分类体系由ClassificationScheme对象表示。本节讲述了如何在以下方面使用JAXR实现:
定义分类体系
JAXR规范要求JAXR提供者能够添加用户自定义的、能被JAXR客户端使用的分类体系。Sun ONE Application Server的JAXR实现使用简单的基于文件的方法为JAXR客户端提供分类体系。这些文件在运行时刻,当JAXR提供者启动的时候被读取。
分类体系结构由JAXR预定义的Concepts DTD来定义,Concepts DTD在jaxrconcepts.dtd文件中被声明,同时也在jaxrconcepts.xsd文件中以XML schema的格式被声明。jaxrconcepts.xml文件包含了用于JAXR实现的分类体系。所有这些文件都包含在install_dir/share/lib/jaxr-impl.jar文件中。
为了添加用户自定义的分类体系,请执行以下过程:
在你将要访问的注册中心中为分类体系发布JAXRClassificationScheme元素,作为一个ClassificationScheme对象。例如,你可以发布ClassificationScheme对象到UDDI注册中心服务器。为了发布ClassificationScheme对象,你必须设定它的名称。你还要在已知的类别模式,例如uddi-org:types中,给模式指定一个类别。在下面的代码中,LifeCycleManager.createClassificationScheme方法调用的第一个参数就是名称。
ClassificationScheme cScheme = blcm.createClassificationScheme("MyScheme", "A Classification Scheme");
ClassificationScheme uddiOrgTypes = bqm.findClassificationSchemeByName(null, "uddi-org:types");
if (uddiOrgTypes != null)
{
Classification classification = blcm.createClassification(uddiOrgTypes,"postalAddress", "categorization" );
postalScheme.addClassification(classification);
ExternalLink externalLink = blcm.createExternalLink("http://www.mycom.com/myscheme.html","My Scheme");
postalScheme.addExternalLink(externalLink);
Collection schemes = new ArrayList();
schemes.add(cScheme);
BulkResponse br = blcm.saveClassificationSchemes(schemes);
}
//The BulkResponse object returned by the saveClassificationSchemes method contains the key for the classification scheme, which you need to retrieve
if (br.getStatus() == JAXRResponse.STATUS_SUCCESS) {
System.out.println("Saved ClassificationScheme");
Collection schemeKeys = br.getCollection();
Iterator keysIter = schemeKeys.iterator();
while (keysIter.hasNext())
{
javax.xml.registry.infomodel.Key key = (javax.xml.registry.infomodel.Key) keysIter.next();
System.out.println("The postalScheme key is " + key.getId());
System.out.println("Use this key as the scheme" + " uuid in the taxonomy file");
}
}
在XML文件中,定义一个与JAXR预定义Concepts DTD兼容的分类体系结构。在你的分类体系XML文件中输入ClassificationScheme元素,指定返回的主键 ID值作为id属性,并指定name作为name属性。例如,JAXRClassificationScheme元素的起始标签看起来好像下面这样(所有都在一行):
<JAXRClassificationScheme id="uuid:nnnnnnnn-nnnn-nnnn-nnnn- nnnnnnnnnnnn" name="MyScheme">
The ClassificationScheme id must be a UUID.
在你的分类体系XML文件中输入每个JAXRConcept元素,按顺序指定下面的四个属性。
a) id是JAXRClassificationScheme的id值,后面接着一个/ 分隔符,再接着是JAXRConcept元素的code
b) name是JAXRConcept元素的名称
c) parent是直接父元素的id(ClassificationScheme的id或者JAXRConcept的id)
d) code是JAXRConcept元素的code值
naics.xml文件中的第一个JAXRConcept元素好像下面这样(所有都在一行):
<JAXRConcept id="uuid:C0B9FE13-179F-413D-8A5B-5004DB8E5BB2/11" name="Agriculture, Forestry, Fishing and Hunting"
parent="uuid:C0B9FE13-179F-413D-8A5B-5004DB8E5BB2" code="11"></JAXRConcept>
想要添加一个用户自定义分类体系结构到JAXR提供者,请在运行客户端程序的时候指定com.sun.xml.registry.userTaxonomyFilenames属性。该命令行(都在一行)看起来好像下面这样,竖杠(|)作为文件分隔符:
java myProgram -DuserTaxonomyFilenames=c:\myfile\xxx.xml|c:\myfile\xxx2.xml
还可以在build.xml文件中使用<sysproperty>标签设定这个属性。或者,在程序中象下面这样设定这个属性:
System.setProperty ("com.sun.xml.registry.userTaxonomyFilenames", "c:\myfile\xxx.xml|c:\myfile\xxx2.xml");
指定邮递地址
JAXR规范定义了一个邮递地址作为结构化的接口,它具有street、city、 country等属性。UDDI规范却定义邮递地址作为一个自由格式的地址行集合,每行可能被赋予一个意义。为了映射JAXR的PostalAddress格式到一个特定的UDDI地址格式,你需要指定UDDI格式作为ClassificationScheme对象,然后在格式类别模式中的concept和JAXR PostalAddress类别模式中的comment之间指定语义对等关系。JAXR PostalAddress类别模式由Sun ONE Application Server的JAXR实现提供。PostalAddress对象含有以下字段:streetNumber、street、 city、 state、postalCode、和country。这些是按照ClassificationScheme指定的PostalAddressAttributes,在postalconcepts.xml文件中预定义的concept。
为了在JAXR邮递地址格式和其他格式之间指定映射关系,你需要设置两个连接属性。
javax.xml.registry.postalAddressScheme属性,它为连接指定了一个邮递地址类别模式。
javax.xml.registry.semanticEquivalences属性,它在JAXR格式和其他格式之间指定了语义对等关系。
首先,使用来自JAXRClassificationScheme元素(UUID)的id值来指定邮递地址模式。
// Set properties for postal address mapping using my scheme props.setProperty("javax.xml.registry.postalAddressScheme",
uuid:6eaf4b50-4196-11d6-9e2b-000629dc0a2b");
然后,指定从默认JAXR邮递地址模式的每个JAXRConcept元素id到IBM模式中对应元素id的映射。
props.setProperty("javax.xml.registry.semanticEquivalences",urn:uuid:PostalAddressAttributes/StreetNumber," +"urn:uuid:6eaf4b50-4196-11d6-9e2b-000629dc0a2b/StreetAddressNumber|" +
"urn:uuid:PostalAddressAttributes/Street," + "urn:uuid:6eaf4b50-4196-11d6-9e2b- 000629dc0a2b/StreetAddress|" + "urn:uuid:PostalAddressAttributes/City," + "urn:uuid:6eaf4b50-4196-11d6- 9e2b-000629dc0a2b/City|" + "urn:uuid:PostalAddressAttributes/State," + "urn:uuid:6eaf4b50-4196-11d6-9e2b000629dc0a2b/State|"+
urn:uuid:PostalAddressAttributes/PostalCode," + "urn:uuid:6eaf4b50-4196-11d6- 9e2b-000629dc0a2b/ZipCode|" +
"urn:uuid:PostalAddressAttributes/Country," + "urn:uuid:6eaf4b50-4196-11d6-9e2b-000629dc0a2b/Country");
使用这些属性创建连接之后,在发布机构之前,你可以创建一个邮递地址并把机构主要联系方式赋给它。
例如:
String streetNumber = "99";
String street = "Imaginary Ave. Suite 33";
String city = "Imaginary City";
String state = "NY";
String country = "USA";
String postalCode = "00000";
String type = "";
PostalAddress postAddr =
blcm.createPostalAddress(streetNumber, street, city, state, country, postalCode, type);
Collection postalAddresses = new ArrayList();
postalAddresses.add(postAddr);
primaryContact.setPostalAddresses(postalAddresses);
这时,如果邮递地址模式和查询的语义对等关系与发布时指定的一样,JAXR查询就可以使用PostalAddress方法检索出邮递地址。如果不知道以前是用何种邮寄地址模式来发布的邮递地址,你可以把它们当作一组Slot对象来检索。JAXRQueryPostal.java示例程序演示了如何这样做:
向机构添加服务和服务绑定
很多机构添加自己到注册中心是为了提供服务,所以JAXR为添加服务和服务绑定到机构提供了便利。
就象Organization对象一样,Service对象拥有一个名称和一个描述。仍和Organization一样,它也拥有在服务注册时,由注册中心生成的唯一主键。它可能还包含与其相关的类别。
服务通常还含有服务绑定,它提供了关于如何访问服务的信息。ServiceBinding对象通常含有一个描述信息,一个访问URI,以及一个规范链接,它在服务绑定和描述如何通过服务绑定使用服务的技术规范之间提供了一个链接。
以下代码演示了如何创建一组服务,添加服务绑定到服务,然后添加服务到机构。它指定一个访问URI但不指定规范链接。因为访问URI不是真实的,而且默认情况下JAXR为所有发布的URI检查有效性,所以绑定设置validateURI属性的值为false。
// Create services and service
Collection services = new ArrayList();
Service service = blcm.createService("My Service Name");
InternationalString is = blcm.createInternationalString("My Service Description");
service.setDescription(is);
// Create service bindings
Collection serviceBindings = new ArrayList();
ServiceBinding binding = blcm.createServiceBinding();
is = blcm.createInternationalString("My Service Binding " + "Description");
binding.setDescription(is);
binding.setValidateURI(false);
binding.setAccessURI("http://TheCoffeeBreak.com:8080/sb/");
serviceBindings.add(binding);
// Add service bindings to service
service.addServiceBindings(serviceBindings);
// Add service to services, then add services to organization
services.add(service);
org.addServices(services);