科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道使用 JAX-RPC 访问 IBM WebSphere Service Registry and Repository

使用 JAX-RPC 访问 IBM WebSphere Service Registry and Repository

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文将向您介绍如何使用 JAX-RPC 访问 IBM WebSphere Service Registry and Repository Version 6.0。目标读者是已提供的 WebSphere Service Registry and Repository 客户端对其不合适的应用程序开发人员。

作者:ibm 来源:ibm 2007年10月6日

关键字: 技术 WEBSPHERE IBM 中间件

  • 评论
  • 分享微博
  • 分享邮件

引言

IBM® WebSphere® Service Registry and Repository(以下称为 Service Registry)包括一个支持使用 SOAP/HTTP 或 RMI/IIOP 来访问 Service Registry 的 Java™ 客户端,同时带有一个基于服务数据对象 (SDO) 2.0 的编程模型。也可以直接使用该客户端使用的 SOAP API,本文将说明如何使用 JAX-RPC 客户端来调用此 API。

本文首先说明如何查找描述 Service Registry 的接口的 Web 服务描述语言 (WSDL) 和 XML 模式文件(可以根据这些文件用特定编程语言生成客户端接口)。文中还包括用于说明如何生成 JAX-RPC 客户端的示例。

接下来将说明使用 Service Registry SOAP API 时涉及到的一些常规主题,并且还将介绍一些实用函数的来源,这些实用函数在使用 Service Registry 的 JAX-RPC 客户端时非常有用。

在介绍了实用函数之后,我们将提供一些示例来说明如何调用根据 WSDL 生成的每个 Service Registry 操作。

在开始学习本文之前,您应该对以下内容有很好的了解:

  • 使用 WebSphere 进行 Java 和 JAX-RPC 编程
  • Service Registry Information Center 中关于已提供的客户端和 SOAP API 的信息




回页首


检索 Service Registry SOAP API 的 WSDL 描述

第一步是获取 Service Registry SOAP API 的 WSDL 描述,以便您可以根据它生成 Java 客户端。要这样做,最简单的方法是使用运行 Service Registry 的 WebSphere Application Server(Service Registry 支持 WebSphere Application Server 6.0.2.x)实例的管理控制台。

请执行以下步骤:

  1. 启动承载 Service Registry 的 WebSphere Application Server 概要的管理控制台。
  2. 如果安全性处于启用状态,则输入用户 ID 和密码,并单击 Log in
  3. 单击 Applications
  4. 单击 Enterprise Applications
  5. 单击 ServiceRegistry
  6. 单击位于“Additonal Properties”下方的 Publish WSDL Files
  7. 单击 ServiceRegistry_WSDLFiles.zip
  8. 保存文件。
  9. 展开该文件,您将看到一个名为 ServiceRegistry.ear 的目录/文件夹
  10. 该目录/文件夹内有另一个名为 WSRRCoreSDO.jar 的目录/文件夹。
  11. 该目录/文件夹内有另一个名为 META-INF 的目录/文件夹。
  12. 该目录/文件夹内有另一个名为 wsdl 的目录/文件夹。

该目录/文件夹内有一组用于定义 Service Registry SOAP API 的 WSDL 和 XML 模式文件。您必须对如何使用 WebSphere 进行 Java 和 JAX-RPC 编程有很好的了解,并且您还应该阅读 Service Registry Information Center 中关于已提供的客户端和 SOAP API 的信息。

提示:请注意,在 wsrrSdoWS.wsdl 文件中,端点是 WebSphere Application Server 实例中的 Service Registry 的端点。





回页首


生成客户端

本文中的示例代码假设由 WSDL2Java 工具生成的缺省客户端是 WebSphere Application Server 的一部分。

要生成客户端,请执行以下操作:

  1. 转到 WebSphere Application Server 安装的 bin 目录。
  2. 运行 setupcmdline 并将 PATH 环境变量设置为 WAS_PATH 的值。
  3. 在包含 WSDL 和 XSD 文件的目录中,运行以下命令: WSDL2Java –a –r client wsrrSdoW.wsdl.

