理解SDO的实现

  我们没有实现规范定义的所有内容

  ChangeSummary、sequence、静态接口API等功能我们没有实现

  SDO的实现关键点

  我们抛开SDO的API不谈,因为我们不是从接口的角度来分析SDO的实现。我觉得SDO的实现主要包括如下的内容:

  1、数据类型转换

  简单类型转换、普通的JavaBean转化为SDO等等,这是SDO能被用来处理异构系统之间数据传输的能力必要的基础

  2、XPath访问

  xpath大家很熟悉了,但特别的地方是实现对JavaBean对象使用xpath形式进行访问

  3、序列化

  SDO要在网络间传输,要实现序列化;普通的Java对象实现序列化是非常简单的,只要声明实现java.io.Serializable可以了。但SDO实现的是Externalizable接口,类完全负责序列化和恢复数据成员。

  4、数据更新(增、删、改、查)

  SDO本身是一个Tree形结构的,每个枝干、叶子节点都要能访问到

  5、特别属性的支持,如readonly属性、动态属性(OpenContent)的支持、约束

  readonly对数据更新有许多限制

  OpenContent对应的是xsd中定义的anyType属性类型,它能放置任何java对象,如果xsd中如果定义了约束,在将其转为SDO对象实例后,需要支持这种约束,但需要注意的是:这种约束只有在调用Validate的方法之后才会起作用,例如你定义某个字段的长度为10,在使用中之间set为20,普元的SDO实现不会进行检查这中约束,但调用SDOUtil.Validate方法来校验的时候,能检查到这种冲突。

  6、动态数据API的支持

  动态API使用的定义是common.sdo.DataObject类,使用studio的属性编辑器的时候可以看到。

  7、异常处理

  SDO规范中详细定义了数据运算的行为,当出错时该抛出什么异常,实际测试中我们发现抛出的异常都没有遵循规范来做

  测试时该重点考虑的地方

  1、数据类型及其兼容性的转换

  这不用说大家应该都知道,这是基本功能,也是实现其它特性的基础。如果从定义业务流(好像被改为了逻辑流?)/页面流的角度考虑,是利用属性编辑器的时候要考虑,SDO的数据类型与Java类型的映射关系

  2、复杂xpath的支持

  包括xpath多层、对象多层自引用嵌套;xpath的下标带数组形式

  3、对象的序列化/反序列化

  前面提到,SDO序列化实现的是Externalizable接口,类完全自己负责序列化和恢复数据成员,因此这应该是个测试的重点,如果从使用的角度来考虑,ajax调用会使用到这方面的功能;此外这会带来安全性的问题,例如:一个远程调用,当恶意的客户端返回一个与服务器端不同版本的序列化对象时,如果不妥当处理,会抛出ClassCastException,严重时会导致系统崩溃;还有恶意类读取和写入对象数据,造成敏感信息泄漏等等。不过目前SCA的版本似乎关注的安全性不多,安全性的问题似乎可以放一放,不过将来会应该会出的,像出来了WS后,要加一个WS-Security一样。

  还有,要考虑被测的SDO对象应包含所有的Java基本数据类型及其数组形式、复杂对象及其数组形式。

  4、opencontent属性的支持

  opencontent属性是xsd文件中定义的anyType了,需要注意的是由于opencontent属性的特别性,目前的实现保存opencontent属性是一个SDO对象共用一个List来保存的,而不是每个枝干、叶子节点下建一个。这种实现中比较特别的地方,可能会造成并发访问时出问题。实际测试中我们可以在页面流/逻辑流中大量地操作一个有opencontent属性的SDO对象,来模拟这种情况的发生。

  上述的描述可能展开的不够,如果有兴趣,不妨再进行更详细的探讨,先介绍到这吧。