ABD 和资产的形式定义
“Asset-Based Development 正在开发软件解决方案,重用聚合的、归档软件构件,在某种程度上,只是利用之前的投资组织软件开发。通过重用资产和构件来解决复发问题,加快了开发速度并减少了成本和风险。”
“资产是向问题提供解决方案的相关构件的集合。资产在其可变点是可定制的,这意味着在资产中(更具体的说,在资产构件中)的那些位置是可定制的。”
ABD
流程包含四个关键阶段:资产识别、资产生产、资产管理和资产消耗。被认为是潜在资产的解决方案向前移入到了生产。资产生产的结果在存储库中作为资产存储和
管理,并且被客户重用。客户也可以提供反馈给资产生产和管理阶段,这有助于 ABD 流程成为一个自我完善的循环。
图 1. 基于资产的开发流程
IBM 为资产生产、消耗和管理提供一套构建 ABD 流程的产品,包括 Rational Software Architect、Rational Clear Case/Clear Quest 和 Asset Manager。
在套件中,Asset Manager 是资产管理解决方案,在 ABD
流程中处于中心地位。除了资产管理之外,还提供一个协作机制用于资产重用,一个本体系统(ontology
system)用于更好地进行资产分类,以及一个管理流程用于资产生命周期。应用程序需要同 Asset Manager 交互来加入 ABD 流程。
解决方案背景
Asset Manager 提供两种类型的用户接口(UI)。一个是本地的基于 Web 的 UI,另一个是嵌入基于 Eclipse
的开发工具(例如,Rational Software Architect 或 WebSphere Business Modeler)的
Asset Manager Rich Client 插件。插件提供与 Asset Manager
的无缝集成。然而一个真正的开发环境通常包含用于不同平台的多种开发和管理工具,而且用户对这些工具的操作风格和 UI
可能已经很熟悉了。目前,如果您使用的工具不是基于 Eclipse 的,您必须使用 Asset Manager 的 Web 接口同 ABD
Process 交互。
Asset Manager 也提供 API 将 Asset Manager 集成到其他应用程序。其中一个就是基于 Java 的二进制 API(在 参考资料
的 Asset Manager
InfoCenter 中获取关于集成的 API 和指南的详细信息)。然而,该 API
是一个特定于平台的实现,而其他非 Java 平台(例如 Microsoft® .NET Framework)不能从该 API
中获益。另一个是一个 Web 服务和 HTTP API,但是相对比较复杂。
本文讨论如何结合使用标准 Web 服务调用和 HTTP
请求来将 Asset Manager 集成到应用程序。尽管解决方案被证实是 Java 的,但是也能应用于其他平台。
Asset Manager 内容模型
资产内容是解决方案的实现。它包含在目录层次结构中组织的一组构件。层次结构与资产清单中的解决方案部分是一致的。
系统元数据是 Asset Manager 中所有资产实例共享的必要公共元数据。它包含资产类型、类别模式和相关类型。它也是操作资产时重要的信息。
连接 Web 服务和 HTTP API
Asset Manager 提供两个 API:Web 服务和 HTTP。Web 服务 API
可以访问系统元数据和资产清单,但是不能创建和更新资产清单和内容。HTTP API
可以检索、创建和更新资产内容,但是不能操作资产的已扩展数据和系统元数据。一个成功的 ABD
集成必须结合两个 API 的功能。
首先,您必须连接 API,两个 API 都使用 HTTP Basic Authentication 进行识别用户。因此请求被发送之前,确保在 HTTP 头部的用户名和密码是设置正确的。
HTTP API 使用 HTTP GET 请求来检索资产内容,使用 HTTP POST 请求来创建和更新资产内容。HTTP API 的端点是:
连接完成后,您就可以通过使用在 WSDL 中定义的操作来访问 Web 服务。在其他的平台上,例如 .NET 或 C++,您可以使用类似的技术来连接 HTTP 和 Web 服务 API。
访问清单和内容
这有两种格式可以访问一个资产清单。您可以通过 HTTP 接口检索整个清单 XML 文件连同资产内容,或者您也可以以一种面向对象的方式使用 Web 服务接口定义的方法。
使用 HTTP API 访问
HTTP API 提供更低级别的信息和对清单的完全控制,但是为了正确理解和修改清单,您必须熟悉 RAS,这种风格的一个优势是您可以访问资产内容和资产清单。这是非常有用的,因为对于创建和修改一个资产它们都是必须的。
要以这种风格访问,首先,您必须使用资产 ID 和资产版本作为参数发送一个 HTTP GET 请求。返回的响应是一个 ZIP
流,含有资产清单和资产内容。您可以将其保存到本地磁盘或使用标准 ZIP 工具来处理它。一个资产 ZIP 文件结构的样例如图 4 所示。
图 4. 一个样例资产的 ZIP 文件结构
一个资产 ZIP 文件包含资产清单文件(manifest.rmd)和构件。清单文件描述解决方案分类、使用和相关资产。图 5 显示了一个样例清单文件。
图 5. 一个样例资产清单文件
您可以使用标准 ZIP 和 XML 处理技术根据 RAS
来操作资产内容及其清单,这给您完全的资产控制,但是同时也意味着较少的直觉和更大的风险。例如,为了向资产添加一个分类术语,您必须在相应的
descriptorGroup 元素下添加一个 nodeDescriptor 元素,然而如果 descriptorGroup
不存在,您必须同时添加 descriptorGroup 和 nodeDescriptor 元素。(见 访问系统元数据
获取如何通过添加一个新 descriptorGroup 元素来检索所需信息。)为了向资产添加一个构件,您首先必须在 ZIP 文件中的正确位置添加该构件,然后向资产清单相应的解决方案部分添加一个构件实体元素。所有这些在核心资产文件上的修改必须遵从 RAS。
一个资产被创建或修改之后,您可以使用 HTTPS POST 请求向 Asset Manager 存储库提交新资产。HTTP POST
参数在 Asset Manager InfoCenter(见 参考资料
)中予以说明。
清单 1 说明了如何使用 HTTP 接口来访问一个资产。
清单 1. 使用 HTTP 接口访问资产
String http_location =
"https://9.125.62.227:9080/com.ibm.ram.repository.web.ws.was/RAMSecure/
RAMAssetAccess.jsp?assetID={C986918C-8E01-4039-6D94-D56E0B6E57A6}&version=0.9";
try {
// use the https get to get the asset content
InputStream is = HTTPHelper.getHTTPSContent(oneAssetHTTPLocation,
username, password);
ZipInputStream zis = new ZipInputStream(is);
ZipEntry zipEntry;
int len = 0;
String name = null;
byte[] buffer = new byte[512];
while ((zipEntry = zis.getNextEntry()) != null) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
name = zipEntry.getName();
while ((len = zis.read(buffer, 0, buffer.length)) != -1) {
out.write(buffer, 0, len);
}
out.flush();
entryMap.put(name, out.toByteArray());
out.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte[] mainfest = entryMap.get("manifest.rmd");
使用 Web 服务 API 访问
Web 服务接口对资产客户是友好的。它以一种面向对象的方式提供访问资产清单的对象和方法,并提供对资产已扩展元数据的完全控制。
连接到 Web 服务接口之后,您可以在 Asset Manager 中的资产上执行一个搜索,然后使用资产 ID 和版本来获取资产的元数据对象。元数据对象包含关于数据清单的必要信息。您可以调用 getManifest
方法来获取清单文件,与您在之前 manifest.rmd 文件中所用的方式一样,或者您可以调用关于资产元数据对象的方法来获取资产清单的对应部分。例如,您可以在资产清单中调用 getRelationships
方法来获取 relatedAsset 部分,调用 getArtifactsRoot
获取构件层次结构的根,然后递归调用 getChildren
方法来获取整体构件层次结构。
一些已扩展元数据,诸如用户标记和修改历史,也可以通过 Web 服务 API 检索和修改,更多 Asset Manager Web 服务 API 的信息,请参考 参考资料
。
清单 2 说明了如何使用 Web 服务 API。
清单 2. 使用 Web 服务接口访问资产
try {
//Get the asset metadata object
AssetSO asset = ramWebService.getAsset(assetID, assetVersion, true,
true, true, true, true, true, true, true, true, "zh_CN");
//Get the category schema list related to this asset object
CategorySchema[] categoryschemas=asset.getCategorySchemas();
for(int i=0;i<categoryschemas.length;i++){
CategorySchema oneCategorySchema=categoryschemas;
//OO Style Access: get the categories related to this asset
Category[] categories=oneCategorySchema.getCategories();
// Recursively retrieve the sub categories
for(int j=0;i<categories.length;j++){
Category oneSubCategory=categories[j];
SubCategory[] subCategories=oneSubCategory.getSubCategories();
//......
}
}
这有两个访问一个类别模式的方法。一个获得全部类别模式完整的 XML 描述,另一个是使用 Asset Manager Web 服务
API 的递归格式。为了检索一个类别模式的全部 XML 内容,首先,获取类别模式的 URL ,然后在模式 UI 上执行一个 HTTP
GET。一个类别模式的样例如图 6 所示。