2021SC@SDUSC【软件工程应用与实践】Cocoon项目4——core文件夹分析(3)

2021SC@SDUSC

CachingSource.java

1、总结

这个类实现了一个类似source的代理,它使用另一个source来获取内容。 此实现可以在给定的时间段内缓存内容。
继承自AbstractLogEnabled
实现了Serviceable, Initializable, XMLizable, Source接口

2、主要属性

//已使用的协议
final protected String protocol;
//完整的url字符串
final protected String uri;
//底层源的完整url字符串
final protected String sourceUri;
//真实内容的source对象
protected Source source;
//判断是否更新了元信息
private boolean freshMeta;
//缓存对象失效前的秒数
final protected int expires;
//由于同步刷新异常而失败
final protected boolean fail;
//缓存键扩展
final protected String cacheName;
// 异步刷新策略
final protected boolean async;
  • expires 参数的值包含一些额外的语义。 指定 -1 将产生始终被视为有效的缓存响应。 值 0 可用于实现完全相反的效果。 也就是说,缓存的内容会被立即无条件抛出并更新
  • cache-fail 参数允许后续同步请求(必须刷新)在无法访问包装源的情况下失败,其默认值为 true

3、方法

protected SourceMeta getResponseMeta() throws IOException
  • 使用元信息初始化缓存的响应,若无法初始化二进制响应抛出I/O异常
protected byte[] getBinaryResponse() throws IOException
  • 使用元和二进制内容初始化缓存的响应,若无法初始化二进制响应抛出I/O异常
  • 根据freshMeta的值判断是否要刷新元
protected byte[] getXMLResponse() throws SAXException, IOException
  • 使用元、二进制和 XML 内容初始化缓存的响应
  • 若在 xml 处理过程中出现问题,抛出 SAXException,若发生 IO 级别错误,抛出I/O异常,其他异常情况则抛出CascadingIOException
private SourceMeta getMeta()
  • 将元数据返回给source,若无法初始化元则返回默认元值

实现Serviceable接口

public void service(ServiceManager manager)
  • Serviceable 是一个需要使用“角色”抽象连接到软件组件的类,因此不依赖于特定的实现,而是依赖于行为接口。
  • 围绕 Serviceable 契约的主体是用户。 Serviceable 能够使用由它初始化的 ServiceManager 管理的对象。 作为与系统契约的一部分,实例化实体必须在 Serviceable 被认为有效之前调用服务方法

实现Initializable接口

public void initialize() throws Exception
  • 初始化source,若后续请求永远不会失败,则保存响应,若相应无效则删除
  • PS:Initializable 接口由需要在激活之前分配资源的组件使用,用来初始化组件,包括分配整个组件生命周期所需的任何资源

实现source接口

public String getScheme()
  • 返回协议标识符,即 URI 中第一个 ‘:’ 之前的部分
  • 这个方法可以用来获取负责这个对象的SourceFactory
public long getContentLength()
  • 获取source的内容长度,如果无法确定长度,则返回 -1
public long getLastModified()
  • 获取最后修改日期,时限为自格林威治标准时间 1970 年 1 月 1 日以来的最后一次修改(以毫秒为单位),如果未知则返回0
public InputStream getInputStream() throws IOException
  • 返回一个 InputStream 以从source读取,不可能为
  • PS:如果这是可修改的,可能会从两个不同的调用中获得不同的内容。返回的流必须由调用代码关闭。
public String getMimeType()
  • 获取此对象描述的内容的mime类型,若无法确定则返回null
public String getURI()
  • 返回此源的唯一标识符url
public SourceValidity getValidity()
  • 获取有效性对象,可以包含上次修改日期或过期信息或描述此对象有效性的任何其他内容,若当前无法计算则返回null
public void refresh()
  • 刷新此对象并更新上次修改日期和内容长度,只创建缓存的对象,若不存在则清除缓存数据
  • 仅当缓存内容过期时,此方法才会尝试刷新缓存的元数据和内容,即使source不存在,也要将该事实缓存

缓存如何工作?
第一次获得source对象时,只需通过 get InputStream()询问其内容,然后通过调用getValidity()来获取有效性对象。(调用getValidity()总是返回相同的对象)缓存算法现在可以将此Validity与source的系统标识符一起存储。下一次,缓存算法要检查缓存内容是否仍然有效,即再次检查其Validity值。
如果它仍然与第一次相同的source,则必须调用refresh() 才能丢弃source对象中存储的有效性。如果是新的source对象,调用refresh() 不应造成任何伤害。之后,可以通过调用getValidity()检索最新的Validity。这可用于测试内容是否仍然有效,如源有效性文档中所歧视的内容。如果内容仍然有效,缓存知道该怎么做,如果没有,新内容可以使用 getPutStream()获得。因此,无论是在呼叫getValidity()后,还是在获取"访问流"之后,Validity必须相同,直到调用刷新

XMLizable接口的实现

public void toSAX(ContentHandler contentHandler) throws SAXException
  • 生成表示对象状态的 SAX 事件
  • PS:如果实现可以产生词法事件,则应注意处理程序实际上可以是接受此类事件或直接实现 LexicalHandler 接口的 XMLConsumer
protected String getSourceURI()
  • 返回缓存source的 uri
protected byte[] readXMLResponse(Source source, byte[] binary, ServiceManager manager)throws SAXException, IOException
  • 从source读取 XML 内容并将其返回
protected byte[] readBinaryResponse(Source source)
  • 从source读取二进制内容并将其返回
protected static class SourceMeta implements Serializable
  • 用于缓存source元信息的数据持有者

4、其他

构造器

//构造一个新对象
CachingSource(String protocol, 
              String uri, String sourceUri, 
              Source source, int expires, 
              String cacheName, boolean async, 
              CachingSourceValidityStrategy validityStrategy, 
              boolean fail)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值