- Timestamp:
- 07/08/13 23:04:56 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
java/main/src/main/java/com/framsticks/params/UniqueListAccess.java
r90 r98 1 1 package com.framsticks.params; 2 2 3 import com.framsticks.util.FramsticksException; 4 import com.framsticks.util.UnimplementedException; 5 import com.framsticks.util.UnsupportedOperationException; 3 6 import com.framsticks.util.lang.Casting; 4 7 import com.framsticks.util.lang.Numbers; … … 12 15 public class UniqueListAccess extends ListAccess { 13 16 14 private static final Logger log = Logger.getLogger(UniqueListAccess.class .getName());17 private static final Logger log = Logger.getLogger(UniqueListAccess.class); 15 18 16 19 Map<String, Object> map; … … 23 26 } 24 27 28 public static Integer getUidNumber(String uid) { 29 try { 30 return Integer.valueOf(uid.substring(1)); 31 } catch (NumberFormatException e) { 32 return null; 33 } 34 } 35 36 public static class UidComparator implements Comparator<String> { 37 38 protected String name; 39 40 /** 41 * @param name 42 */ 43 public UidComparator(String name) { 44 this.name = name; 45 } 46 47 @Override 48 public int compare(String a, String b) { 49 if (a.equals(b)) { 50 return 0; 51 } 52 int diff = a.length() - b.length(); 53 if (diff != 0) { 54 return diff; 55 } 56 Integer au = getUidNumber(a); 57 Integer bu = getUidNumber(b); 58 if (au == null || bu == null) { 59 throw new FramsticksException().msg("comparator failure").arg("left", a).arg("right", b).arg("in", this); 60 } 61 return au - bu; 62 } 63 64 @Override 65 public String toString() { 66 return "comparator " + name; 67 } 68 69 70 } 71 25 72 @Override 26 73 public Map<String, Object> createAccessee() { 27 return new HashMap<String, Object>(); 28 } 29 30 @Override 31 public Param getParam(int i) { 32 log.error("accesing unique list through index"); 33 assert false; 34 return null; 35 //log.error("accesing unique list through index"); 36 //return null; 37 //return Param.build().setId(Integer.toString(i)).setName(elementAccess.getId()).type("o " + elementAccess.getId()).build(); 38 } 39 40 @Override 41 public Param getParam(String id) { 74 return new TreeMap<String, Object>(new UidComparator(elementAccess.toString())); 75 } 76 77 @Override 78 public CompositeParam getParam(int i) { 79 if ((i < 0) || (i >= map.size())) { 80 return null; 81 } 82 return Param.build().id(Integer.toString(i)).forAccess(elementAccess).finish(CompositeParam.class); 83 } 84 85 @Override 86 public CompositeParam getParam(String id) { 42 87 Integer i = Numbers.parse(id, Integer.class); 43 88 if (i != null) { 44 89 return getParam(i); 45 90 } 46 //TODO list access here 47 return Param.build().id(id).forAccess(elementAccess).finish(); 91 Integer uidNumber = getUidNumber(id); 92 if (uidNumber == null) { 93 return null; 94 } 95 if (!map.containsKey(id)) { 96 return null; 97 } 98 return Param.build().id(id).forAccess(elementAccess).finish(CompositeParam.class); 48 99 } 49 100 … … 60 111 @Override 61 112 public <T> T get(int i, Class<T> type) { 62 log.error("accesing unique list through index"); 63 assert false; 64 return null; 65 //Object[] values = map.values().toArray(); 66 //return Casting.tryCast(i < values.length ? values[i] : null, type); 113 Iterator<Map.Entry<String, Object>> iterator = map.entrySet().iterator(); 114 while (i > 0 && iterator.hasNext()) { 115 iterator.next(); 116 --i; 117 } 118 if (i > 0) { 119 return null; 120 } 121 if (!iterator.hasNext()) { 122 return null; 123 } 124 return Casting.tryCast(type, iterator.next().getValue()); 67 125 } 68 126 … … 73 131 return get(i, type); 74 132 } 75 return Casting.tryCast(type, map.containsKey(id) ? map.get(id) : null); 133 Integer uidNumber = getUidNumber(id); 134 if (uidNumber == null) { 135 return null; 136 } 137 return Casting.tryCast(type, map.get(id)); 76 138 } 77 139 … … 110 172 @Override 111 173 public <T> int set(int i, T value) { 112 log.error("accesing unique list through index"); 113 //return setByUid(value, null); 114 return 0; 174 throw new UnsupportedOperationException().msg("accesing unique list through index"); 115 175 } 116 176 … … 184 244 185 245 @Override 186 public Collection<Param> getParams() { 187 List<Param> result = new LinkedList<Param>(); 188 if (map == null) { 189 return result; 190 } 191 for (String k : map.keySet()) { 192 result.add(getParam(k)); 193 } 194 return result; 246 public Iterable<Param> getParams() { 247 return new Iterable<Param>() { 248 249 @Override 250 public Iterator<Param> iterator() { 251 return new Iterator<Param>() { 252 253 protected Iterator<Map.Entry<String, Object>> internal = map.entrySet().iterator(); 254 255 @Override 256 public boolean hasNext() { 257 return internal.hasNext(); 258 } 259 260 @Override 261 public Param next() { 262 return Param.build().id(internal.next().getKey()).forAccess(elementAccess).finish(); 263 } 264 265 @Override 266 public void remove() { 267 throw new UnimplementedException().msg("remove element from list").arg("list", UniqueListAccess.this); 268 269 } 270 }; 271 } 272 }; 273 } 274 275 @Override 276 public int getCompositeParamCount() { 277 return map.size(); 278 } 279 280 @Override 281 public CompositeParam getCompositeParam(int number) { 282 return getParam(number); 195 283 } 196 284 }
Note: See TracChangeset
for help on using the changeset viewer.