]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - org.argeo.slc.hibernate/src/main/java/org/argeo/slc/hibernate/structure/tree/TreeSRegistryDaoHibernate.java
Branch hibernate project from core
[gpl/argeo-slc.git] / org.argeo.slc.hibernate / src / main / java / org / argeo / slc / hibernate / structure / tree / TreeSRegistryDaoHibernate.java
diff --git a/org.argeo.slc.hibernate/src/main/java/org/argeo/slc/hibernate/structure/tree/TreeSRegistryDaoHibernate.java b/org.argeo.slc.hibernate/src/main/java/org/argeo/slc/hibernate/structure/tree/TreeSRegistryDaoHibernate.java
new file mode 100644 (file)
index 0000000..fab18a1
--- /dev/null
@@ -0,0 +1,133 @@
+package org.argeo.slc.hibernate.structure.tree;\r
+\r
+import java.util.List;\r
+\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
+ * \r
+ * @see TreeSRegistry\r
+ */\r
+public class TreeSRegistryDaoHibernate extends HibernateDaoSupport implements\r
+               TreeSRegistryDao {\r
+\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 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 getActiveTreeSRegistry() {\r
+               List<?> list = getHibernateTemplate().find(\r
+                               "from TreeSRegistry where status=?",\r
+                               TreeSRegistry.STATUS_ACTIVE);\r
+               if (list.size() == 0) {\r
+                       return null;\r
+               } else {\r
+                       return (TreeSRegistry) list.get(0);\r
+               }\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