1 21 package oracle.toplink.essentials.internal.queryframework; 23 24 import java.util.*; 25 import oracle.toplink.essentials.internal.helper.*; 26 import oracle.toplink.essentials.exceptions.*; 27 import oracle.toplink.essentials.mappings.converters.*; 28 import oracle.toplink.essentials.internal.sessions.AbstractRecord; 29 import oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl; 30 import oracle.toplink.essentials.internal.sessions.AbstractSession; 31 32 42 public class DirectMapContainerPolicy extends InterfaceContainerPolicy { 43 protected DatabaseField keyField; 44 protected DatabaseField valueField; 45 protected Converter keyConverter; 46 protected Converter valueConverter; 47 48 52 public DirectMapContainerPolicy() { 53 super(); 54 } 55 56 60 public DirectMapContainerPolicy(Class containerClass) { 61 super(containerClass); 62 } 63 64 68 public boolean addInto(Object key, Object value, Object container, AbstractSession session) { 69 try { 70 ((Map)container).put(key, value); 71 } catch (ClassCastException ex1) { 72 throw QueryException.cannotAddElement(key, container, ex1); 73 } 74 return true; 75 } 76 77 81 public boolean addInto(Object element, Object container, AbstractSession session) { 82 throw ValidationException.operationNotSupported("addInto(Object element, Object container, Session session)"); 83 } 84 85 89 public Object buildContainerFromVector(Vector vector, AbstractSession session) { 90 Map container = (Map)containerInstance(vector.size()); 91 AbstractRecord row; 92 93 for (Enumeration e = vector.elements(); e.hasMoreElements();) { 94 row = (AbstractRecord)e.nextElement(); 95 Object key = row.get(keyField); 96 Object value = row.get(valueField); 97 if (getKeyConverter() != null) { 98 key = getKeyConverter().convertDataValueToObjectValue(key, session); 99 } 100 if (getValueConverter() != null) { 101 value = getValueConverter().convertDataValueToObjectValue(value, session); 102 } 103 if (key != null) { 104 container.put(key, value); 105 } 106 } 107 return container; 108 } 109 110 114 public void clear(Object container) { 115 try { 116 ((Map)container).clear(); 117 } catch (UnsupportedOperationException ex) { 118 throw QueryException.methodNotValid(container, "clear()"); 119 } 120 } 121 122 126 public boolean compareContainers(Object firstObjectMap, Object secondObjectMap) { 127 if (sizeFor(firstObjectMap) != sizeFor(secondObjectMap)) { 128 return false; 129 } 130 131 for (Object firstIterator = iteratorFor(firstObjectMap); hasNext(firstIterator);) { 132 Object key = next(firstIterator); 133 if (!((Map)firstObjectMap).get(key).equals(((Map)secondObjectMap).get(key))) { 134 return false; 135 } 136 } 137 return true; 138 } 139 140 145 public boolean compareKeys(Object sourceValue, AbstractSession session) { 146 Object backUpVersion = null; 147 148 if (((UnitOfWorkImpl)session).isClassReadOnly(sourceValue.getClass())) { 150 backUpVersion = ((UnitOfWorkImpl)session).getOriginalVersionOfObject(sourceValue); 151 } else { 152 backUpVersion = ((UnitOfWorkImpl)session).getBackupClone(sourceValue); 153 } 154 return (keyFrom(backUpVersion, session).equals(keyFrom(sourceValue, session))); 155 } 156 157 162 protected boolean contains(Object element, Object container) { 163 return ((Map)container).containsValue(element); 164 } 165 166 public Class getInterfaceType() { 167 return ClassConstants.Map_Class; 168 } 169 170 public boolean isDirectMapPolicy() { 171 return true; 172 } 173 174 178 public Object iteratorFor(Object container) { 179 if (((Map)container).keySet() == null) { 180 return null; 181 } 182 return ((Map)container).keySet().iterator(); 183 } 184 185 189 public Object iteratorForValue(Object container) { 190 if (((Map)container).values() == null) { 191 return null; 192 } 193 return ((Map)container).values().iterator(); 194 } 195 196 200 public boolean removeFrom(Object key, Object element, Object container, AbstractSession session) { 201 try { 202 Object returnValue = null; 203 if (key != null) { 204 returnValue = ((Map)container).remove(key); 205 } else { 206 returnValue = ((Map)container).remove(keyFrom(element, session)); 207 } 208 if (returnValue == null) { 209 return false; 210 } else { 211 return true; 212 } 213 } catch (UnsupportedOperationException ex) { 214 throw QueryException.methodNotValid(container, "remove(Object element)"); 215 } 216 } 217 218 222 public boolean removeFromWithIdentity(Object element, Object container, AbstractSession session) { 223 boolean found = false; 224 Vector knownKeys = new Vector(1); 225 try { 226 Iterator iterator = ((Map)container).keySet().iterator(); 227 while (iterator.hasNext()) { 228 Object key = iterator.next(); 229 if (((Map)container).get(key) == element) { 230 knownKeys.addElement(key); 231 found = true; 232 } 233 } 234 if (found) { 235 for (int index = 0; index < knownKeys.size(); ++index) { 236 ((Map)container).remove(knownKeys.elementAt(index)); 237 } 238 } 239 return found; 240 } catch (UnsupportedOperationException ex) { 241 throw QueryException.methodNotValid(container, "remove(Object element)"); 242 } 243 } 244 245 public void setKeyField(DatabaseField field) { 246 keyField = field; 247 } 248 249 public void setValueField(DatabaseField field) { 250 valueField = field; 251 } 252 253 257 public int sizeFor(Object container) { 258 return ((Map)container).size(); 259 } 260 261 265 public void validateElementAndRehashIfRequired(Object sourceValue, Object targetMap, AbstractSession session, Object targetVersionOfSource) { 266 if (session.isUnitOfWork()) { 267 Object backupValue = ((UnitOfWorkImpl)session).getBackupClone(sourceValue); 269 if (!keyFrom(backupValue, session).equals(keyFrom(sourceValue, session))) { 270 removeFrom(backupValue, targetMap, session); 272 addInto(targetVersionOfSource, targetMap, session); 273 } 274 } 275 } 276 277 281 public boolean isValidContainer(Object container) { 282 return container instanceof Map; 284 } 285 286 290 public Object valueFromKey(Object key, Object container) { 291 return ((Map)container).get(key); 292 } 293 294 public Converter getKeyConverter() { 295 return keyConverter; 296 } 297 298 public void setKeyConverter(Converter keyConverter) { 299 this.keyConverter = keyConverter; 300 } 301 302 public void setValueConverter(Converter valueConverter) { 303 this.valueConverter = valueConverter; 304 } 305 306 public Converter getValueConverter() { 307 return valueConverter; 308 } 309 } 310 | Popular Tags |