4


内容管理 API

Sun Java System Content Delivery Server 内容管理 API 提供 Content Delivery Server 与内容管理系统之间的接口。使用此 API 可以编写内容管理适配器,以便在内容发送到订户的设备时测试内容二进制代码或更改内容信息。例如,可以创建内容管理适配器,以便添加用于处理数字权限管理 (Digital Rights Management, DRM) 的代码,或者在预览文件中添加水印。



注 - 如果内容管理适配器需要在开发者提交内容的原始版本上运行,则提交验证器工作流不得在提交时执行任何测试或修改。有关创建工作流和配置 Content Delivery Server 附带的提交验证器工作流的信息,请参见《Sun Javatrademark System Content Delivery Server 5.1 集成和配置指南》中的第 14 章“提交验证器工作流”。



内容管理适配器在处理收到的调用时需要一些时间,这会延迟内容传送到订户的时间。尽量将内容管理 API 的使用限制为不增加过多开销的操作。

内容管理 API 包括以下元素:

有关这些类和接口的其他信息,请参见 $CDS_HOME/javadoc/cdsapi/index.html 中的 Javadoc 工具的 HTML 输出。


4.1 一般处理流程

内容管理 API 用于处理 Content Delivery Server 与外部内容管理系统或 DRM 服务器之间的通信。内容和事务的详细信息保留在 ContentInfo 对象中。使用此 API 可以访问和处理内容传送给订户时的内容信息。

本节介绍了设备、Content Delivery Server 及内容管理适配器之间的信息流。将讨论以下主题:

4.1.1 获取内容列表

当订户在 Subscriber Portal 中单击“类别”下的内容标题时,将启动内容列表请求。为了实现该请求,系统将执行以下操作:

1. 订户设备向 Content Delivery Server 发送请求以获取有关选定类别中内容项的信息。

2. Content Delivery Server 根据 Content Delivery Server 数据库中的信息,为列表中的各项创建初始 ContentInfo 对象。此信息显示给订户或由 Content Delivery Server 使用。

3. Content Delivery Server 调用 getContentInfos 并传递列表中各项的 ContentInfo 对象。

getContentInfos 的实现可以根据系统需要更改内容信息。此时仅修改内容列表中显示给订户的信息。

4. Content Delivery Server 将该类别的项目列表和其他信息返回到订户设备。

5. Subscriber Portal 在页面的“结果”部分中显示该列表。

4.1.2 获取内容详细资料

当订户在 Subscriber Portal 的“结果”页中单击某个内容项的名称或“更多详细信息”时,将启动有关特定内容项详细信息的请求。以下各项介绍了有关获取内容详细资料的事务步骤:

1. 订户在 Subscriber Portal 的“结果”页中单击特定内容项的名称或“更多详细信息”。

2. 订户设备向 Content Delivery Server 发送请求以获取选定内容项的信息。

3. Content Delivery Server 为单个项目调用 getContentInfo。方法的实现可以返回有关内容的详细信息,如二进制代码和描述符的 MIME 类型、内容的大小和类型(如 ringtone 或 MIDlet)以及事务详细信息。也可以修改与内容项关联的任何预览文件。

4. Content Delivery Server 将有关内容项以及任何预览文件的详细信息传递到订户设备。

4.1.3 下载内容

订户从设备选择购买内容时将启动获取内容的进程。通常,在将内容传送给订户之前将对其进行测试。可以基于很多因素进行测试,如订户的电话类型(CDMA 或 GSM)、价格模型(订阅或使用)、内容类型或其他特征。以下各项介绍了下载内容的事务步骤:

1. 订户在 Subscriber Portal 中选择所需的内容项,然后单击“立即下载”。订户必须从设备而不是 PC 访问 Subscriber Portal。

2. 对于两步下载,设备会将请求发送到 Content Delivery Server 以下载内容描述符。

3. Content Delivery Server 为请求的内容项生成初始的 ContentInfo 对象。

4. Content Delivery Server 将从 Content Delivery Server 数据库中检索内容二进制代码、描述符及其 MIME 类型,并将其传递到内容管理系统。

