其他分享
首页 > 其他分享> > 2021SC@SDUSC【软件工程应用与实践】Cocoon项目12——sitemap-impl文件夹分析(1)

2021SC@SDUSC【软件工程应用与实践】Cocoon项目12——sitemap-impl文件夹分析(1)

作者:互联网

2021SC@SDUSC

sitemap-impl文件夹分析(1)


本次代码主要解析的是sitemap-impl文件夹下的components文件夹

AbstractInterpreter.java

1、总结

  1. Cocoon 用于流量控制的各种脚本语言的抽象超类。 定义一些有用的行为,例如在脚本文件被修改时重新加载脚本文件的能力(在进行开发时很有用),并将控制权传递给 Cocoon 的站点地图以生成结果页面
  2. 属于不同站点地图的流解释器应该被隔离。 为了实现这一点,类实现了 SingleThreaded。 由于站点地图引擎在站点地图构建时查找流程解释器一次,这确保每个站点地图将使用此类的不同实例。 但是该实例将处理给定站点地图的所有流调用,因此必须是线程安全的
  3. 继承自org.apache.cocoon.util.AbstractLogEnabled
    实现了Serviceable, Contextualizable, org.apache.cocoon.components.flow.Interpreter, SingleThreaded, Configurable, Disposable接口

2、主要属性:

//此解释器的实例 ID,用于标识用户范围
private String instanceID;
//是否应该重新加载脚本。 通过 flow.xmap 中的“reload-scripts”属性指定
protected boolean reloadScripts;
//两次检查修改过的脚本文件之间的间隔。 通过 flow.xmap 中的“check-time”XML 属性指定
protected long checkTime;
//需要解析的源位置列表
protected ArrayList needResolve = new ArrayList();

3、方法

public void setInterpreterID(String interpreterID)
public void register(String source) {
        synchronized (this) {
            needResolve.add(source);
        }
    }
public synchronized final void refresh() {
        this.nextCheckTime = System.currentTimeMillis() + this.delay;
        // 调用refresh(),刷新可修改源
        this.source.refresh();
        // 保留上次修改日期
        this.lastModified = source.getLastModified();
}

ContinuationsManagerImpl.java

1、总结

ContinuationsManager 的默认实现,有两种工作模式:

  1. 标准模式 - 延续存储在单个持有人中。没有安全性应用于继续查找,任何人都可以只知道 ID 来调用延续。 将“session-bound-continuations”配置选项设置为 false 以激活此模式
  2. 安全模式 - 每个会话都有自己的延续持有者。延续仅对为其创建的同一会话有效,会话失效也会导致所有绑定的延续失效。将此设置用于 Web 应用程序。 将“session-bound-continuations”配置选项设置为 true 以激活此模式

继承自org.apache.cocoon.util.AbstractLogEnabled
实现了 Configurable, ThreadSafe, Serviceable, Contextualizable接口

2、主要属性

//用于创建连续 ID 的随机数生成器
protected SecureRandom random;
protected byte[] bytes;
//自上次访问以来,内存中的延续存在时间。时间以毫秒为单位,默认为 1 小时
protected int defaultTimeToLive;
//维护 WebContinuation 树的森林
//此集合仅用于 displayAllContinuations()方法的调试
protected Set forest = Collections.synchronizedSet(new HashSet());
//主要延续持有人,除非延续存储在用户会话中,否则使用
protected WebContinuationsHolder continuationsHolder;
//WebContinuation 实例的排序集,基于它们的到期时间,后台线程使用它来使延续无效
protected SortedSet expirations = Collections.synchronizedSortedSet(new TreeSet());
protected boolean bindContinuationsToSession;
protected long expirationCheckInterval;

3、方法

protected void handleLeafContinuationExpiration(WebContinuation wk) 
protected void handleParentContinuationExpiration(WebContinuation parent)
protected WebContinuation generateContinuation(Object kont,
                                                 WebContinuation parent,
                                                 int ttl,
                                                 String interpreterId,
                                                 ContinuationsDisposer disposer) {

        char[] result = new char[bytes.length * 2];
        WebContinuation wk;
        WebContinuationsHolder continuationsHolder = lookupWebContinuationsHolder(true);
        while (true) {
            random.nextBytes(bytes);

            for (int i = 0; i < CONTINUATION_ID_LENGTH; i++) {
                byte ch = bytes[i];
                result[2 * i] = Character.forDigit(Math.abs(ch >> 4), 16);
                result[2 * i + 1] = Character.forDigit(Math.abs(ch & 0x0f), 16);
            }
            final String id = new String(result);
            synchronized (continuationsHolder) {
                if (!continuationsHolder.contains(id)) {
                    if (this.bindContinuationsToSession)
                        wk = new HolderAwareWebContinuation(id, kont, parent,
                                                            ttl, interpreterId, disposer,
                                                            continuationsHolder);
                    else
                        wk = new WebContinuation(id, kont, parent, ttl,
                                                 interpreterId, disposer);
                    continuationsHolder.addContinuation(wk);
                    break;
                }
            }
        }
        wk.setLogger(getLogger());
        return wk;
}
protected void removeContinuation(WebContinuationsHolder continuationsHolder,
            WebContinuation wk) {
        if (wk.getChildren().size() != 0) {
            return;
        }
        // 删除对这个 contination 的访问
        disposeContinuation(continuationsHolder, wk);
        _detach(wk);
        if (getLogger().isDebugEnabled()) {
            getLogger().debug("WK: Deleted continuation: " + wk.getId());
        }
        // 现在检查是否需要删除父级
        WebContinuation parent = wk.getParentContinuation();
        if (null != parent && parent.hasExpired()) {
            //父级必须具有相同的延续持有者,不需要查找            removeContinuation(continuationsHolder, parent);
        }
}
protected void invalidateContinuations(WebContinuationsHolder continuationsHolder)

4、构造器

public HolderAwareWebContinuation(String id,
                                  Object continuation,
                                  WebContinuation parentContinuation,
                                  int timeToLive,
                                  String interpreterId,
                                  ContinuationsDisposer disposer,
                                  WebContinuationsHolder continuationsHolder) {
            super(id, continuation, parentContinuation, timeToLive, interpreterId, disposer);
            this.continuationsHolder = continuationsHolder;
        }

FlowHelper.java

1、总结

提供流控制器层和视图层之间的接口

视图可以获取流脚本发送的上下文对象和当前的 Web 延续(如果有)

2、主要属性

定义对象模型中用于存储各种对象的键的常量。 这些常量是私有的,因此对这些对象的访问只能通过下面提供的访问器

这些对象存储在对象模型中而不是作为请求属性存储,因为对象模型是为子请求克隆的(请参阅 EnvironmentWrapper),而请求属性在“真实”请求及其所有子请求之间共享

//用于存储流上下文的请求属性名称
private static final String CONTEXT_OBJECT = "cocoon.flow.context";
//用于存储流延续的请求属性名称
private static final String CONTINUATION_OBJECT = "cocoon.flow.continuation";

3、方法

public final static Object getContextObject(Map objectModel)
public final static void setContextObject(Map objectModel, ObjectModel newObjectModel, Object obj)

标签:12,2021SC,wk,延续,WebContinuation,protected,continuationsHolder,impl,String
来源: https://blog.csdn.net/weixin_51523159/article/details/121788233