软件资产打包和消费方法和系统的制作方法

文档序号:6578193阅读:259来源:国知局
专利名称:软件资产打包和消费方法和系统的制作方法
技术领域
本发明涉及可重用资产(reusable asset)技术领域,更具体涉及一种资产打包和 消费方法和系统。
背景技术
可重用资产的消费可以使企业更好地响应迅速变化的市场和业务过程。从企业的 角度来说,可重用资产能够迅速地组装业务解决方案,并缩短产品推向市场的时间。从IT 的角度来说,可重用资产通过自动化和集成业务过程,可以极大地减少大规模项目开发的 复杂性,实现更大的灵活性,并加速解决方案的交付,从而为企业提供价值。OMG (Object Management Group)于 2005年 11 月公布的可重用资产规范(RAS) 2. 2 定义了打包可重用软件资产的标准方式。该规范定义了可重用软件资产的结构、内容和描 述,它试图通过一致的、标准化的打包减少资产重用过程中的磨擦,提高资产的可重用性。目前,已有若干工具厂商已在其工具中实现了目前发布的RAS XML模式 (schema)0例如,某些常用的遵循RAS 2. 2的资产管理产品包括三个主要部分资产储存库, web客户端和富客户端(eclipse)。它支持资产搜索、打包、消费、全生命周期管理。其中, 消费资产仅意味着下载资产,并获得工件(artifact)。尽管关于如何使用这些工件的指南 可能也被打包在资产中,但用户仍然需要阅读这些指南并手工执行消费步骤。OSTNet的产品AMS也符合RAS 2. 2。它包括三个主要部分AMSCodeCrawler,AMS FindIT,AMS Registry。AMS CodeCrawler提供了资产分析功能,例如发现依赖性、重复代 码等。在资产消费方面,该产品也仅仅是获取资产。BEA AquaLogic Enterprise Repository (Flush Line)遵循 RAS 2.2。它包含一 个储存库,并提供了资产的分类。对于资产打包,它是手工进行的。而对于资产消费,除了 从储存库中下载资产外,没有进一步的支持。LogicLibrary的支持RAS的产品是Logicdex。在该工具中消费资产也仅意味着 下载资产。在如上所述的现有的可重用资产解决方案中,在资产打包与资产消费之间缺乏关 联。也就是说,在打包时,仅仅将一组工件文件和清单文件打包的资产包中,而没有将该资 产的消费操作步骤及其上下文和可变参数等也打包在资产包中,这样,资产消费时需要在 简单的下载、复制之后进行复杂的人工定制,而无法实现消费操作的自动化。尽管也可能将 用于指导用户消费操作的文档打包在资产包中,但这仍需要在资产消费时由用户阅读该文 档,并人工执行各消费操作步骤。事实上,同一个可重用资产通常不能完全适合于不同的上 下文(客户、国家、业务领域等)。而当今的软件解决方案往往是一次性的。即使所谓“标 准的”软件解决方案也往往是来自实际开发项目的实例,而没有人定义该软件解决方案能 够如何随着不同上下文而变化。因此,在大多数情况下,当用户获取资产后,需要在组装过 程中手工进行繁复的修改。对于一些资产类型,用户需要执行重复的步骤来生成进一步的解决方案。这种手工做法不但十分低效,而且易错,从而降低了基于可重用资产的开发所可 能带来的好处。此外,尽管也可以考虑把消费操作的执行代码打包到资产中,从而可在消费时通 过执行这些代码来自动消费资产,但这要求资产打包者针对每一次资产打包编写消费操 作,这不但带来了繁重的开发工作量,而且降低了资产的可重用性。

发明内容
针对现有技术的上述和其他问题,提出了根据本发明的实施例的解决方案。在本发明的一个方面,提供了一种资产打包系统,包括获取模块,用于获得待打 包资产的工件,以及与资产类型或工件类型相关联的活动,其中所述活动包含用于执行资 产消费操作的执行代码;以及打包引擎,用于响应于从所述相关联的活动中选择了活动,将 所述选择的活动与所述工件打包到资产包中,其中,所述打包引擎在打包过程中生成并存 储关于资产包中的工件、活动以及工件与活动之间关联的元信息。在本发明的另一个方面,提供了一种资产消费系统,包括获取模块,用于获取资 产包和资产包元信息,其中所述资产包包含工件和与工件相关联的活动,所述资产包元信 息包括关于资产包中的工件和活动以及工件与活动之间关联的元信息,其中所述活动包含 用于针对所关联的工件执行资产消费操作的执行代码;消费引擎,用于通过读取和解释所 述元信息从而针对资产包中的所关联的工件执行资产包中的活动来消费该资产。在本发明的另一个方面,提供了一种资产打包方法,包括获得待打包资产的工 件,以及与资产类型或工件类型相关联的活动,其中所述活动包含用于执行资产消费操作 的执行代码;以及响应于从所述相关联的活动中选择了活动,将所述选择的活动与所述工 件打包到资产包中,其中,在打包过程中生成并存储关于资产包中的工件、活动以及工件与 活动之间关联的元信息。在本发明的另一个方面,提供了一种资产消费方法,包括获取资产包和资产包元 信息,其中所述资产包包含工件和与工件相关联的活动,所述资产包元信息包括关于资产 包中的工件和活动以及工件与活动之间关联的元信息,其中所述活动包含用于针对所关联 的工件执行资产消费操作的执行代码;以及通过读取和解释所述元信息从而针对资产包中 的所关联的工件执行资产包中的活动来消费该资产。


