1 52 53 package freemarker.core; 54 55 import freemarker.template.*; 56 import java.util.*; 57 58 final class HashLiteral extends Expression { 59 60 private final ArrayList keys, values; 61 private final int size; 62 63 HashLiteral(ArrayList keys, ArrayList values) { 64 this.keys = keys; 65 this.values = values; 66 this.size = keys.size(); 67 keys.trimToSize(); 68 values.trimToSize(); 69 } 70 71 TemplateModel _getAsTemplateModel(Environment env) throws TemplateException { 72 return new SequenceHash(env); 73 } 74 75 public String getCanonicalForm() { 76 StringBuffer buf = new StringBuffer ("{"); 77 for (int i = 0; i < size; i++) { 78 Expression key = (Expression) keys.get(i); 79 Expression value = (Expression) values.get(i); 80 buf.append(key.getCanonicalForm()); 81 buf.append(" : "); 82 buf.append(value.getCanonicalForm()); 83 if (i != size-1) { 84 buf.append(","); 85 } 86 } 87 buf.append("}"); 88 return buf.toString(); 89 } 90 91 boolean isLiteral() { 92 if (constantValue != null) { 93 return true; 94 } 95 for (int i = 0; i < size; i++) { 96 Expression key = (Expression) keys.get(i); 97 Expression value = (Expression) values.get(i); 98 if (!key.isLiteral() || !value.isLiteral()) { 99 return false; 100 } 101 } 102 return true; 103 } 104 105 106 Expression _deepClone(String name, Expression subst) { 107 ArrayList clonedKeys = (ArrayList)keys.clone(); 108 for (ListIterator iter = clonedKeys.listIterator(); iter.hasNext();) { 109 iter.set(((Expression)iter.next()).deepClone(name, subst)); 110 } 111 ArrayList clonedValues = (ArrayList)values.clone(); 112 for (ListIterator iter = clonedValues.listIterator(); iter.hasNext();) { 113 iter.set(((Expression)iter.next()).deepClone(name, subst)); 114 } 115 return new HashLiteral(clonedKeys, clonedValues); 116 } 117 118 private class SequenceHash implements TemplateHashModelEx { 119 120 private HashMap keyMap; private TemplateCollectionModel keyCollection, valueCollection; 123 SequenceHash(Environment env) throws TemplateException { 124 keyMap = new HashMap(); 125 ArrayList keyList = new ArrayList(size); 126 ArrayList valueList = new ArrayList(size); 127 for (int i = 0; i< size; i++) { 128 Expression keyExp = (Expression) keys.get(i); 129 Expression valExp = (Expression) values.get(i); 130 String key = keyExp.getStringValue(env); 131 TemplateModel value = valExp.getAsTemplateModel(env); 132 assertNonNull(value, valExp, env); 133 keyMap.put(key, value); 134 keyList.add(key); 135 valueList.add(value); 136 } 137 keyCollection = new CollectionAndSequence(new SimpleSequence(keyList)); 138 valueCollection = new CollectionAndSequence(new SimpleSequence(valueList)); 139 } 140 141 public int size() { 142 return size; 143 } 144 145 public TemplateCollectionModel keys() { 146 return keyCollection; 147 } 148 149 public TemplateCollectionModel values() { 150 return valueCollection; 151 } 152 153 public TemplateModel get(String key) { 154 return (TemplateModel) keyMap.get(key); 155 } 156 157 public boolean isEmpty() { 158 return size == 0; 159 } 160 } 161 } 162 | Popular Tags |