From b3a7956f82c9c947ee6f729053d5e17e18ff4f25 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 14 Feb 2008 15:29:54 +0000 Subject: [PATCH] Improve syncPath git-svn-id: https://svn.argeo.org/slc/trunk@956 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../tree/TreeSRegistryDaoHibernate.java | 67 +++++++++++++++---- 1 file changed, 53 insertions(+), 14 deletions(-) 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 286bee6e0..8b421a896 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 @@ -14,6 +14,7 @@ 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. @@ -48,27 +49,52 @@ public class TreeSRegistryDaoHibernate extends HibernateDaoSupport implements public void syncPath(TreeSRegistry registry, StructureRegistry localRegistry, TreeSPath path) { + Session session = getSession(); + if (log.isTraceEnabled()) + log.trace("Session#" + session.hashCode() + " " + session); + syncPathImpl(registry, localRegistry, path, session); + session.update(registry); + // update(registry); + } + + private void syncPathImpl(TreeSRegistry registry, + StructureRegistry localRegistry, TreeSPath path, + Session session) { if (path.getParent() != null) { TreeSPath parent = treeSPathDao.getOrCreate(path.getParent()); - syncPath(registry, localRegistry, parent); + syncPathImpl(registry, localRegistry, parent, session); } if (log.isTraceEnabled()) log.trace("Synchronize path " + path); - + if (registry.getElement(path) == null) { - if (localRegistry != null) { - registry.register(path, getElement(registry, localRegistry, path)); - } else { - registry.register(path, new SimpleSElement(path.getName())); - } - update(registry); + final StructureElement element = getElement(registry, + localRegistry, path); + 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 sElement = getElement(registry, localRegistry, path); - if (sElement != null) { - registry.register(path, sElement); - update(registry); + StructureElement element = getElement(registry, localRegistry, + path); + + 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); } } } @@ -80,7 +106,20 @@ public class TreeSRegistryDaoHibernate extends HibernateDaoSupport implements } protected StructureElement getElement(TreeSRegistry registry, - StructureRegistry localRegistry, TreeSPath path){ - return localRegistry.getElement(path); + StructureRegistry localRegistry, TreeSPath path) { + StructureElement element; + if (localRegistry != null) { + element = localRegistry.getElement(path); + if (getSession().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; } } -- 2.39.5