]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - org.argeo.slc.core/src/main/java/org/argeo/slc/hibernate/structure/tree/TreeSRegistryDaoHibernate.java
Create separate Hibernate project
[gpl/argeo-slc.git] / org.argeo.slc.core / src / main / java / org / argeo / slc / hibernate / structure / tree / TreeSRegistryDaoHibernate.java
index 3effc45d1989c9049bcd526944d4559ae228e351..fab18a19d6c17efe4b12db1ca75b038a4d3e2499 100644 (file)
@@ -4,9 +4,17 @@ import java.util.List;
 \r
 import org.springframework.orm.hibernate3.support.HibernateDaoSupport;\r
 \r
+import org.apache.commons.logging.Log;\r
+import org.apache.commons.logging.LogFactory;\r
+\r
+import org.argeo.slc.core.structure.SimpleSElement;\r
+import org.argeo.slc.core.structure.StructureElement;\r
+import org.argeo.slc.core.structure.StructureRegistry;\r
 import org.argeo.slc.core.structure.tree.TreeSPath;\r
 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
@@ -16,21 +24,26 @@ import org.argeo.slc.dao.structure.tree.TreeSRegistryDao;
 public class TreeSRegistryDaoHibernate extends HibernateDaoSupport implements\r
                TreeSRegistryDao {\r
 \r
-       // private static Log log =\r
-       // LogFactory.getLog(TreeSRegistryDaoHibernate.class);\r
+       private TreeSPathDao treeSPathDao;\r
+\r
+       private static Log log = LogFactory.getLog(TreeSRegistryDaoHibernate.class);\r
 \r
        public void create(TreeSRegistry registry) {\r
                getHibernateTemplate().save(registry);\r
        }\r
 \r
-       public void update(TreeSRegistry registry) {\r
-               getHibernateTemplate().update(registry);\r
+       public void update(TreeSRegistry registryArg) {\r
+               Session session = getSession();\r
+               session.beginTransaction();\r
+               TreeSRegistry registry = (TreeSRegistry)session.merge(registryArg);\r
+               session.update(registry);\r
+               session.getTransaction().commit();\r
        }\r
 \r
-       public TreeSRegistry getTreeSRegistry(TreeSPath treeSPath) {\r
+       public TreeSRegistry getActiveTreeSRegistry() {\r
                List<?> list = getHibernateTemplate().find(\r
-                               "from TreeSRegistry where root.asUniqueString=?",\r
-                               treeSPath.getRoot().getAsUniqueString());\r
+                               "from TreeSRegistry where status=?",\r
+                               TreeSRegistry.STATUS_ACTIVE);\r
                if (list.size() == 0) {\r
                        return null;\r
                } else {\r
@@ -38,4 +51,83 @@ public class TreeSRegistryDaoHibernate extends HibernateDaoSupport implements
                }\r
        }\r
 \r
+       public void syncPath(TreeSRegistry registryArg,\r
+                       StructureRegistry<TreeSPath> localRegistry, TreeSPath pathArg) {\r
+               Session session = getSession();\r
+               session.beginTransaction();\r
+               TreeSRegistry registry = (TreeSRegistry)session.merge(registryArg);\r
+               TreeSPath path = (TreeSPath)session.merge(pathArg);\r
+               if (log.isTraceEnabled())\r
+                       log.trace("Session#" + session.hashCode() + " " + session);\r
+               syncPathImpl(registry, localRegistry, path, session);\r
+               session.update(registry);\r
+               session.getTransaction().commit();\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
+                       syncPathImpl(registry, localRegistry, parent, session);\r
+               }\r
+\r
+               if (log.isTraceEnabled())\r
+                       log.trace("Synchronize path " + path);\r
+\r
+               if (registry.getElement(path) == null) {\r
+                       final StructureElement element = getElement(registry,\r
+                                       localRegistry, path, session);\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 element = getElement(registry, localRegistry,\r
+                                               path, session);\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
+\r
+       }\r
+\r
+       public void setTreeSPathDao(TreeSPathDao treeSPathDao) {\r
+               this.treeSPathDao = treeSPathDao;\r
+       }\r
+\r
+       protected StructureElement getElement(TreeSRegistry registry,\r
+                       StructureRegistry<TreeSPath> localRegistry, TreeSPath path,\r
+                       Session session) {\r
+               StructureElement element;\r
+               if (localRegistry != null) {\r
+                       element = localRegistry.getElement(path);\r
+                       if (session.getSessionFactory()\r
+                                       .getClassMetadata(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