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());
}
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());
}
//用于创建新适配器实例的工厂方法//
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());
}
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());
}
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());
}
public TemplateModelIterator iterator() throws TemplateModelException {
return new IteratorToTemplateModelIteratorAdapter(collection.iterator(), getObjectWrapper());
}



