package fr.lteconsulting.hexa.persistence.client.legacy.persistence; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import fr.lteconsulting.hexa.persistence.client.legacy.persistence.PersistenceConfiguration.OneToManyFieldConfiguration; public class ListProxy<T> implements List<T> { EntityManagerImpl em; Object owner; OneToManyFieldConfiguration fieldConfiguration; List<T> data; public ListProxy( EntityManagerImpl em, Object owner, OneToManyFieldConfiguration fieldConfiguration ) { this.em = em; this.owner = owner; this.fieldConfiguration = fieldConfiguration; } private void ensureData() { if( data != null ) return; data = em.getCollectionList( owner, fieldConfiguration ); } @Override public int size() { ensureData(); return data.size(); } @Override public boolean isEmpty() { ensureData(); return data.isEmpty(); } @Override public boolean contains( Object o ) { ensureData(); return data.contains( o ); } @Override public Iterator<T> iterator() { ensureData(); return data.iterator(); } @Override public Object[] toArray() { ensureData(); return data.toArray(); } @Override public <E> E[] toArray( E[] a ) { ensureData(); return data.toArray( a ); } @Override public boolean add( T e ) { ensureData(); return data.add( e ); } @Override public boolean remove( Object o ) { // TODO : if orphanRemoval => mark the child entity to be deleted ! And in other methods also ensureData(); return data.remove( o ); } @Override public boolean containsAll( Collection<?> c ) { ensureData(); return data.containsAll( c ); } @Override public boolean addAll( Collection<? extends T> c ) { ensureData(); return data.addAll( c ); } @Override public boolean addAll( int index, Collection<? extends T> c ) { ensureData(); return data.addAll( index, c ); } @Override public boolean removeAll( Collection<?> c ) { ensureData(); return data.removeAll( c ); } @Override public boolean retainAll( Collection<?> c ) { ensureData(); return data.retainAll( c ); } @Override public void clear() { ensureData(); data.clear(); } @Override public boolean equals( Object o ) { ensureData(); return data.equals( o ); } @Override public int hashCode() { ensureData(); return data.hashCode(); } @Override public T get( int index ) { ensureData(); return data.get( index ); } @Override public T set( int index, T element ) { ensureData(); return data.set( index, element ); } @Override public void add( int index, T element ) { ensureData(); data.add( index, element ); } @Override public T remove( int index ) { ensureData(); return data.remove( index ); } @Override public int indexOf( Object o ) { ensureData(); return data.indexOf( o ); } @Override public int lastIndexOf( Object o ) { ensureData(); return data.lastIndexOf( o ); } @Override public ListIterator<T> listIterator() { ensureData(); return data.listIterator(); } @Override public ListIterator<T> listIterator( int index ) { ensureData(); return data.listIterator( index ); } @Override public List<T> subList( int fromIndex, int toIndex ) { ensureData(); return data.subList( fromIndex, toIndex ); } }