5. Content Delivery Server 将调用getContentDescriptor 以处理内容详细资料并对描述符文件进行适当更新。

6. 内容管理系统将返回描述符文件的更新版本,该更新版本包含向订户传送的值。

7. Content Delivery Server 将更新的描述符文件传递到订户设备。

8. 该设备向 Content Delivery Server 发出请求,以获得内容二进制代码。订户在设备中单击显示的 URL 即可发送请求(发送请求的方法之一)。

9. Content Delivery Server 使用内容二进制代码及其 MIME 类型填充 ContentInfo 对象并将该对象传递给内容管理适配器。

10. Content Delivery Server 调用 getContentBinary 以创建更新的内容二进制文件。

11. 内容管理适配器对内容进行测试并将更新的内容二进制文件及二进制 MIME 类型传回 Content Delivery Server。



注 - 在发布内容时将完成功能匹配(用于确定运行内容所用的设备)。内容管理适配器更改内容后不能出现以下情形,即设备无法再运行该内容。可能影响设备运行内容的更改包括增加内容大小或更改 MIME 类型。



12. Content Delivery Server 将更新内容传递到订户设备。


4.2 ContentManager 接口

ContentManager 接口提供 Content Delivery Server 与内容管理系统或 DRM 服务器之间的接口。您可以实现它所提供的方法,以便在内容二进制代码、描述符和其他信息传送给订户之前对其进行修改。

该类中的方法将 ContentInfo 对象和 BillingInfo 对象作为参数。ContentInfo 对象包含内容二进制代码、内容描述符文件和其他信息,如内容二进制代码和描述符的 MIME 类型、内容的大小和类型,以及下载内容所需的步骤数。

BillingInfo 对象包含事务详细信息,如价格模型。此对象还包含订户信息。有关记帐和 BillingInfo 对象的详细信息,请参见 3

ContentManager 接口位于 com.sun.content.server.content 软件包中。

4.2.1 getContentInfo 方法

abstract ContentInfo getContentInfo(ContentInfo inContentInfo, BillingInfo inBillingInfo) throws ContentException

此方法在订户请求有关单个内容项的信息时由 Content Delivery Server 调用。ContentInfo 对象包含有关初始内容项的信息,如内容二进制代码和描述符的 MIME 类型、估计的内容大小和类型(如 ringtone 或 MIDlet)以及下载该内容所需的步骤数。

要修改预览文件,请使用 ContentInfo.getValue 方法和 KEY_CONTENT_PREVIEWS 键获取 ContentInfo 对象中的原始 ContentPreview 对象集合。每个 ContentPreview 对象表示一个预览文件。如果内容项没有预览文件,该方法将返回一个空集合。在从 Subscriber Portal 请求内容详细信息时,如果既未包含返回资源二进制文件的标志,也未包含返回资源 URL 的标志,该方法将返回 Null。

在修改预览文件后,请使用 ContentInfo.setValue 方法和 KEY_CONTENT_PREVIEWS 键保存返回到 Content Delivery Server 的 ContentInfo 对象中的已修改 ContentPreview 对象集合。

4.2.2 getContentInfos 方法

abstract ContentInfo[] getContentInfos(ContentInfo[]inContentInfos, BillingInfo[] inBillingInfos) throws ContentException

此方法在订户请求有关类别中内容项列表的信息时由 Content Delivery Server 调用。对实现进行编码,以便仅修改内容列表中显示的信息。

4.2.3 getContentDescriptor 方法

abstract ContentInfo getContentDescriptor(ContentInfo inContentInfo, BillingInfo inBillingInfo) throws ContentException

此方法在订户启动将内容描述符下载到设备的请求时由 Content Delivery Server 调用。Content Delivery Server 检索内容描述符文件。内容描述符和二进制代码将传递到内容管理系统。内容管理系统可以更新内容描述符信息(包括大小),并将其返回到 Content Delivery Server 以便传送给订户。

4.2.4 getContentBinary 方法