所附权利要求中阐述了被认为是本发明的特点的创造性特征。但是,通过参照附 图阅读下面对说明性实施例的详细说明可更好地理解发明本身以及其优选使用模式、目 标、特征以及优点,在附图中图1示出了根据本发明的实施例扩展的RAS模型;图2示出了符合该扩展的RAS模型的RAS XML模式的示例性表示;图3示出了根据本发明的实施例的系统体系结构;图4示出了根据本发明的实施例所产生的XML格式的配置文件的示例;图5示出了根据本发明的实施例所生成的清单文件的示例;图6示出了根据本发明的实施例的开发活动库的方法;
图7示出了根据本发明的实施例的资产打包方法;图8示出了根据本发明的实施例的资产消费方法。
具体实施例方式本申请中所使用的若干术语的含义如下软件资产简称资产,通常指任何能够重用的软件资源,比如源代码、网络服务描 述语言(WSDL)代码、解决方案、应用程序等;更具体地,是指在给定上下文中为问题提供解 决方案的工件的集合。工件工件是可由资产的生产者/消费者或工具创建、存储和操纵的软件工作产 品。工件或者是位于资产包(asset package)中的实际文件,或者代表包含至少一个作 为实际文件的子工件的逻辑实体。工件可以是需求文档、模型、源代码文件、部署描述器 (deployment descriptor)、测试用例或脚本等等。工件类型对工件的分类。例如可以将代表实际文件的工件按照文件类型(二进 制、纯文本等)进行分类。可以根据多种标准对工件进行不同粒度的分类。例如,可以将 WSDL文件分类为一种工件类型。活动活动是当应用资产时处理资产的消费者或工具所执行的操作。在本发明的 实施例中,活动包括可以被打包到资产包中的用于执行资产消费操作的执行代码及相关属 性定义。变化点变化点在资产中可以具有由资产消费者提供或定制的值的位置。在本发明的实施例中,变化点是变化点类型的实例,且可以包含由变化点类型定 义的识别代码及属性。识别代码用于从所关联的工件中识别出所有变化点值,资产消费者 可在消费资产时从中选择一个变化点值,作为该变化点的取值。变化点在定义活动的变化 点绑定规则时创建。在本发明实施例中,变化点又称为变化点实例。变化点类型具有某种相同特征的若干变化点实例属于同一个变化点类型。在本 发明的实施例中,变化点类型包括用于识别资产或工件中的所有变化点值的识别代码及相 关的属性定义。变化点值在消费资产时变化点实例的可能取值。变化点值是由变化点实例的识 别代码在工件中识别出来,并赋给变化点实例的。上下文上下文是指资产消费时的执行环境。可以在清单(manifest)文件中定义 很多上下文。工件可以声明其与多个上下文相关。资产包资产包是一组工件文件加上一个清单文件。清单文件是描述资产的元信息文件,它可以是由已知的RAS XML模式之一验证的 XML文件。本发明的发明人认识到针对一定类型的资产或工件往往会存在一些通用的消费 活动,例如从web服务接口生成中介模型(mediation model)、暴露一个数据库服务等等, 也会存在一些通用的变化点类型,并且这些类型的变化点实例是可以定位的,然而在现有 的RAS规范中,消费活动和变化点实例并没有与资产或工件的类型相关联,而是针对每一 个独立的资产。为此,本发明的一实施例对现有的RAS规范进行了扩展,从而提供了对于与 资产类型或工件类型相关的活动和变化点实例的支持。开发者可以针对不同的资产类型或
7工件类型开发通用的消费活动和变化点类型,并将其存储在储存库中。当资产的打包者要 打包资产时,他可以从与该资产的类型相关的活动中选择所需要的活动,并将所选择的活 动、活动所绑定的变化点实例及其上下文约束与工件一起打包到资产包中,并将资产包存 储到储存库中。在消费过程中,资产的消费者获取资产包,检验上下文并执行资产中被打包 的活动,同时为所绑定的变化点实例选定变化点值,从而获得用于构建自己的解决方案的 所有消费结果。本发明的实施例基于对RAS 2. 2规范中的核心RAS模型的扩展。该核心RAS模型 定义了 asset (资产)、profile (简档)、artifact (工件)、activity (活动)、context (上 下文)等类及其之间的关系。关于该RAS 2. 2规范及其核心RAS模型的详细说明,请参见 http://www. omg. org/docs/formal/05-11-02. pdf0图1示出了根据本发明的实施例扩展的RAS模型。如图所示,本发明的实施例对 RAS 2. 2规范的扩展可以包括(a)扩展了 ArtifactType (工件类型)类 201,增加了 name (名称)、suffix (后 缀)和description (描述)等属性,其中suffix属性用于标识来自文件资源的工件的类 型;(b)将Artifact (工件)类与Activity (活动)类之间的关联修改为 ArtifactType 与 Activity 类之间的关联 202 ;(c)添加了 VariabilityPointType(变化点类型)类203以描述变化 点实例的类型,该类包括id(标识)、name、identifier (识别器)、description, richTextDescription(丰富文本描述)等属性,其中identifier为该变化点类型的识别器 类的名称,该识别器类用于实现在相关工件或资产中查找属于该变化点类型的变化点实例 的所有值;(d)添加了 ArtifactType 类与 VariabilityPointType 类之间的关联 204。(e)将Activity类与VariabilityPoint (变化点)类之间的绑定 修改为Activity类与VariabilityPointType类之间的绑定,这是通过新增 加的VariabilityPointBindingRule(变化点绑定规则)类205实现的,该 VariabilityPointBindingRule 类包括 ruleName (规则名)、variabilityPointTypeID (变 化点类型标识)、description、required (是否必需)等属性;(f)添加了 ActivityParameter (活动参数)类206以描述活动的参数,该 ActivityParameter 类包括 name、description、defaultValue (缺省值)、required 等属 性;(g)添加了 ActivityContext (活动上下文)类207以描述活动的上下文, 该 ActivityContext 类包括 id、description、product (产品)、version (版本)、 richTextDescription 等属性。(h)添加了 Activity类与ActivityContext类之间的关系,这是通过新 增加的ContextExpression(上下文表达式)类208实现的,该ContextExpresion 具有operator (操作符)属性,该operator属性的类型为一个新增加的枚举类 LogicOperator (逻辑操作符)209,该枚举类LogicOperator具有如下固定实例And (与)、 Or (或)、Not (否)。通过 ActivityContext、ContextExpression 以及 LogicOperator 类可以实现活动的复杂的上下文限制。当然,以上描述的对RAS 2. 2规范的扩展仅仅是示例性说明,而不是对本发明的 限制。在本发明的一些实施例中,可以不包括以上多项扩展中的一个或多个,例如,可以不 包括上述扩展(c)-(h),或不包括(f)-(h),或不包括(g)-(h);可以包括更多、更少或不同 的类和属性。例如,还可以包括Activity类与AssetType (资产类型)类之间的关联,以及 图中未示出的VariabilityPointType类与AssetType类之间的关联,等等。此外,尽管本 发明的实施例是基于扩展的RAS规范实现的,但本发明的其他实施例也可以基于其他现有 的或未来开发的标准的或专有的资产管理规范来实现。图2示出了符合该扩展的RAS模型的RAS XML模式的示例性表示。该RAS XML 模式定义了 ArtifactType、VariabilityPointType、ActivityContext、AssetActivity、 ArtifactActivity、Activity> ActivityParameter、LogicalOperator 等类及其之间的关 系。如下所述的根据本发明的实施例的活动库开发系统可以根据该RAS XML模式来操作, 从而生成包含符合该扩展的RAS模型的活动、变化点类型、上下文、参数以及活动与变化点 实例、上下文、参数之间的绑定的活动库。根据本发明的实施例的资产打包系统也可以根据 类似的RAS XML模式来进行操作,从而生成符合该扩展的RAS模型的资产包。图3示出了根据本发明的实施例的系统体系结构。如图所示,根据本发明的实施 例的系统分为三个部分活动库开发系统310,资产打包系统320和资产消费系统330。其 中,活动库开发系统310用于开发针对特定资产类型或工件类型的活动和变化点类型,并 将活动、变化点类型及其元信息存储在活动库中以便由资产打包系统320使用;资产打包 系统320用于将从活动库中选择的活动与工件打包成资产;资产消费系统330用于消费打 包的资产。下面分别描述根据本发明的实施例的系统的这三个部分。如图所示,在本发明的一个实施例,提供了一种活动库开发系统310,该系统包括 创建模块311,以及配置模块312。创建模块311用于创建能够由资产打包系统320打包到资产包中的活动,以及能 够由资产打包系统320打包到资产包中的变化点实例所属的变化点类型。在本发明的实施 例中,活动包括用于执行资产消费操作的执行代码及相关属性定义,而变化点类型包括用 于识别资产或工件中的变化点位置的识别代码以及相关的属性定义。在本文中,所述执行 代码和识别代码可以是可由机器直接执行或者经过解释或编译等处理后执行的代码,包括 以任何一种语言编写的源代码、中间代码(例如Java字节码)或机器代码等。活动库开发者可通过在创建模块311的相应用户界面中设置活动的属性以及开 发活动的执行代码来创建活动。活动的属性可以是由如上所述且如图1所示的根据本发明 的实施例的扩展的RAS模型规定的。例如,活动库开发者可以在该用户界面中输入所要创 建的活动的名称,活动的类型(即是与工件类型关联的活动还是与资产类型关联的活动), 活动的实现类所在的包名及该实现类的类名等,根据本发明的实施例的创建模块311将据 此创建具有相应属性的活动。活动的执行代码通常是由活动的实现类实现的,且可由活动 库开发者在另一用户界面中编写。活动库开发者可根据活动的操作逻辑使用本领域中所知 的任何适当开发方法来开发活动的执行代码。不同类型的资产或工件所能应用的消费活动 是不同的。因此,可以针对不同类型的资产或工件来创建不同的活动及其执行代码。例如, 类型为WSDL文件的工件在消费时通常涉及生成网络服务客户端。因此,可创建针对WSDL
9文件工件类型的用于生成网络服务客户端的活动,该活动的执行代码将执行如下操作获 取WSDL文件,检查传入的参数,例如GMS或HTTP绑定,判断上下文是在什么环境,如果是在 WPS SCA环境下,则生成SCA模型对象,同时根据参数把模型对象属性按参数设置,最后生 成网络服务客户端并输出;如果判断上下文是其他环境,则执行其他相应的操作等。下面示出了活动的实现类的源代码的示例性结构1.public class CreateMediationFlowFromffSDL implements ITask{2.public IStatus execute (IProgressMonitor arg(), Activity argl)3. throw Exception {4. //T0D0 Auto-generated method stud5. return null ;6. }7____8.public IStatus setup(IProgressMonitor arg()){9. //T0D0 Auto-generated method stub10. return null ;其中的方法“execute”用于实现该活动的执行逻辑,用户可根据该活动在消费时 的具体操作在方法体中填入相应的执行代码;“setup”方法用于为该活动的执行进行准 备,例如检查资产消费的上下文是否适合该活动的执行等,用户可根据为该活动的执行所 需进行的准备在方法体中填入相应的执行代码。活动库开发者可通过在创建模块311的相应用户界面中设置变化点类型的属性 以及开发与变化点类型关联的识别代码来创建变化点类型。变化点类型的属性可以是由如 上所述且所图1所示的根据本发明的实施例的扩展的RAS模型规定的。例如,活动库开发 者可在该用户界面中输入所要创建的变化点类型的名称、该变化点类型的唯一标识、在该 变化点类型的识别器类所在的包名及该识别器类的类名等,根据本发明的实施例的创建模 块311将根据活动库开发者在该示例性用户界面中的输入创建具有相应属性的变化点类 型。与变化点类型关联的识别代码通常是由与变化点类型关联的识别器类实现的,且可由 活动库开发者在另一用户界面中编写。与变化点类型关联的识别代码用于在资产或工件中 识别出属于该变化点类型的变化点实例的所有变化点值,它可由活动库开发者根据变化点 值在资产或工件中的位置及识别方法使用本领域中所知的任何适当方法来开发。不同类 型的资产或工件所能应用的变化点类型是不同的。因此,可以针对不同类型的资产或工件 来开发不同的变化点类型。当然,也可以针对多种类型的资产或工件开发相同的变化点类 型。例如,假设为WSDL文件开发的变化点类型为operation,一个资产中包括类型为WSDL 文件的工件,并为该WSDL创建了属于该变化点类型的变化点实例,如果该工件中含有多个 operation,则每一个operation是该变化点实例的一个变化点值,且该变化点实例的识别 代码(即与该变化点类型关联的识别代码)将在该WSDL文件中找出所有的operation,即 所有的变化点值。下面示出了与变化点类型关联的识别器类的实现代码的示例性结构1.public class WSDL PortType Identifier implementsVPIdentifier{
2. public List getVariants(IFile file){3. //T0D0 Auto-generated method stub4. return null ;5. }6. public List getFilteredVariants(IFile arg(),String argl,String arg2)
{7. //TODO Auto-generated method stub8. return null ;9. }10____11.}其中“getVariants”方法用于从工件或资产中获得属于该变化点类型的变化点实 例的所有变化点值,用户可根据能够在工件或资产中识别该变化点实例的所有值的具体操 作逻辑在方法体中填入相应的执行代码; “getFilteredVariants"方法用于获得属于该变化点类型的变化点实例的所有经 过滤的变化点值,用户可根据能够在工件或资产中识别该变化点实例的所有变化点值并进 行所需过滤的具体操作逻辑在方法体中填入相应的执行代码。根据本发明的实施例,所述创建模块311还用于设置活动的参数。所设置的参数 对应于活动的执行代码中的相应方法或函数的参数。这样,当根据本发明的实施例的资产 消费系统310消费资产并执行资产包中的该活动时,可由用户提供或指定所设置的参数的 值,或者从资产消费的上下文中自动获得所设置的参数的值,并将该值提供给活动的执行 代码中的相应方法或函数。这样,该活动就能够根据用户提供的不同的参数值或不同的消 费上下文执行不同的操作,从而提高了活动的通用性和资产的可重用性。根据本发明的实施例,所述创建模块311还用于设置活动的变化点绑定规则, 所述变化点绑定规则将某个变化点实例绑定到活动,并对应于活动的执行代码在执行 过程中的某个位置(例如某个输入参数)。也就是说,该活动的执行代码在执行过程 中的该位置需要由外界提供的值,该值可以由该变化点实例的变化点值来提供。例如, 对于上述一个资产中包括类型为WSDL文件的工件的示例,假设为工件类型WSDL文件 创建的活动将在两个WSDL文件之间生成接口转换。而生成接口转换需要两个参数 inputOperation和outputOperation。这样,可以为该活动设置对应于该两个参数且名称 分别为inputOperation和outputOperation的两个变化点绑定规则,且这两个绑定规则均 绑定到属于变化点类型operation的变化点实例。这样,当消费该资产时,通过执行该活 动,从而执行所绑定的变化点实例的识别代码,可以找到WSDL文件中的所有operation,消 费者可以从中选择两个特定的operation,分别作为该活动的两个参数inputOperation和 outputOperation 的值。活动库开发者可通过在创建模块311的相应用户界面中为活动设置参数及其属 性,以及为活动设置变化点绑定规则及其属性,绑定规则将属于已开发的变化点类型的变 化点实例绑定到该活动,该变化点实例可在设置绑定规则并指定了变化点类型后根据该变 化点类型创建。参数的属性以及绑定规则的属性可以是由如上所述且如图1所示的根据本
11发明的实施例的扩展的RAS模型规定的。例如,活动库开发者可在该用户界面中为活动添 加一个或多个参数,并设置参数的名称、参数的类型(输入参数或输出参数)、简短描述、缺 省值、是否必需等属性。此外,活动库开发者还可在该用户界面中为活动添加一个或多个变 化点绑定规则,并设置绑定规则的名称、变化点类型标识、是否必需等属性,其中变化点类 型标识属性的值可以从已创建的变化点类型的标识中选择。创建模块311可以将已创建的活动、变化点类型、活动参数、变化点绑定规则及其 之间的关联存储到活动库中或其他位置。返回图3,配置模块312用于配置活动和变化点类型与资产类型或工件类型之间 的关联。活动库开发者可以通过所述配置模块312将存储在活动库中或其他位置的已创建 的活动和变化点类型与工件类型或资产类型相关联。可以将多个活动或多个变化点类型与 同一个工件类型或资产类型相关联,也将同一个活动或同一个变化点类型与多个工件类型 或资产类型相关联。仅作为示例,可以将这种关联存储在配置文件例如XML格式的配置文 件中。根据本发明的实施例,所述配置模块312还用于设置活动执行的上下文。所述 上下文例如可包括硬件平台、操作系统平台、其他相关的系统软件和应用软件、其他资产 等。可使用包括由AND、OR、NOT等逻辑操作符以及括号连接起来的多个上下文的上下文 表达式,来设置复杂的上下文。所设置的上下文例如可以符合如上所述且所图1所示的 根据本发明的实施例的扩展的RAS模型。例如,为一个活动设置的上下文表达式可以是 (OSffindowsXP)AND(RSA 6.1 OR WID 6. 1),其表示该活动只能在WindowsXP操作系统下且 安装了 RSA 6. 1或WID 6.1的环境下执行。根据本发明的其他实施例,也可以由所述创建 模块311来设置活动执行的上下文。例如,活动库开发者可以在根据本发明的实施例的配置模块312的相应用户界面 中从所列出系统所支持的工件类型列表(这些工件类型可以是由工件文件的后缀标识的) 中选择某一个工件类型,并从所列出的已创建的活动的列表中选择将与所选择的工件类型 相关联的活动,并由系统自动选择该活动所绑定的变化点实例。此外,活动库开发者可以在 根据本发明的实施例的相应用户界面中为所选择的活动创建和编辑上下文表达式。由配置模块312经过上述配置过程所产生的配置文件反映了资产类型或工件类 型与活动和变化点类型之间的关联、活动的参数及变化点绑定规则、活动的上下文等元信 息。配置模块312可以将该配置文件存储在活动库中,以及从活动库中获取已存储的配置 文件以及相关的活动和变化点类型,并在对活动和变化点类型及其与资产类型或工件类型 的关联进行更新之后,相应更新配置文件。也就是说,配置模块312可以通过该配置文件对 活动库进行维护,例如查找、增减、修改活动库中包含的活动和变化点类型以及其与资产类 型或工件类型之间的关联。该配置文件也可以由根据本发明的实施例的资产打包系统320 访问、使用和更新。图4示出了由根据本发明的实施例所产生的XML格式的配置文件的示例。如 图所示,该配置文件通过id为“1”的artifactType元素定义了一个工件类型,通 过该artifactType元素的子元素activities中的id分别为“0001”和“0002”的 子元素activity定义了两个活动,并定义了该两个活动与该工件类型的关联;通 过id为“2”的另一个artifactType元素定义了另一个工件类型;通过id为“001”
12的variabilityPointType元素定义了 一个变化点类型,并通过该元素中的属性 artifactType = ” 1”定义了该变化点类型与id为1的工件类型相关联;通过id分别 为“01”、“02”和“03”的三个activityContext元素定义了三个活动上下文;然后在 assetActivities元素中定义了 id为“0001”的活动属于资产类型的活动,并进一步定义 了该活动的参数和上下文,其中该上下文被定义为由上述活动上下文通过逻辑操作符的组 合;以及在artifactActivities元素中定义了 id为“0002”的活动与工件类型相关联的活 动,并进一步定义了该活动的参数和上下文,其中该上下文同样被定义为由上述活动上下 文通过逻辑操作符的组合。根据本发明的一些实施例,配置模块312的功能也可以由创建模块311来完成,这 样,就不需要单独的配置模块312 了。在这样的实施例中,可以在创建活动或变化点类型的 同时将所创建的活动或变化点类型与相应的工件类型或资产类型相关联。所述活动库既可以如图所示位于用于存储工件及资产的资产储存库之内,也可以 位于资产储存库之外且可由所述资产打包系统320访问的任何其他位置。以上描述了根据本发明的实施例的活动库开发系统310,应指出的是,以上描述仅 是对本发明的实施例的示例性说明,而不是对本发明的限制。例如,在本发明的一些实施例 中,该活动库开发系统310或其中的部分功能也可以由根据本发明的实施例的资产打包系 统320来完成,例如可以将创建模块311和配置模块312包括在资产打包系统320中,这 样就可以由资产打包系统320在创建了所需的活动和变化点类型并进行适当配置后,将活 动以及可能地变化点实例与工件一起打包到资产包中,而不再需要专门的活动库开发系统 310。如图3所示,在本发明的另一个方面,还提供了一种资产打包系统320,该系统包 括获取模块321,以及打包引擎322。获取模块321可用于获取工件以及与工件类型或资产类型相关联的活动,还可用 于获取活动所绑定的并与工件类型或资产类型相关联的变化点实例。获取模块321可以从 资产储存库或任何其他位置获取工件,并可以从活动库中或任何其他位置获取活动以及活 动所绑定的并与资产类型或工件类型相关联的活动的变化点实例。具体地,这可以通过首 先从活动库中获取反映资产类型或工件类型与活动和变化点类型之间的关联以及活动与 变化点实例之间的绑定的配置文件,并根据该配置文件查找与相应工件类型相关联的活动 以及所述活动所绑定的变化点实例来实现。打包引擎322用于创建资产,以及响应于用户选择的工件以及所选择的与资产类 型或工件类型相关联的活动,将资产、工件以及与所选择的与资产类型或工件类型相关联 的活动打包到资产包中。具体地说,打包引擎322可以根据用户在相应用户界面中输入的 资产属性创建资产,根据用户的选择从获取模块321获得将要包含在资产中的工件,以及 在用户界面中显示与资产以及用户所选择的工件的类型相关联的所有活动以便由用户从 中选择将要被打包到资产包中的活动,然后将所述资产、工件及活动打包到资产包中。当用 户所选择的活动具有变化点绑定时,打包引擎322还用于将活动所绑定的变化点实例也打 包到资产包中。在打包过程中,打包引擎322将根据用户的输入和选择以及工件、活动和可 能地变化点实例的属性生成关于所选择的工件、活动及可能地变化点实例的元信息,并将 该元信息存储在例如将被打包到资产包中的清单文件中。所述元信息例如可包括所选择的工件的属性、活动和变化点实例的属性及其与工件的关联等信息。换言之,资产打包者可 以根据已有工件、活动、变化点实例等相关信息,及其资产本身的重用要求定义资产的消费 步骤,消费步骤包含消费资产的活动之间的依赖关系、执行顺序等等,这些消费步骤以及工 件、活动、变化点实例的属性和关联信息构成资产的元数据,这些元数据在资产发布时成为 清单文件的一部分。根据本发明的一实施例,如果活动和变化点实例是与资产类型相关联的,则将所 述活动和变化点实例视为与该资产类型的资产中包含的每一个工件相关联,并在打包过程 中,生成所述活动和变化点实例与资产中每一个工件之间的关联的元信息。根据本发明的实施例,响应于判断需要打包的活动具有变化点绑定,打包引擎322 首先判断该变化点实例所属的变化点类型所关联的工件类型是否与该活动当前关联的工 件类型相一致,且只有当该判断为是时,才将该活动和该变化点实例打包到资产包中,而当 该判断为否时,不将该活动和该变化点实例打包到资产包中。这提供了一种验证机制,以便 将正确的工件、活动和变化点实例打包到资产包中。在本发明的另一些实施例中,当用户所选择的需要打包的活动具有变化点绑定 时,打包引擎322不是直接将变化点实例打包到资产包中,而是首先将该变化点实例应用 于该活动所关联的工件,即针对该工件运行该变化点实例的识别代码,从而生成该工件中、 该变化点实例的所有变化点值,然后将所述变化点值打包到资产包中。根据本发明的实施例,如果需要打包的活动具有参数,则所述打包引擎322还用 于生成关于所述参数及其与活动之间的关联的元信息,并将该元信息存储在例如将被打包 到资产包中的清单文件中。根据本发明的进一步的实施例,打包引擎322在生成关于所述 参数及其与活动之间的关联的元信息之前,还允许由用户对在活动库开发系统310中设置 的活动的参数进行进一步的限制,例如限制参数的取值范围,以适应当前资产的情况。根据本发明的实施例,该资产打包系统320还包括一可选的上下文设置模块323, 用于设置所述选择的活动的上下文。也就是说,该上下文设置模块323可以用于由用户 对在活动库开发系统310中设置的活动的上下文进行进一步的限制,以适应当前资产的情 况,并且所述打包引擎322在打包过程中还将经过进一步限制的活动的上下文的元信息存 储在例如将被打包到资产包中的清单文件中。根据本发明的实施例,打包引擎322在将多个活动打包到资产包中时,还可以用 于对这些活动进行排序,从而形成一定的活动流。打包引擎322还可用于设置这些活动之 间的输入输出关系,即将一个活动的输出参数设置为另一个活动的输出参数。打包引擎322执行的打包过程涉及根据代表前述扩展的RAS模型的RAS XML模式 生成包含关于资产中的各工件、活动、变化点实例或变化点值、参数、上下文等及其之间的 关系的元信息的清单文件,并将该资产中的各工件和清单工件打包到一个存档文件中。当 然,也可以将所述清单文件或元信息存储在资产消费系统330可访问的任何其他位置,例 如网络上的服务器上。如何由所述扩展的RAS模型生成所述RAS XML模式对于本领域的技 术人员来说是显而易见的。图5示出了由根据本发明的实施例的打包引擎322所生成的清单文件的示例。如 图所示,在该清单文件中,在第一个元素中定义了资产的根以及用于验证该清单文件的RAS XML模式文件的位置和版本。在〈assetManifest〉元素中定义了该清单文件的名称、标识等属性。在〈solution〉部分定义了该资产包含的各工件及工件所关联的变化点实例,其 中的〈artifact〉元素定义了工件及其名称和类型属性,〈reference〉元素定义了该工件在 资产包中的位置,<variabilityPoint>元素定义了该工件所关联的变化点实例及其属性, 〈description〉元素对该变化点实例进行了进一步描述,其中的〈variants〉定义了该变化 点实例可从中选择取值的变化点值,这些变化点值是通过针对该工件运行该变化点实例的 识别代码所生成的。在〈usage〉部分中定义了与工件相关联的活动及其变化点绑定,其中 <artifactActivity>元素中包括该资产中所有与工件相关联的活动,〈activity〉元素定 义了活动的名称、类型、所关联的工件等属性,<variabilityPointBinding>元素定义了该 活动的变化点绑定规则及其名称、所绑定的变化点实例等属性。如本领域的技术人员所知 的,该清单文件示例还可包含其他未示出的关于资产包中的工件、活动、变化点实例、活动 的参数、上下文及其之间的关联和绑定等元信息。根据本发明的实施例,该资产打包系统320还包括一可选的上载模块(未示出), 用于将已打包好的资产包上载到资产储存库中,以便由资产的消费者消费。当然,也可以将 资产包存储在可以资产消费系统访问的任何其他位置。返回图3,根据本发明的另一个实施例,还提供了一种资产消费系统330,包括获 取模块331,以及消费引擎332。获取模块331用于获取资产包,例如可以响应于来自用户的命令,从资产储存库 或任何其他位置获取由资产打包系统320生成的资产包。消费引擎332用于读取和解释资产包的元信息,并通过自动执行资产包中的活动 消费该资产,从而生成相应的解决方案。消费引擎332可响应于来自用户的资产消费命令, 通过解释资产包的元信息例如资产包中的清单文件获得资产包中的与资产或工件类型相 关联的活动,并自动执行所述活动。根据本发明的实施例,当资产包中的活动包括参数时,该消费引擎332还用于在 执行该活动时,接收为该活动的参数指定的参数值,从而定制该活动。也就是说,当消费引 擎332执行活动并判断该活动需要参数时,将自动显示用于指定参数值的用户界面,并响 应于用户在该用户界面中指定了相应的参数值,将该参数值传递给该活动的执行代码,这 样该活动就能够根据用户指定的不同参数值,执行不同的操作。根据本发明的实施例,当资产包中的活动包括变化点绑定时,该消费引擎332还 用于在执行资产包中的活动时,接收为该活动所绑定的变化点实例选定的变化点值,作为 该变化点实例的取值,从而定制该活动。也就是说,在执行资产包中的活动时,该活动所绑 定的变化点实例的识别代码也被执行,从而在资产的工件中找到若干变化点值,用户可以 从这些变化点值中进行选择,从而定制该活动。如果在资产包中已经包含了在打包过程中 生成的变化点值,则不必执行变化点实例的识别代码,而是由用户直接从这些变化点值中 进行选择。根据本发明的实施例,该资产消费系统330还包括如下可选模块上下文获取模 块333,以及上下文检验模块334。上下文获取模块333用于获取消费资产的当前上下文。上下文获取模块333可使 用本领域中所知的任何方法获取消费资产的当前上下文,所述上下文例如可包括当前硬件 平台、操作系统平台、其他相关的系统软件和应用软件、其他资产等。
15
上下文检验模块334用于检验所述当前上下文是否与资产包中的活动的上下文 匹配。具体地,上下文检验模块334可读取资产包的元信息中的活动的上下文表达式,并判 断当前上下文是否符合该上下文表达式。响应于当前上下文与资产包中的活动的上下文匹 配,所述消费引擎332执行该活动;而响应于当前上下文与资产包中的活动的上下文不匹 配,不执行该活动。以上描述了根据本发明的实施例的活动库开发系统310、资产打包系统320和资 产消费系统330,以应指出的是,以上描述及其中的大量细节仅为示例,而不是对本发明的 限制。在本发明的其他实施例中,所述系统可具有更多、更少或不同的部件,且各部件之间 的连接、包含等关系可以与描述的不同。例如,所述活动库开发系统310也可以位于所述资 产打包系统320之中,等等。所有这些变化都处于本发明的精神和范围之内。下面参照附图描述与以上活动库开发系统310、资产打包系统320和资产消费系 统330对应的根据本发明的实施例的开发活动库的方法,资产打包方法和资产消费方法。 为简明起见,在以下描述中省略了与以上重复的部分内容,因此可参照以上描述获得对根 据本发明的实施例的方法的更详细的了解。图6示出了根据本发明的实施例的开发活动库的方法。如图所示,该方法包括如 下步骤在步骤601中,创建针对特定资产类型或工件类型的活动。在步骤602中,创建针对特定资产类型或工件类型的变化点类型。在步骤603中,配置用于执行所创建的活动的上下文。在可选步骤604中,配置所创建的活动的参数及变化点绑定规则。在步骤605中,配置所创建的活动和变化点类型与资产类型或工件类型之间的关 联。在步骤606中,将所述活动,变化点类型,以及关于活动、变化点类型、可能地活动 的参数和变化点绑定规则、上下文以及活动和变化点类型与资产类型或工件类型之间的关 联的元信息存储在活动库中。图7示出了根据本发明的实施例的资产打包方法。如图所示,该方法包括如下步 骤在步骤701,获得待打包资产的工件,以及与资产类型或工件类型相关联的活动, 其中所述活动包含用于执行资产消费操作的执行代码。在步骤702,响应于从所述相关联的活动中选择了所需要的活动,将所述选择的活 动与所述工件打包到资产包中,其中,在打包过程中生成并存储关于资产包中的工件、活动 以及工件与活动之间关联的元信息。根据本发明的一实施例,该方法还包括将与资产类型或工件类型相关联的、所述 选择的活动所绑定的变化点实例打包到资产包中,其中,所述变化点实例包含用于在所关 联的工件中识别变化点值的识别代码;且其中,在打包过程中还生成并存储关于资产包中 的变化点实例及其与活动的绑定的元信息。作为另一种选择,不是将活动所绑定的变化点 实例本身打包到资产包中,而是首先针对活动所关联的工件应用该变化点实例,即执行该 变化点实例的识别代码,从而生成该工件中的所有变化点值,并将这些变化点值打包到资 产包中,例如将这些变化点值存储在所述清单文件中。
根据本发明的一实施例,在打包过程中还生成并存储关于资产包中的活动的参数 的元信息。根据本发明的一实施例,在打包过程中还生成并存储关于用于执行资产包中的活 动的上下文的元信息。根据本发明的一实施例,所述将所述选择的活动与所述工件打包到资产包中包括 将多个活动打包到资产包中;且其中,在打包过程中还生成并存储关于所述多个活动的执 行顺序及输入输出关系的元信息。图8示出了根据本发明的实施例的资产消费方法。如图所示,该方法包括如下步 骤在步骤801,获取资产包和资产包元信息,其中所述资产包包含工件和与工件相关 联的活动,所述资产包元信息包括关于资产包中的工件和活动以及工件与活动之间关联的 元信息,其中所述活动包含用于针对所关联的工件执行资产消费操作的执行代码。在步骤802,通过读取和解释所述元信息从而针对资产包中的所关联的工件执行 资产包中的活动来消费该资产。根据本发明的一实施例,所述资产包还包含与工件相关联的、且由资产包中的活 动所绑定的变化点实例,其中所述变化点实例包含用于在所关联的工件中识别变化点值的 识别代码;所述资产包元信息还包括关于所述变化点实例、以及其与活动的绑定的元信息; 以及在执行资产包中的活动时,通过针对所关联的工件执行所绑定的变化点实例的识别代 码获得所述工件中的变化点值,并将所选择的变化点值提供给该活动,从而定制该活动。当 然,如果资产包中已经包含了在打包阶段生成的变化点值,则不必执行变化点实例的识别 代码,而是直接从中选择变化点值,作为该变化点实例的取值,提供给该活动,从而定制该 活动。根据本发明的一实施例,所述资产包元信息还包括关于资产包中的活动的参数的 元信息;以及在执行资产包中的活动时,接收为该活动的参数指定的值,从而定制该活动。根据本发明的一实施例,所述资产包元信息还包括关于用于执行资产包中的活动 的上下文的元信息,且该方法还包括获取消费资产的当前上下文;判断所述当前上下文 是否与资产包中的活动的上下文匹配;响应于所述判断为是,执行该活动;以及响应于所 述判断为否,不执行该活动。以上描述了根据本发明的实施例的各方法,应指出的是,以上描述仅为示例,而不 是对本发明的限制。在本发明的其他实施例中,所述方法可具有更多、更少或不同的步骤, 且各步骤之间的顺序可以与描述的不同,或可以并行执行。本发明的实施例实现了如下及其他优点中的一个或多个通过将消费资产的活动和变化点实例打包到资产中,实现了资产消费的自动执行 和定制,避免了手工资产消费的低效和可能的错误;通过针对资产类型或工件类型开发通用的消费活动和变化点类型,可以共享这些 消费活动和变化点类型,这样,资产打包者只需要进行选择,而不需要具备编程的技能,极 大地减轻了资产打包者工作量,减少了资产打包中的重复工作;通过将通用的消费活动和变化点实例打包到资产包中,提高了资产包的可重用 性,扩大了其可重用的范围;
17
通过将所开发的通用的消费活动和变化点类型与资产类型或工件类型相关联,提 供了打包资产中的验证机制,确保了将正确的消费活动和变化点实例打包到资产中;通过定义消费活动的执行上下文,并将上下文与消费活动一起打包到资产中,实 现了上下文感知的资产重用,并提供了消费资产中的验证机制,确保了正确地消费资产。本发明可以硬件、软件、或硬件与软件的结合的方式实现。本发明可以集中的方式 在一个计算机系统中实现,或以分布方式实现,在这种分布方式中,不同的部件分布在若干 互连的计算机系统中。适于执行本文中描述的方法的任何计算机系统或其它装置都是合适 的。一种典型的硬件和软件的组合可以是带有计算机程序的通用计算机系统,当该计算机 程序被加载和执行时,控制该计算机系统而使其执行本发明的方法,并构成本发明的装置。本发明也可体现在计算机程序产品中,该程序产品包含使能实现本文中描述的方 法的所有特征,并且当其被加载到计算机系统中时,能够执行所述方法。尽管已参照优选实施例具体示出和说明了本发明,但是本领域内的那些技术人员 应理解,可在形式和细节上对其进行各种改变而不会背离本发明的精神和范围。
18
权利要求
一种资产打包系统,包括获取模块,用于获得待打包资产的工件、与资产类型或工件类型相关联的活动,其中所述活动包含用于执行资产消费操作的执行代码;以及打包引擎,用于响应于从所述相关联的活动中选择了活动,将所述选择的活动与所述工件打包到资产包中,其中,所述打包引擎在打包过程中生成并存储关于资产包中的工件、活动以及工件与活动之间的关联的元信息。
2.根据权利要求1的系统,其中所述打包引擎还用于将与资产类型或工件类型相关联的、所述选择的活动所绑定的变 化点实例打包到资产包中,其中,所述变化点实例包含用于在所关联的工件中识别变化点 值的识别代码;且其中,打包引擎在打包过程中还生成并存储关于资产包中的变化点实例及其与活动 的绑定的元信息。
3.根据权利要求1的系统,其中所述打包引擎还用于针对所述选择的活动所关联的工件,执行所述选择的活动所绑 定的变化点实例包含的识别代码,从而生成所述工件中的至少一个变化点值,并将所述至 少一个变化点值打包到资产包中,其中所述变化点实例包含的识别代码用于在所关联的工 件中识别变化点值;且其中,打包引擎在打包过程中还生成并存储关于资产包中的变化点实例及其与活动 的绑定的元信息。
4.根据权利要求1-3中任何一个的系统,其中所述打包引擎在打包过程中还生成并存储关于用于执行资产包中的活动的上下文的Ttlfn 息 ο
5.根据权利要求1-3中任何一个的系统,还包括创建模块,用于针对资产类型或工件类型创建活动和变化点类型;配置模块,用于配置用于执行所创建的活动的上下文以及所创建的活动和变化点类型 与资产类型或工件类型之间的关联;以及存储模块,用于将所述活动、变化点类型、以及关于所述活动、变化点类型、上下文及活 动和变化点类型与资产类型或工件类型的关联的元信息存储在活动库中。
6.一种资产消费系统,包括获取模块,用于获取资产包和资产包元信息,其中所述资产包包含工件和与工件相关 联的活动,所述资产包元信息包括关于资产包中的工件和活动以及工件与活动之间关联的 元信息,其中所述活动包含用于针对所关联的工件执行资产消费操作的执行代码;消费引擎,用于通过读取和解释所述元信息,从而针对资产包中的所关联的工件执行 资产包中的活动来消费该资产。
7.根据权利要求6的系统,其中所述资产包还包含与工件相关联的、且由资产包中的活动所绑定的变化点实例,其中 所述变化点实例包含用于在所关联的工件中识别变化点值的识别代码;所述资产包元信息还包括关于所述变化点实例、以及其与活动的绑定的元信息;以及该消费引擎还用于在执行资产包中的活动的过程中,通过针对所关联的工件执行所绑 定的变化点实例的识别代码获得所述工件中的变化点值,并将所选择的变化点值提供给该 活动,从而定制该活动。
8.根据权利要求6的系统,其中所述资产包还包含与工件相关联的、且由资产包中的活动所绑定的变化点实例的变化 点值,其中所述变化点值是通过在所关联的工件上应用所述变化点实例包含的用于在所关 联的工件中识别变化点值的识别代码而生成的;所述资产包元信息还包括关于所述变化点实例、以及其与活动的绑定的元信息;以及 该消费引擎还用于在执行资产包中的活动的过程中,通过将从所述变化点值中选择的 变化点值提供给该活动,从而定制该活动。
9.根据权利要求6的系统,其中所述资产包元信息还包括关于用于执行资产包中的活 动的上下文的元信息,且该系统还包括上下文获取模块,用于获取消费资产的当前上下文;上下文判断模块,用于判断所述当前上下文是否与资产包中的活动的上下文匹配; 且其中,所述消费引擎还用于 响应于所述判断为是,执行该活动。
10.一种资产打包方法,包括获得待打包资产的工件,以及与资产类型或工件类型相关联的活动,其中所述活动包 含用于执行资产消费操作的执行代码;以及响应于从所述相关联的活动中选择了活动,将所述选择的活动与所述工件打包到资产 包中,其中,在打包过程中生成并存储关于资产包中的工件、活动以及工件与活动之间关联 的元信息。
11.根据权利要求10的方法,还包括将与资产类型或工件类型相关联的、所述选择的活动所绑定的变化点实例打包到资产 包中,其中,所述变化点实例包含用于在所关联的工件中识别变化点值的识别代码;且其中,在打包过程中还生成并存储关于资产包中的变化点实例及其与活动的绑定的元信息。
12.根据权利要求10方法,还包括针对所述选择的活动所关联的工件,执行所述选择的活动所绑定的变化点实例包含的 执行代码,从而生成所述工件中的一个或多个变化点值,并将所述一个或多个变化点值打 包到资产包中,所述变化点实例包含的执行代码用于在所关联的工件中识别变化点值; 且其中,在打包过程中还生成并存储关于资产包中的变元信息 。
13.根据权利要求10-12中任何一个的方法,其中在打包过程中还生成并存储关于资产包中的活动的参数的元信息。
14.根据权利要求10-12中任何一个的方法,其中在打包过程中还生成并存储关于用于执行资产包中的活动的上下文的元信息。
15.根据权利要求10-12中任何一个的方法,还包括针对资产类型或工件类型创建活动和变化点类型; 配置用于执行所创建的活动的上下文;配置所创建的活动和变化点类型与资产类型或工件类型之间的关联;以及 将所述活动、变化点类型、以及关于所述活动、变化点类型、上下文及活动和变化点类 型与资产类型或工件类型的关联的元信息存储在活动库中。
16.一种资产消费方法,包括获取资产包和资产包元信息,其中所述资产包包含工件和与工件相关联的活动,所述 资产包元信息包括关于资产包中的工件和活动以及工件与活动之间关联的元信息,其中所 述活动包含用于针对所关联的工件执行资产消费操作的执行代码;以及通过读取和解释所述元信息从而针对资产包中的所关联的工件执行资产包中的活动 来消费该资产。
17.根据权利要求16的方法,其中所述资产包还包含与工件相关联的、且由资产包中的活动所绑定的变化点实例,其中 所述变化点实例包含用于在所关联的工件中识别变化点值的识别代码;所述资产包元信息还包括关于所述变化点实例、以及其与活动的绑定的元信息; 且该方法还包括在执行资产包中的活动的过程中,通过针对所关联的工件执行所绑定的变化点实例的 识别代码获得所述工件中的变化点值,并将所选择的变化点值提供给该活动,从而定制该 活动。
18.根据权利要求16的方法,其中所述资产包还包含与工件相关联的、且由资产包中的活动所绑定的变化点实例的变化 点值,其中所述变化点值是通过在所关联的工件上应用所述变化点实例包含的用于在所关 联的工件中识别变化点值的识别代码而生成的;所述资产包元信息还包括关于所述变化点实例、以及其与活动的绑定的元信息; 且该方法还包括在执行资产包中的活动的过程中,通过将从所述变化点值中选择的变化点值提供给该 活动,定制该活动。
19.根据权利要求16的方法,其中所述资产包元信息还包括关于资产包中的活动的参数的元信息; 且该方法还包括在执行资产包中的活动的过程中,接收为该活动的参数指定的值,从而定制该活动。
20.根据权利要求16的方法,其中所述资产包元信息还包括关于用于执行资产包中的 活动的上下文的元信息,且该方法还包括获取消费资产的当前上下文;判断所述当前上下文是否与资产包中的活动的上下文匹配; 响应于所述判断为是,执行该活动。
全文摘要
本发明的实施例提供了一种资产打包方法和系统。该资产打包系统包括获取模块,用于获得待打包资产的工件,以及与资产类型或工件类型相关联的活动,其中活动包含用于执行资产消费操作的执行代码;以及打包引擎,用于响应于从相关联的活动中选择了的活动,将选择的活动与工件打包到资产包中,其中,打包引擎在打包过程中生成并存储关于资产包中的工件、活动及其关联的元信息。还提供了相应的资产消费方法和系统,该系统包括获取模块,用于获取资产包和资产包元信息;消费引擎,用于通过读取和解释所述元信息从而针对资产包中的所关联的工件执行资产包中的活动来消费该资产。
文档编号G06F9/44GK101937336SQ20091013981
公开日2011年1月5日 申请日期2009年6月30日 优先权日2009年6月30日
发明者E·卡亨, R·P·尚瑟, 何蕾, 李东兵, 田晨, 翁长河, 赵勇 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1