X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.slc.core%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fhibernate%2Fstructure%2Ftree%2FTreeSRegistryDaoHibernate.java;h=fab18a19d6c17efe4b12db1ca75b038a4d3e2499;hb=4226558ccaf4d40b55d5d8492d0ef3476dfdf0c9;hp=3effc45d1989c9049bcd526944d4559ae228e351;hpb=faf680e212bf3e18837c4f798587856e061273b3;p=gpl%2Fargeo-slc.git diff --git a/org.argeo.slc.core/src/main/java/org/argeo/slc/hibernate/structure/tree/TreeSRegistryDaoHibernate.java b/org.argeo.slc.core/src/main/java/org/argeo/slc/hibernate/structure/tree/TreeSRegistryDaoHibernate.java index 3effc45d1..fab18a19d 100644 --- a/org.argeo.slc.core/src/main/java/org/argeo/slc/hibernate/structure/tree/TreeSRegistryDaoHibernate.java +++ b/org.argeo.slc.core/src/main/java/org/argeo/slc/hibernate/structure/tree/TreeSRegistryDaoHibernate.java @@ -4,9 +4,17 @@ import java.util.List; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.argeo.slc.core.structure.SimpleSElement; +import org.argeo.slc.core.structure.StructureElement; +import org.argeo.slc.core.structure.StructureRegistry; import org.argeo.slc.core.structure.tree.TreeSPath; import org.argeo.slc.core.structure.tree.TreeSRegistry; +import org.argeo.slc.dao.structure.tree.TreeSPathDao; import org.argeo.slc.dao.structure.tree.TreeSRegistryDao; +import org.hibernate.Session; /** * The Hibernate implementation for tree-based structure registry. @@ -16,21 +24,26 @@ import org.argeo.slc.dao.structure.tree.TreeSRegistryDao; public class TreeSRegistryDaoHibernate extends HibernateDaoSupport implements TreeSRegistryDao { - // private static Log log = - // LogFactory.getLog(TreeSRegistryDaoHibernate.class); + private TreeSPathDao treeSPathDao; + + private static Log log = LogFactory.getLog(TreeSRegistryDaoHibernate.class); public void create(TreeSRegistry registry) { getHibernateTemplate().save(registry); } - public void update(TreeSRegistry registry) { - getHibernateTemplate().update(registry); + public void update(TreeSRegistry registryArg) { + Session session = getSession(); + session.beginTransaction(); + TreeSRegistry registry = (TreeSRegistry)session.merge(registryArg); + session.update(registry); + session.getTransaction().commit(); } - public TreeSRegistry getTreeSRegistry(TreeSPath treeSPath) { + public TreeSRegistry getActiveTreeSRegistry() { List list = getHibernateTemplate().find( - "from TreeSRegistry where root.asUniqueString=?", - treeSPath.getRoot().getAsUniqueString()); + "from TreeSRegistry where status=?", + TreeSRegistry.STATUS_ACTIVE); if (list.size() == 0) { return null; } else { @@ -38,4 +51,83 @@ public class TreeSRegistryDaoHibernate extends HibernateDaoSupport implements } } + public void syncPath(TreeSRegistry registryArg, + StructureRegistry localRegistry, TreeSPath pathArg) { + Session session = getSession(); + session.beginTransaction(); + TreeSRegistry registry = (TreeSRegistry)session.merge(registryArg); + TreeSPath path = (TreeSPath)session.merge(pathArg); + if (log.isTraceEnabled()) + log.trace("Session#" + session.hashCode() + " " + session); + syncPathImpl(registry, localRegistry, path, session); + session.update(registry); + session.getTransaction().commit(); + } + + private void syncPathImpl(TreeSRegistry registry, + StructureRegistry localRegistry, TreeSPath path, + Session session) { + if (path.getParent() != null) { + TreeSPath parent = treeSPathDao.getOrCreate(path.getParent()); + syncPathImpl(registry, localRegistry, parent, session); + } + + if (log.isTraceEnabled()) + log.trace("Synchronize path " + path); + + if (registry.getElement(path) == null) { + final StructureElement element = getElement(registry, + localRegistry, path, session); + StructureElement elementPersisted = (StructureElement) session + .merge(element); + registry.register(path, elementPersisted); + // update(registry); + + if (log.isTraceEnabled()) + log.trace("No element in persisted structure for " + path + + ", merged to " + elementPersisted); + } else { + if (localRegistry != null) { + StructureElement element = getElement(registry, localRegistry, + path, session); + + if (element != null) { + StructureElement elementPersisted = (StructureElement) session + .merge(element); + registry.register(path, elementPersisted); + // update(registry); + if (log.isTraceEnabled()) + log + .trace("Update existing element in persisted structure for " + + path + + ", merged to " + + elementPersisted); + } + } + } + + } + + public void setTreeSPathDao(TreeSPathDao treeSPathDao) { + this.treeSPathDao = treeSPathDao; + } + + protected StructureElement getElement(TreeSRegistry registry, + StructureRegistry localRegistry, TreeSPath path, + Session session) { + StructureElement element; + if (localRegistry != null) { + element = localRegistry.getElement(path); + if (session.getSessionFactory() + .getClassMetadata(element.getClass()) == null) { + if (log.isTraceEnabled()) + log.trace("Replace non-hibernate element " + element + + " by a simple element."); + element = new SimpleSElement(element.getLabel()); + } + } else { + element = new SimpleSElement(path.getName()); + } + return element; + } }