ref #10067 add remoting specific parts to AbstractLazyInitializer again in taxeditor
[taxeditor.git] / eu.etaxonomy.taxeditor.cdmlib / src / main / java / org / hibernate / proxy / AbstractLazyInitializer.java
index 39adf883027acf8d4a4628111cc4e3d1c4ee1131..f989f1479cd9eac593e707cc6be1ef5eae66063e 100644 (file)
@@ -22,11 +22,18 @@ import org.hibernate.internal.CoreMessageLogger;
 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
@@ -166,6 +173,11 @@ public abstract class AbstractLazyInitializer implements LazyInitializer {
 \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
@@ -467,4 +479,47 @@ public abstract class AbstractLazyInitializer implements LazyInitializer {
     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