import org.hibernate.internal.SessionFactoryRegistry;\r
import org.hibernate.persister.entity.EntityPersister;\r
\r
+import eu.etaxonomy.cdm.api.application.CdmApplicationRemoteConfiguration;\r
+import eu.etaxonomy.cdm.cache.ProxyUtils;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.taxeditor.service.ICachedCommonService;\r
+\r
/**\r
* Convenience base class for lazy initialization handlers. Centralizes the basic plumbing of doing lazy\r
* initialization freeing subclasses to acts as essentially adapters to their intended entity mode and/or\r
* proxy generation strategy.\r
*\r
+ * ##FIXME REMOTING## for adaptations needed for remoting search for "remote"\r
+ *\r
* @author Gavin King\r
*/\r
public abstract class AbstractLazyInitializer implements LazyInitializer {\r
\r
@Override\r
public final void initialize() throws HibernateException {\r
+ // In remoting we are sure that session is null\r
+ // both when using property paths and switching off conversations\r
+ if(session == null && remoting) {\r
+ remoteInitialize();\r
+ }\r
if ( !initialized ) {\r
if ( allowLoadOutsideTransaction ) {\r
permissiveInitialization();\r
public void setUnwrap(boolean unwrap) {\r
this.unwrap = unwrap;\r
}\r
+\r
+ /** Below is section of code which makes remote service calls */\r
+\r
+ private static CdmApplicationRemoteConfiguration configuration;\r
+ private static boolean remoting = false;\r
+\r
+ public static void setConfiguration(CdmApplicationRemoteConfiguration conf) {\r
+ remoting = true;\r
+ configuration = conf;\r
+ }\r
+\r
+\r
+ private void remoteInitialize() {\r
+\r
+ if(!initialized) {\r
+ int classid = ((Integer)getIdentifier()).intValue();\r
+ LOG.info("--> Remote Lazy Initializing Object " + getEntityName() + " with id " + classid);\r
+ Class clazz;\r
+ try {\r
+ clazz = Class.forName(getEntityName());\r
+ } catch (ClassNotFoundException e) {\r
+ throw new HibernateException("Class for " + getEntityName() + " not found", e);\r
+ }\r
+ if(configuration == null) {\r
+ throw new HibernateException("CdmApplicationRemoteConfiguration not initialized (null)");\r
+ }\r
+ ICachedCommonService cachedCommonService = configuration.getCachedCommonService();\r
+ if(cachedCommonService == null) {\r
+ throw new HibernateException("commonService not initialized (null)");\r
+ }\r
+\r
+ CdmBase cdmBase = cachedCommonService.find(clazz,classid);\r
+ if(ProxyUtils.isUninitializedProxy(cdmBase)) {\r
+ throw new HibernateException("CdmBase Object initialized but is still a proxy");\r
+ }\r
+ setImplementation(cdmBase);\r
+\r
+ }\r
+ }\r
+\r
+ public static boolean isInitialized(AbstractLazyInitializer obj) {\r
+ return obj.initialized;\r
+ }\r
}\r