栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

FreeMarker代码分析第七篇

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

FreeMarker代码分析第七篇

2021SC@SDUSC

FreeMarker代码分析第七篇
  • util包
    • IdentityHashMap.java
      • 代码分析
    • ModelCache.java
      • 代码分析
    • ModelFactory.java
      • 代码分析
    • WrapperTemplateModel.java
      • 代码分析

util包 IdentityHashMap.java 代码分析
package freemarker.ext.util;

import java.util.AbstractCollection;
import java.util.AbstractMap;
import java.util.AbstractSet;
import java.util.Collection;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;


@SuppressWarnings("rawtypes")
@Deprecated
public class IdentityHashMap
    extends AbstractMap
    implements Map, Cloneable, java.io.Serializable {

    public static final long serialVersionUID = 362498820763181265L;
    
    private transient Entry table[];

    
    private transient int count;

ModelCache.java 代码分析
package freemarker.ext.util;

import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.util.IdentityHashMap;
import java.util.Map;

import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelAdapter;


public abstract class ModelCache {
    private boolean useCache = false;
    private Map modelCache = null;
    private ReferenceQueue refQueue = null;
    
    protected ModelCache() {
    }
    
    
    public synchronized void setUseCache(boolean useCache) {
        this.useCache = useCache;
        if (useCache) {
            modelCache = new IdentityHashMap<>();
            refQueue = new ReferenceQueue<>();
        } else {
            modelCache = null;
            refQueue = null;
        }
    }

    
    public synchronized boolean getUseCache() {
        return useCache;
    }
    
    public TemplateModel getInstance(Object object) {
        if (object instanceof TemplateModel) {
            return (TemplateModel) object;
        }
        if (object instanceof TemplateModelAdapter) {
            return ((TemplateModelAdapter) object).getTemplateModel();
        }
        if (useCache && isCacheable(object)) {
            TemplateModel model = lookup(object);
            if (model == null) {
                model = create(object);
                register(model, object);
            }
            return model;
        } else {
            return create(object);
        }
    }
    
    protected abstract TemplateModel create(Object object);
    protected abstract boolean isCacheable(Object object);
    
    public void clearCache() {
        if (modelCache != null) {
            synchronized (modelCache) {
                modelCache.clear();
            }
        }
    }

    private final TemplateModel lookup(Object object) {
        ModelReference ref = null;
        // NOTE: we're doing minimal synchronizations -- which can lead to
        // duplicate wrapper creation. However, this has no harmful side-effects and
        // is a lesser performance hit.
        synchronized (modelCache) {
            ref = modelCache.get(object);
        }

        if (ref != null)
            return ref.getModel();

        return null;
    }

    private final void register(TemplateModel model, Object object) {
        synchronized (modelCache) {
            // Remove cleared references
            for (; ; ) {
                ModelReference queuedRef = (ModelReference) refQueue.poll();
                if (queuedRef == null) {
                    break;
                }
                modelCache.remove(queuedRef.object);
            }
            // Register new reference
            modelCache.put(object, new ModelReference(model, object, refQueue));
        }
    }

    
    private static final class ModelReference extends SoftReference {
        Object object;

        ModelReference(TemplateModel ref, Object object, ReferenceQueue refQueue) {
            super(ref, refQueue);
            this.object = object;
        }

        TemplateModel getModel() {
            return this.get();
        }
    }

}
ModelFactory.java 代码分析
package freemarker.ext.util;

import freemarker.template.ObjectWrapper;
import freemarker.template.TemplateModel;


public interface ModelFactory {
    
    TemplateModel create(Object object, ObjectWrapper wrapper);
}

WrapperTemplateModel.java 代码分析
package freemarker.ext.util;

import freemarker.template.TemplateModel;


public interface WrapperTemplateModel extends TemplateModel {
    
    public Object getWrappedObject();
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/424571.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号