5


内容验证 API

本章介绍 Sun Java System Content Delivery Server 内容验证 API。使用此 API 可创建验证和保护所提交内容时所需的内容验证适配器。在将内容提交到 Content Delivery Server 时执行的提交验证器工作流会使用内容验证适配器。

内容验证 API 包括以下类:

内容验证 API 的类位于 com.sun.content.server.validation.adapter 软件包中。有关这些类的其他信息,请参见位于 $CDS_HOME/javadoc/validation/index.html 的 Javadoc 工具的 HTML 输出。


5.1 一般处理流程

提交到 Content Delivery Server 的每项内容由 $CDS_HOME/deployment/deployment-name/conf/SubmissionVerifierWorkflows.xml 文件中定义的工作流处理。工作流由一系列步骤组成。在每个步骤中,该步骤指定的内容验证适配器将对内容二进制代码执行某种类型的处理。例如,一个步骤可能提供混淆处理,另一步骤可能为数字权限管理 (Digital Rights Management, DRM) 添加代码。有关创建内容验证工作流的信息,请参见《Sun Javatrademark System Content Delivery Server 5.1 集成和配置指南》中的第 14.3 节“创建工作流”。

对于工作流中的每个步骤,Content Delivery Server 调用为该步骤指定的内容验证适配器,并向其传递一个 ValidationContent 对象和一个 Properties 对象。ValidationContent 对象包含被提交内容的元数据和内容二进制代码。Properties 对象包含工作流中为该步骤定义的参数。

对于工作流中的第一步,Content Delivery Server 创建初始 ValidationContent 对象。对于随后的每个步骤,前一步返回的 ValidationContent 对象将传递到下一步的内容验证适配器。


5.2 ValidationAdapter

ValidationAdapter 类处理元数据和内容二进制代码,并执行任何必要的转换。本节介绍需要实现的方法。

5.2.1 execute 方法

public abstract ValidationContent execute(ValidationContent content, java.util.Properties properties) throws java.lang.Exception

执行工作流中的步骤时,Content Delivery Server 将调用 execute 方法。此方法的参数是上一个步骤中的 ValidationContent 对象以及在工作流步骤中指定的参数。您必须知道在工作流的上一个步骤中创建的 ValidationContent 对象的类型。例如,如果在工作流的第一步使用某个适配器,则该适配器必须准备从 Content Delivery Server 接收 InitialValidationContent 对象。

在实现此方法时,您必须处理传递的属性,并创建要返回的 ValidationContent 对象。根据需要处理元数据和内容二进制代码。例如,要对代码进行混淆处理,请调用所需的混淆器来转换内容二进制代码,并在 ValidationContent 对象中返回新的内容二进制代码。必须知道工作流下一步中预期的 ValidationContent 对象的类型并生成该对象类型。例如,如果工作流下一步预期接收定制的 ValidationObject,则此方法必须生成该定制的 ValidationObject

如果您的适配器需要的信息可能更改,或者您不希望进行硬编码,则请为这些值创建属性文件。然后适配器可以通过作为参数传递的 Properties 对象访问文件中的信息。例如,如果您的适配器对代码进行混淆处理,则您可能需要一个属性来标识运行适配器的系统上混淆器的位置。创建的属性文件必须置于 $CDS_HOME/deployment/deployment-name/conf 目录中。还必须在 $CDS_HOME/deployment/deployment-name/conf/SubmissionVerifierAdapters.xml 文件中设置适配器的属性文件名,如 5.4 使用内容验证 API 中所述。

5.2.2 returns 方法

public static java.lang.Class returns(java.lang.Class inputType) throws java.lang.Exception

Content Delivery Server 调用 returns 方法以验证适配器能否处理要传递的 ValidationContent 对象类型。此方法返回的对象类型必须与 execute 方法返回的类型相同。例如,如果 execute 方法返回定制的 ValidationContent 对象,则 returns 方法必须返回相同类型的定制 ValidationContent 对象。

有关此方法的样例实现,请参见 5.5 样例内容验证适配器


5.3 ValidationContent

ValidationContent 类是抽象类,可以扩展该类以创建定制的验证适配器。该类包含内容的元数据和二进制代码部分。如果工作流的某个后续步骤中的适配器需要额外的内容信息,请将该信息添加到从此类扩展而来的类中。


5.4 使用内容验证 API

cdsapi.jar 文件中提供了内容验证 API 的类。在编译适配器时,此文件必须位于类路径中。为方便起见,$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 目录中的 SubmissionVerifierAdapters.xml 文件:

a. 为创建的适配器添加一个语句。

例如,如果创建名为 MyValidationAdapter 的适配器,且该适配器需要名为 validation.properties 的属性文件,请将以下语句添加到文件中:


<adapter id="MyValidationAdapter" name="sample.package.MyValidationAdapter"
propertyfile="validation.properties"/>

 

b. 保存所做的更改。

5. 编辑 $CDS_HOME/deployment/deployment-name/conf 目录中的 SubmissionVerifierWorkflows.xml 文件:

a. 在相应工作流中添加一个步骤,以执行所创建的适配器。

关于步骤元素的 adapter 属性值,请指定为适配器元素(在a 中添加到 SubmissionVerifierAdapters.xml 文件的元素)的 id 属性提供的值。有关创建工作流的信息,请参见《Sun Javatrademark System Content Delivery Server 5.1 集成和配置指南》中的第 14.3 节“创建工作流”。

b. 保存所做的更改。

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


5.5 样例内容验证适配器

以下代码示例是如何扩展 ValidationAdapter 类以实现您自己的验证适配器的样例。


编码样例 5-1 样例 ValidationAdapter 实现

import com.sun.content.server.validation.adapter.*;
import java.io.FileOutputStream;
import java.util.Properties;
 
public class ExportToFileValidationAdapter
extends ValidationAdapter
{
  public ValidationContent execute(
    ValidationContent content, Properties properties)
  throws Exception
  {
    // Export if the filename is specified
    String outFilename =
      properties.getProperty("ExportToFile.FileName");
    if (outFilename != null)
    {
      FileOutputStream fileOutStream = null;
      try
      {
        // get the first byte[] in the map
        // ignore the rest for this sample 
        byte[] bytes = (byte[])
          content.getMimeBytesMap().values().iterator().next();
 
        // Write the byte[] to the output file.
        fileOutStream = new FileOutputStream(outFilename);
        fileOutStream.write(bytes);
        fileOutStream.flush();
        fileOutStream.close();
        fileOutStream = null;
      }
      finally
      {
        if (fileOutStream != null)
        {
          fileOutStream.flush();
          fileOutStream.close();
        }
      }
    }
 
    content.setStatus(ValidationContent.VALID);
 
    return content;
  }
 
  public static Class returns(Class inputType) throws Exception
  {
    if (!ValidationContent.class.isAssignableFrom(inputType))
      throw new Exception("Wrong input type to adapter.");
    return ValidationContent.class;
  }
}