\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
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 getActiveTreeSRegistry() {\r
List<?> list = getHibernateTemplate().find(\r
- "from TreeSRegistry where status=?", TreeSRegistry.STATUS_ACTIVE);\r
+ "from TreeSRegistry where status=?",\r
+ TreeSRegistry.STATUS_ACTIVE);\r
if (list.size() == 0) {\r
return null;\r
} else {\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