1 52 53 package freemarker.core; 54 55 import freemarker.template.*; 56 import java.util.*; 57 import java.io.Serializable ; 58 59 63 final public class CollectionAndSequence 64 implements TemplateCollectionModel, TemplateSequenceModel, Serializable 65 { 66 private TemplateCollectionModel collection; 67 private TemplateSequenceModel sequence; 68 private ArrayList data; 69 70 public CollectionAndSequence(TemplateCollectionModel collection) { 71 this.collection = collection; 72 } 73 74 public CollectionAndSequence(TemplateSequenceModel sequence) { 75 this.sequence = sequence; 76 } 77 78 public TemplateModelIterator iterator() throws TemplateModelException { 79 if (collection != null) { 80 return collection.iterator(); 81 } else { 82 return new SequenceIterator(sequence); 83 } 84 } 85 86 public TemplateModel get(int i) throws TemplateModelException { 87 if (sequence != null) { 88 return sequence.get(i); 89 } else { 90 initSequence(); 91 return (TemplateModel)data.get(i); 92 } 93 } 94 95 public int size() throws TemplateModelException { 96 if (sequence != null) { 97 return sequence.size(); 98 } else { 99 initSequence(); 100 return data.size(); 101 } 102 } 103 104 private void initSequence() throws TemplateModelException { 105 if (data == null) { 106 data = new ArrayList(); 107 TemplateModelIterator it = collection.iterator(); 108 while (it.hasNext()) { 109 data.add(it.next()); 110 } 111 } 112 } 113 114 private static class SequenceIterator 115 implements TemplateModelIterator 116 { 117 private final TemplateSequenceModel sequence; 118 private final int size; 119 private int index = 0; 120 121 SequenceIterator(TemplateSequenceModel sequence) throws TemplateModelException { 122 this.sequence = sequence; 123 this.size = sequence.size(); 124 125 } 126 public TemplateModel next() throws TemplateModelException { 127 return sequence.get(index++); 128 } 129 130 public boolean hasNext() { 131 return index < size; 132 } 133 } 134 } 135 | Popular Tags |