import org.jboss.logging.Logger;
import eu.etaxonomy.cdm.api.application.CdmApplicationRemoteConfiguration;
+import eu.etaxonomy.cdm.cache.ProxyUtils;
import eu.etaxonomy.cdm.model.common.CdmBase;
import eu.etaxonomy.taxeditor.remoting.CdmEagerLoadingException;
-import eu.etaxonomy.taxeditor.remoting.cache.ProxyUtils;
import eu.etaxonomy.taxeditor.service.ICachedCommonService;
/**
* Base class implementing {@link org.hibernate.collection.spi.PersistentCollection}
*
+ * This is an extended copy of the original class from hibernate. It has been extended to
+ * allow making remote service calls to spring httpinvoker services (see section at the bottom
+ * of this class).
+ *
* @author Gavin King
+ * @author Cherian Mathew
*/
public abstract class AbstractPersistentCollection implements Serializable, PersistentCollection {
private static final Logger log = Logger.getLogger( AbstractPersistentCollection.class );
- private static final long serialVersionUID = -7238232378593030571L;
+ /**
+ * <b>IMPORTANT:</b><br>
+ * This serialVersionUID must be kept in sync with the serialVersionUID which is generated
+ * on the fly for serialized AbstractPersistentCollection objects coming from the httpInvoker
+ * service.
+ * This is most probably necessary after updating hibernate to a newer version. In any case
+ * it the need for updating this <code>serialVersionUID</code> becomes obvious when the attempt
+ * to connect to the server side fails with an <code>InvalidClassException</code>:
+ *
+ * <pre>
+ * java.io.InvalidClassException: org.hibernate.collection.internal.AbstractPersistentCollection;
+ * local class incompatible:
+ * stream classdesc serialVersionUID = 2742261122392386159,
+ * local class serialVersionUID = -7238232378593030571
+ * </pre>
+ * The correct <code>serialVersionUID</code> is the <code>stream classdesc serialVersionUID</code>
+ * from the error message.
+ */
+ private static final long serialVersionUID = 7094296207968006972L;
private transient SessionImplementor session;
private boolean initialized;
this.owner = owner;
}
- /** ------ Below is section of code which makes remote service calls ----- */
+/** ####################################################################
+
+ ADDED PART: Below is section of code which makes remote service calls
+
+ #################################################################### */
+
+
// The affected methods are :
// initialize(final boolean writing)
// readSize()
configuration = conf;
}
-
private void remoteInitialize() {
if (getOwner() != null && !initialized) {
throw new HibernateException("commonService not initialized (null)");
}
- //Object obj = ProxyUtils.deproxy(cachedCommonService.initializeCollection(this));
- Object obj = ProxyUtils.deproxy(cachedCommonService.initializeCollection(cdmBase.getUuid(), fieldName));
- if(ProxyUtils.isProxy(obj)) {
+ //Object obj = ProxyUtils.deproxyIfInitialized(cachedCommonService.initializeCollection(this));
+ Object obj = ProxyUtils.deproxyIfInitialized(cachedCommonService.initializeCollection(cdmBase.getUuid(), fieldName));
+ if(ProxyUtils.isUninitializedProxy(obj)) {
throw new HibernateException("Persistent Collection initialized but is still a proxy");
}
afterInitialize();
if (clazz != null) {
//CollectionField cf = cachedCommonService.getCollectionField(col);
//cachedCommonService.updatePersistentCollection(cf);
- Object collectionType = ProxyUtils.getCollectionType(obj);
+ Object collectionType = ProxyUtils.getCollectionType(obj, clazz);
Field field = clazz.getDeclaredField(collectionType.toString());
field.setAccessible(true);
field.set(this, obj);
}
}
}
-
-
-
-}
-
+}
\ No newline at end of file