您将看到一些关于命名空间 commonj.sdo 的警告,但您可以忽略它们。

从命名空间到 Java 包的映射既可以由 WSDL2Java 命令的参数进行控制,也可以由映射文件进行控制。

生成的接口

根据 WSDL 生成的 Java 接口如下所示:

import com.ibm.serviceregistry.jaxrpc.commonj.sdo.DataGraphType;
import com.ibm.serviceregistry.jaxrpc.ws.QueryResult;
import com.ibm.serviceregistry.jaxrpc.ws.ServiceRegistryWebServiceException;

import java.rmi.RemoteException;

package com.ibm.serviceregistry.jaxrpc.ws;

public interface WSRRCoreSDOPortType extends java.rmi.Remote {
    public String create(DataGraphType datagraph) throws
        RemoteException, ServiceRegistryWebServiceException;

    public void delete(String bsrURI) throws
        RemoteException, ServiceRegistryWebServiceException;

    public QueryResult executeQuery(DataGraphType datagraph) throws
        RemoteException, ServiceRegistryWebServiceException;

    public QueryResult executeNamedQuery(String query) throws
        RemoteException, ServiceRegistryWebServiceException;

    public QueryResult executeNamedQueryWithParameters(String query,
                                            String[] parameters) throws
        RemoteException, ServiceRegistryWebServiceException;

    public DataGraphType retrieve(String bsrURI) throws
        RemoteException, ServiceRegistryWebServiceException;

    public DataGraphType retrieveWithDepth(String bsrURI,
                                           int    depth) throws
        RemoteException, ServiceRegistryWebServiceException;

    public void update(DataGraphType datagraph) throws
        RemoteException, ServiceRegistryWebServiceException;





回页首


实用工具

本部分说明一些用于简化 Service Registry SOAP API 的使用的实用函数。

创建 DataGraphType 的实例

portType 的某些操作会将 DataGraphType 的实例作为输入参数。在所有这些情况下,DataGraphType 实例的根对象是一个 WSRR 类型的实例。对于该实例,WSRR 类型具有以下两部分内容:

