Web 触发的更新

Eclipse 更新管理器可用来以可预知的方式呈示和浏览 Eclipse 更新站点。更新站点可包含显示在树视图中的类别,这些类别又包含一些功能部件。可以在更新管理器内的“预览”视图中检查功能部件。如果功能部件是有效的安装候选功能部件,则它将包含一个将启动 Eclipse 安装向导的按钮“立即安装”。完成安装任务后,该功能部件将成为产品的一部分。

显示供安装的功能部件的这一标准方法不是唯一的方法。提供程序可以从更新管理器接管显示、注册、搜索和其它任务,且仅当要将功能部件实际安装到 Eclipse 产品中时才返回控制权。

更新管理器能够运行可接受来自 Web 页面的请求的 servlet。此功能不是自动的:必须在首选项 > 安装/更新 > Web 触发的更新页面中激活它。当按确定时,更新管理器将激活可处理入局请求的应用程序服务器。之后,将使用回调 URL 信息对从“更新管理器”内打开的所有 URL 进行编码。如果初始 URL 是常规 Web 页面,则编码的 URL 将具有添加回调 URL 以用来调用 Eclipse 的查询部件:

http://acme.com/myApplication.html

变成

http://acme.com/myApplication.html?updateURL=<localhost>:<localport>?org.eclipse.update/install

其中“localhost”是在本地机器上运行的 Eclipse 服务器的地址,本地端口是在启动服务器时动态选择的,而查询则是 Eclipse Web 应用程序名和处理请求的 servlet 的名称。

如果原始 URL 已是一个查询:

http://acme.com/myApplication/myServlet?arg1=value1&arg2=value2

则编码就把我们的信息简单地添加为另一个参数:

http://acme.com/myApplication/myServlet?arg1=value1&arg2=value2&updateURL=<localhost>:<localport>?org.eclipse.update/install

正常的 Web 页面和查询将忽略该编码并且不会导致任何问题,也不会影响显示。编码只添加可由了解它的页面使用的信息。

因为 Web 页面必须从更新管理器启动,所以“更新”视图中的站点书签可创建为 Web 书签。更新管理器相应地处理这些书签并且当双击某一书签时,它将在浏览器中打开 URL(如果在操作系统和窗口系统的版本上提供了嵌入式浏览器,则该浏览器将直接在更新管理器内打开;否则,它将在常驻浏览器窗口中打开)。

可以在 Web 页面中执行的任务

提供程序可以它们想用的任何方法建立其“更新”Web 页面:它们可使用以数据库为基础的复杂 Web 应用程序,或使用简单的静态 HTML。使用较复杂的体系结构就允许提供程序向用户提供更多值。对新功能部件的复杂搜索、更新及电子修订、所选择功能部件的丰富的可视显示方式、有关它们的功能的文章、各个有用的链接以及“最流行的功能部件”表决就是所能提供的功能的一部分。另外,提供程序还可以启用认证来限制对一些功能部件的访问以及要求用户注册等等。

从 Web 页面调用 Eclipse

有许多不同的方法来抽取编码信息。一种非常简单的方法就是按如下所示使用 Java 脚本函数:

<SCRIPT LANGUAGE="JavaScript">

function getArgs() {
   var args = new Object();
   var query = location.search.substring(1);
   var pairs = query.split("&");
   for (var i=0; i<pairs.length; i++) {
      var pos = pairs[i].indexOf('=');
      if (pos == -1) continue;
      var argname = pairs[i].substring(0, pos);
      var value = pairs[i].substring(pos+1);
      args[argname] = unescape(value);
   }
   return args;
}
</SCRIPT>

上述函数分析当前页面的 URL 并将查询自变量作为数组返回。

回调 URL 的作用是允许 Web 页面将控制权返回给 Eclipse。一旦用户选择了要安装的功能部件,则它必须返回到 Eclipse 来完成安装。Web 触发的更新的作用是不使更新站点过时:仍然需要这些站点,但是在此方案中,它们只是用作物理存储功能部件的位置。Web 页面在某个时刻必须回调到 Eclipse 中,并传递更新站点 URL 以及所选择的功能部件标识和版本。此信息是通过使用原始回调 URL 并添加自变量(从而形成查询)来编码的。

回调查询的自变量是:

当用户在 Web 页面中完成了所有其选择且剩下要做的就只是按类似“下载”按钮或超级链接这样的事情时,应该回调到 Eclipse。此功能的一个简单实现将是:

<input type="button" 	name="Download" value="Download"
			onClick="javascript:download('com.example.root', '1.0.0')">

在上面的代码中,功能部件标识和版本都是以按钮标记的形式硬编码的。

可以按如下所示实现下载功能:

function download(id, version) {
   var args = getArgs();
   if (args.updateURL) {
      var updateURL = args.updateURL;
      var callback = updateURL+"?server=
      "+escape("http://acme.com/updateSite/")+
      "&feature="+escape(id+'_'+version)+"&backURL="+escape(location);
      location = callback;
   }
}

在上面的 JavaScript 函数中,在页面 URL 中从开头进行编码的回调 URL 用来形成查询。一旦创建了查询,就会请求浏览器打开它。此步骤将导致浏览器调用 Eclipse servlet(它将处理查询)、连接至提供程序更新站点(在这种情况下为“http://acme.com/updateSite/”)和使用提供的标识和版本定位功能部件。如果一切顺利的话,则 Eclipse 窗口将显示在顶层并且将打开熟悉的安装向导。此时,您将返回到 Eclipse 中并且可以象通常那样完成安装。

指出以下这一点很重要:已编码的回调 URL 对于整个机制来说是非常关键的。如果包含“下载”链接或按钮的页面在 Web 站点映射中的多个层下面,则根 Web 页面(从更新管理器启动的 Web 页面)必须确保回调 URL 被传递到从该页面内打开的所有页面。可以各种方法(在页面中直接编码、保存瞬时 cookie 以及将它存储在为站点的各页面服务的 servlet 中等等)来完成该任务。

 

Copyright IBM Corporation and others 2000, 2003.