@Override public PersistentCollection instantiate(SharedSessionContractImplementor session, CollectionPersister persister, Serializable key) throws HibernateException { return new PersistentArrayHolder(session, persister); }
@Override @SuppressWarnings("unchecked") public Iterator entries(CollectionPersister persister) { return elements(); }
@Override public boolean needsUpdating(Object entry, int i, Type elemType) throws HibernateException { final Serializable sn = getSnapshot(); return i < Array.getLength( sn ) && Array.get( sn, i ) != null && Array.get( array, i ) != null && elemType.isDirty( Array.get( array, i ), Array.get( sn, i ), getSession() ); }
@Override public Collection getOrphans(Serializable snapshot, String entityName) throws HibernateException { final Object[] sn = (Object[]) snapshot; final Object[] arr = (Object[]) array; final ArrayList result = new ArrayList(); Collections.addAll( result, sn ); for ( int i=0; i<sn.length; i++ ) { identityRemove( result, arr[i], entityName, getSession() ); } return result; }
@Override public Object getSnapshotElement(Object entry, int i) { final Serializable sn = getSnapshot(); return Array.get( sn, i ); }
@Override public Serializable disassemble(CollectionPersister persister) throws HibernateException { final int length = Array.getLength( array ); final Serializable[] result = new Serializable[length]; for ( int i=0; i<length; i++ ) { result[i] = persister.getElementType().disassemble( Array.get( array,i ), getSession(), null ); } return result; }
/** * Constructs a PersistentCollection instance for holding an array. * * @param session The session * @param array The array (the persistent "collection"). */ public PersistentArrayHolder(SharedSessionContractImplementor session, Object array) { super( session ); this.array = array; setInitialized(); }
@Override public boolean endRead() { setInitialized(); array = (E[]) Array.newInstance( getCollectionDescriptor().getElementDescriptor().getJavaType(), tempList.size() ); for ( int i=0; i<tempList.size(); i++ ) { Array.set( array, i, tempList.get( i ) ); } tempList = null; return true; }
@Override public void initializeFromCache( Serializable disassembled, Object owner, PersistentCollectionDescriptor collectionDescriptor) { final Serializable[] cached = (Serializable[]) disassembled; array = (E[]) Array.newInstance( getCollectionDescriptor().getElementDescriptor().getJavaType(), cached.length ); for ( int i=0; i<cached.length; i++ ) { Array.set( array, i, getCollectionDescriptor().getElementDescriptor().getJavaTypeDescriptor().getMutabilityPlan().assemble( cached[i] ) ); } }
@Override public Collection getOrphans(Serializable snapshot, String entityName) throws HibernateException { final Object[] sn = (Object[]) snapshot; final Object[] arr = (Object[]) array; final ArrayList result = new ArrayList(); Collections.addAll( result, sn ); for ( int i=0; i<sn.length; i++ ) { identityRemove( result, arr[i], entityName, getSession() ); } return result; }
@Override public boolean needsInserting(Object entry, int i, Type elemType) throws HibernateException { final Serializable sn = getSnapshot(); return Array.get( array, i ) != null && ( i >= Array.getLength( sn ) || Array.get( sn, i ) == 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() ); final int index = (Integer) persister.readIndex( rs, descriptor.getSuffixedIndexAliases(), getSession() ); for ( int i = tempList.size(); i<=index; i++) { tempList.add( i, null ); } tempList.set( index, element ); return element; }
@Override public boolean endRead() { setInitialized(); array = Array.newInstance( elementClass, tempList.size() ); for ( int i=0; i<tempList.size(); i++ ) { Array.set( array, i, tempList.get( i ) ); } tempList = null; return true; }
@Override public boolean equalsSnapshot(CollectionPersister persister) throws HibernateException { final Type elementType = persister.getElementType(); final Serializable snapshot = getSnapshot(); final int xlen = Array.getLength( snapshot ); if ( xlen!= Array.getLength( array ) ) { return false; } for ( int i=0; i<xlen; i++) { if ( elementType.isDirty( Array.get( snapshot, i ), Array.get( array, i ), getSession() ) ) { return false; } } return true; }
@Override public Collection getOrphans(Serializable snapshot, String entityName) throws HibernateException { Object[] sn = (Object[]) snapshot; Object[] arr = (Object[]) array; ArrayList result = new ArrayList(); for (int i=0; i<sn.length; i++) result.add( sn[i] ); for (int i=0; i<sn.length; i++) identityRemove( result, arr[i], entityName, getSession() ); return result; }
@Override public Iterator getDeletes(CollectionPersister persister, boolean indexIsFormula) throws HibernateException { final java.util.List<Integer> deletes = new ArrayList<>(); final Serializable sn = getSnapshot(); final int snSize = Array.getLength( sn ); final int arraySize = Array.getLength( array ); int end; if ( snSize > arraySize ) { for ( int i=arraySize; i<snSize; i++ ) { deletes.add( i ); } end = arraySize; } else { end = snSize; } for ( int i=0; i<end; i++ ) { if ( Array.get( array, i ) == null && Array.get( sn, i ) != null ) { deletes.add( i ); } } return deletes.iterator(); }
@Override public void initializeFromCache(CollectionPersister persister, Serializable disassembled, Object owner) throws HibernateException { final Serializable[] cached = (Serializable[]) disassembled; array = Array.newInstance( persister.getElementClass(), cached.length ); for ( int i=0; i<cached.length; i++ ) { Array.set( array, i, persister.getElementType().assemble( cached[i], getSession(), owner ) ); } }
@Override public PersistentCollection wrap(SharedSessionContractImplementor session, Object array) { return new PersistentArrayHolder(session, array); }
public PersistentArrayHolder(SessionImplementor session, Object array) { super(session); this.array = array; setInitialized(); }
@Override @SuppressWarnings("unchecked") public Iterator<E> entries(PersistentCollectionDescriptor<?, ?, E> descriptor) { return elements(); }