  1. 一个构件属性,包含要作为请求的一部分传递到 Service Registry 的对象。
  2. 一个根属性,包含构件数组中的对象的 bsrURI 值,该构件数组即请求将应用到的对象。

在创建多个文档的示例(下文将进行说明)中,如果您在一个创建请求中使用 DataGraphType 来创建与 Policy 文档关联的 WSDL 文档,则会将这两个文档添加到构件数组中,并且将 WSDL 文档的 bsrURI 值指定为 WSRR 实例(此实例是 DataGraphType 实例的根对象)的根属性。

在 Service Registry 中创建内容时,DataGraphType 实例中的对象必须是 GenericObjects 或 Document 的子类型的实例,并且无须为包含关系而担忧。

在调用 executeQuery 时,查询是唯一要传递的对象,因此,您同样不必为包含关系而担忧。

然而,在调用更新时,有可能要更新逻辑对象,在此情况下,有必要了解包含关系对构件数组的影响。只需将构件数组内的对象不包含的对象添加到该数组中即可。例如,如果更新调用是添加两个 WSDL portType 之间的关系,则只需将这两个 portType 添加到构件数组中,而无需将表示每个 portType 的操作的对象添加到数组中,因为这些对象包含在其中一个 portType 中。

下面是可用来创建 DataGraphType 实例的代码示例(给定将作为请求的一部分进行发送的对象(即构件)数组和请求将应用到的对象的 bsrURI 值)。

static DataGraphType createDataGraph(BaseObject[] objects,
                                     String rootID) {
    WSRR wsrr = new WSRR();
    wsrr.setArtefacts(objects);
    wsrr.setRoot(rootID);
    DataGraphType dg = new DataGraphType();
    dg.setWSRR(wsrr);
    return dg;
}

处理返回的 DataGraphType 实例

在处理从查询或检索操作返回的 DataGraphType 实例时,为数据图中的所有对象建立索引将非常有用。如上所述,由于只将数据图中的另一个对象不包含的对象添加到构件数组中,因此,仅了解构件数组中的对象是不够的。

以下代码处理 DataGraphType 实例,并通过跟踪构件数组内的每个对象中所有可能的包含关系来生成找到的所有对象的 HashMap。

static HashMap buildHashMap(DataGraphType dg) {
    HashMap hm = new HashMap();
    BaseObject[] topLevelObjects = dg.getWSRR().getArtefacts();
    mapArrayOfBaseObjects(hm, topLevelObjects);
    return hm;
}

private static void mapArrayOfBaseObjects(HashMap hm,
                                          BaseObject[] baseObjects) {
    int arrayLength = baseObjects.length;
    for (int i = 0; i < arrayLength; i++) {
        BaseObject baseObject = baseObjects[i];
        mapBaseObject(hm, baseObject);
    }
}

private static void mapBaseObject(HashMap hm, BaseObject baseObject) {
    String bsrURI = baseObject.getBsrURI();
    if (hm.get(bsrURI) == null) {
        hm.put(bsrURI, baseObject);
    }
    /*
     * Now follow containment relationships, recursing to add either a
     * single object or an array of objects as appropriate.
     */
    if (baseObject instanceof ComplexTypeDefinition) {
        ComplexTypeDefinition ctd = (ComplexTypeDefinition) baseObject;
        mapArrayOfBaseObjects(hm, ctd.getLocalAttributes());
    } else if (baseObject instanceof Export) {
        Export exp = (Export) baseObject;
        mapBaseObject(hm, exp.getExportBinding());
        mapArrayOfBaseObjects(hm, exp.getInterfaces());
    } else if (baseObject instanceof _import) {
        _import imp = (_import) baseObject;
        mapBaseObject(hm, imp.getImportBinding());
        mapArrayOfBaseObjects(hm, imp.getInterfaces());
    } else if (baseObject instanceof Module) {
        Module module = (Module) baseObject;
        mapArrayOfBaseObjects(hm, module.getImports());
        mapArrayOfBaseObjects(hm, module.getExports());
    } else if (baseObject instanceof WSDLBinding) {
        mapBaseObject(hm, ((WSDLBinding) baseObject).getSOAPBinding());
    } else if (baseObject instanceof WSDLMessage) {
        mapArrayOfBaseObjects(hm,
                         ((WSDLMessage) baseObject).getMessageParts());
    } else if (baseObject instanceof WSDLPort) {
        mapBaseObject(hm, ((WSDLPort) baseObject).getSOAPAddress());
    } else if (baseObject instanceof WSDLPortType) {
        mapArrayOfBaseObjects(hm,
                          ((WSDLPortType) baseObject).getOperations());
    } else if (baseObject instanceof WSDLService) {
      mapArrayOfBaseObjects(hm, ((WSDLService) baseObject).getPorts());
    }
}

在建立此 HashMap 后,只要在处理数据图时遇到 bsrURI 值,就可以通过查找 HashMap 中的 bsrURI 值很容易地找到相应的对象。

声明文档内容已更改

在更新文档内容时,有必要添加 SDO 更改摘要以表明内容已更改的事实并说明原始内容是什么。以下实用函数将必要的更改摘要添加到数据图中。在更改文档内容前应调用此函数。

提示:请注意,可以更改的是根文档的内容,并不是数据图中任何其他对象的内容。

static void declareRootDocumentContentChanged(DataGraphType dg) {
    if (dg != null) {
        Document doc = (Document) getRootObject(dg);
        if (doc != null) {
            ChangeSummaryType changeSummary = new ChangeSummaryType();
            changeSummary.setLogging(true);
            ObjectChangesType objectChanges = new ObjectChangesType();
            objectChanges.setKey("#" + doc.getBsrURI());
            ChangeSummarySetting changeSummarySetting =
                                            new ChangeSummarySetting();
            changeSummarySetting.setDataValue(doc.getContent());
            changeSummarySetting.setFeatureName("content");
            ObjectChangeValueType[] objectChangeValueTypes =
                                          new ObjectChangeValueType[1];
            objectChangeValueTypes[0] = changeSummarySetting;
            objectChanges.setValue(objectChangeValueTypes);
            ObjectChangesType[] objectChangesArray =
                                              new ObjectChangesType[1];
            objectChangesArray[0] = objectChanges;
            changeSummary.setObjectChanges(objectChangesArray);
            dg.setChangeSummary(changeSummary);
        } else {
            System.err.println("null doc");
        }
    } else {
        System.err.println("null dg");
    }
}

处理查询结果

所有与查询相关的操作都返回 QueryResult 类型的实例。QueryResult 实例包含一列 DataGraphType 实例,一个 DataGraphType 实例对应一个与查询条件匹配的对象。如果是属性查询,则每个 DataGraphType 实例都包含一组 UserDefinedProperty 实例,一个 UserDefinedProperty 实例对应查询中请求的一个属性。如果是 datagraph 查询,则每个 DataGraphType 实例都包含与查询匹配的对象的数据图。

以下代码说明如何访问 datagraph 查询的结果。

static void printQueryResult(QueryResult queryResult) {
    DataGraphType[] resultArray = queryResult.getDatagraph();
    if (resultArray != null) {
        System.out.println("Number of results: " + resultArray.length);
        for (int i = 0; i < resultArray.length; i++) {
            DataGraphType dg = (DataGraphType) resultArray[i];
            if (dg != null) {
                printRootObject(dg);
            } else {
                System.err.println("Null dg");
            }
        }
    } else {
        System.err.println("Null resultArray");
    }
}

static void printRootObject(DataGraphType dg) {
    BaseObject baseObject = getRootObject(dg);
    if (baseObject != null) {
        System.out.print("{");
        System.out.print(baseObject.getName());
        System.out.print(", ");
        System.out.print(baseObject.getNamespace());
        System.out.print(", ");
        System.out.print(baseObject.getVersion());
        System.out.println("}");
        if (baseObject instanceof Document) {
            System.out.println("content:");
            Document doc = (Document) baseObject;
            String documentContent = new String(doc.getContent());
            System.out.println(documentContent);
        }
    } else {
        System.err.println("Root object not found");
    }
}

static BaseObject getRootObject(DataGraphType dg) {
    BaseObject baseObject = null;
    WSRR wsrr = dg.getWSRR();
    if (wsrr != null) {
        String rootObjectID = wsrr.getRoot();
        if (rootObjectID != null) {
            if (!rootObjectID.equals("")) {
                HashMap hm = buildHashMap(dg);
                if (hm != null) {
                    baseObject = (BaseObject)(hm.get(rootObjectID));
                } else {
                    System.err.println("Root object not in HashMap");
                }
            } else {
                System.err.println("empty rootObjectID");
            }
        } else {
            System.err.println("null rootObjectID");
        }
    } else {
        System.err.println("null wsrr");
    }
    return baseObject;
}

返回数据图的根对象

以下代码返回数据图的根对象。

static BaseObject getRootObject(DataGraphType dg) {
    BaseObject baseObject = null;
    WSRR wsrr = dg.getWSRR();
    if (wsrr != null) {
        String rootObjectID = wsrr.getRoot();
        if (rootObjectID != null) {
            if (!rootObjectID.equals("")) {
                HashMap hm = buildHashMap(dg);
                if (hm != null) {
                    baseObject = (BaseObject)(hm.get(rootObjectID));
                } else {
                    System.err.println("Root object not in HashMap");
                }
            } else {
                System.err.println("empty rootObjectID");
            }
        } else {
            System.err.println("null rootObjectID");
        }
    } else {
        System.err.println("null wsrr");
    }
    return baseObject;
}





回页首


示例

本部分包括调用每个根据 WSDL 生成的 Service Registry 操作的示例。

创建单个文档

以下代码说明如何创建和填充 XMLDocument 实例。

提示:请注意,对于有关检索将成为文档内容的 byte[] 的部分,我们留给读者自己练习。应将位置属性的值设置为文档内容的位置。

private static XMLDocument createSingleXMLDocument() {
    XMLDocument doc = new XMLDocument();
    doc.setName("CreateSingleObjectTestDocument");
    doc.setNamespace("http://www.ibm.com/colgrave/WSRR/test");
    doc.setDescription("Single document created via JAX-RPC");
    doc.setLocation("…");
    UserDefinedProperty[] udps = new UserDefinedProperty[1];
    UserDefinedProperty udp = new UserDefinedProperty();
    udp.setName("UserDefinedPropertyOne");
    udp.setValue("ValueOne");
    udps[0] = udp;
    doc.setUserDefinedProperties(udps);
    try {
        byte[] content = …;
        if (content != null) {
            doc.setContent(content);
        } else {
            System.err.println("Got null content");
        }
    } catch (Throwable t) {
        t.printStackTrace(System.err);
    }
    return doc;
}

以上代码创建 XMLDocument 实例,然后在该实例上设置一些标准属性(名称、命名空间、描述和位置)。

以上代码还将用户定义属性添加到实例,并且说明了如何处理 Service Registry 中的每个对象几乎都可以具有的用户定义属性的数组。在此示例中,我们添加一个具有“ValueOne”值的名为“UserDefinedPropertyOne”的属性。

现在我们有一个文档实例,以下代码将说明如何将其保存到 Service Registry 中。

try {
    WSRRCoreSDOPortType wsrrCoreSDOPortType = ...;
    XMLDocument doc = // The code above;
    /*
     * Assign a temporary bsrURI value, which must begin with '_', to
     * the object so that we can refer to it, including referring to it
     * as the root object contained by the WSRR instance.
     */
    doc.setBsrURI("_1");
    BaseObject[] artefactArray = new BaseObject[1];
    artefactArray[0] = doc;
    DataGraphType dg = Utilities.createDataGraph(artefactArray, "_1");
    String bsrURI = wsrrCoreSDOPortType.create(dg);
    System.out.println("Returned bsrURI is " + bsrURI);
} catch (ServiceRegistryWebServiceException srwse) {
    System.err.println("Caught ServiceRegistryWebServiceException");
    System.err.println("message: " + srwse.getMessage());
} catch (Throwable t) {
    t.printStackTrace(System.err);
}

用于获取存根实例以调用 Service Registry 的代码取决于您的环境以及您是否需要为不同的端点提供 URL,因此上述代码省略了此代码。对 Utilities.createDataGraph 的调用将调用上一部分(标题为“创建 DataGraphType 的实例”)中显示的代码。这里,构件数组中只有单个对象,并且根值是一个临时的 bsrURI 值(因为根值会引用将在 Service Registry 中创建的内容)。

创建多个相关的文档

有多种方法可以通过对 Service Registry 的单次调用来创建多个文档。其中一种方法是将 GenericObject 用作一组文档的根,在此情况下,通过对创建操作的单次调用,将创建 GenericObject 和所有新文档(GenericObject 作为根对象)。只能用这种方法来影响依赖关系(如 WSDL 文档之间的依赖关系)的解析。

另一种方法是构造对象(这些对象之间具有用户定义关系)的数据图。下面是第二种方法的示例。

try {
    WSRRCoreSDOPortType wsrrCoreSDOPortType = ...;
    // Create document that will be the source of the relationship
    XMLDocument doc1 = createSourceDocument();
    // Create second document that will be the target of the relationship
    XMLDocument doc2 = createTargetDocument();
    // Now create the relationship between the two
    addRelationship(doc1, doc2);
    // Create the DataGraph with the source document as the root object
    BaseObject[] artefactArray = new BaseObject[2];
    artefactArray[0] = doc1;
    artefactArray[1] = doc2;
    DataGraphType dg = Utilities.createDataGraph(artefactArray,
                                                 doc1.getBsrURI());
    String bsrURI = wsrrCoreSDOPortType.create(dg);
    System.out.println("Returned bsrURI is " + bsrURI);
} catch (ServiceRegistryWebServiceException srwse) {
    System.err.println("Caught ServiceRegistryWebServiceException");
    System.err.println("message: " + srwse.getMessage());
} catch (Throwable t) {
    t.printStackTrace(System.err);
}

private static void addRelationship(XMLDocument sourceDocument,
                                    XMLDocument targetDocument) {
    UserDefinedRelationship udr = new UserDefinedRelationship();
    udr.setName("CreateMultipleObjectsTestRelationship");
    // Only one target
    String[] targets = new String[1];
    // Use the temporary bsrURI value to refer to the target object
    targets[0] = targetDocument.getBsrURI();
    udr.setTargets(targets);
    // Add the relationship to the source document
    UserDefinedRelationship[] udrs = new UserDefinedRelationship[1];
    udrs[0] = udr;
    sourceDocument.setUserDefinedRelationships(udrs);
}

在此示例中,创建两个文档的方式与前一个示例中创建单个文档的方式相同。一旦创建了文档,就可以调用 addRelationship 方法,以便将关系从第一个文档添加到第二个文档。对第一个文档调用创建操作时,正是此关系会引发创建第二个文档。

执行命名查询

执行命名查询是最容易的调用操作。以下代码说明如何调用 getAllXMLDocuments 命名查询。

try {
    WSRRCoreSDOPortType wsrrCoreSDOPortType = ...;
    QueryResult queryResult =
        wsrrCoreSDOPortType.executeNamedQuery("getAllXMLDocuments"); 
    Utilities.printQueryResult(queryResult);
} catch (ServiceRegistryWebServiceException srwse) {
    System.err.println("Caught ServiceRegistryWebServiceException");
    System.err.println("message: " + srwse.getMessage());
} catch (Throwable t) {
    t.printStackTrace(System.err);
}

对 Utilities.printQueryResult() 的调用将调用在上面有关处理查询结果的部分中显示的示例代码。

执行带参数的命名查询

可以对一些命名查询进行参数化。以下代码说明如何调用 getXSDDocument 查询,同时传入以下两个参数(要进行匹配的属性的名称和该属性的值),因此该示例查询具有名为“TrueOrFalseBO.xsd”的 XSDDocument。

try {
    WSRRCoreSDOPortType wsrrCoreSDOPortType = ...;
    // Query for an XSD Document with a specific name
    String[] parameters = new String[2];
    parameters[0] = "name";
    parameters[1] = "TrueOrFalseBO.xsd";
    QueryResult queryResult =
  wsrrCoreSDOPortType.executeNamedQueryWithParameters("getXSDDocument",
                                                      parameters);
    Utilities.printQueryResult(queryResult);
} catch (ServiceRegistryWebServiceException srwse) {
    System.err.println("Caught ServiceRegistryWebServiceException");
    System.err.println("message: " + srwse.getMessage());
} catch (Throwable t) {
    t.printStackTrace(System.err);
}

执行查询

如果没有合适的命名查询,则有可能会调用一个特定的查询,其中查询表达式是使用 XPath 进行描述的。

以下代码说明如何查询所有的 XMLDocuments。

try {
    WSRRCoreSDOPortType wsrrCoreSDOPortType = …;
    String query = "/WSRR/XMLDocument";
    GraphQuery gq = new GraphQuery();
    gq.setBsrURI("_1");
    gq.setQueryExpression(query);
    BaseObject[] artefactsArray = new BaseObject[1];
    artefactsArray[0] = gq;
    WSRR wsrr = new WSRR();
    wsrr.setArtefacts(artefactsArray);
    // Set the GraphQuery object as the root object.
    wsrr.setRoot("_1");
    DataGraphType dg = new DataGraphType();
    dg.setWSRR(wsrr);
    QueryResult response = wsrrCoreSDOPortType.executeQuery(dg);
    Utilities.printQueryResult(response);
} catch (Throwable t) {
    t.printStackTrace(System.err);
}

以上代码将创建 GraphQuery 实例并将 XPath 查询表达式设置为“/WSRR/XMLDocument”,对 Service Registry 中的任何 XMLDocument 实例进行匹配。临时的 bsrURI 值“_1”会分配到 GraphQuery 实例,即使并不会持久保留该值。这是因为我们仍需要将一个值设置为 DataGraphType 实例中包含的 WSRR 实例的根属性。

一旦创建并填充了 WSRR 实例,就会将它设置为 DataGraphType 实例的根对象并且会在此时调用 executeQuery 操作,由于这是 GraphQuery 实例,因此该调用会返回包含一组标准的 DataGraphType 实例的 QueryResult。

检索内容

为了从 Service Registry 检索对象,有必要知道其 bsrURI,因此,以下示例将说明如何发出 PropertyQuery 以便仅返回 bsrURI,然后,该 bsrURI 会在检索调用中使用。

try {
    WSRRCoreSDOPortType wsrrCoreSDOPortType = …;
    String bsrURI = queryDocID(wsrrCoreSDOPortType);
    if (bsrURI != null) {
      System.out.println("Attempting to retrieve document with bsrURI "
+ bsrURI);
        DataGraphType retrieveResult =
                                  wsrrCoreSDOPortType.retrieve(bsrURI);
        if (retrieveResult != null) {
            Utilities.printRootObject(retrieveResult);
        } else {
            System.err.println("null retrieveResult");
        }
    } else {
        System.err.println("null bsrURI");
    }
} catch (ServiceRegistryWebServiceException srwse) {
    System.err.println("Caught ServiceRegistryWebServiceException");
    System.err.println("message: " + srwse.getMessage());
} catch (Throwable t) {
    t.printStackTrace(System.err);
}

queryDocID 发出假设只与一个文档匹配的 PropertyQuery,返回该文档的 bsrURI,而要检索的正是该文档。queryDocID 方法的代码如下所示。

String bsrURI = null;
/*
 * Do a property query to retrieve the bsrURI of the document created
 * in CreateSingleObjectTest
 */
String[] uris = Utilities.queryMatchingURIs(wsrrCoreSDOPortType,
          "/WSRR/XMLDocument[@name='CreateSingleObjectTestDocument']");
if (uris != null) {
    if (uris.length == 1) {
        bsrURI = uris[0];
    } else {
        System.err.println("was expecting one bsrURI");
    }
} else {
    System.err.println("null uris");
}
return bsrURI;

该代码调用一个实用方法 (queryMatchingURIs),以便调用属性查询,同时传入要使用的 XPath 表达式,在此示例中,该表达式为:WSRR/XMLDocument[@name='CreateSingleObjectTestDocument']"。queryMatchingURIs 为已提供的 XPath 表达式建立 PropertyQuery,并指定要为每个与 XPath 表达式匹配的对象返回的 bsrURI 属性的值。queryMatchingURIs 方法的代码如下所示。

String[] results = null;
PropertyQuery pq = new PropertyQuery();
// Set temporary bsrURI value
pq.setBsrURI("_1");
pq.setQueryExpression(queryExpression);
/*
 * Add the user-defined property to the PropertyQuery object to declare
 * that we want the value of the bsrURI property of the matching
 * document(s) to be returned.
 */
UserDefinedProperty[] udps = new UserDefinedProperty[1];
UserDefinedProperty udp = new UserDefinedProperty();
udps[0] = udp;
udp.setName("TheNameIsUnimportant");
udp.setValue("bsrURI");
pq.setUserDefinedProperties(udps);
// Construct the DataGraph to represent the query and issue it.
BaseObject[] artefactArray = new BaseObject[1];
artefactArray[0] = pq;
DataGraphType dg = Utilities.createDataGraph(artefactArray,
                                             pq.getBsrURI());
try {
    QueryResult response = wsrrCoreSDOPortType.executeQuery(dg);
    // Now retrieve the bsrURI value of the document
    if (response != null) {
        DataGraphType[] resultDGs = response.getDatagraph();
        if (resultDGs != null) {
            if (resultDGs.length > 0) {
                results = new String[resultDGs.length];
                for (int i = 0; i < resultDGs.length; i++) {
                    DataGraphType resultDG = resultDGs[i];
                    if (resultDG != null) {
                        UserDefinedProperty[] resultUDPs =
                                     resultDG.getPropertyQueryResult();
                        if (resultUDPs != null) {
                         UserDefinedProperty resultUDP = resultUDPs[0];
                            results[i] = resultUDP.getValue();
                        } else {
                  System.err.println("Got null UserDefinedProperties");
                        }
                    } else {
                        System.err.println("null resultDG");
                    }
                }
            } else {
                System.err.println("Was expecting at least one DG");
            }
        } else {
            System.err.println("null resultDGs");
        }
    } else {
        System.err.println("executeQuery returned null");
    }
} catch (ServiceRegistryWebServiceException srwse) {
    System.err.println("Caught ServiceRegistryWebServiceException");
    System.err.println(srwse.getMessage());
}
return results;

更新内容

本部分将提供用于更新元数据和文档内容的代码示例。

更新元数据

以下代码是用于更新有关文档的元数据(将在此示例中更新描述)的示例。此代码假设已经知道要更新的文档的 bsrURI 值。检索文档,对描述进行更改,然后在 Service Registry 中更新文档。

try {
    WSRRCoreSDOPortType wsrrCoreSDOPortType = …;
    String bsrURI = …; // The bsrURI of the doc. to be updated.
    if (bsrURI != null) {
        DataGraphType retrieveResult =
                                  wsrrCoreSDOPortType.retrieve(bsrURI);
        if (retrieveResult != null) {
            BaseObject baseObject =
                               Utilities.getRootObject(retrieveResult);
            if (baseObject != null) {
       baseObject.setDescription("Description modified by UpdateTest");
                wsrrCoreSDOPortType.update(retrieveResult);
                System.out.println("Description updated successfully");
            }
        } else {
            System.err.println("null retrieveResult");
        }
    } else {
        System.err.println("null bsrURI");
    }
} catch (ServiceRegistryWebServiceException srwse) {
    System.err.println("Caught ServiceRegistryWebServiceException");
    System.err.println("message: " + srwse.getMessage());
} catch (Throwable t) {
    t.printStackTrace(System.err);
}

该代码使用实用方法来返回数据图的根对象,从而获取要更新的对象。

提示:由检索调用返回的 DataGraphType 实例可用于后续更新调用。

更新文档内容

以下代码是更新文档内容的示例。

try {
    WSRRCoreSDOPortType wsrrCoreSDOPortType = ...;
    String bsrURI = ...;
    if (bsrURI != null) {
        DataGraphType retrieveResult =
                                  wsrrCoreSDOPortType.retrieve(bsrURI);
        if (retrieveResult != null) {
            BaseObject baseObject =
                               Utilities.getRootObject(retrieveResult);
            Document doc = (Document) baseObject;
            if (doc != null) {
           Utilities.declareRootDocumentContentChanged(retrieveResult);
                Byte[] newContent = …;
                doc.setContent(newContent);
                wsrrCoreSDOPortType.update(retrieveResult);
            }
        } else {
            System.err.println("null retrieveResult");
        }
    } else {
        System.err.println("null bsrURI");
    }
} catch (ServiceRegistryWebServiceException srwse) {
    System.err.println("Caught ServiceRegistryWebServiceException");
    System.err.println("message: " + srwse.getMessage());
} catch (Throwable t) {
    t.printStackTrace(System.err);
}

删除内容

在删除内容时,必须知道 bsrURI 值,这一点与检索内容时类似。以下代码是删除对象的示例。

String bsrURI = null;
try {
    WSRRCoreSDOPortType wsrrCoreSDOPortType = …;
    bsrURI = queryDocID(wsrrCoreSDOPortType);
    if (bsrURI != null) {
        System.out.println("Attempting to delete document with bsrURI "
+ bsrURI);
        wsrrCoreSDOPortType.delete(bsrURI);
        System.out.println("Attempt was successful");
    } else {
        System.err.println("null bsrURI");
    }
} catch (ServiceRegistryWebServiceException srwse) {
    System.err.println("Caught ServiceRegistryWebServiceException");
    System.err.println("message: " + srwse.getMessage());
} catch (Throwable t) {
    t.printStackTrace(System.err);
}

queryDocID 方法与上面检索示例中的类似。





回页首


结束语

本文说明了如何根据 Service Registry API 的 WSDL 描述来生成 JAX-RPC 客户端。文中介绍了若干有用的实用方法,并且给出了一些用于调用每个方法的示例。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章