deleted project from trunk to work on branch
[taxeditor.git] / eu.etaxonomy.taxeditor.remoting / src / main / java / org / hibernate / collection / internal / AbstractPersistentCollection.java
diff --git a/eu.etaxonomy.taxeditor.remoting/src/main/java/org/hibernate/collection/internal/AbstractPersistentCollection.java b/eu.etaxonomy.taxeditor.remoting/src/main/java/org/hibernate/collection/internal/AbstractPersistentCollection.java
deleted file mode 100644 (file)
index 7338571..0000000
+++ /dev/null
@@ -1,1338 +0,0 @@
-
-
-/*
- * Hibernate, Relational Persistence for Idiomatic Java
- *
- * Copyright (c) 2008-2011, Red Hat Inc. or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors.  All third-party contributions are
- * distributed under license by Red Hat Inc.
- *
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA  02110-1301  USA
- */
-package org.hibernate.collection.internal;
-
-import java.io.Serializable;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-import javax.naming.NamingException;
-
-import org.hibernate.AssertionFailure;
-import org.hibernate.HibernateException;
-import org.hibernate.LazyInitializationException;
-import org.hibernate.Session;
-import org.hibernate.collection.spi.PersistentCollection;
-import org.hibernate.engine.internal.ForeignKeys;
-import org.hibernate.engine.spi.CollectionEntry;
-import org.hibernate.engine.spi.EntityEntry;
-import org.hibernate.engine.spi.SessionFactoryImplementor;
-import org.hibernate.engine.spi.SessionImplementor;
-import org.hibernate.engine.spi.Status;
-import org.hibernate.engine.spi.TypedValue;
-import org.hibernate.internal.SessionFactoryRegistry;
-import org.hibernate.internal.util.MarkerObject;
-import org.hibernate.internal.util.collections.EmptyIterator;
-import org.hibernate.internal.util.collections.IdentitySet;
-import org.hibernate.persister.collection.CollectionPersister;
-import org.hibernate.persister.entity.EntityPersister;
-import org.hibernate.pretty.MessageHelper;
-import org.hibernate.type.Type;
-import org.jboss.logging.Logger;
-
-import eu.etaxonomy.cdm.api.application.CdmApplicationRemoteConfiguration;
-import eu.etaxonomy.cdm.api.application.CdmApplicationRemoteController;
-import eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration;
-import eu.etaxonomy.cdm.api.cache.ICachedCommonService;
-import eu.etaxonomy.cdm.api.cache.CachedCommonServiceImpl.CollectionField;
-import eu.etaxonomy.cdm.api.service.ICommonService;
-import eu.etaxonomy.cdm.model.common.PersistentMultiLanguageText;
-
-/**
- * Base class implementing {@link org.hibernate.collection.spi.PersistentCollection}
- *
- * @author Gavin King
- */
-public abstract class AbstractPersistentCollection implements Serializable, PersistentCollection {
-       private static final Logger log = Logger.getLogger( AbstractPersistentCollection.class );
-
-       private static final long serialVersionUID = -7238232378593030571L;
-
-       private transient SessionImplementor session;
-       private boolean initialized;
-       private transient List<DelayedOperation> operationQueue;
-       private transient boolean directlyAccessible;
-       private transient boolean initializing;
-       private Object owner;
-       private int cachedSize = -1;
-
-       private String role;
-       private Serializable key;
-       // collections detect changes made via their public interface and mark
-       // themselves as dirty as a performance optimization
-       private boolean dirty;
-       private Serializable storedSnapshot;
-
-       private String sessionFactoryUuid;
-       private boolean specjLazyLoad = false;
-
-       @Override
-    public final String getRole() {
-               return role;
-       }
-
-       @Override
-    public final Serializable getKey() {
-               return key;
-       }
-
-       @Override
-    public final boolean isUnreferenced() {
-               return role == null;
-       }
-
-       @Override
-    public final boolean isDirty() {
-               return dirty;
-       }
-
-       @Override
-    public final void clearDirty() {
-               dirty = false;
-       }
-
-       @Override
-    public final void dirty() {
-               dirty = true;
-       }
-
-       @Override
-    public final Serializable getStoredSnapshot() {
-               return storedSnapshot;
-       }
-
-       //Careful: these methods do not initialize the collection.
-
-       /**
-        * Is the initialized collection empty?
-        */
-       @Override
-    public abstract boolean empty();
-
-       /**
-        * Called by any read-only method of the collection interface
-        */
-       protected final void read() {
-               initialize( false );
-       }
-
-       /**
-        * Called by the {@link Collection#size} method
-        */
-       @SuppressWarnings({"JavaDoc"})
-       protected boolean readSize() {
-               if ( !initialized ) {
-                       if ( cachedSize != -1 && !hasQueuedOperations() ) {
-                               return true;
-                       }
-                       else {
-                               // In remoting we are sure that session is null
-                               // both when using property paths and switching off conversations
-                               if(session == null && remoting) {
-                                       log.info("--> readSize, of " + getRole() + " with key " + getKey());
-                                       read();
-                               } else {
-                                       boolean isExtraLazy = withTemporarySessionIfNeeded(
-                                                       new LazyInitializationWork<Boolean>() {
-                                                               @Override
-                                                               public Boolean doWork() {
-                                                                       CollectionEntry entry = session.getPersistenceContext().getCollectionEntry( AbstractPersistentCollection.this );
-
-                                                                       if ( entry != null ) {
-                                                                               CollectionPersister persister = entry.getLoadedPersister();
-                                                                               if ( persister.isExtraLazy() ) {
-                                                                                       if ( hasQueuedOperations() ) {
-                                                                                               session.flush();
-                                                                                       }
-                                                                                       cachedSize = persister.getSize( entry.getLoadedKey(), session );
-                                                                                       return true;
-                                                                               }
-                                                                               else {
-                                                                                       read();
-                                                                               }
-                                                                       }
-                                                                       else{
-                                                                               throwLazyInitializationExceptionIfNotConnected();
-                                                                       }
-                                                                       return false;
-                                                               }
-                                                       }
-                                                       );
-                                       if ( isExtraLazy ) {
-                                               return true;
-                                       }
-                               }
-                       }
-               }
-               return false;
-       }
-
-       public static interface LazyInitializationWork<T> {
-               public T doWork();
-       }
-
-       private <T> T withTemporarySessionIfNeeded(LazyInitializationWork<T> lazyInitializationWork) {
-               SessionImplementor originalSession = null;
-               boolean isTempSession = false;
-               boolean isJTA = false;
-
-               if ( session == null ) {
-                       if ( specjLazyLoad ) {
-                               session = openTemporarySessionForLoading();
-                               isTempSession = true;
-                       }
-                       else {
-                               throwLazyInitializationException( "could not initialize proxy - no Session" );
-                       }
-               }
-               else if ( !session.isOpen() ) {
-                       if ( specjLazyLoad ) {
-                               originalSession = session;
-                               session = openTemporarySessionForLoading();
-                               isTempSession = true;
-                       }
-                       else {
-                               throwLazyInitializationException( "could not initialize proxy - the owning Session was closed" );
-                       }
-               }
-               else if ( !session.isConnected() ) {
-                       if ( specjLazyLoad ) {
-                               originalSession = session;
-                               session = openTemporarySessionForLoading();
-                               isTempSession = true;
-                       }
-                       else {
-                               throwLazyInitializationException( "could not initialize proxy - the owning Session is disconnected" );
-                       }
-               }
-
-               if ( isTempSession ) {
-                       // TODO: On the next major release, add an
-                       // 'isJTA' or 'getTransactionFactory' method to Session.
-                       isJTA = session.getTransactionCoordinator()
-                                       .getTransactionContext().getTransactionEnvironment()
-                                       .getTransactionFactory()
-                                       .compatibleWithJtaSynchronization();
-
-                       if ( !isJTA ) {
-                               // Explicitly handle the transactions only if we're not in
-                               // a JTA environment.  A lazy loading temporary session can
-                               // be created even if a current session and transaction are
-                               // open (ex: session.clear() was used).  We must prevent
-                               // multiple transactions.
-                               ( ( Session) session ).beginTransaction();
-                       }
-
-                       session.getPersistenceContext().addUninitializedDetachedCollection(
-                                       session.getFactory().getCollectionPersister( getRole() ),
-                                       this
-                       );
-               }
-
-               try {
-                       return lazyInitializationWork.doWork();
-               }
-               finally {
-                       if ( isTempSession ) {
-                               // make sure the just opened temp session gets closed!
-                               try {
-                                       if ( !isJTA ) {
-                                               ( ( Session) session ).getTransaction().commit();
-                                       }
-                                       ( (Session) session ).close();
-                               }
-                               catch (Exception e) {
-                                       log.warn( "Unable to close temporary session used to load lazy collection associated to no session" );
-                               }
-                               session = originalSession;
-                       }
-               }
-       }
-
-       private SessionImplementor openTemporarySessionForLoading() {
-               if ( sessionFactoryUuid == null ) {
-                       throwLazyInitializationException( "SessionFactory UUID not known to create temporary Session for loading" );
-               }
-
-               SessionFactoryImplementor sf = (SessionFactoryImplementor)
-                               SessionFactoryRegistry.INSTANCE.getSessionFactory( sessionFactoryUuid );
-               return (SessionImplementor) sf.openSession();
-       }
-
-       protected Boolean readIndexExistence(final Object index) {
-               if ( !initialized ) {
-                       // In remoting we are sure that session is null
-                       // both when using property paths and switching off conversations
-                       if(session == null && remoting) {
-                               log.info("--> readIndexExistence, of " + getRole() + " with key " + getKey());
-                               read();
-                       } else {
-                               Boolean extraLazyExistenceCheck = withTemporarySessionIfNeeded(
-                                               new LazyInitializationWork<Boolean>() {
-                                                       @Override
-                                                       public Boolean doWork() {
-                                                               CollectionEntry entry = session.getPersistenceContext().getCollectionEntry( AbstractPersistentCollection.this );
-                                                               CollectionPersister persister = entry.getLoadedPersister();
-                                                               if ( persister.isExtraLazy() ) {
-                                                                       if ( hasQueuedOperations() ) {
-                                                                               session.flush();
-                                                                       }
-                                                                       return persister.indexExists( entry.getLoadedKey(), index, session );
-                                                               }
-                                                               else {
-                                                                       read();
-                                                               }
-                                                               return null;
-                                                       }
-                                               }
-                                               );
-                               if ( extraLazyExistenceCheck != null ) {
-                                       return extraLazyExistenceCheck;
-                               }
-                       }
-               }
-               return null;
-       }
-
-       protected Boolean readElementExistence(final Object element) {
-               if ( !initialized ) {
-                       // In remoting we are sure that session is null
-                       // both when using property paths and switching off conversations
-                       if(session == null && remoting) {
-                               log.info("--> readElementExistence, of " + getRole() + " with key " + getKey());
-                               read();
-
-                       } else {
-                               Boolean extraLazyExistenceCheck = withTemporarySessionIfNeeded(
-                                               new LazyInitializationWork<Boolean>() {
-                                                       @Override
-                                                       public Boolean doWork() {
-                                                               CollectionEntry entry = session.getPersistenceContext().getCollectionEntry( AbstractPersistentCollection.this );
-                                                               CollectionPersister persister = entry.getLoadedPersister();
-                                                               if ( persister.isExtraLazy() ) {
-                                                                       if ( hasQueuedOperations() ) {
-                                                                               session.flush();
-                                                                       }
-                                                                       return persister.elementExists( entry.getLoadedKey(), element, session );
-                                                               }
-                                                               else {
-                                                                       read();
-                                                               }
-                                                               return null;
-                                                       }
-                                               }
-                                               );
-                               if ( extraLazyExistenceCheck != null ) {
-                                       return extraLazyExistenceCheck;
-                               }
-                       }
-               }
-               return null;
-       }
-
-       protected static final Object UNKNOWN = new MarkerObject( "UNKNOWN" );
-
-       protected Object readElementByIndex(final Object index) {
-               if ( !initialized ) {
-                       // In remoting we are sure that session is null
-                       // both when using property paths and switching off conversations
-                       if(session == null && remoting) {
-                               log.info("--> readElementByIndex, of " + getRole() + " with key " + getKey());
-                               read();
-
-                       } else {
-                               class ExtraLazyElementByIndexReader implements LazyInitializationWork {
-                                       private boolean isExtraLazy;
-                                       private Object element;
-
-                                       @Override
-                                       public Object doWork() {
-                                               CollectionEntry entry = session.getPersistenceContext().getCollectionEntry( AbstractPersistentCollection.this );
-                                               CollectionPersister persister = entry.getLoadedPersister();
-                                               isExtraLazy = persister.isExtraLazy();
-                                               if ( isExtraLazy ) {
-                                                       if ( hasQueuedOperations() ) {
-                                                               session.flush();
-                                                       }
-                                                       element = persister.getElementByIndex( entry.getLoadedKey(), index, session, owner );
-                                               }
-                                               else {
-                                                       read();
-                                               }
-                                               return null;
-                                       }
-                               }
-
-                               ExtraLazyElementByIndexReader reader = new ExtraLazyElementByIndexReader();
-                               //noinspection unchecked
-                               withTemporarySessionIfNeeded( reader );
-                               if ( reader.isExtraLazy ) {
-                                       return reader.element;
-                               }
-                       }
-               }
-               return UNKNOWN;
-
-       }
-
-       protected int getCachedSize() {
-               return cachedSize;
-       }
-
-       private boolean isConnectedToSession() {
-               return session != null &&
-                               session.isOpen() &&
-                               session.getPersistenceContext().containsCollection( this );
-       }
-
-       /**
-        * Called by any writer method of the collection interface
-        */
-       protected final void write() {
-               initialize( true );
-               dirty();
-       }
-
-       /**
-        * Is this collection in a state that would allow us to
-        * "queue" operations?
-        */
-       @SuppressWarnings({"JavaDoc"})
-       protected boolean isOperationQueueEnabled() {
-               return !initialized &&
-                               isConnectedToSession() &&
-                               isInverseCollection();
-       }
-
-       /**
-        * Is this collection in a state that would allow us to
-        * "queue" puts? This is a special case, because of orphan
-        * delete.
-        */
-       @SuppressWarnings({"JavaDoc"})
-       protected boolean isPutQueueEnabled() {
-               return !initialized &&
-                               isConnectedToSession() &&
-                               isInverseOneToManyOrNoOrphanDelete();
-       }
-
-       /**
-        * Is this collection in a state that would allow us to
-        * "queue" clear? This is a special case, because of orphan
-        * delete.
-        */
-       @SuppressWarnings({"JavaDoc"})
-       protected boolean isClearQueueEnabled() {
-               return !initialized &&
-                               isConnectedToSession() &&
-                               isInverseCollectionNoOrphanDelete();
-       }
-
-       /**
-        * Is this the "inverse" end of a bidirectional association?
-        */
-       @SuppressWarnings({"JavaDoc"})
-       private boolean isInverseCollection() {
-               CollectionEntry ce = session.getPersistenceContext().getCollectionEntry( this );
-               return ce != null && ce.getLoadedPersister().isInverse();
-       }
-
-       /**
-        * Is this the "inverse" end of a bidirectional association with
-        * no orphan delete enabled?
-        */
-       @SuppressWarnings({"JavaDoc"})
-       private boolean isInverseCollectionNoOrphanDelete() {
-               CollectionEntry ce = session.getPersistenceContext().getCollectionEntry( this );
-               return ce != null &&
-                               ce.getLoadedPersister().isInverse() &&
-                               !ce.getLoadedPersister().hasOrphanDelete();
-       }
-
-       /**
-        * Is this the "inverse" end of a bidirectional one-to-many, or
-        * of a collection with no orphan delete?
-        */
-       @SuppressWarnings({"JavaDoc"})
-       private boolean isInverseOneToManyOrNoOrphanDelete() {
-               CollectionEntry ce = session.getPersistenceContext().getCollectionEntry( this );
-               return ce != null && ce.getLoadedPersister().isInverse() && (
-                               ce.getLoadedPersister().isOneToMany() ||
-                                               !ce.getLoadedPersister().hasOrphanDelete()
-               );
-       }
-
-       /**
-        * Queue an addition
-        */
-       @SuppressWarnings({"JavaDoc"})
-       protected final void queueOperation(DelayedOperation operation) {
-               if ( operationQueue == null ) {
-                       operationQueue = new ArrayList<DelayedOperation>( 10 );
-               }
-               operationQueue.add( operation );
-               dirty = true; //needed so that we remove this collection from the second-level cache
-       }
-
-       /**
-        * After reading all existing elements from the database,
-        * add the queued elements to the underlying collection.
-        */
-       protected final void performQueuedOperations() {
-               for ( DelayedOperation operation : operationQueue ) {
-                       operation.operate();
-               }
-       }
-
-       /**
-        * After flushing, re-init snapshot state.
-        */
-       @Override
-    public void setSnapshot(Serializable key, String role, Serializable snapshot) {
-               this.key = key;
-               this.role = role;
-               this.storedSnapshot = snapshot;
-       }
-
-       /**
-        * After flushing, clear any "queued" additions, since the
-        * database state is now synchronized with the memory state.
-        */
-       @Override
-    public void postAction() {
-               operationQueue = null;
-               cachedSize = -1;
-               clearDirty();
-       }
-
-       /**
-        * Not called by Hibernate, but used by non-JDK serialization,
-        * eg. SOAP libraries.
-        */
-       public AbstractPersistentCollection() {
-       }
-
-       protected AbstractPersistentCollection(SessionImplementor session) {
-               this.session = session;
-       }
-
-       /**
-        * return the user-visible collection (or array) instance
-        */
-       @Override
-    public Object getValue() {
-               return this;
-       }
-
-       /**
-        * Called just before reading any rows from the JDBC result set
-        */
-       @Override
-    public void beginRead() {
-               // override on some subclasses
-               initializing = true;
-       }
-
-       /**
-        * Called after reading all rows from the JDBC result set
-        */
-       @Override
-    public boolean endRead() {
-               //override on some subclasses
-               return afterInitialize();
-       }
-
-       @Override
-    public boolean afterInitialize() {
-               setInitialized();
-               //do this bit after setting initialized to true or it will recurse
-               if ( operationQueue != null ) {
-                       performQueuedOperations();
-                       operationQueue = null;
-                       cachedSize = -1;
-                       return false;
-               }
-               else {
-                       return true;
-               }
-       }
-
-       /**
-        * Initialize the collection, if possible, wrapping any exceptions
-        * in a runtime exception
-        *
-        * @param writing currently obsolete
-        *
-        * @throws LazyInitializationException if we cannot initialize
-        */
-       protected final void initialize(final boolean writing) {
-               // In remoting we are sure that session is null
-               // both when using property paths and switching off conversations
-               if(session == null && remoting) {
-                       remoteInitialize();
-               }
-
-               if ( initialized ) {
-                       return;
-               }
-
-
-               withTemporarySessionIfNeeded(
-                               new LazyInitializationWork<Object>() {
-                                       @Override
-                                       public Object doWork() {
-                                               session.initializeCollection( AbstractPersistentCollection.this, writing );
-                                               return null;
-                                       }
-                               }
-               );
-       }
-
-       private void throwLazyInitializationExceptionIfNotConnected() {
-               if ( !isConnectedToSession() ) {
-                       throwLazyInitializationException( "no session or session was closed" );
-               }
-               if ( !session.isConnected() ) {
-                       throwLazyInitializationException( "session is disconnected" );
-               }
-       }
-
-       private void throwLazyInitializationException(String message) {
-               throw new LazyInitializationException(
-                               "failed to lazily initialize a collection" +
-                                               (role == null ? "" : " of role: " + role) +
-                                               ", " + message
-               );
-       }
-
-       protected final void setInitialized() {
-               this.initializing = false;
-               this.initialized = true;
-       }
-
-       protected final void setDirectlyAccessible(boolean directlyAccessible) {
-               this.directlyAccessible = directlyAccessible;
-       }
-
-       /**
-        * Could the application possibly have a direct reference to
-        * the underlying collection implementation?
-        */
-       @Override
-    public boolean isDirectlyAccessible() {
-               return directlyAccessible;
-       }
-
-       /**
-        * Disassociate this collection from the given session.
-        *
-        * @return true if this was currently associated with the given session
-        */
-       @Override
-    public final boolean unsetSession(SessionImplementor currentSession) {
-               prepareForPossibleSpecialSpecjInitialization();
-               if ( currentSession == this.session ) {
-                       this.session = null;
-                       return true;
-               }
-               else {
-                       return false;
-               }
-       }
-
-       protected void prepareForPossibleSpecialSpecjInitialization() {
-               if ( session != null ) {
-                       specjLazyLoad = session.getFactory().getSettings().isInitializeLazyStateOutsideTransactionsEnabled();
-
-                       if ( specjLazyLoad && sessionFactoryUuid == null ) {
-                               try {
-                                       sessionFactoryUuid = (String) session.getFactory().getReference().get( "uuid" ).getContent();
-                               }
-                               catch (NamingException e) {
-                                       //not much we can do if this fails...
-                               }
-                       }
-               }
-       }
-
-
-       /**
-        * Associate the collection with the given session.
-        *
-        * @return false if the collection was already associated with the session
-        *
-        * @throws HibernateException if the collection was already associated
-        * with another open session
-        */
-       @Override
-    public final boolean setCurrentSession(SessionImplementor session) throws HibernateException {
-               if ( session == this.session ) {
-                       return false;
-               }
-               else {
-                       if ( isConnectedToSession() ) {
-                               CollectionEntry ce = session.getPersistenceContext().getCollectionEntry( this );
-                               if ( ce == null ) {
-                                       throw new HibernateException(
-                                                       "Illegal attempt to associate a collection with two open sessions"
-                                       );
-                               }
-                               else {
-                                       throw new HibernateException(
-                                                       "Illegal attempt to associate a collection with two open sessions: " +
-                                                                       MessageHelper.collectionInfoString(
-                                                                                       ce.getLoadedPersister(), this,
-                                                                                       ce.getLoadedKey(), session
-                                                                       )
-                                       );
-                               }
-                       }
-                       else {
-                               this.session = session;
-                               return true;
-                       }
-               }
-       }
-
-       /**
-        * Do we need to completely recreate this collection when it changes?
-        */
-       @Override
-    public boolean needsRecreate(CollectionPersister persister) {
-               return false;
-       }
-
-       /**
-        * To be called internally by the session, forcing
-        * immediate initialization.
-        */
-       @Override
-    public final void forceInitialization() throws HibernateException {
-               if ( !initialized ) {
-                       if ( initializing ) {
-                               throw new AssertionFailure( "force initialize loading collection" );
-                       }
-                       if ( session == null ) {
-                               throw new HibernateException( "collection is not associated with any session" );
-                       }
-                       if ( !session.isConnected() ) {
-                               throw new HibernateException( "disconnected session" );
-                       }
-                       session.initializeCollection( this, false );
-               }
-       }
-
-
-       /**
-        * Get the current snapshot from the session
-        */
-       @SuppressWarnings({"JavaDoc"})
-       protected final Serializable getSnapshot() {
-               return session.getPersistenceContext().getSnapshot( this );
-       }
-
-       /**
-        * Is this instance initialized?
-        */
-       @Override
-    public final boolean wasInitialized() {
-               return initialized;
-       }
-
-       @Override
-    public boolean isRowUpdatePossible() {
-               return true;
-       }
-
-       /**
-        * Does this instance have any "queued" additions?
-        */
-       @Override
-    public final boolean hasQueuedOperations() {
-               return operationQueue != null;
-       }
-
-       /**
-        * Iterate the "queued" additions
-        */
-       @Override
-    public final Iterator queuedAdditionIterator() {
-               if ( hasQueuedOperations() ) {
-                       return new Iterator() {
-                               int i = 0;
-
-                               @Override
-                public Object next() {
-                                       return operationQueue.get( i++ ).getAddedInstance();
-                               }
-
-                               @Override
-                public boolean hasNext() {
-                                       return i < operationQueue.size();
-                               }
-
-                               @Override
-                public void remove() {
-                                       throw new UnsupportedOperationException();
-                               }
-                       };
-               }
-               else {
-                       return EmptyIterator.INSTANCE;
-               }
-       }
-
-       /**
-        * Iterate the "queued" additions
-        */
-       @Override
-    @SuppressWarnings({"unchecked"})
-       public final Collection getQueuedOrphans(String entityName) {
-               if ( hasQueuedOperations() ) {
-                       Collection additions = new ArrayList( operationQueue.size() );
-                       Collection removals = new ArrayList( operationQueue.size() );
-                       for ( DelayedOperation operation : operationQueue ) {
-                               additions.add( operation.getAddedInstance() );
-                               removals.add( operation.getOrphan() );
-                       }
-                       return getOrphans( removals, additions, entityName, session );
-               }
-               else {
-                       return Collections.EMPTY_LIST;
-               }
-       }
-
-       /**
-        * Called before inserting rows, to ensure that any surrogate keys
-        * are fully generated
-        */
-       @Override
-    public void preInsert(CollectionPersister persister) throws HibernateException {
-       }
-
-       /**
-        * Called after inserting a row, to fetch the natively generated id
-        */
-       @Override
-    public void afterRowInsert(CollectionPersister persister, Object entry, int i) throws HibernateException {
-       }
-
-       /**
-        * get all "orphaned" elements
-        */
-       @Override
-    public abstract Collection getOrphans(Serializable snapshot, String entityName) throws HibernateException;
-
-       /**
-        * Get the current session
-        */
-       @SuppressWarnings({"JavaDoc"})
-       public final SessionImplementor getSession() {
-               return session;
-       }
-
-       protected final class IteratorProxy implements Iterator {
-               protected final Iterator itr;
-
-               public IteratorProxy(Iterator itr) {
-                       this.itr = itr;
-               }
-
-               @Override
-        public boolean hasNext() {
-                       return itr.hasNext();
-               }
-
-               @Override
-        public Object next() {
-                       return itr.next();
-               }
-
-               @Override
-        public void remove() {
-                       write();
-                       itr.remove();
-               }
-
-       }
-
-       protected final class ListIteratorProxy implements ListIterator {
-               protected final ListIterator itr;
-
-               public ListIteratorProxy(ListIterator itr) {
-                       this.itr = itr;
-               }
-
-               @Override
-        @SuppressWarnings({"unchecked"})
-               public void add(Object o) {
-                       write();
-                       itr.add( o );
-               }
-
-               @Override
-        public boolean hasNext() {
-                       return itr.hasNext();
-               }
-
-               @Override
-        public boolean hasPrevious() {
-                       return itr.hasPrevious();
-               }
-
-               @Override
-        public Object next() {
-                       return itr.next();
-               }
-
-               @Override
-        public int nextIndex() {
-                       return itr.nextIndex();
-               }
-
-               @Override
-        public Object previous() {
-                       return itr.previous();
-               }
-
-               @Override
-        public int previousIndex() {
-                       return itr.previousIndex();
-               }
-
-               @Override
-        public void remove() {
-                       write();
-                       itr.remove();
-               }
-
-               @Override
-        @SuppressWarnings({"unchecked"})
-               public void set(Object o) {
-                       write();
-                       itr.set( o );
-               }
-
-       }
-
-       protected class SetProxy implements java.util.Set {
-               protected final Collection set;
-
-               public SetProxy(Collection set) {
-                       this.set = set;
-               }
-
-               @Override
-        @SuppressWarnings({"unchecked"})
-               public boolean add(Object o) {
-                       write();
-                       return set.add( o );
-               }
-
-               @Override
-        @SuppressWarnings({"unchecked"})
-               public boolean addAll(Collection c) {
-                       write();
-                       return set.addAll( c );
-               }
-
-               @Override
-        public void clear() {
-                       write();
-                       set.clear();
-               }
-
-               @Override
-        public boolean contains(Object o) {
-                       return set.contains( o );
-               }
-
-               @Override
-        public boolean containsAll(Collection c) {
-                       return set.containsAll( c );
-               }
-
-               @Override
-        public boolean isEmpty() {
-                       return set.isEmpty();
-               }
-
-               @Override
-        public Iterator iterator() {
-                       return new IteratorProxy( set.iterator() );
-               }
-
-               @Override
-        public boolean remove(Object o) {
-                       write();
-                       return set.remove( o );
-               }
-
-               @Override
-        public boolean removeAll(Collection c) {
-                       write();
-                       return set.removeAll( c );
-               }
-
-               @Override
-        public boolean retainAll(Collection c) {
-                       write();
-                       return set.retainAll( c );
-               }
-
-               @Override
-        public int size() {
-                       return set.size();
-               }
-
-               @Override
-        public Object[] toArray() {
-                       return set.toArray();
-               }
-
-               @Override
-        @SuppressWarnings({"unchecked"})
-               public Object[] toArray(Object[] array) {
-                       return set.toArray( array );
-               }
-
-       }
-
-       protected final class ListProxy implements java.util.List {
-               protected final List list;
-
-               public ListProxy(List list) {
-                       this.list = list;
-               }
-
-               @Override
-               @SuppressWarnings({"unchecked"})
-               public void add(int index, Object value) {
-                       write();
-                       list.add( index, value );
-               }
-
-               @Override
-               @SuppressWarnings({"unchecked"})
-               public boolean add(Object o) {
-                       write();
-                       return list.add( o );
-               }
-
-               @Override
-               @SuppressWarnings({"unchecked"})
-               public boolean addAll(Collection c) {
-                       write();
-                       return list.addAll( c );
-               }
-
-               @Override
-               @SuppressWarnings({"unchecked"})
-               public boolean addAll(int i, Collection c) {
-                       write();
-                       return list.addAll( i, c );
-               }
-
-               @Override
-               public void clear() {
-                       write();
-                       list.clear();
-               }
-
-               @Override
-               public boolean contains(Object o) {
-                       return list.contains( o );
-               }
-
-               @Override
-               public boolean containsAll(Collection c) {
-                       return list.containsAll( c );
-               }
-
-               @Override
-               public Object get(int i) {
-                       return list.get( i );
-               }
-
-               @Override
-               public int indexOf(Object o) {
-                       return list.indexOf( o );
-               }
-
-               @Override
-               public boolean isEmpty() {
-                       return list.isEmpty();
-               }
-
-               @Override
-               public Iterator iterator() {
-                       return new IteratorProxy( list.iterator() );
-               }
-
-               @Override
-               public int lastIndexOf(Object o) {
-                       return list.lastIndexOf( o );
-               }
-
-               @Override
-               public ListIterator listIterator() {
-                       return new ListIteratorProxy( list.listIterator() );
-               }
-
-               @Override
-               public ListIterator listIterator(int i) {
-                       return new ListIteratorProxy( list.listIterator( i ) );
-               }
-
-               @Override
-               public Object remove(int i) {
-                       write();
-                       return list.remove( i );
-               }
-
-               @Override
-               public boolean remove(Object o) {
-                       write();
-                       return list.remove( o );
-               }
-
-               @Override
-               public boolean removeAll(Collection c) {
-                       write();
-                       return list.removeAll( c );
-               }
-
-               @Override
-               public boolean retainAll(Collection c) {
-                       write();
-                       return list.retainAll( c );
-               }
-
-               @Override
-               @SuppressWarnings({"unchecked"})
-               public Object set(int i, Object o) {
-                       write();
-                       return list.set( i, o );
-               }
-
-               @Override
-               public int size() {
-                       return list.size();
-               }
-
-               @Override
-               public List subList(int i, int j) {
-                       return list.subList( i, j );
-               }
-
-               @Override
-               public Object[] toArray() {
-                       return list.toArray();
-               }
-
-               @Override
-               @SuppressWarnings({"unchecked"})
-               public Object[] toArray(Object[] array) {
-                       return list.toArray( array );
-               }
-
-       }
-
-       /**
-        * Contract for operations which are part of a collection's operation queue.
-        */
-       protected interface DelayedOperation {
-               public void operate();
-
-               public Object getAddedInstance();
-
-               public Object getOrphan();
-       }
-
-       /**
-        * Given a collection of entity instances that used to
-        * belong to the collection, and a collection of instances
-        * that currently belong, return a collection of orphans
-        */
-       @SuppressWarnings({"JavaDoc", "unchecked"})
-       protected static Collection getOrphans(
-                       Collection oldElements,
-                       Collection currentElements,
-                       String entityName,
-                       SessionImplementor session) throws HibernateException {
-
-               // short-circuit(s)
-               if ( currentElements.size() == 0 ) {
-                       return oldElements; // no new elements, the old list contains only Orphans
-               }
-               if ( oldElements.size() == 0 ) {
-                       return oldElements; // no old elements, so no Orphans neither
-               }
-
-               final EntityPersister entityPersister = session.getFactory().getEntityPersister( entityName );
-               final Type idType = entityPersister.getIdentifierType();
-
-               // create the collection holding the Orphans
-               Collection res = new ArrayList();
-
-               // collect EntityIdentifier(s) of the *current* elements - add them into a HashSet for fast access
-               java.util.Set currentIds = new HashSet();
-               java.util.Set currentSaving = new IdentitySet();
-               for ( Object current : currentElements ) {
-                       if ( current != null && ForeignKeys.isNotTransient( entityName, current, null, session ) ) {
-                               EntityEntry ee = session.getPersistenceContext().getEntry( current );
-                               if ( ee != null && ee.getStatus() == Status.SAVING ) {
-                                       currentSaving.add( current );
-                               }
-                               else {
-                                       Serializable currentId = ForeignKeys.getEntityIdentifierIfNotUnsaved(
-                                                       entityName,
-                                                       current,
-                                                       session
-                                       );
-                                       currentIds.add( new TypedValue( idType, currentId, entityPersister.getEntityMode() ) );
-                               }
-                       }
-               }
-
-               // iterate over the *old* list
-               for ( Object old : oldElements ) {
-                       if ( !currentSaving.contains( old ) ) {
-                               Serializable oldId = ForeignKeys.getEntityIdentifierIfNotUnsaved( entityName, old, session );
-                               if ( !currentIds.contains( new TypedValue( idType, oldId, entityPersister.getEntityMode() ) ) ) {
-                                       res.add( old );
-                               }
-                       }
-               }
-
-               return res;
-       }
-
-       public static void identityRemove(
-                       Collection list,
-                       Object object,
-                       String entityName,
-                       SessionImplementor session) throws HibernateException {
-
-               if ( object != null && ForeignKeys.isNotTransient( entityName, object, null, session ) ) {
-                       final EntityPersister entityPersister = session.getFactory().getEntityPersister( entityName );
-                       Type idType = entityPersister.getIdentifierType();
-
-                       Serializable idOfCurrent = ForeignKeys.getEntityIdentifierIfNotUnsaved( entityName, object, session );
-                       Iterator itr = list.iterator();
-                       while ( itr.hasNext() ) {
-                               Serializable idOfOld = ForeignKeys.getEntityIdentifierIfNotUnsaved( entityName, itr.next(), session );
-                               if ( idType.isEqual( idOfCurrent, idOfOld, session.getFactory() ) ) {
-                                       itr.remove();
-                                       break;
-                               }
-                       }
-
-               }
-       }
-
-       @Override
-    public Object getIdentifier(Object entry, int i) {
-               throw new UnsupportedOperationException();
-       }
-
-       @Override
-    public Object getOwner() {
-               return owner;
-       }
-
-       @Override
-    public void setOwner(Object owner) {
-               this.owner = owner;
-       }
-
-       /** ------ Below is section of code which makes remote service calls ----- */
-       // The affected methods are :
-       // initialize(final boolean writing)
-       // readSize()
-       // readIndexExistence(final Object index)
-       // readElementExistence(final Object element)
-       // readElementByIndex(final Object index)
-
-       private static CdmApplicationRemoteConfiguration configuration;
-       private static boolean remoting = false;
-
-       public static void setConfiguration(CdmApplicationRemoteConfiguration conf) {
-           remoting = true;
-               configuration = conf;
-       }
-
-
-       private void remoteInitialize() {
-
-               if (getOwner() != null && !initialized) {
-
-                       try {
-                               String role = getRole();
-                               String fieldName = role.substring(role.lastIndexOf(".") + 1);
-                               log.info("--> Remote Lazy Initializing Collection " + getRole() + " , key : " + getKey() + " , field : " + fieldName);
-                               Object owner = getOwner();
-
-                               if(configuration == null) {
-                                       throw new HibernateException("CdmApplicationRemoteConfiguration not initialized (null)");
-                               }
-                               ICachedCommonService cachedCommonService = configuration.getCachedCommonService();
-                               if(cachedCommonService == null) {
-                                       throw new HibernateException("commonService not initialized (null)");
-                               }
-
-                               PersistentCollection col = cachedCommonService.initializeCollection(this);
-                               afterInitialize();
-
-                               Class<?> clazz = getClass();
-                               if (clazz != null) {
-                                       CollectionField cf = cachedCommonService.getCollectionField(col);
-                                       cachedCommonService.updatePersistentCollection(cf);
-                                       Field field = clazz.getDeclaredField(cf.getType().toString());
-                                       field.setAccessible(true);
-                                       field.set(this, cf.getCollection());
-                               }
-                       } catch (Exception ex) {
-                               log.warn(ex.getMessage());
-                       }
-               }
-       }
-
-
-
-}
-