]> git.argeo.org Git - gpl/argeo-slc.git/commitdiff
Improve syncPath
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 14 Feb 2008 15:29:54 +0000 (15:29 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 14 Feb 2008 15:29:54 +0000 (15:29 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@956 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

org.argeo.slc.core/src/main/java/org/argeo/slc/hibernate/structure/tree/TreeSRegistryDaoHibernate.java

index 286bee6e06d9ee49724a31f70e404dcc74f86cc3..8b421a896b10519ca3db565fe756885cb44a7c7d 100644 (file)
@@ -14,6 +14,7 @@ import org.argeo.slc.core.structure.tree.TreeSPath;
 import org.argeo.slc.core.structure.tree.TreeSRegistry;\r
 import org.argeo.slc.dao.structure.tree.TreeSPathDao;\r
 import org.argeo.slc.dao.structure.tree.TreeSRegistryDao;\r
+import org.hibernate.Session;\r
 \r
 /**\r
  * The Hibernate implementation for tree-based structure registry.\r
@@ -48,27 +49,52 @@ public class TreeSRegistryDaoHibernate extends HibernateDaoSupport implements
 \r
        public void syncPath(TreeSRegistry registry,\r
                        StructureRegistry<TreeSPath> localRegistry, TreeSPath path) {\r
+               Session session = getSession();\r
+               if (log.isTraceEnabled())\r
+                       log.trace("Session#" + session.hashCode() + " " + session);\r
+               syncPathImpl(registry, localRegistry, path, session);\r
+               session.update(registry);\r
+               // update(registry);\r
+       }\r
+\r
+       private void syncPathImpl(TreeSRegistry registry,\r
+                       StructureRegistry<TreeSPath> localRegistry, TreeSPath path,\r
+                       Session session) {\r
                if (path.getParent() != null) {\r
                        TreeSPath parent = treeSPathDao.getOrCreate(path.getParent());\r
-                       syncPath(registry, localRegistry, parent);\r
+                       syncPathImpl(registry, localRegistry, parent, session);\r
                }\r
 \r
                if (log.isTraceEnabled())\r
                        log.trace("Synchronize path " + path);\r
-               \r
+\r
                if (registry.getElement(path) == null) {\r
-                       if (localRegistry != null) {\r
-                               registry.register(path, getElement(registry, localRegistry, path));\r
-                       } else {\r
-                               registry.register(path, new SimpleSElement(path.getName()));\r
-                       }\r
-                       update(registry);\r
+                       final StructureElement element = getElement(registry,\r
+                                       localRegistry, path);\r
+                       StructureElement elementPersisted = (StructureElement) session\r
+                                       .merge(element);\r
+                       registry.register(path, elementPersisted);\r
+                       // update(registry);\r
+\r
+                       if (log.isTraceEnabled())\r
+                               log.trace("No element in persisted structure for " + path\r
+                                               + ", merged to " + elementPersisted);\r
                } else {\r
                        if (localRegistry != null) {\r
-                               StructureElement sElement = getElement(registry, localRegistry, path);\r
-                               if (sElement != null) {\r
-                                       registry.register(path, sElement);\r
-                                       update(registry);\r
+                               StructureElement element = getElement(registry, localRegistry,\r
+                                               path);\r
+\r
+                               if (element != null) {\r
+                                       StructureElement elementPersisted = (StructureElement) session\r
+                                                       .merge(element);\r
+                                       registry.register(path, elementPersisted);\r
+                                       // update(registry);\r
+                                       if (log.isTraceEnabled())\r
+                                               log\r
+                                                               .trace("Update existing element in persisted structure for "\r
+                                                                               + path\r
+                                                                               + ", merged to "\r
+                                                                               + elementPersisted);\r
                                }\r
                        }\r
                }\r
@@ -80,7 +106,20 @@ public class TreeSRegistryDaoHibernate extends HibernateDaoSupport implements
        }\r
 \r
        protected StructureElement getElement(TreeSRegistry registry,\r
-                       StructureRegistry<TreeSPath> localRegistry, TreeSPath path){\r
-               return localRegistry.getElement(path);\r
+                       StructureRegistry<TreeSPath> localRegistry, TreeSPath path) {\r
+               StructureElement element;\r
+               if (localRegistry != null) {\r
+                       element = localRegistry.getElement(path);\r
+                       if (getSession().getSessionFactory().getClassMetadata(\r
+                                       element.getClass()) == null) {\r
+                               if (log.isTraceEnabled())\r
+                                       log.trace("Replace non-hibernate element " + element\r
+                                                       + " by a simple element.");\r
+                               element = new SimpleSElement(element.getLabel());\r
+                       }\r
+               } else {\r
+                       element = new SimpleSElement(path.getName());\r
+               }\r
+               return element;\r
        }\r
 }\r