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

FreeMarker源码分析(五)

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

FreeMarker源码分析(五)

2021SC@SDUSC

目录

DefaultArrayAdapter.java

源码展示

关键代码分析

adapt()

ByteArrayAdapter

 DefaultListAdapter.java

源码展示

关键代码分析

get()

getAPI()

DefaultNonListCollectionAdapter

源码展示

关键代码分析

iterator()

   


DefaultArrayAdapter.java

源码展示

package freemarker.template;

import java.io.Serializable;
import java.lang.reflect.Array;

import freemarker.ext.util.WrapperTemplateModel;


public abstract class DefaultArrayAdapter extends WrappingTemplateModel implements TemplateSequenceModel,
        AdapterTemplateModel, WrapperTemplateModel, Serializable {

    
    public static DefaultArrayAdapter adapt(Object array, ObjectWrapperAndUnwrapper wrapper) {
        final Class componentType = array.getClass().getComponentType();
        if (componentType == null) {
            throw new IllegalArgumentException("Not an array");
        }
        
        if (componentType.isPrimitive()) {
            if (componentType == int.class) {
                return new IntArrayAdapter((int[]) array, wrapper);
            }
            if (componentType == double.class) {
                return new DoubleArrayAdapter((double[]) array, wrapper);
            }
            if (componentType == long.class) {
                return new LongArrayAdapter((long[]) array, wrapper);
            }
            if (componentType == boolean.class) {
                return new BooleanArrayAdapter((boolean[]) array, wrapper);
            }
            if (componentType == float.class) {
                return new FloatArrayAdapter((float[]) array, wrapper);
            }
            if (componentType == char.class) {
                return new CharArrayAdapter((char[]) array, wrapper);
            }
            if (componentType == short.class) {
                return new ShortArrayAdapter((short[]) array, wrapper);
            }
            if (componentType == byte.class) {
                return new ByteArrayAdapter((byte[]) array, wrapper);
            }
            return new GenericPrimitiveArrayAdapter(array, wrapper);
        } else {
            return new ObjectArrayAdapter((Object[]) array, wrapper);
        }
    }

    private DefaultArrayAdapter(ObjectWrapper wrapper) {
        super(wrapper);
    }

    @Override
    public final Object getAdaptedObject(Class hint) {
        return getWrappedObject();
    }

    private static class ObjectArrayAdapter extends DefaultArrayAdapter {

        private final Object[] array;

        private ObjectArrayAdapter(Object[] array, ObjectWrapper wrapper) {
            super(wrapper);
            this.array = array;
        }

        @Override
        public TemplateModel get(int index) throws TemplateModelException {
            return index >= 0 && index < array.length ? wrap(array[index]) : null;
        }

        @Override
        public int size() throws TemplateModelException {
            return array.length;
        }

        @Override
        public Object getWrappedObject() {
            return array;
        }

    }

    private static class ByteArrayAdapter extends DefaultArrayAdapter {

        private final byte[] array;

        private ByteArrayAdapter(byte[] array, ObjectWrapper wrapper) {
            super(wrapper);
            this.array = array;
        }

        @Override
        public TemplateModel get(int index) throws TemplateModelException {
            return index >= 0 && index < array.length ? wrap(Byte.valueOf(array[index])) : null;
        }

        @Override
        public int size() throws TemplateModelException {
            return array.length;
        }

        @Override
        public Object getWrappedObject() {
            return array;
        }

    }

    private static class ShortArrayAdapter extends DefaultArrayAdapter {

        private final short[] array;

        private ShortArrayAdapter(short[] array, ObjectWrapper wrapper) {
            super(wrapper);
            this.array = array;
        }

        @Override
        public TemplateModel get(int index) throws TemplateModelException {
            return index >= 0 && index < array.length ? wrap(Short.valueOf(array[index])) : null;
        }

        @Override
        public int size() throws TemplateModelException {
            return array.length;
        }

        @Override
        public Object getWrappedObject() {
            return array;
        }

    }

    private static class IntArrayAdapter extends DefaultArrayAdapter {

        private final int[] array;

        private IntArrayAdapter(int[] array, ObjectWrapper wrapper) {
            super(wrapper);
            this.array = array;
        }

        @Override
        public TemplateModel get(int index) throws TemplateModelException {
            return index >= 0 && index < array.length ? wrap(Integer.valueOf(array[index])) : null;
        }

        @Override
        public int size() throws TemplateModelException {
            return array.length;
        }

        @Override
        public Object getWrappedObject() {
            return array;
        }

    }

    private static class LongArrayAdapter extends DefaultArrayAdapter {

        private final long[] array;

        private LongArrayAdapter(long[] array, ObjectWrapper wrapper) {
            super(wrapper);
            this.array = array;
        }

        @Override
        public TemplateModel get(int index) throws TemplateModelException {
            return index >= 0 && index < array.length ? wrap(Long.valueOf(array[index])) : null;
        }

        @Override
        public int size() throws TemplateModelException {
            return array.length;
        }

        @Override
        public Object getWrappedObject() {
            return array;
        }

    }

    private static class FloatArrayAdapter extends DefaultArrayAdapter {

        private final float[] array;

        private FloatArrayAdapter(float[] array, ObjectWrapper wrapper) {
            super(wrapper);
            this.array = array;
        }

        @Override
        public TemplateModel get(int index) throws TemplateModelException {
            return index >= 0 && index < array.length ? wrap(Float.valueOf(array[index])) : null;
        }

        @Override
        public int size() throws TemplateModelException {
            return array.length;
        }

        @Override
        public Object getWrappedObject() {
            return array;
        }

    }

    private static class DoubleArrayAdapter extends DefaultArrayAdapter {

        private final double[] array;

        private DoubleArrayAdapter(double[] array, ObjectWrapper wrapper) {
            super(wrapper);
            this.array = array;
        }

        @Override
        public TemplateModel get(int index) throws TemplateModelException {
            return index >= 0 && index < array.length ? wrap(Double.valueOf(array[index])) : null;
        }

        @Override
        public int size() throws TemplateModelException {
            return array.length;
        }

        @Override
        public Object getWrappedObject() {
            return array;
        }

    }

    private static class CharArrayAdapter extends DefaultArrayAdapter {

        private final char[] array;

        private CharArrayAdapter(char[] array, ObjectWrapper wrapper) {
            super(wrapper);
            this.array = array;
        }

        @Override
        public TemplateModel get(int index) throws TemplateModelException {
            return index >= 0 && index < array.length ? wrap(Character.valueOf(array[index])) : null;
        }

        @Override
        public int size() throws TemplateModelException {
            return array.length;
        }

        @Override
        public Object getWrappedObject() {
            return array;
        }

    }

    private static class BooleanArrayAdapter extends DefaultArrayAdapter {

        private final boolean[] array;

        private BooleanArrayAdapter(boolean[] array, ObjectWrapper wrapper) {
            super(wrapper);
            this.array = array;
        }

        @Override
        public TemplateModel get(int index) throws TemplateModelException {
            return index >= 0 && index < array.length ? wrap(Boolean.valueOf(array[index])) : null;
        }

        @Override
        public int size() throws TemplateModelException {
            return array.length;
        }

        @Override
        public Object getWrappedObject() {
            return array;
        }

    }

    
    private static class GenericPrimitiveArrayAdapter extends DefaultArrayAdapter {

        private final Object array;
        private final int length;

        private GenericPrimitiveArrayAdapter(Object array, ObjectWrapper wrapper) {
            super(wrapper);
            this.array = array;
            length = Array.getLength(array);
        }

        @Override
        public TemplateModel get(int index) throws TemplateModelException {
            return index >= 0 && index < length ? wrap(Array.get(array, index)) : null;
        }

        @Override
        public int size() throws TemplateModelException {
            return length;
        }

        @Override
        public Object getWrappedObject() {
            return array;
        }

    }

}

