1 package org.sapia.archie.impl; 2 3 import java.util.ArrayList ; 4 import java.util.Iterator ; 5 import java.util.List ; 6 import java.util.Map ; 7 8 import org.sapia.archie.AbstractNode; 9 import org.sapia.archie.Entry; 10 import org.sapia.archie.NameParser; 11 import org.sapia.archie.NamePart; 12 import org.sapia.archie.NodeFactory; 13 import org.sapia.archie.ProcessingException; 14 15 16 27 public class MultiValueNode extends AbstractNode { 28 protected Map _valueLists; 29 30 protected MultiValueNode(Map children, Map values, NodeFactory fac) 31 throws ProcessingException { 32 super(children, fac); 33 _valueLists = values; 34 } 35 36 protected MultiValueNode(NameParser parser, Map children, Map values, NodeFactory fac) 37 throws ProcessingException { 38 super(parser, children, fac); 39 _valueLists = values; 40 } 41 42 51 public Object getValue(NamePart name) { 52 List values = (List ) _valueLists.get(name); 53 54 if (values == null) { 55 return null; 56 } 57 58 Object selected = onSelect(values); 59 if(selected != null){ 60 selected = onRead(name, selected); 61 } 62 return selected; 63 } 64 65 68 public Object removeValue(NamePart name) { 69 Object val = getValue(name); 70 _valueLists.remove(name); 71 return val; 72 } 73 74 77 public Iterator getEntries() { 78 Map.Entry entry; 79 Iterator itr = _valueLists.entrySet().iterator(); 80 List values; 81 List entries = new ArrayList (); 82 while(itr.hasNext()){ 83 entry = (Map.Entry )itr.next(); 84 values = (List )entry.getValue(); 85 for(int i = 0; i < values.size(); i++){ 86 entries.add(new Entry(entry.getKey().toString(), values.get(i))); 87 } 88 } 89 return entries.iterator(); 90 } 91 92 95 public boolean putValue(NamePart name, Object value, boolean overwrite) { 96 List values = (List ) _valueLists.get(name); 97 98 if (values == null) { 99 values = new ArrayList (); 100 _valueLists.put(name, values); 101 } 102 103 if (!overwrite && (values.size() != 0)) { 104 return false; 105 } 106 107 Object toBind = onWrite(name, value); 108 if(toBind != null){ 109 values.add(toBind); 110 } 111 return true; 112 } 113 114 117 public Iterator getValueNames() { 118 return _valueLists.keySet().iterator(); 119 } 120 121 124 public int getValueCount() { 125 return _valueLists.size(); 126 } 127 128 131 public int getChildrenCount() { 132 return _valueLists.size(); 133 } 134 135 138 public Iterator getChildrenNames() { 139 return _valueLists.keySet().iterator(); 140 } 141 142 145 public Iterator getChildren() { 146 return super.getChildren(); 147 } 148 149 158 protected Object onSelect(List values) { 159 if (values.size() > 0) { 160 Object toReturn = values.remove(0); 161 values.add(toReturn); 162 163 return toReturn; 164 } 165 166 return null; 167 } 168 169 179 protected Object onRead(NamePart np, Object selected){ 180 return selected; 181 } 182 183 192 protected Object onWrite(NamePart np, Object toBind){ 193 return toBind; 194 } 195 196 static class ValueIterator implements Iterator { 197 Iterator _lists; 198 Iterator _current; 199 200 ValueIterator(Iterator lists) { 201 _lists = lists; 202 } 203 204 public boolean hasNext() { 205 if (_current != null) { 206 if (_current.hasNext()) { 207 return true; 208 } else if (_lists.hasNext()) { 209 _current = ((List ) _lists.next()).iterator(); 210 211 return _current.hasNext(); 212 } else { 213 return false; 214 } 215 } else if (_lists.hasNext()) { 216 _current = ((List ) _lists.next()).iterator(); 217 218 return hasNext(); 219 } 220 221 return false; 222 } 223 224 public Object next() { 225 if (_current == null) { 226 if (hasNext()) { 227 return _current.next(); 228 } 229 } 230 231 return _current.next(); 232 } 233 234 public void remove() { 235 } 236 } 237 } 238 | Popular Tags |