abstract ContentInfo getContentBinary(ContentInfo inContentInfo, BillingInfo inBillingInfo) throws ContentException

此方法在订户启动将内容二进制代码下载到设备的请求时由 Content Delivery Server 调用。在调用 getContentBinary 时可以将二进制代码传递到内容管理适配器。要传送给订户的已测试内容二进制代码必须返回到 Content Delivery Server。


4.3 使用内容管理 API

cdsapi.jar 中提供了内容管理 API 的类。编译内容管理适配器时,cdsapi.jar 文件必须位于类路径中。为方便起见,$CDS_HOME/dist/cds/staging/jar 目录中提供了所有 Content Delivery Server JAR 文件的副本。在编译所创建的适配器时,请在类路径中使用此缓冲区。

使适配器可用于 Content Delivery Server 取决于所使用的应用服务器,以及是否已部署了该服务器。要使适配器可用,请执行以下操作:

1. 为适配器创建 JAR 文件。

2. 对于所有应用服务器,请将该 JAR 文件放在 $CDS_HOME/dist/cds/lib/external 目录中。

现在,该适配器将包含在所有以后的部署中。

3. 如果现有部署需要使用该适配器,请将该 JAR 文件放在每个部署的 $CDS_HOME/deployment/deployment-name/lib/external 目录中。

如果使用的是 WebLogic Server,则会为您处理类路径。

如果使用的是 Sun Java System Application Server,则会为每个部署更新类路径:

a. 在编辑 $CDS_HOME/deployment/deployment-name/sun/domains/cdsdomain/config/domain.xml 文件之前,先对其进行备份,以便从编辑期间可能引入的任何错误中恢复。

b. 编辑 domain.xml 并修改 java-config 元素,将 JAR 文件的绝对路径添加到 classpath-suffix 属性中。

c. 保存所做的更改。

4. 编辑 $CDS_HOME/deployment/deployment-name/conf 目录中的 security.config 文件:

a. 将名为 module.security.contentmanager 的属性添加到具有相同名称的现有属性之后。

现有 module.security.contentmanager 属性指向 Content Delivery Server 附带的 DRM 代理所使用的具体实现,该属性必须第一个出现。

b. 将所添加的属性设置为 ContentManager 接口实现的全限定软件包和类名。

以下代码显示了 module.security.contentmanager 属性的样例设置:


module.security.contentmanager=
com.sun.content.server.fulfillment.content.external.SunContentManager
module.security.contentmanager=myapps.adapters.ContentManagerImpl

 

c. 将 module.security.contentmanager.enabled 属性设置为 true,以表明适配器可供 Content Delivery Server 调用。

d. 保存所做的更改。

5. 重新启动任何现有部署以识别新的 JAR 文件。


4.4 样例内容管理适配器

编码样例 4-1 显示了 ContentManager 接口的样例实现。


编码样例 4-1 样例 ContentManager 实现

import com.sun.content.server.content.*;
import com.sun.content.server.billing.BillingInfo;
 
public class ContentManagerImpl implements ContentManager
{
  public ContentInfo getContentInfo(
    ContentInfo inContentInfo,
    BillingInfo inBillingInfo)
  throws ContentException
  {
    // Update the information that is shown to the user
    return inContentInfo;
  }
 
  public ContentInfo[] getContentInfos(
    ContentInfo[] inContentInfos,
    BillingInfo[] inBillingInfos)
  throws ContentException
  {
    // Iterate through each ContentInfo object and update the
    // information that is shown to the user when a list of
    // content is shown.
    return inContentInfos;
  }
 
  public ContentInfo getContentDescriptor(
    ContentInfo inContentInfo,
    BillingInfo inBillingInfo)
  throws ContentException
  {
    // Update content download descriptor
    return inContentInfo;
  }
 
  public ContentInfo getContentBinary(
    ContentInfo inContentInfo,
    BillingInfo inBillingInfo)
  throws ContentException
  {
    // Update content binary, binary MIME type
    return inContentInfo;
  }
}