目录 上一页 下一页 索引

第 5 章

内容验证 API


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

内容验证 API 包括以下类:

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

5.1 一般处理流程

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

对于工作流中的每个步骤,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 调用此方法。此时传入前一步的 ValidationContent 对象以及工作流步骤中指定的参数。您必须知道在工作流上一步中创建的 ValidationContent 对象的类型。例如,如果在工作流的第一步使用某个适配器,则该适配器必须准备从 Content Delivery Server 接收 InitialValidationContent 对象。

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

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

5.2.2 returns()

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

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

有关此方法的样例实现,请参见“示例”

5.3 ValidationContent 类

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

5.4 使用内容验证 API

内容验证 API 的类位于软件包 com.sun.content.server.validation.adapter 中。此软件包包含在 validation.jar 文件中,该文件位于以下某个位置:

其中,deployment-name 是部署 Developer Portal 时指定的名称,server-domainapp.server.domain 属性的配置文件中指定的值,server-nameapp.server.name 属性的配置文件中指定的值。

编译适配器时,validation.jar 文件必须位于类路径中。

为使适配器可用于 Content Delivery Server,请执行以下操作:

  1. 为适配器创建 Java 归档 (JAR) 文件,并将 JAR 文件置于 CDS_HOME/deployment/deployment-name/lib/external 目录中,以便在执行过程中 Content Delivery Server 可以找到该文件。
  2. Content Delivery Server 需要重新启动才能发觉新的 JAR 文件。

  3. 修改 $CDS_HOME/deployment/deployment-name/conf 目录中的 SubmissionVerifierAdapters.xml 文件,在其中为所创建的适配器加入一条语句。
  4. 例如,如果创建名为 MyValidationAdapter 的适配器,且该适配器需要名为 validation.properties 的属性文件,那么请将以下语句添加到文件中:

    <adapter id="MyValidationAdapter" name="sample.package.MyValidationAdapter" propertyfile="validation.properties"/> 
    
  5. 修改 $CDS_HOME/deployment/deployment-name/conf 目录中的 SubmissionVerifierWorkflows.xml 文件,加入一个步骤执行所创建的适配器。

有关步骤元素的适配器特性的值,请指定为上一步中添加到 SubmissionVerifierAdapters.xml 文件中的适配器元素 id 特性提供的值。有关创建工作流的信息,请参见《Sun Java System Content Delivery Server 集成指南》。

5.5 示例

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

代码示例 5 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; 
  } 
} 


目录 上一页 下一页 索引 定制指南
Sun Java™ System Content Delivery Server,版本 2004Q1