关键代码分析

adapt()
//用于创建新适配器实例的工厂方法//

public static DefaultArrayAdapter adapt(Object array, ObjectWrapperAndUnwrapper wrapper) {

//array—适应的清单;不能为空//

//wrapper—用于包装数组中的项的ObjectWrapper//
        final Class componentType = array.getClass().getComponentType();
        if (componentType == null) {
            throw new IllegalArgumentException("Not an array");
        }
        
        if (componentType.isPrimitive()) {
            if (componentType == int.class) {
                return new IntArrayAdapter((int[]) array, wrapper);
            }
            if (componentType == double.class) {
                return new DoubleArrayAdapter((double[]) array, wrapper);
            }
            if (componentType == long.class) {
                return new LongArrayAdapter((long[]) array, wrapper);
            }
            if (componentType == boolean.class) {
                return new BooleanArrayAdapter((boolean[]) array, wrapper);
            }
            if (componentType == float.class) {
                return new FloatArrayAdapter((float[]) array, wrapper);
            }
            if (componentType == char.class) {
                return new CharArrayAdapter((char[]) array, wrapper);
            }
            if (componentType == short.class) {
                return new ShortArrayAdapter((short[]) array, wrapper);
            }
            if (componentType == byte.class) {
                return new ByteArrayAdapter((byte[]) array, wrapper);
            }
            return new GenericPrimitiveArrayAdapter(array, wrapper);
        } else {
            return new ObjectArrayAdapter((Object[]) array, wrapper);
        }
    }

ByteArrayAdapter
// ByteArrayAdapter类作为DefaultArrayAdapter的子类实现对ByteArray 的加工 //
 private static class ByteArrayAdapter extends DefaultArrayAdapter {

        private final byte[] array;
 
        private ByteArrayAdapter(byte[] array, ObjectWrapper wrapper) {
            super(wrapper);
            this.array = array;
        }

        @Override
        public TemplateModel get(int index) throws TemplateModelException {
            return index >= 0 && index < array.length ? wrap(Byte.valueOf(array[index])) : null;
        }

        @Override
        public int size() throws TemplateModelException {
            return array.length;
        }

        @Override
        public Object getWrappedObject() {
            return array;
        }

    }

 DefaultListAdapter.java 源码展示

