@Override public PersistentCollection wrap(SharedSessionContractImplementor session, Object collection) { return new PersistentMap( session, (java.util.Map) collection ); }
@Override @SuppressWarnings("unchecked") public void putAll(Map puts) { if ( puts.size() > 0 ) { initialize( true ); for ( Object o : puts.entrySet() ) { final Entry entry = (Entry) o; put( entry.getKey(), entry.getValue() ); } } }
@Override @SuppressWarnings("unchecked") public void initializeFromCache(CollectionPersister persister, Serializable disassembled, Object owner) throws HibernateException { final Serializable[] array = (Serializable[]) disassembled; final int size = array.length; beforeInitialize( persister, size ); for ( int i = 0; i < size; i+=2 ) { map.put( persister.getIndexType().assemble( array[i], getSession(), owner ), persister.getElementType().assemble( array[i+1], getSession(), owner ) ); } }
@Override public int size() { return readSize() ? getCachedSize() : map.size(); }
@Override public Collection getOrphans(Serializable snapshot, String entityName) throws HibernateException { final Map sn = (Map) snapshot; return getOrphans( sn.values(), map.values(), entityName, getSession() ); }
@Override @SuppressWarnings("unchecked") public void clear() { if ( isClearQueueEnabled() ) { queueOperation( new Clear() ); } else { initialize( true ); if ( ! map.isEmpty() ) { dirty(); map.clear(); } } }
@Override @SuppressWarnings("unchecked") public Object put(Object key, Object value) { if ( isPutQueueEnabled() ) { final Object old = readElementByIndex( key ); if ( old != UNKNOWN ) { queueOperation( new Put( key, value, old ) ); return old; } } initialize( true ); final Object old = map.put( key, value ); // would be better to use the element-type to determine // whether the old and the new are equal here; the problem being // we do not necessarily have access to the element type in all // cases if ( value != old ) { dirty(); } return old; }
@Override @SuppressWarnings("unchecked") public boolean needsUpdating(Object entry, int i, Type elemType) throws HibernateException { final Map sn = (Map) getSnapshot(); final Map.Entry e = (Map.Entry) entry; final Object snValue = sn.get( e.getKey() ); return e.getValue() != null && snValue != null && elemType.isDirty( snValue, e.getValue(), getSession() ); }
Object old = children.put( child.getName(), child ); assertTrue( old == child ); assertFalse( children.isDirty() ); old = children.remove( otherChild.getName() ); assertNull( old ); assertFalse( children.isDirty() ); children.putAll( otherMap ); assertFalse( children.isDirty() ); children.putAll( otherMap ); assertTrue( children.isDirty() ); children.clearDirty(); session.delete( child ); children.clear(); assertTrue( children.isDirty() ); session.flush(); children.clear(); assertFalse( children.isDirty() );
@Override @SuppressWarnings("unchecked") public Object getSnapshotElement(Object entry, int i) { final Map sn = (Map) getSnapshot(); return sn.get( ( (Map.Entry) entry ).getKey() ); }
@Override @SuppressWarnings("unchecked") public Serializable disassemble(CollectionPersister persister) throws HibernateException { final Serializable[] result = new Serializable[ map.size() * 2 ]; final Iterator itr = map.entrySet().iterator(); int i=0; while ( itr.hasNext() ) { final Map.Entry e = (Map.Entry) itr.next(); result[i++] = persister.getIndexType().disassemble( e.getKey(), getSession(), null ); result[i++] = persister.getElementType().disassemble( e.getValue(), getSession(), null ); } return result; }
@Override @SuppressWarnings("unchecked") public boolean needsUpdating(Object entry, int i) throws HibernateException { final Map sn = (Map) getSnapshot(); final Map.Entry e = (Map.Entry) entry; final Object snValue = sn.get( e.getKey() ); return e.getValue() != null && snValue != null && getCollectionDescriptor().isDirty( snValue, e.getValue(), getSession() ); }
@Override @SuppressWarnings("unchecked") public void initializeFromCache( Serializable disassembled, Object owner, PersistentCollectionDescriptor collectionDescriptor) throws HibernateException { final Serializable[] array = (Serializable[]) disassembled; final int size = array.length; beforeInitialize( size, collectionDescriptor ); for ( int i = 0; i < size; i+=2 ) { map.put( (K) getCollectionDescriptor().getIndexDescriptor() .getJavaTypeDescriptor() .getMutabilityPlan() .assemble( array[i] ), getCollectionDescriptor().getElementDescriptor() .getJavaTypeDescriptor() .getMutabilityPlan() .assemble( array[i+1] ) ); } }
@Override @SuppressWarnings("unchecked") public Object remove(Object key) { if ( isPutQueueEnabled() ) { final Object old = readElementByIndex( key ); if ( old != UNKNOWN ) { elementRemoved = true; queueOperation( new Remove( key, old ) ); return old; } } // TODO : safe to interpret "map.remove(key) == null" as non-dirty? initialize( true ); if ( map.containsKey( key ) ) { elementRemoved = true; dirty(); } return map.remove( key ); }
/** * @see java.util.Map#clear() */ public void clear() { if ( isClearQueueEnabled() ) { queueOperation( new Clear() ); } else { initialize( true ); if ( ! map.isEmpty() ) { dirty(); map.clear(); } } }
@Override public boolean isEmpty() { return readSize() ? getCachedSize()==0 : map.isEmpty(); }
@Override public boolean equalsSnapshot(CollectionPersister persister) throws HibernateException { final Type elementType = persister.getElementType(); final Map snapshotMap = (Map) getSnapshot(); if ( snapshotMap.size() != this.map.size() ) { return false; } for ( Object o : map.entrySet() ) { final Entry entry = (Entry) o; if ( elementType.isDirty( entry.getValue(), snapshotMap.get( entry.getKey() ), getSession() ) ) { return false; } } return true; }
@Override public Collection getOrphans(Serializable snapshot, String entityName) throws HibernateException { final Map sn = (Map) snapshot; return getOrphans( sn.values(), map.values(), entityName, getSession() ); }
@Override @SuppressWarnings("unchecked") public boolean needsInserting(Object entry, int i, Type elemType) throws HibernateException { final Map sn = (Map) getSnapshot(); final Map.Entry e = (Map.Entry) entry; return e.getValue() != null && sn.get( e.getKey() ) == null; }
@Override @SuppressWarnings("unchecked") public Object readFrom( ResultSet rs, CollectionPersister persister, CollectionAliases descriptor, Object owner) throws HibernateException, SQLException { final Object element = persister.readElement( rs, owner, descriptor.getSuffixedElementAliases(), getSession() ); if ( element != null ) { final Object index = persister.readIndex( rs, descriptor.getSuffixedIndexAliases(), getSession() ); if ( loadingEntries == null ) { loadingEntries = new ArrayList<>(); } loadingEntries.add( new Object[] { index, element } ); } return element; }