-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