package freemarker.template;

import java.io.Serializable;
import java.util.AbstractSequentialList;
import java.util.List;

import freemarker.ext.util.WrapperTemplateModel;
import freemarker.template.utility.ObjectWrapperWithAPISupport;
import freemarker.template.utility.RichObjectWrapper;


public class DefaultListAdapter extends WrappingTemplateModel implements TemplateSequenceModel,
        AdapterTemplateModel, WrapperTemplateModel, TemplateModelWithAPISupport, Serializable {

    protected final List list;

    
    public static DefaultListAdapter adapt(List list, RichObjectWrapper wrapper) {
        // [2.4] DefaultListAdapter should implement TemplateCollectionModelEx, so this choice becomes unnecessary
        return list instanceof AbstractSequentialList
                ? new DefaultListAdapterWithCollectionSupport(list, wrapper)
                : new DefaultListAdapter(list, wrapper);
    }

    private DefaultListAdapter(List list, RichObjectWrapper wrapper) {
        super(wrapper);
        this.list = list;
    }

    @Override
    public TemplateModel get(int index) throws TemplateModelException {
        return index >= 0 && index < list.size() ? wrap(list.get(index)) : null;
    }

    @Override
    public int size() throws TemplateModelException {
        return list.size();
    }

    @Override
    public Object getAdaptedObject(Class hint) {
        return getWrappedObject();
    }

    @Override
    public Object getWrappedObject() {
        return list;
    }

    private static class DefaultListAdapterWithCollectionSupport extends DefaultListAdapter implements
            TemplateCollectionModel {

        private DefaultListAdapterWithCollectionSupport(List list, RichObjectWrapper wrapper) {
            super(list, wrapper);
        }

        @Override
        public TemplateModelIterator iterator() throws TemplateModelException {
            return new IteratorToTemplateModelIteratorAdapter(list.iterator(), getObjectWrapper());
        }

    }

    @Override
    public TemplateModel getAPI() throws TemplateModelException {
        return ((ObjectWrapperWithAPISupport) getObjectWrapper()).wrapAsAPI(list);
    }
    
}
关键代码分析

get()

public TemplateModel get(int index) throws TemplateModelException {
        return index >= 0 && index < list.size() ? wrap(list.get(index)) : null;
    }

getAPI()
public TemplateModel getAPI() throws TemplateModelException {
        return ((ObjectWrapperWithAPISupport) getObjectWrapper()).wrapAsAPI(list);
    }
    

DefaultNonListCollectionAdapter 源码展示
public class DefaultNonListCollectionAdapter extends WrappingTemplateModel implements TemplateCollectionModelEx,
        AdapterTemplateModel, WrapperTemplateModel, TemplateModelWithAPISupport, Serializable {

    private final Collection collection;

    
    public static DefaultNonListCollectionAdapter adapt(Collection collection, ObjectWrapperWithAPISupport wrapper) {
        return new DefaultNonListCollectionAdapter(collection, wrapper);
    }

    private DefaultNonListCollectionAdapter(Collection collection, ObjectWrapperWithAPISupport wrapper) {
        super(wrapper);
        this.collection = collection;
    }

    @Override
    public TemplateModelIterator iterator() throws TemplateModelException {
        return new IteratorToTemplateModelIteratorAdapter(collection.iterator(), getObjectWrapper());
    }

    @Override
    public int size() {
        return collection.size();
    }

    @Override
    public boolean isEmpty() {
        return collection.isEmpty();
    }

    @Override
    public Object getWrappedObject() {
        return collection;
    }

    @Override
    public Object getAdaptedObject(Class hint) {
        return getWrappedObject();
    }

    public boolean contains(TemplateModel item) throws TemplateModelException {
        Object itemPojo = ((ObjectWrapperAndUnwrapper) getObjectWrapper()).unwrap(item);
        try {
            return collection.contains(itemPojo);
        } catch (ClassCastException e) {
            throw new _TemplateModelException(e,
                    "Failed to check if the collection contains the item. Probably the item's Java type, ",
                    itemPojo != null ? new _DelayedShortClassName(itemPojo.getClass()) : "Null",
                    ", doesn't match the type of (some of) the collection items; see cause exception.");
        }
    }

    @Override
    public TemplateModel getAPI() throws TemplateModelException {
        return ((ObjectWrapperWithAPISupport) getObjectWrapper()).wrapAsAPI(collection);
    }

}
关键代码分析

iterator()


 public TemplateModelIterator iterator() throws TemplateModelException {
        return new IteratorToTemplateModelIteratorAdapter(collection.iterator(), getObjectWrapper());
    }

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

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

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