具体实施方式
现在参考附图来描述本发明,贯穿附图,相同的标号用于指相同的元素。在以下描述中,为解释目的,陈述了众多具体细节,以提供对本发明的完整了解。然而,很明显,本发明可以不用这些具体细节来实施。在其它实例中,以框图形式示出了众所周知的结构和设备,以便于描述本发明。
如本申请中所使用的,术语“组件”和“系统”指的是计算机相关的实体,无论是硬件、硬件和软件的组合、软件还是执行中的软件。例如,组件可以是,但不限于,运行在处理器上的进程、处理器、对象、可执行码、执行线程、程序和/或计算机。作为说明,运行在服务器上的应用程序和服务器都可以是组件。一个或多个组件可驻留在进程和/或执行线程中,并且组件可位于一个计算机上和/或在两个或多个计算机之间分布。
如此处所使用的,术语“推断”或“推导”一般指从一组通过事件和/或数据捕捉的观察中推出或推断系统、环境和/或用户的状态的过程。例如,推断可用于标识特定的上下文或行动,或可生成状态的概率分布。推断可以是概率性的一即,基于数据和事件的考虑的感兴趣的状态的概率分布的计算。推断也可以指用于从一组事件和/或数据组成更高级事件的技术。这类推断导致从一组观察的事件和/或储存的事件数据构造新的事件或行动,无论事件是否在相邻的时间上相关,也无论事件是否来自一个或若干个事件和数据源。
定义
以下术语贯穿整个描述使用,此处提供了其定义以帮助理解本发明的各方面。
人为因素:工具公用地展示的任何数据项,使得其它工具可持有指向它的指针。每一人为因素必需是一种人为因素类型。每一人为因素必需由唯一且不变的人为因素标识符来标识。例如:源文件foo.cs、工作项125、来自构建20041205.3的测试结果。
人为因素消费者:非正式地而言,展示它所持有的对由人为因素提供者主持的人为因素的引用的工具或服务。更正式地而言,展示它所持有的对由人为因素提供者主持的人为因素的引用的服务。例如,C的工作项(其本身是人为因素)可持有对P的变化设置的引用,该变化设置是当工作项被处理时所登记的。在这一情况下,C是人为因素消费者,而P是人为因素提供者。人为因素消费者必须提供某 些标准行为。注意,由于在定义中链接是在两个人为因素之间的,因此人为因素消费者必须也是人为因素提供者。
人为因素标识符:特定人为因素的唯一、不变标识符的对象化版本(ArtifactUri)。人为因素标识符中的属性符合URI规则。
人为因素提供者:非正式地而言,一种工具或服务主持并展现人为因素消费者可链接到其上的人为因素。更正式地而言,它是展现人为因素的服务。例如,C通过web服务展现类型缺陷、要求和任务的人为因素,令其成为人为因素提供者。人为因素提供者必须提供某些标准行为。注意,由于在定义中链接是在两个人为因素之间的,因此许多人为因素提供者也可以是人为因素消费者。
人为因素代理:由广义人为因素提供者(GAP)储存的人为因素,它表示储存在启用了非集成服务的存储中的数据。
人为因素类型:工具公共地展现的数据的类型。特定人为因素类型的人为因素具有与该类型的其它人为因素的公用链接类型集。示例包括但不限于,源文件、缺陷、要求、测试结果和构建。
人为因素URI:符合格式良好的特定规则的统一资源标识符。集成服务(IS)Uri的同义词。
集成服务(IS):允许通过技术和约定的组合对松耦合且单独构建的非集成工具的简单数据集成的所揭示的轻便体系结构。尚未由IS体系结构启用的任何服务或工具被称为“非IS”或也被称为非集成。
IS名字空间:对应于启用IS的产品和人为因素的集合的名字空间,它可以被认为是“逻辑服务器”,其中,其物理元素可以分散跨越多个物理服务器。工具在安装时向IS名字空间注册它们本身,并且所有的工具都可通过IS位置表来访问。每一人为因素由一个IS名字空间拥有。
IS Uri:符合格式良好的IS专用规则的统一资源标识符。ArtifactUri的同义词。
外部标识符:在IS GAP的上下文中是有意义的。指某标识符未启用IS的工具将通过之引用人为因素。
广义人为因素提供商:IS GAP是提供了IS的设备,它启用了人为因素代理的构造,以向未完全启用IS的工具告知人为因素处理行为。
广义人为因素方案(GAS):用于描述人为因素集合的公用方案。每一人为因素包括其扩展的属性和它所持有的到其它人为因素的链接。
广义链接方案(GLS):用于描述链接的集合的公用方案。每一链接包括其 引用和被引用的ArtifactUri,以及其链接类型。
入站(inbound)链接:来自被引用的人为因素(即,被指向的人为因素)的观点的链接。到引用人为因素的入站链接可以使用用于人为因素消费者实现的标准GetReferencingArtifacts方法来发现。
链接:由人为因素消费者持有的指向人为因素的人为因素标识符。链接是二元的,并正好涉及两个人为因素,即引用人为因素和被引用的人为因素。当工具(人为因素消费者)持有对一个不同的人为因素的人为因素标识符时,形成链接。每一链接必须是一种链接类型。注意,格式良好的链接在两个人为因素之间,即在引用人为因素和被引用的人为因素之间。人为因素和非人为因素之间的指针不是链接。例如:在构建20041205.4中发现了程序错误125,其中,“程序错误”和“构建”是人为因素类型,而“在……中发现”是链接类型。
链接类型:描述该类型的链接的目的。可将人为因素的人为因素类型约束到可构造哪些有效链接。每一链接包括两个读数(或角色),每一个来自每一(出站和入站)方向。例如:在构建20041205.4中发现程序错误125,相应于构建20041205.4而被展示的程序错误125。
松耦合:在链接的上下文中,不需要人为因素提供者知道任何人为因素消费者的行为质量。例如,当人为因素提供者使用IS跨服务(cross-service)反转查询工具发出引用反转查询时,IS依照对所有人为因素公用的方案返回一组引用。
出站链接:来自引用人为因素(即,指向某一其它人为因素的人为因素)的观点的链接。到被引用的人为因素的出站链接由人为因素提供者实现所需的标准GetArtifacts方法返回。
引用反转(也称为反转查询):一般而言,引用反转是发现什么项目持有指向(引用)特定项目的指针的过程。在IS中,它是发现哪些引用人为因素持有到特定被引用者的链路的过程。
被引用的人为因素:用于链接的上下文中。被引用的人为因素是引用人为因素所指向的链接的一侧。被引用的人为因素总是由人为因素提供者主持。
引用(或参考)人为因素:用于链接的上下文中。引用人为因素是持有对被引用的人为因素的引用的链接的一侧。它由人为因素消费者主持。
紧耦合:在链接的上下文中,需要人为因素消费者知道关于人为因素提供者的特定知识的行为质量。例如,如果提供者提供一种专用的引用反转方法(可能包括特殊的过滤器或传递回主题消费者特别感兴趣的特定信息)并且消费者利用其优 势,则该交互被称为是紧耦合的。
工具专用Id(TSId):格式良好的IS Uri的最终部分。工具实例、人为因素类型和工具专用Id的组合必须在IS名字空间中是唯一的。此外,TSId必须是不变的。
现在参考图1,示出了本发明的系统100。为本描述的目的,仅提供了两种非集成工具(或服务,但是在后文总称为工具):第一工具102和第二工具104。然而,可以理解,可以有任意数量的非集成工具可用,它们被启用以通过采用依照本发明的一个或多个接口来交互。在本实现中,第一工具102是指定的提供者,而第二工具是消费者。由于两个工具(102和104)都是非集成工具,因此本发明的接口便于展示这些工具(102和104)的数据,如可以用集成工具所完成的。所展示的数据是人为因素以及到这些人为因素的引用的形式。作为支持,人为因素提供者接口106(例如,以应用编程接口API的形式)用便于展示第一工具102的一个或多个人为因素108(表示为人为因素1、人为因素2、……、人为因素N)的第一工具102来实现。第二工具104将被指定为人为因素108的消费者。依照本发明,提供了展示可引用第一工具102的一个或多个人为因素108的第二工具104的一个或多个引用112(表示为引用1、引用2、……、引用M)的人为因素消费者接口110。
第一工具102的人为因素108通过链接组件114与第二工具104的引用112相关联。这一链接组件可以是消费者接口110的一部分;然而,这并非所需。链接组件114定义了一种链接,它包括指向人为因素108的至少一个的人为因素标识符。链接是一种链接类型,并且是二元的,其中它涉及两个人为因素:引用人为因素和被引用的人为因素。
由此,所揭示的体系结构包括用于启用先前未被构建成集成的工具之间的集成的一组API和约定。这提供了工具的基于服务器的合伙者集成和客户机集成的基础,并可方便构建第三方生态系统(ecosystem)的基础。
现在参考图2,示出了依照本发明的过程的流程图。尽管为了简化解释的目的,此处例如以流程图形式示出的一个或多个方法被示出和描述为一系列动作,然而可以理解和明白,本发明不由动作的顺序所限制,因为依照本发明,某些动作可以用不同的顺序和/或与来自此处所示出和描述的其它动作一起发生。例如,本领域的技术人员可理解和明白,方法可以替换地被表示为诸如状态图中的一系列相关的状态或事件。此外,并非需要所有示出的动作来实现依照本发明的方法。
在200,非集成工具可被使用,但仍不可用作集成工具。在204,人为因素提 供者API与工具之一一起使用,以展示其人为因素以供公共使用。在206,在另一工具上采用人为因素消费者API来展示与该人为因素相关联的引用。在208,将引用链接到人为因素,令工具集成。过程然后到达停止块。
现在参考图3,示出了消费者和提供者的链接方案300,以及引用和被引用的人为因素关联。认为因素提供者302可创建并展现多种不同类型的URI(统一资源标识符),用于至少支持以下实体:松耦合的基于服务器的交互、松耦合的客户机、高速缓存和紧耦合交互,它们都按与调用者的合约支持任一人为因素专用功能。如图所示,提供者302创建被引用的人为因素的URI,它便于展示人为因素专用数据。人为因素消费者304持有到被引用的人为因素的链接、以及到引用人为因素的URI,它展现了人为因素专用数据。与该链接在一起的是链接类型。到被引用的人为因素的URI支持松耦合的交互和紧耦合的交互,其中,后者支持与调用者的合约的任一人为因素的专用功能。从消费者304到提供者302建立链接306,以向消费者304展示人为因素数据。注意,链接的使用既不局限于所揭示的URI表示的结构,也不局限于该URI,一般而言,它只是任一类型的链接机制。现在参考图4,示出了便于呈现人为因素依赖性的用户界面(UI)400。UI400可用于显示来自己注册的链接定义的链接类型信息402、来自己注册的人为因素定义的人为因素类型信息404、来自GetArtifact的人为因素名字信息406、以及来自GetArtifact的最后一次修改的信息408。
本发明的主要元素包括以下内容。持久数据包括人为因素元数据、链接实例和人为因素/链接实例高速缓存信息。对于人为因素元数据,为参与链接服务,每一人为因素提供者注册它所提供的每一人为因素的人为因素类型,并注册那些人为因素的每一个可主持的链接类型。对于链接实例(广义人为因素提供者数据库),对于其中很难或不方便本地储存链接的那些工具,所揭示的链接体系结构包括一种“广义人为因素提供者”实现。高速缓存便于高速缓存人为因素及其链接,以优化查询性能。
公用格式和方案包括人为因素ID、广义人为因素方案(GAS)、广义人为因素数据库方案(GADS)。人为因素ID是不变且唯一的构造关键字。它通过由人为因素提供者提供的服务来展示,并被具体化为URI。GAS是一种公用且简写的形式,其中,任一人为因素连同其出站链接一起可通过广义请求来返回。GADS启用了以广义人为因素方案形式呈现的人为因素和链接的储存。它被用作广义人为因素提供者和人为因素/链接高速缓存的方案。
本发明的体系结构也包括用于启用了链接的人为因素提供者的API和约定。该API由参与集成的每一工具或服务实现。GetArtifacts(获取人为因素)方法基于人为因素ID的串返回1:m个广义人为因素方案格式的人为因素。通过约定,每一GetArtifact实现向返回符合广义人为因素方案的人为因素的链接高速缓存管理器(以及该环境中的其它工具)引发Artifactchanged(人为因素改变)事件。SynchronizeArtifactCache(同步人为因素高速缓存)方法通过引发类似于ArtifactChanged的事件向高速缓存同步地报告人为因素。
该体系结构也包括用于启用了链接的人为因素消费者的API。该API必须由参与链接并持有到其它人为因素的链接的每一工具或服务来实现。GetReferencedArtifacts(获取被引用的人为因素)方法返回指向提供的一组广义人为因素方案格式的人为因素ID的人为因素列表。
还提供了用于链接管理器的API。GetArtifacts方法返回可能来自多个提供者的广义人为因素方案格式的一组人为因素。如果启用了人为因素/链接高速缓存,则从其导出答复,否则就忽略,在后一情况下,提供者单独地查询并且总计它们的响应。GetReferencedArtifacts方法返回可能来自多个提供者的人为因素列表,它们指向所提供的一组广义人为因素方案格式的人为因素ID。SynchronizeArtifactCache方法调用每一工具的SynchronizeArtifactCache方法,用于全高速缓存同步。
该体系结构提供了用于广义人为因素提供者(GAP)的API。来自人为因素提供者API的所有方法由GAP实现。来自人为因素消费者API的所有方法由GAP实现。UpdateArtifactData(更新人为因素数据)方法将广义人为因素方案格式的人为因素推入GAP数据库中。GetArtifactsByExternalID(按照外部ID获取人为因素)方法启用了按照标识符的GAP数据库查询,该标识符可能不符合ArtifactID,但是可由底层的工具理解。
提供了一种可再次主持(re-hostable)的UI,用于显示人为因素间的引用。
格式良好的IS URI
人为因素标识符由格式良好的IS Uri构成。每一IS Uri由人为因素提供者形成。尽管构成格式良好的Uri的某些元素是从IS环境中导出的,然而其它的由该工具本身提供。以下讨论标识Uri的每一元素,并解释了其值是如何导出的。
以下是格式良好的IS Uri的一个示例:
http://<ISNamespace>/vset/<tooltype>.<toolinstance>/{<artifacttype>/}<tool-specific id>
-http是由于Uri可以出现在IDE(集成开发环境)之外而出现的常量。如果它的确出现,则它将依照下文在“外部可寻址性”中描述的规则来处理。
-每一IS逻辑服务器定义一个名字空间。<ISNamespace>仅是服务器的名字,如“Server22”。
-vest是令IS Uri能够将串识别为IS Uri的常量。
-<tooltype>标识了由负责维护和回答关于人为因素的问题的工具(即,人为因素提供者)支持的工具接口。这令调用工具(持有链接的工具)能够基于由该工具提供的接口作出关于如何处理人为因素的决策。例如:vsbug、vsversionstore等。tooltype(工具类型)标识了API并由该工具指定。
-<toolinstance>描述了负责所标识的人为因素的人为因素提供者的具体实例。组合<tooltype><toolinstance>在IS名字空间中是唯一的。例如,tooltype实例由IS在安装时分配,并储存在工具中。
-<artifacttype>(可任选)是由工具维护的人为因素的类型。如果类型是不变的(即,人为因素的类型在其生命周期内不能改变),则工具仅提供人为因素类型。人为因素类型由工具在安装时注册。
-<tool-specific id>是对人为因素实例的不变引用。tool-specific id(工具专用id)由工具创建并维护。
示例:
指向储存在H中的文件的Uri:http://Server08/vset/vsversionstore.2/file/b4e3216
指向C中的要求记录的Uri:http://Server08/vseffvsbug.1/req/345
编码/解码人为因素URI实用程序功能
为鼓励URI格式化的一致,IS提供了一对实用程序功能,以基于结构对它们进行编码和解码。
string EncodeUri(ArtifactId artifactId)
EnodeUri(编码Uri)采用了类型ArtifactID的结构,并产生符合以下URL规则的串。ArtifactID.ToolInstance(以toolType.toolInstance的形式)和 ArtifactID.ArtifactType的非空值由调用者提供。如果ArtifactID.ServerNamespace=null,则当前活动的名字空间的名字用于URI的ISNamespace部分。在大多数情况下,工具提供了ArtifactID.ToolSpecificID的非空值。如果ArtifactID.ToolSepcificID=null,则EncodeUri将串“<?>”插入到工具专用id中。该串在向广义人为因素提供者添加人为因素时具有特殊的意义;否则,可以避免其使用。
ArtifactId DecodeUri(string artifactUri)
DecodeUri采用符合IS Uri规则的串,并返回类型ArtifactId的结构。
例如:
以下摘录的代码示出了使用EncodeUri方法构建人为因素ID以及转换到格式良好的IS Uri。所得的URI是:
http://IS001/vset/Work%20Item%20%Tracking.1/defect/5291.
DecodeUri反向工作。
public void EncodeUriExample()
{
ISServerProxy IS=new ISServerProxy();
ArtifactId artId=new ArtifactId();
artId.ServerNamespace=null;
artId.ToolInstance=″WorkItems.1″;
artId.ArtifactType=″defect″;
artId.ToolSpecificId=″5291″;
string Uri=IS.EncodeUri(artId);
}
松耦合和紧耦合
在IS链接环境中,工具使用链接来启用松耦合行为。它们也可提供专用的接口和交互,它们通过紧耦合的行为提供了高级专用集成。其每一个在适当的上下文中都是有效的。
松耦合提供以下优点。它很容易将新的人为因素类型添加到一组人为因素中,而不会干扰预先存在的应用程序。这对第三方集成尤其有用。可能总计结果来提供用于变化类型人为因素的完整的“何处使用”图。人为因素处理程序(提供者和消 费者)可彻底改变行为,并且只要它们继续使用广义链接接口,所有松耦合的行为都可以继续工作。
提供紧耦合行为的工具利用了符合链接服务的链接,但是它们不利用广义链接接口。相反,人为因素消费者利用了由人为因素提供者提供了特定接口。这些行为可用于提供跨工具的行为,它对参与的工具是非常专用的。
当对被引用的人为因素提供者未知的引用人为因素中存在指向被引用的人为因素的指针时,可以使用松耦合。
例如—第三方测试情况管理工具被引入到该套件中。它启用了IS并由此提供了例如构建对缺陷的链接的机制。缺陷不需要知道这一引用人为因素的新类型,以在反转查询中显示关于它的信息。
当引用人为因素指向它不了解的被引用的人为因素类型时,以及当对被引用的人为因素可用的行为不被引用人为因素影响时,也可使用松耦合。
例如—在IDE中,当用户希望看见哪些工作项目与构建相关联时,在构建的反转查询UI中返回工作项目的列表。同样地,当用户希望看见哪些工作项目被特定的变化设置影响时,在变化设置的反向查询UI中返回工作项目的列表。在任一情况下,用户应当能够双击任一工作项目,并且会显示该窗口的文档窗口。无论引用人为因素是构建的还是变化设置的,期望的行为都是相同的;由此,行为不受引用人为因素的影响(在这两个情况下)。
松耦合的交互通过(a)遵循IS约定,以及(b)实现标准接口的人为因素提供者和消费者来启用。
工具如何参与链接
提供人为因素的每一工具是人为因素提供者。人为因素提供者注册其人为因素类型,并实现令松耦合工具能够读取这些人为因素的一组接口。人为因素提供者责任在“人为因素提供者义务”中有详细描述。
也包含到其它人为因素的链接的人为因素提供者是人为因素消费者。人为因素消费者具有提供者之外的某些附加义务。它注册链接类型,并提供标准方法来答复查询和反向查询。人为因素消费者责任在“人为因素消费者义务”中有详细描述。
最后,IS本身提供了用于注册、发现和跨服务链接查询的若干设备,在“IS API”中有详细描述。
人为因素提供者义务
主持人为因素的任何工具是人为因素提供者。人为因素提供者具有以下责任,其中一些是可任选的,另一些是强制的。在注册时,每一人为因素提供者向IS注册其主持的每一人为因素类型、注册它可引发的任何事件(包括人为因素改变事件)、注册其提供者web服务接口的URL、提供可对它所拥有的每一人为因素返回IS Uri的web服务接口、提供可用于检索它所拥有的每一人为因素类型的实例的GetArtifacts方法、可包括人为因素的Uri作为返回人为因素实例的每一方法中的返回值、当它所拥有的人为因素以促使该人为因素的GetArtifacts方法执行返回不同结果的方式被创建、删除或改变时引发事件、提供对它所提供的每一人为因素类型处理外部可寻址性的方法、以及可实现响应于对它所拥有的人为因素的IDE内请求的客户机API(ExecuteDefaultAction(执行默认行动)、GetAllowableActions(获取可允许的行动)、ExecuteAction(执行行动))。IS和其它可使用它来提供人为因素消费者和提供者之间的未耦合的访问。
人为因素类型注册
人为因素类型和链接类型的注册在安装时发生。每一工具准备一符合IS注册服务XML(可扩充标记语言)方案的XML文档。以下信息对每一人为因素类型是必需的:负责该类型的人为因素的提供者;人为因素类型名称(不可定位);以及人为因素类型标签(可定位)。以下信息对每一链接类型是必需的:引用人为因素的人为因素类型名称;链接类型名称(不可定位);链接类型标签(可定位);反向链接类型标签(可定位);以及可任选地被引用人为因素类型数组。对于链接类型标签,前向和反向用于提供任一方向上的读数,如man bites dog、dog is bittenby man。如果被引用的人为因素类型为空,则链接的被引用的一端无类型。即,该类型的链接可指向任何人为因素。被引用的人为因素类型数组中的每一元素指示被引用的人为因素类型服务和被引用的人为因素类型名称两者。
提供者服务器API-IToolServerLinking
人为因素提供者提供了GetArtifacts方法来检索它所拥有的每一人为因素类型的实例。GetArtifacts方法采用Uri数组作为输入。返回值是符合广义人为因素显示方案(GAS)的对象数组。
Artifact[]GetArtifacts(string[] ArtifactUriList)
GetArtifacts可采用IS Uri形式的人为因素Id的数组。提供者负责为以GAS格式标识的每一人为因素Id返回一人为因素实例。
例如:
给定以下内容:名为“IS001”的IS名字空间,以及向IS001注册的名为“WorkItems.1”的缺陷跟踪工具;以及两个工作项目:Defect(缺陷)152和Requirement(要求)153。
最后,构想名为ArtifactUri[]的数组,它具有这两种元素:http://IS001/vset/WorkItems.1/Defect/152和http://IS001/vset/WorkItems.1/Req/153
这一调用之后MyArtifacts的值为:
Artifact[]MyArtifacts=workItemToo1.GetArtifacts(ArtifactUri[])
一旦被串行化,它看上去类似于以下XML文档:
<?xml version=″1.0″encoding=″utf-8″?>
<Artifacts xmlns=″http://www.company.com/Tool/GenericArtifactSchema.xsd″>
<Artifact>
<Uri>http://IS001/vset/WorkItems.1/Defect/152</Uri>
<ProviderName>MS Work Item Tracking</ProviderName>
<Title>152(Open)</Title>
<Type>Defect</Type>
<LastChangedOn>2003-10-24T20:47:58.170</LastChangedon>
<LastChangedBy>dminium</LastChangedBy>
<ExtendedAttributes>
<ExtendedAttribute>
<Name>Status</Name>
<Value>Open</Value>
</ExtendedAttribute>
<ExtendedAttribute>
<Name>Assigned To</Name>
<Value>Allen Clark(allclark)</Value>
</ExtendedAttribute>
</ExtendedAttributes>
<Links>
<Link>
<LinkType>depends on</LinkType>
<ReferencedUri>http://IS001/vset/WorkItems.1/Defect/173</ReferencedUri>
</Link>
<Link>
<LinkType>found in</LinkType>
<ReferencedUri>http://IS001/vset/Builds.1/Build/2003.11.15</ReferencedUri
</Link>
<Link>
<LinkType>checked in</LinkType>
<ReferencedUri>http://IS001/vset/Hat.1/ChangeSet/987Urt5B</ReferencedUri>
</Link>
</Links>
</Artifact>
<Artifact>
<Uri>http://IS001/vset/WorkItems.1/Req/153</Uri>
<providerName>Work Item Tracking</ProyiderName>
<Title>153(In Work)</Title>
<Type>Requirement</Type>
<LastChangedon<2003-10-27T20:36:52.170</LastChangedOn>
<LastChangedBy>eeykholt</LastChangedBy>
<ExtendedAttributes>
<ExtendedAttribute>
<Name>Status</Name>
<Value>In Work</Value>
</ExtendedAttribute>
<ExtendedAttribute>
<Name>Assigned To</Name>
<Value>Selvaraj(naselvar)</Value>
</ExtendedAttribute>
</ExtendedAttributes>
<Links>
<Link>
<LinkType>authored in</LinkType>
<ReferencedUri>http://IS001/vset/Teamhare/ReqDoc/38976FBA</ReferencedUri>
</Link>
<Link>
<LinkType>depends on</LinkType>
<ReferencedUri>http://IS001/vset/WorkItems.1/Defect/173</ReferencedUri>
</Link>
</Links>
</Artifact>
</Artifacts>
SynchronizeArtifactCache方法
SynchronizeArtifactCache方法用于当被破坏时重建人为因素高速缓存。
void SynchronizeArtifactCache()
SynchronizeArtifactCache方法由IS调用,以启动对由人为因素消费者持有的前向链接的完整组的通知。人为因素消费者必须对其每一人为因素引发一CacheArtifact事件(多个人为因素可以被包装到单个事件中)。IS倾听这些事件,并使用结果来填充可用于解析简单查询的链接高速缓存,而无需调用消费者的GetArtifacts或GetReferencingArtifacts方法。
void SynchronizeArtifactCache(DateTime from,DateTime to)
SynchronizeArtifactCache可由日期范围来约束。在这一情况下,作为包含,人为因素消费者仅有义务对来回之间修改的人为因素签发CacheArtifact事件。
对于由人为因素提供者持有的每一人为因素,SynchronizeArtifactCache方法将人为因素及其出站链接(如果有的话)包装成一XML文档(符合GAS方案)。注意,这一格式化需要与GetArtifacts所使用的完全一样的逻辑。该方法也引发CacheArtifact事件,将符合GAS的XML文档传递到IS。
当提供者完成其高速缓存活动之后,它签发一EndCacheLoad(结束高速缓存加载)事件。注意,GAS文档可持有多个人为因素。由此,提供者具有一下子将若干人为因素传递到高速缓存的选项。IS通常通过响应于ArtifactChanged事件来更新其高速缓存)—该事件与其它工具预订的事件相同。然而,IS也倾听CacheArtifact事件,这些事件不是其它工具和服务所预订的。
提供者客户机API-IToolClientLinking
存在人为因素提供者客户机API,以处理IDE内的松耦合交互。例如,构想这样一种情形,其中,工具显示其Id在作为GetArtifacts调用的结果返回的链接集合中的人为因素的列表。用户希望显示这些(任意)人为因素中的一个。如果人为因素提供者实现此处所描述的ExecuteDefaultAction方法,则列表的持有者可调用该行动(很可能是显示该人为因素的导航行动),而不需要该人为因素或人为因素类型的任何知识。
ExecuteDefaultAction方法
该方法可由人为因素提供者作为其提供者客户机的一部分来提供。它作为提供者客户机安装的一部分被安装,并可被探索。
bool ExecuteDefaultAction(string artifactUri)
ExecuteDefaultAction采用单个人为因素URI作为输入。提供者客户机负责执行对人为因素合适的任何默认行为。如果默认行动的执行成功,则返回真。ExecuteDefaultAction通常不被直接调用。相反,它通过IS客户机的 ExecuteDefaultAction方法来调用。
ArtifactChanged事件
当以促使该人为因素的GetArtifacts方法执行返回不同结果的方式创建、删除或改变人为因素时,人为因素提供者必须引发ArtifactChanged事件。
当人为因素改变时,提供者使用FireAsyncEvent(触发异步事件)方法向IS事件引发异步ArtifactChanged事件。该ArtifactChanged事件类型作为IS的一部分在注册期间被自动安装。它包括符合GAS方案的XMl文档。由于GAS包括人为因素的前向链接,ArtifactChanged用于向倾听者通知链接变化以及其它人为因素变化。
只要添加、改变或删除了人为因素,就引发ArtifactChanged事件。GAS方案包括Artifact元素上的属性,它令调用者能够指示它所包含的人为因素是否被添加、改变或删除。以下示出了单个ArtifactChanged事件中报告的两个变化:Defect(缺陷)152被添加,Requirement(要求)153被删除。
<?xml version=″1.0″encoding=″utf-8″?>
<Artifacts xmlns=″http://www.company.com/Tool/GenericArtifactSchema.xsd″>
<Artifact ChangeType=″Add″>
<Uri>http://IS001/vset/WorkItems.1/Defect/152</Uri>
<ProviderName>MS Work Item Tracking</ProviderName>
<Title>152(Resolved)</Title>
<Type>Defect</Type>
<LastChangedOn>2003-10-24T20:47:58.170</LastChangedOn>
<LastChangedBy>dminium</LastChangedBy>
<ExtendecdAttributes>
<ExtendedAttribute>
<Name>Status</Name>
<Value>Resolved</Value>
</ExtendedAttribute>
<ExtendedAttribute>
<Name>Assigned To</Name>
<Value>Peanuts McFadden(nuts)</Value>
</ExtendedAttribute>
</ExtendedAttributes>
<Links>
<Link>
<LinkType>depends on</LinkType>
<ReferencedUri>http://IS001/vset/WorkItems.1/Defect/173</ReferencedUri>
</Link>
<Link>
<LinkType>found in</LinkType>
<ReferencedUri>http://IS001/vset/Builds.1/Build/2003.11.15</ReferencedUri
>
</Link>
<Link>
<LinkType>checked in</LinkType>
<ReferencedUri>http://IS001/vset/Hatteras.1/ChangeSet/987Urt5B</Reference
dUri>
</Link>
</Links>
</Artifact>
<Artifact ChangeType=″Delete″>
<Uri>http://IS001/vset/WorkItems.1/Defect/23</Uri>
</Artifact>
</Artifacts>
任何工具可以注册到广义ArtifactChanged事件。另外,人为因素/链接高速缓存倾听这些事件,并使用它们来更新其自身。
外部可寻址性
人为因素提供者提供了一种对它所提供的每一人为因素处理外部可寻址性的方法。构想用户将IS人为因素的URI放入到一段电子邮件中。电子邮件的接收者对该URI不能作出任何行动,除非它是外部可寻址的。如果是,则浏览器可得出对其作出什么行动。
示例:
例如,构想储存在版本存储中以下位置的源文件:
\\VSServer8\FinProj\Acctg\WebUI\taccts.cs
它由以下URI表示:
http://VSServer8/vset/vsversionstore.2/file/b4e3216
现在考虑向用户发送指示tacct程序刚失败(其中,“tacct”是超链接,在其后是IS Uri)的电子邮件。当用户选择该超链接时,他正确地期望将产生与该URI相关联的内容的某一表示。在这一情况下,它可以是某一元数据以及关于该文件的描述性信息(以帮助唤起他的记忆)。这是可能的,因为每一人为因素提供者可令那些人为因素外部可寻址。它通过在安装时提供可处理它所管理的人为因素的类型的页面来实现这一目标。该页面储存在IS服务器上众所周知的虚拟目录中,并对其工具实例命名。页面可以非常简单,以调用简单的XSL变换来产生只读页面。或者,它可以非常复杂,以提供到完全膨胀的(full-blown)应用程序的网关。
IS提供了ISAPI(因特网服务器应用程序接口)过滤器,它将URI转换成URL,用于定向到正确的目录,并令页面能够将人为因素类型和标记处理为普通参数。
示例:
这一收到的Uri:http://Server8/vset/vsversionstore.2/file/b4e3216由ISAPI过滤器转换成以下URL:
http://Server8/vsversionstore.2aspx?artifactType=file&id=b4e3216
其中,“artasp”是储存了ASP页面的Server8上的文件夹。
人为因素消费者义务
在注册时,每一人为因素消费者向IS注册它所持有的的每一链接类型、注册其消费者web服务接口的URL、预订它可响应的任何事件(包括人为因素改变事件)、提供可响应“你指向我吗?”查询的GetReferncingArtifacts方法、并可响应ArtifactChanged事件;用于删除应当被删除的引用人为因素链接。对于变化,引用人为因素可检查会导致链接被无效的情况。
消费者服务器API
人为因素消费者必须提供能够响应于“你指向我吗?”查询的GetReferencingArtifacts方法。GetReferencingArtifacts采用URI数组作为输入。返回值是符合广义人为因素数据库方案(GAS)的Artifact(人为因素)对象。以下是该方法的特征:
Artifact[]GetReferencingArtifacts(string[]artifactUriList)
这一版本的GetReferencingArtifacts采用被引用的人为因素Id的数组。消费者负责返回它所拥有的指向所包括的被引用的人为因素的任一个的所有引用人为因素的列表,作为GAS兼容的Artifact对象。
Artifact[] GetReferencingArtifacts (string[] artifactUriList,LinkFilter[] linkFilterList)
这一版本的GetReferencingArtifacts采用被引用的人为因素Id的数组和链接过滤器的数组。链接过滤器可用于按照提供人为因素的工具类型、人为因素类型或链接类型来限制返回的人为因素。
ArtifactChaned事件处理程序
如此处所描述的,每次当人为因素本质上改变时,人为因素提供者引发ArtifactChanged(人为因素改变)事件。每一人为因素消费者可通过注册ArtifactChanged事件处理程序来倾听这些ArtifactChanged事件。
每一消费者的ArtifactChanged事件处理程序检查该事件以确定它是否持有感兴趣的人为因素。如果它的确持有,则消费者的事件处理程序然后可响应于该变化。通常这一响应采用以下形式之一:
-如果消费者仅持有指向该人为因素的指针,则它通常仅对删除情况下的ArtifactChanged感兴趣。消费者移除到删除的人为因素的任何链接。
-在某些情况下,可能有需要被引用的人为因素处于使引用人为因素能够持有到它的链接的特定状态的特定政策信息。如果是这样,则消费者可确保在改变之后,被引用的人为因素仍处于正确的状态;否则,消费者移除该链接。
人为因素/链接高速缓存使用ArtifactChanged事件来保持为最新。
IS API
以下API由IS中的各种元素直接提供。
服务器API-EncodeUri/DecodeUri实用程序方法。
GetArtifacts方法
GetArtifacts方法采用URI数组作为输入。返回值是符合GAS的对象。从逻辑观点来看,GetArtifacts的IS版本调用向其请求人为因素的每一人为因素提供者的GetArtifacts方法。具体地,查询相对于人为因素/链接高速缓存来执行,除非直接参数=真。该方法的特征如下:
Artifact[] GetArtifacts (string[] artifactUriList)
GetArtifacts采用ISUri形式的人为因素Id的数组。提供者负责向以GAS格式表示的每一人为因素Id返回一人为因素实例。这一版本的GetArtifacts相对于IS人为因素/链接高速缓存来运行。
Artifact[] GetArtifacts(string[]artifactUriList,bool direct)
这一版本的GetArtifacts完全与上述形式一样运作,除调用者可提供直接参数 的值之外。当直接参数=真时,结果集直接从作出调用的个别提供者的GetArtifacts方法构建,而不是检索人为因素/链接高速缓存。这提供了最新的数据,而没有昂贵的总计查询。
GetReferencingArtifacts方法
IS跨服务反向查询GetReferencingArtifacts(获取引用人为因素)作为分类的查询总计器运行。从逻辑观点来看,从IS请求的跨服务反向查询相对于所有的启用了IS的工具来运行链接反向查询,这些工具能够向查询贡献信息、总计来自所有响应者的结果、并向用户发送回单个结果集(以XML文档的形式)。从物理观点来看,IS跨服务反向查询可以实际上相对于IS人为因素/链接高速缓存来执行。
Artifact[] GetReferencingArtifacts (string[] artifactUriList)
这一版本的GetReferencingArtifacts采用被引用的人为因素Id的数组。咨询每一潜在的人为因素消费者(基于注册信息)来构建人为因素的完整列表。每一消费者负责返回它所拥有的指向所包括的被引用的人为因素的任一个的所有引用人为因素的列表,作为GAS兼容的Artifact(人为因素)对象。IS然后合并这些列表,并向客户机返回单个Artifact数组。
Artifact[] GetReferencingArtifacts (string[] artifactUriList,LinkFilter[] linkFilterList)
这一版本的GetReferencingArtifacts与前一版本相同,除它采用附加的链接过滤器数组之外。链接过滤器可用于按照提供人为因素的工具类型、人为因素类型或链接类型来限制返回的人为因素。
Artifact[] GetReferencingArtifacts (string[] artifactUri,bool direct)
这一版本的GetReferencingArtifacts完全与第一种形式相同地运作,除调用者可提供直接参数的值之外。当直接参数=真时,直接从作出调用的个别提供者的GetReferencingArtifacts方法构建结果集,而非利用人为因素/链接高速缓存。这提供了最新的数据,而没有昂贵的总计查询。
Artifact[] GetReferencingArtifacts (string[] artifactUriList,booldirect.LinkFilter[]linkFilterList)
这一版本的GetReferencingArtifacts与第二种形式完全相同地运作,除调用者可提供直接参数的值之外。当直接参数=真时,从作出调用的个别提供者的GetReferencingArtifacts方法直接构建结果集,而非利用人为因素/链接高速缓存。这提供了最新的数据,而没有昂贵的总计查询。
链接助手方法—ILinking
IS链接助手方法后处理Artifact(人为因素)对象的数组,其中在每一人为因素内出站(引用)链接被嵌套,以产生符合GLS的链接的平面列表。ExtractLinks(提取链接)返回在符合可任选用户提供的过滤器的Artifact对象数组内找到的所有链接的平面列表。
第三种形式的Extractlinks完全一样,但是仅用于其被引用的Id通过字符串数组传递的链接。以该方式,ExtractLinks可以与GetReferencingArtifacts配对,以创建那些仅仅指向感兴趣的人为因素Id的链接的平面、经过滤的列表。
Link[] ExtractLinks(Artifact[] artifactList)
给定一Artifact对象数组,其中每一链接用其引用人为因素来包装,ExtractLinkds产生符合GLS的Link(链接)数组内的链接的平面列表。
Link[] ExtractLinks(Artifact[] artifactList,LinkFilter[]linkFilterList)
在这一形式的ExtractLinks中,仅当它符合linkFilterList(链接过滤器列表)中的过滤器时,链接才被包括在内。
Link[] ExtractLinks(Artifact[] artifactList, LinkFilter[]linkFilterList,string[]artifactUriList)
在这一形式中,仅那些其被引用的URI包括在ArtifactUri字符串数组中的链接被返回。如果不需要任何链接类型过滤,则LinkFilterList可以为空。
ExtractLinks示例1:产生链接的平面列表
获取导致Artifact数组的人为因素。然后从该Artifact对象数组中提取链接的平面列表。
ISServerproxyIS=new ISServerproxy();
string[]artifactUris=new string[]
{″http://IS001/vset/workitems.1/defect/152″,″http://IS001/vset/WorkItems.1/Req/153″};
Artifact[] artifacts=IS.GetArtifacts(artifactUris);
Link[] links=IS.ExtractLinks(artifacts);
从ExtractLinks返回的链接对象对应于以下的XML方案。
<?xml version=″1.0″encoding=″utf-8″?>
<Links xmlns=″http://tempuri.org/ISGenericLinkSchema.xsd″>
<Link>
<ReferringUri>http://IS001/vset/WorkItems.1/Defect/152</ReferringUri>
<LinkType>depends on</LinkType>
<ReferencedUri>http://IS001/vset/WorkItems.1/Defect/173</ReferencedUri>
</Link>
<Link>
<ReferringUri>http://IS001/vset/WorkItems.1/Defect/152</ReferringUri>
<LinkType>found in</LinkType>
<ReferencedUri>http://IS001/vset/Builds.1/Build/2003.11.15</ReferencedUri>
</Link>
<Link>
<ReferringUri>http://IS001/vset/WorkItems.1/Defect/152</ReferringUri>
<LinkType>checked in</LinkType>
<ReferencedUri>http://IS001/vset/Hatteras.1/ChangeSet/987Urt5B</ReferencedUri>
</Link>
<Link>
<ReferringUri>http://IS001/vset/WorkItems.1/Req/153</ReferringUri>
<LinkType>authored in</LinkType>
<ReferencedUri>http://IS001/vset/eLeadSharePoint/ReqDoc/38976FBA</ReferencedUri>
</Link>
<Link>
<ReferringUri>http://IS001/vset/WorkItems.1/Req/153</ReferringUri>
<LinkType>depends on</LinkType>
<ReferencedUri>http://IS001/vset/WorkItems.1/Defect/173</ReferencedUri>
</Link>
</Links>
ExtractLinks示例2:产生指向特定缺陷的链接列表。
假定Defect(缺陷)163仅从Defect152和Requirement(要求)153引用。在这一情况下,Defect173的GetReferencingArtifacts将返回完全一样的Artifact数组。在这一示例中,ExtractLinks用于仅返回实际上指回Defect173的链接。
ISServerProxyIS=new ISServerProxy();
string[]artifactUris=new string[1]
{″http://IS001/vset/workitems.1/defect/173″};
Artifact[]artifacts=IS.GetReferencingArtifacts(artifactUris);
Link[]links=IS.ExtractLinks(artifacts,null,artifactUris);
The links object returned from ExtractLinks(now filtered by the same setof artifactUris as GetReferencingArtifacts)is shown in Figure5.
<?xml version=″1.0″encoding=″utf-8″?>
<Links xmlns=″http://tempuri.org/ISGenericLinkSchema.xsd″>
<Link>
<ReferringUri>http://IS001/vset/WorkItems.1/Defect/152</ReferringUri>
<LinkType>depends on</LinkType>
<ReferencedUri>http://IS001/vset/workitems.1/Defect/173</ReferencedUri>
</Link>
<Link>
<ReferringUri>http://IS001/vset/WorkItems.1/Req/153</ReferringUri>
<LinkType>depends on</LinkType>
<ReferencedUri>http://IS001/vset/WorkItems.1/Defect/173</ReferencedUri>
</Link>
</Links>
SynchronizeArtifactCache
该方法被调用以促使对人为因素/链接高速缓存的后台更新。
void SynchronizeArtifactCache()
SynchronizeArtifactCache方法促使IS通过调用每一人为因素提供者的SynchronizeArtifactCache方法来同步人为因素高速缓存。
void SynchronizeArtifactCache(DateTime from,DateTime to)
SynchronizeArtifactCache可由日期范围来约束。在这一情况下,包含性地,每一人为因素消费者仅负责对来回修改的人为因素签发CacheArtifact(高速缓存人为因素)事件。
客户机API-IClientLinking
关于链接的IS客户机API由单个方法构成。这一方法的功能是调用工具的默认行动来显示人为因素。
ExecuteDefaultAction
bool ExecuteDefaultAction(string artifactUri)
ExecuteDefaultAction(执行默认行动)采用单个人为因素Id作为输入。客户机基于人为因素类型和注册的机制确定要执行什么行动,用于如下地处理默认行动。如果人为因素类型与已注册的提供者客户机相关联,则提供者客户机的ExecuteDefaultAction被调用。否则,ArtifactId被传递到IS服务器,用于使用外部 可寻址的机制来解析。如果成功,这导致在IDE内部打开一个页面。如果不成功,则用户将看到http404错误。
广义人为因素提供者
现在参考图5,示出了依照本发明的GAP API的一种实现的框图。GAP本质上是提供标准人为因素提供者和消费者方法的数据库应用程序。提供了一个或多个启用IS的工具500和未启用IS的工具502,其某些内容期望作为集成工具来访问。为便于与启用IS的工具500交互,采用具有与其相关联的GAP数据库506的GAP504。GAP数据库506以后文中相对于图7描述的广义人为因素数据库方案(GADS)的格式来结构化。为与未启用IS的工具交互,可书写一GAP适配程序508,使得具有对原始工具502的最小中断,工具数据可作为IS人为因素来展示,并持有到IS人为因素的链接。
GAP特别地旨在解决不可能或不方便直接满足持有人为因素的工具中的人为因素提供者/消费者义务的情况。例如,一个团队希望链接到储存在共享服务器中的文档并从其链接出来,令它们作为正式的人为因素。不幸的是,共享服务器不实现启用IS的API,并由此,不向其人为因素提供IS兼容的URI或提供需要的方法(如,GetArtifacts/GetReferencingArtifacts)。使用GAP,该团队能够为共享文档构造一“人为因素代理”。代理可由其它人为因素引用,并能够持有到其它人为因素的链接,都代表它所表示的真实的共享文档。
GAP也旨在解决其中在源代码或文件系统中人为因素容器被作为文件来保留的情况。在这一情况下,负责创建人为因素的工具在其持续性上没有发言权,且由此不能坚持源控制和文件系统能够识别且储存来自人为因素的链接。例如,一个工具希望持有模型和从该模型生成的源代码之间的链接,其中模型作为源代码储存。使用GAP,该工具可构建人为因素代理来持有那些链接。此外,可构建额外的人为因素代理来表示文件内部的人为因素,如源文件中的方法或工具模型中的XMLweb服务。
现在参考图6,示出了准备非集成工具来使用GAP的一种实现的流程图。在600,接收一个或多个非集成工具。在602,在注册时准备一个或多个非集成工具,用于依照本发明,使用GAP来展示人为因素和引用。在604,注册工具类型来担当映射到GAP服务的每一GAP管理的人为因素的提供者。对于包括自管理和GAP管理的人为因素的提供者,其每一个的工具类型必须是截然不同的。在606,对于 每一GAP管理的人为因素,定义其人为因素类型和出站链接类型(如果有的话)。过程然后到达停止块。
现在参考图7,示出了用于GAP和高速缓存的广义人为因素数据库方案(GADS)700。GADS700包括人为因素(Artifact)元素702,它只包含一个可显示的人为因素,由以下子元素构成:返回的人为因素的URI;人为因素标题(Title),它是返回的人为因素类型的本地化友好名;最后一次改变的日期和时间(LastChangedOn),如果可用的话;改变该人为因素的最后一个人的用户Id(LastChangedBy),如果可用的话;外部ID(ExternalID),该元素被保留由以供IS广义人为因素提供者使用,并包含令IS及其代理能够访问没有直接人为因素提供者的项的信息;以及可任选的比特属性同步标志(SyncFlag),它在高速缓存中使用,并保留实例专用同步状态。
GADS700也包括人为因素元素702的链接(Link)子元素704,它包含以下内容:引用链接URI(ReferringURI)、链接类型(LinkType)、以及被引用的链接URI(ReferencedURI)。人为因素元素702的扩展属性(ExtendedAttributes)子元素706包含描述提供者能够提供的可任选人为因素专用属性的名字/值对的集合。
现在参考图8,示出了依照本发明实现GAP的一种方法的流程图。在800,提供者为展示的每一人为因素注册人为因素类型。在802,提供者为它持有的每一人为因素注册链接类型。在804,确定注册信息是否可被本地或本机地储存。如果不是,则过程流到806,采用GAP。在808,相对于GAP数据库处理数据。在810,非集成工具现在能够与启用IS的工具接口。过程然后到达停止块。然而,如果注册信息可被本机地储存,则过程从804流到812,不采用GAP来处理。过程然后到停止块。
现在参考图9,示出了依照本发明实现GAP适配程序的一种方法的流程图。当修改人为因素时,在GAP数据库中对每一人为因素有一记录。为构造适配程序,必须可能检测到储存在底层工具中的人为因素数据的变化。
在900,向工具添加要被表示为人为因素的项。在902,为该人为因素创建URI。当要被表示为人为因素的项被添加到工具时,工具适配程序通过使用GAP的UpdateArtifactData(更新人为因素数据)方法在GAP中创建对应的人为因素记录,如904所示的。该记录将该人为因素URI映射到对工具已知的标识符(称为其外部Id)。例如,储存在文件共享中的文档的外部Id可以是其文件夹的层次和文件名。
人为因素记录符合GAS,因为它包括例如人为因素的URI、标题、外部Id和扩展属性。在906,系统操作来检测该工具的人为因素的修改。在908,系统确定是否出现了修改。如果否,则过程流回906,以继续监控修改。如果是,则过程流到910,对项“改变”,工具适配程序通过使用GAP的UpdateArtifactData方法注明修改。注意,重要的是在改变和删除/添加之间区分,以维护至和自GAP人为因素的链接的完整性。在912,如果修改是“添加/删除”,则适配程序向/从GAP数据库中添加/删除对应的记录。当涉及人为因素的项被删除时,工具适配程序通过使用GAP的UpdateArtifactData方法从GAP中删除对应的记录。当来自人为因素的链接要被创建或修改时,使用UpdateArtifactData方法。在914,处理链接创建和修改。过程然后到达停止块。为处理外部可寻址性,定义并注册人为因素处理程序。
GAP API
由于它既是人为因素提供者又是人为因素消费者,因此GAP API向标准服务器人为因素提供者和消费者的每一个提供了方法和行为(即,IToolServerLinking接口中的所有方法)。此外,它提供了以下方法以使能够维护它所持有的人为因素数据。
bool UpdateArtifactData(Artifact[]artifacts)
调用者填充Artifact数组对象,并调用UpdateArtifactData来更新GAP数据库。Artifact数据包括保留在GAP数据中的完整人为因素描述,包括扩展属性和链接。每一人为因素必须具有其ChangeType(改变类型)属性(添加、改变、删除)的有效值。
在添加时:如果人为因素的Uri的<tool-specific id>被设为特殊值“<?>”,则GAP生成唯一的ID,并替换其Artifact.Uri属性中的相关联的Uri。否则,直接使用<tool-specific id>的值。当其关键字为收到的Artifact.Uri值的记录在GAP中已经存在而试图添加人为因素时,会引发错误。
在改变或删除时,其关键字为收到的Artifact.Uri值的记录必须在数据库中存在,否则引发错误。
Artifact[]GetArtifactsByExternalId(strinq[]externalId)
该方法用于基于GAP的人为因素URI所匹配的外部Id返回的GAS兼容的人为因素。注意,Artifact数组包括URI和外部Id,因此使用标准GetArtifacts方法来确定给定URI时的外部Id;该方法使得在给定外部Id时能够确定URI。
现在参考图10,示出了依照本发明便于访问非集成工具的系统1000。系统1000示出了若干非集成工具的使用,即第一工具1002、第二工具1004和第三工具1006。第一工具1002需要GAP1008的实现被启用作为对启用IS的工具1010的人为因素提供者。作为其支持,创建工具专用适配程序1012,它便于向启用的工具1010展示一个或多个人为因素。链接和引用可以被储存在依照GADS的GAP数据库506中。
第二工具1004在本机接口的顶部集成了提供者启用API1014,该接口公共地展示其人为因素。第三工具1006在展示对第二工具1004的提供者人为因素和第一工具1002的人为因素的引用的本机接口的顶部集成了消费者启用API1016。
系统1000还包括一人为因素/链接高速缓存1018,它依照本发明高速缓存了人为因素和链接信息。链接管理器1020管理高速缓存1018。高速缓存1018至少与第一、第二和第三工具(1002、1004和1006)接口,以便于至少高速缓存人为因素和链接信息,以及此处所描述的其它信息。
本发明(如,结合选择)可采用基于如分类器1022(可任选)的格式的方案的各种人工智能,用于实现本发明的各种自动过程。此处所描述的实现一般只处理一个中继段,即,直接与另一工具接口的一个工具。分类器1022可用于促进更复杂的查询,可导出超出一个中继段的链接描述。
分类器是将输入属性矢量x=(x1,x2,x3,x4,x5)映射到输入属性属于类的置信度的函数,即f(x)=confidence(class)。这一分类可采用基于概率和/或统计的分析(如,分解成分析效用和成本),以预测或推断用户希望自动执行的行动。
支持矢量机(SVM)是可采用的分类器的一个实例。SVM通过在可能输入的空间中找出超表面来运作,其中超表面试图将触发准则从非触发事件中分离出来。直观上,这令对接近但不等同于训练数据的测试数据的分类是正确的。其它有向和无向的分类方法包括,如单纯贝叶斯、贝叶斯网络、决策树,也可采用提供不同的独立性方案的概率分类模型。此处所使用的分类也包括用于开发优先级模型的统计回归。
如从本发明中可以容易理解的,本发明可采用明确训练(如,通过广义训练数据)或隐含训练(如,通过观察用户行为、接收外来信息)的分类器。例如, SVM通过分类器构造器和特征选择模块中的学习或训练阶段来配置。由此,分类器可用于自动执行若干功能,包括但不限于,例如,依照约定准则确定展示什么人为因素、可以应用什么优先级来展示人为因素、什么工具应当在其它工具前展示、基于数据类型、用户和数据位置可展示什么人为因素。
人为因素/链接高速缓存
人为因素/链接高速缓存是一种集中式的存储,其中它们所持有的人为因素和链接被复制以能够进行高性能的查询访问。通过将简要的人为因素和链接数据收集在一起成为单个数据库,可更有效地处理跨服务的引用反向。
现在参考图11,示出了依照本发明实现高速缓存的过程的流程图。在1100,使用高速缓存来储存人为因素/链接关系。在1102,依照GAS格式化这些关系。在1104,响应于由人为因素提供者引发的ArtifactChanged事件对高速缓存作出更新。IS高速缓存管理器预订ARtifactChanged并使用该事件对象—符合GAS的对象—来更新其本身。由于高速缓存是与实际人为因素更新同步地更新的,它可简单地与底层存储不同步。然而,等待时间较短,且对于大多数应用都是可接受的。当需要零等待事件时,工具可绕过高速缓存,并直接通过其标准GetArtifacts/GetReferencingArtifacts方法向工具作出请求。高速缓存储存在符合广义人为因素数据库方案的数据库中。高速缓存与GAP数据库不同,因为GAP数据库是映射信息和链接的主副本,而高速缓存不是任何内容的主副本,并且是完全可以重新创建的。
再次参考图11,在1106,确定高速缓存是否已与底层数据同步。在该事件中,作为网络或系统故障的结果,在高速缓存和底层数据永久地不同步的情况下,IS提供了一种管理性的SynchronizeArtifactCache(同步人为因素高速缓存)实用程序,它与每一人为因素提供者进行校准以恢复高速缓存。该实用程序调用每一人为因素提供者的SynchronizeArtifactCache方法。如果不需要同步,则过程从1106流到1104以更新高速缓存。如果需要同步,则过程从1106流到1108以调用同步。高速缓存同步如下地运作。IS的SynchronizeArtifactCache实用程序被调用(编程上或通过管理功能)。如果高速缓存同步已在进行中,则提供一警告;然而,警告可以被忽略。在IS管理数据库中,设置“全局同步在进行中”状态。
在1110,要被同步的每一高速缓存的人为因素(基于日期范围)用“要被高速缓存”标志来作标记。在1112,联系具有已被标记的人为因素的每一提供者。 调用人为因素提供者的SynchronizeArtifactCache方法,并设置管理数据库中的状态“<tool-instance>同步正在进行”。在1114,人为因素提供者的SynchronizeArtifactCache方法对每一候选人为因素(或对一组候选人为因素)签发一CacheArtifact事件。在1116,将签发了事件并作了标记的人为因素上传到高速缓存。当人为因素提供者对所有的候选人为因素签发了CacheArtifact事件时,它用其自己的工具实例作为参数触发一EndCacheLoad(结束高速缓存加载)事件。IS高速缓存管理器倾听ArtifactChanged和CacheArtifact事件。这两个事件以同样的方式来处理:包括在事件的Artifacts参数中的每一人为因素被放置在高速缓存中。
在1118,如果高速缓存中存在具有相同的URI的人为因素,则它被替换。否则,它被添加。注意,所替换或添加的条目的“要被高速缓存”标志未被设置。IS高速缓存管理器倾听EndCacheLoad事件。当被接收时,在1120,执行高速缓存清除,使得高速缓存中由EndCacheLoad指定的工具实例的被标记为“要被高速缓存”的所有人为因素被删除。这移除了其对应的人为因素已被从其主持储中删除的高速缓存项。IS关闭“<tool-instance>同步正在进行”状态。当最后一个提供者的“<tool-instance>同步正在进行”状态被关闭时,“全局同步正在进行”状态被关闭。过程然后到达停止块。
API引用
本节包括在本文档的别处对方法详细描述的引用而定义的所有方法特征。另外,由IS提供的方法的过载(overload)由消息限定器(Message Qualifier)来实现。通过ASP.Net中的预订,过载方法的MessageName(消息名)属性通过将消息名和消息限定器串接来形成,如下文所示的。这些消息名对服务的消费者是不可见的。
以下代码表示对方法名(在本情况中为GetArtifacts)默认的消息名。
[WebMethod]
public ArtifactID GetArtifacts(string[]ArtifactUri)
{/*获取人为因素;如果可能的话使用高速缓存*/}
在下文中,消息名被明确地指定。通过约定,它通过将消息名与消息限定器串接形成特征表来形成。在这一情况下,消息限定器是Direct(直接),因此消息名是GetArtifactsDirect(直接获取人为因素)。
[WebMethod(MessageName=″GetArtifactsDirect″)]
public ArtifactID GetArtifacts(string[]ArtifactUri)
{/*直接从人为因素提供者获取人为因素*/}
方案和数据类型
广义人为因素方案(GAS)和人为因素类:GAS是定义可显示人为因素的广义格式的XMl方案。该方案如下,其后为其每一元素的解释。当GAS符合文档被解串行化(deserialize)成对象时,对象采用“人为因素类”中所示的格式。注意,在API中,Artifacts对象从不出现;相反,使用了Artifact对象数组。
<?xml version=″1.0″encoding=″utf-8″?>
<xs:schema
targetNamespace=″http://www.company.com/Tool/GenericArtifactSchema.xsd″
elementFormDefault=″qualified″xmlns=″http://www.company.com/Tool
/GenericArtifactSchema.xsd″
xmlns:mstns=″http://www.company.com/Tool/GenericArtifactSchema.xsd″
xmlns:xs=″http://www.w3.org/2001/XMLSchema″>
<!--By declaring ISUri a simple type we can add validation later.-->
<xs:simpleTyPe name=″ISUri″>
<xs:restriction base=″xs:string″/>
</xs:simpleType>
<!--Enumeration for usage in ArtifactChanged event.-->
<xs:simpleType name=″ChangeType″>
<xs:restriction base=″xs:string″>
<xs:enumeration value=″Add″/>
<xs:enumeration value=″Change″/>
<xs:enumeration value=″Delete″/>
<xs:enumeration value=″NoChange″/>
</xs:restriction>
</xs:simpleType>
<xs:element name=″Artifacts″>
<xs:complexType>
<xs:sequence>
<xs:element name=″Artifact″type=″Artifact″minOccurs=″1″maxOccurs=″unbounded″/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name=″Artifact″>
<xs:sequence>
<xs:element name=″Uri″type=″ISUri″/>
<xs:sequence minOccurs=″0″maxOccurs=″1″>
<xs:element name=″ArtifactTitle″type=″xs:string″/>
<xs:element name=″ArtifactTypeName″type=″xs:string″/>
<xs:element name=″LastChangedon″type=″xs:dateTime″/>
<xs:element name=″LastChangedBy″type=″xs:string″/>
<xs:element name=″ExternalId″type=″xs:string″minOccurs=″0″maxOccurs=″1″/>
<xs:element name=″ExtendedAttributes″minOccurs=″0″maxOccurs=″1″>
<xs:complexType>
<xs:sequence>
<xs:element name=″ExtendedAttribute″
type=″ExtendedAttribute″minOccurs=″0″
maxOccurs=″unbOunded″/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:elemernt name=″OutboundLinks″minOccurs=″0″maxOccurs=″1″>
<xs:complexType>
<xs:sequence>
<xs:element name=″OutboundLink″
type=″OutboundLink″minOccurs=″0″
maxOccurs=″unbounded″/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:sequence>
<xs:attribute name=″ChangeType″type=″ChangeType″default=″NoChange″use=″optional″/>
</xs:complexType>
<xs:complexType name=″ExtendedAttribute″>
<xs:sequence>
<xs:element name=″Name″type=″xs:string″/>
<xs:element name=″Value″type=″xs:strilng″/>
<xs:element name=″FormatString″type=″xs:string″minOccurs=″0″/>
</xs:sequence>
</xs:complexType>
<xs:complexType name=″OutboundLink″>
<xs:sequence>
<xs:element name=″LinkType″type=″xs:string″/>
<xs:element name=″ReferencedUri″type=″ISUri″/>
</xs:sequence>
</xs:complexType>
</xs:schema>
元素人为因素
包含1:m个人为因素元素,其每一个描述了广义IS人为因素。对每一个收到的ArtifactId的一个人为因素元素将出现在人为因素元素中。
元素Artifact
仅包含一个可显示的人为因素,由以下子元素构成:
Uri:返回的人为因素的Uri。
-ArtifactTitle:返回的人为因素的本地化的友好名。
-ArtifactTypeName:返回的人为因素类型的本地化的友好名。
-LastChangedOn:最后一次改变的日期和时间(如果有的话)。
-LastChangedBy:改变该人为因素的最后一个人的userId(如果有的话)。
-ExternalId:该元素被保留,由IS广义人为因素提供者使用。它包含令IS及其代理能够访问没有直接人为因素提供者的项的信息。
-ExtendedArrtibutes:描述提供者可提供的可任选人为因素专用属性的名字 /值对的集合。
-OutboundLinks:描述来自该人为因素的出站链接的链接类型/引用Uri对的集合。
-ChangeType是人为因素元素上可任选的属性,仅在ArtifactChanged事件的上下文中有意义。
Artifacts类
//---------------------------------------------------------------------
// <autogenerated>
// 该代码由工具生成
// 运行时间版本:1.1
//
// 对此文件的改变会导致不正确的行为,
// 并且如果重新生成代码会被丢失.
// </autogenerated>
//-------------------------------------------------------------------------------
//
// 该源代码由xsd自动生成,版本=1.1
//
using System.Xml.Serialization;
[System.Xml.Serialization.XmlTypeAttribute(Namespace=″http://www.company.com/
Tool/GenericArtifactSchema.xsd″)]
[System.Xml.Serialization.XmlRootAttribute(Namespace=″http://www.
company.com/Tool/GenericArtifactSchema.xsd″,IsNullable=false)]
public class Artifacts{
[System.Xml.Serialization.XmlElementAttribute(″Artifact″)]
public Artifact[]Artifact;
}
[System.Xml.Serialization.XmlTypeAttribute(Namespace=″http://www.
company.com/Tool/GenericArtifactSchema.xsd″)]
public class Artifact{
public string Uri;
public string ArtifactTitle;
public string ArtifactTypeName;
public System.DateTime LastChangedon;
public string LastChangedBy;
public string ExternalID;
[System.Xml.Serialization.XmlArrayItemAttribute(IsNullable=false)]
public ExtendedAttribute[]ExtendedAttributes;
[System.Xml.Serialization.XmlArrayItemAttribute(IsNullable=false)]
public OutboundLink[]OutboundLinks:
[system.Xml.Serialization.XmlAttributeAttribute()]
public ChangeType ChangeType=ChangeType.NoChange;
}
[System.Xml.Serialization.XmlTypeAttribute(Namespace=″http://www.
company.com/Tool/GenericArtifactSchema.xsd″)]
public class ExtendedAttribute{
public string Name;
public string Value;
public string FormatString;
}
[System.Xml.Serialization.XmlTypeAttribute(Namespace=″http://www.
company.com/Tool/GenericArtifactSchema.xsd″)]
public class OutboundLink{
public string LinkType;
public string ReferencedUri;
}
[System.Xml.Serialization.XmlTypeAttribute(Namespace=″http://www.
company.com/Tool/GenericArtifactSchema.xsd″)]
public enum ChangeType{
Add,
Change,
Delete,
NoChange,
}
广义链接方案(GLS)和链接类
GLS是定义人为因素链接的广义格式的XML方案。它由ExtractLinks方法返回。该方案如下,随后是其每一元素的解释。当将GLS符合文档解串行化成对象时,对象采用“链接类”一节下所示出的形式。
<?xml version=″1.0″encoding=″utf-8″?>
<xs:schema id=″ISGenericLinkSchema″
targetNamespace=″http://tempuri.org/ISGenericLinkSchema.xsd″
elementFormDefault=″qualified″
xmlns=″http://tempuri.org/ISGenericLinkSchems.xsd″
xmlns:mstns=″http://tempuri.org/ISGenericLinkSchema.xsd″
xmlns:xs=″http://www.w3.org/2001/XMLSchema″>
<xs:element name=″Links″>
<xs:complexType>
<xs:sequence>
<xs:element name=″Link″type=″Link″minOccurs=″1″
maxOccurs=″unbounded″/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name=″Link″>
<xs:sequence>
<xs:elementname=″ReferringUri″type=″xs:string″/>
<xs:elementname=″LinkType″type=″xs:string″/>
<xs:element name=″ReferencedUri″type=″xs:string″/>
</xs:sequence>
</xs:complexType>
</xs:schems>
元素链接
包含1:m个链接元素,其每一个描述了两个IS人为因素之间的链接。
元素Link
描述两个人为因素之间的一个链接:
-ReferringUri:引用(消费者)人为因素的Uri。
-LinkType:链接的类型。
-ReferencedUri:被引用的(提供者)人为因素的Uri。
Link类
//------------------------------------------------------一----------------------
// <autogenerated>
// 该代码由工具生成。
// 运行时间版本:1.1
//
// 对该文件作出改变将导致不正确的行为,
// 并且如果重新生成代码则会丢失.
// </autogenerated>
//-------------------------------------------------------------------------
//
// 该源代码由xsd自动生成,版本=1.1
//
using System.Xml.Serialization;
[System.Xml.Serialization.XmlTypeAttribute(Namespace=″http://tempuri.org/ISGe
nericLinkSchema.xsd″)]
[System.Xml.Serialization.XmlRootAttribute(Namespace=″http://tempuri.org/ISGe
nericLinkSchema.xsd″,IsNullable=false)]
public class Links{
[System.Xml.Serialization.XmlElementAttribute(″Link″)]
public Link[]Link;
}
[System.Xml.Serialization.XmlTYpeAttribute(Namespace=″http://tempuri.org/ISGe
nericLinkSchema.xsd″)]
public class Link{
public string ReferringUri;
public string LinkType;
publ ic string ReferencedUri;
}
LinkFilter类
LinkFilter类在查询方法中用于过滤结果。每一人为因素消费者必须考虑其 GetReferencingArtifacts实现中的过滤器。
public class LinkFilter
{
public enum filterType
{
ToolInstance,
ArtifactType,
LinkType
}
public filterType Type;
public string[]Values;
}
ArtifactId类
ArtifactId类用于收集用于使用EncodeUn和DecodeUri方法形成人为因素的Uri的数据。
public class ArtifactId
{
public string VisualStudioServerNamespace;
public string Tool;
public string ArtifactType;
public string ToolSpecificId;
}
广义人为因素数据库方案
以下是用于广义人为因素提供者和人为因素/链接高速缓存的广义人为因素数据库方案的描述。本质上,它是GAS方案的数据库实现,有以下例外:提供者名字和人为因素类型不存在。当读取人为因素实例时它们被自动从URI中导出,并当写入人为因素实例时它们被忽略。可任选的比特属性“Sync Flag(同步标志)”仅在高速缓存中使用,并保留实例专用同步状态。
示例计算系统
现在参考图12,示出了用于执行所揭示的体系结构的计算机的框图。为提供本发明的各方面的附加环境,图12及以下讨论旨在提供可在其中实现本发明的各方面的合适的计算环境1200的简要、通用描述。尽管上文在可运行在一个或多个计算机上的计算机可执行指令的通用上下文中描述了本发明,然而本领域的技术人员将认识到,本发明也可结合程序模块来实现和/或被实现为硬件和软件的组合。
一般而言,程序模块包括例程、程序、组件、数据结构等等,执行特定的任务或实现特定的抽象数据类型。此外,本领域的技术人员可以理解,本发明的方法可以用其它计算机系统配置来实施,包括单处理器或多处理器计算机系统、小型机、大型机、以及个人计算机、手持式计算设备、基于微处理器或可编程消费者电子产品等等,其每一个都可操作地耦合至一个或多个相关联的设备。
所示出的本发明的步骤也可在分布式计算环境中实施,其中某些任务由通过通信网络连接的远程处理设备来执行。在分布式计算环境中,程序模块可以位于本地和远程存储器存储设备中。
计算机通常包括各种计算机可读介质。计算机可读介质可以是可由计算机访问的任一可用介质,包括易失和非易失介质、可移动和不可移动介质。作为示例而非局限,计算机可读介质包括计算机存储介质和通信介质。计算机存储介质包括以用于储存诸如计算机可读指令、数据结构、程序模块或其它数据等信息的任一方法或技术实现的易失和非易失,可移动和不可移动介质。计算机存储介质包括但不限于,RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字视频盘(DVD)或其它光盘存储、磁盒、磁带、磁盘存储或其它磁存储设备、或可以用来储存所期望的信息并可由计算机110访问的任一其它介质。
通信介质通常在诸如载波或其它传输机制的已调制数据信号中包含计算机可读指令、数据结构、程序模块或其它数据,并包括任一信息传送介质。术语“已调制数据信号”指以对信号中的信息进行编码的方式设置或改变其一个或多个特征的信号。作为示例而非局限,通信介质包括有线介质,如有线网络或直接连线连接,以及无线介质,如声学、RF、红外和其它无线介质。上述任一的组合也应当包括在计算机可读介质的范围之内。
再次参考图12,示出了用于实现本发明的各方面的示例性环境1200,包括计算机1202,计算机1202包括处理单元1204、系统存储器1206和系统总线1208。系统总线1208将包括但不限于系统存储器1206的系统组件耦合至处理单元1204。处理单元1204可以是各种可购买的处理器中的任一种。双微处理器和其它多处理器体系结构也可用作处理单元1204。
系统总线1208可以是若干类型总线结构中的任一种,它们可进一步互连到存储器总线(有或没有存储器控制器)、外围总线、以及使用各种可购买的总线体系结构的任一种的局部总线。系统存储器1206包括只读存储器(ROM)1210和随机存取存储器(RAM)1212。基本输入/输出系统(BIOS)储存在诸如ROM、EPROM、 EEPROM等的非易失存储器1210中,其中,BIOS包含如在启动时帮助在计算机1202内的元件间传递信息的例程。RAM1212也可包括用于高速缓存数据的高速RAM,如静态RAM。
计算机1202还包括内部硬盘驱动器(HDD)1214(如,EIDE、SATA),其中,内部硬盘驱动器1214也可被配置成外部地用于合适的机壳(未示出);磁性软盘驱动器(FDD)1216(如,用于对可移动磁盘1218进行读写)以及光盘驱动器1220(如用于读取CD-ROM盘1222或对诸如DVD等其它高容量光学介质进行读写)。硬盘驱动器1214、磁盘驱动器1216和光盘驱动器1220可以分别通过硬盘驱动器接口1224、磁盘驱动器接口1226和光驱接口1228连接到系统总线1208。用于外部驱动器实现的接口1224包括通用串行总线(USB)和IEEE1394接口技术中的至少一个或两者。
驱动器及其相关联的计算机可读介质提供了数据、数据结构、计算机可执行指令等的非易失存储。对于计算机1202,驱动器和介质容纳以合适的数据格式的任何数据的存储。尽管上述计算机可读介质的描述指的是HDD、可移动磁盘和可移动光学介质,如CD或DVD,然而本领域的技术人员可以理解,可计算机可读的其它类型的介质,如zip驱动器、磁带盒、闪存卡、盒式磁带等,也可用于示例性操作环境,此外,任何这样的介质可包含用于执行本发明的方法的计算机可执行指令。
若干程序模块可储存在驱动器和RAM1212中,包括操作系统1230、一个或多个应用程序1232、其它程序模块1234和程序数据1236。操作系统、应用程序、模块和/或数据的所有或部分可以高速缓存在RAM1212中。
可以理解,本发明可以用可购买的操作系统或操作系统的组合来实现。
用户可通过一个或多个有线/无线输入设备,如键盘1238和定位设备(如鼠标1240)向计算机1202输入命令和信息。其它输入设备(未示出)可包括麦克风、IR遥控器、操纵杆、游戏垫、触针笔、触摸屏等等。这些和其它输入设备通常通过耦合至系统总线1208的输入设备接口1242耦合至处理单元1204,但也可以通过其它接口连接,如并行端口、IEEE1394、串行端口、游戏端口、USB端口、IR接口等等。
监视器1244或其它类型的显示设备也通过接口,如视频适配器1246连接到系统总线1208。除监视器1244以外,计算机通常包括其它外围输出设备(未示出),如扬声器、打印机等等。
计算机1202可在使用通过有线和/或无线通信到一个或多个远程计算机,如远程计算机1248的逻辑连接的网络化环境中操作。远程计算机1248可以是工作站、服务器计算机、路由器、个人计算机、便携式计算机、基于微处理器的娱乐设备、对等设备或其它公用网络节点,并通常包括许多或所有上文相对于计算机1202所描述的元件,尽管为简明的目的,仅示出了存储器存储设备1250。所描述的逻辑连接包括到局域网(LAN)1252和/或较大的网络,如广域网(WAN)1254的有线/无线连接。这类LAN和WAN网络环境常见于办公室、公司,并促进了企业范围计算机网络,如内联网,所有这些网络可连接到全球通信网络,如因特网。
当在LAN网络环境中使用时,计算机1202通过有线和/或无线通信网络接口或适配器1256连接到局域网1252。适配器1256可便于到LAN1252的有线或无线通信,它也可包括布置在其上的无线接入点,用于与无线适配器1256通信。当在WAN网络环境中使用时,计算机1202可包括调制解调器1258,或连接到LAN上的通信服务器,或具有用于通过WAN1254,如通过因特网建立通信的其它装置。调制解调器1258可以是内置或外置的,并且可以是有线或无线设备,它通过串行端口接口1242连接到系统总线1208。在网络化环境中,相对于计算机1202描述的程序模块或其部分可以储存在远程存储器/存储设备1250中。可以理解,示出的网络连接是示例性的,也可以使用在计算机之间建立通信链路的其它装置。
计算机1202可用于与操作上布置在无线通信中的任何无线设备或实体通信,如打印机、扫描仪、台式和/或便携式计算机、便携式数据助理、通信卫星、与无线可检测标签相关联的任一设备或位置(如,公用电话亭、报亭、休息室)、以及电话。这至少包括Wi-Fi和BluetoothTM(蓝牙)无线技术。由此,通信可以是如常规网络一样的预定义结构,或简单地是至少两个设备之间的特别(adhoc)通信。
Wi-Fi或无线保真允许从家里的沙发、酒店房间中的床或工作的会议室连接到因特网,而不需要电线。Wi-Fi是类似于蜂窝电话的无线技术,它令如计算机等设备能够在室内和室外发送和接收信息;在基站范围内的任何地方。Wi-Fi网络使用被称为IEEE802.11(a、b、g等)的无线电技术,来提供安全、可靠、快速的无线连接。Wi-Fi网络可用于将计算机彼此连接、连接到因特网、以及连接到有线网络(使用IEEE802.3或以太网)。Wi-Fi网络在未许可的2.4和5GHz无线电频带中操作,它具有11Mbps(802.11b)或54Mbps(802.11a)的数据速率,或具有包含两个频带(双频带)的产品。因此网络可提供类似于许多办公室中使用的基本10BastT有线以太网的真实世界性能。
参考图13,示出了依照本发明的示例性计算环境1300的示意性框图。系统1300包括一个或多个客户机1302。客户机1302可以是硬件和/或软件(如,线程、进程、计算装置)。例如,客户机1302也可通过采用本发明以容纳cookie和/或相关联的上下文信息。系统1300也包括一个或多个服务器1304。服务器1304也可以是硬件和/或软件(如,线程、进程、计算装置)。例如,服务器1304可容纳线程,以通过使用本发明执行变换。客户机1302和服务器1304之间的一个可能的通信可以是适用于在两个或多个计算机进程之间传输的数据分组的形式。例如,数据分组可包括cookie和/或相关联的上下文信息。系统1300包括可用于便于在客户机1302和服务器1304之间通信的通信框架1306(如,诸如因特网等全球通信网络)。
通信可通过有线(包括光纤)和/或无线技术来促进。客户机1302操作上连接至可用于储存对客户机1302本地的信息(如cookie和/或相关联的上下文信息)的一个或多个客户机数据存储1308。类似地,服务器1304操作上连接至可用于储存对服务器1304本地的信息的一个或多个服务器数据存储1310。
上文所描述的包括本发明的示例。当然,不可能为了描述本发明而描述组件或方法的所有可构想的组合,但是本领域的普通技术人员可以认识到,本发明的许多其它组合和置换都是可能的。因此,本发明旨在包含落入所附权利要求书的精神和范围之内的所有这样的改变、修改和变化。此外,在详细描述或权利要求书中使用了术语“包括”的意义上,这类术语是包含性的,这与术语“包含”在权利要求书中作为过渡词时所解释的“包含”相类似。