From 5548660a9b39f5e9f04b2d619012b2b95aeff044 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Thu, 8 Mar 2012 09:35:32 +0100 Subject: [PATCH] OO-147: implement an other method to prevent StaleObjectException while reloading an object --HG-- branch : 80-patch --- .../nodes/portfolio/DeadlineController.java | 2 +- .../portfolio/manager/EPFrontendManager.java | 14 ++++++++++++-- .../portfolio/manager/EPStructureManager.java | 19 +++++++++++++++++-- .../EPMultipleArtefactsAsTableController.java | 2 +- .../ui/structel/EPPageViewController.java | 2 +- .../edit/EPStructureDetailsController.java | 2 +- ...StructureTreeAndDetailsEditController.java | 8 ++++---- 7 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/olat/course/nodes/portfolio/DeadlineController.java b/src/main/java/org/olat/course/nodes/portfolio/DeadlineController.java index c6225ff0fe7..1b595e10aa0 100644 --- a/src/main/java/org/olat/course/nodes/portfolio/DeadlineController.java +++ b/src/main/java/org/olat/course/nodes/portfolio/DeadlineController.java @@ -91,7 +91,7 @@ public class DeadlineController extends FormBasicController { @Override protected void formOK(UserRequest ureq) { Date newDeadLine = deadlineChooser.getDate(); - map = (EPStructuredMap) ePFMgr.loadPortfolioStructureByKey(map.getKey()); // OLAT-6335: refresh map in case it was changed meanwhile + map = (EPStructuredMap) ePFMgr.reloadPortfolioStructure(map); // OLAT-6335: refresh map in case it was changed meanwhile map.setDeadLine(newDeadLine); map.setStatus(StructureStatusEnum.OPEN); ePFMgr.savePortfolioStructure(map); diff --git a/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java b/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java index 7809b1b2bb1..70a9bf948c0 100755 --- a/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java +++ b/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java @@ -61,7 +61,6 @@ import org.olat.modules.webFeed.portfolio.LiveBlogArtefactHandler; import org.olat.portfolio.PortfolioModule; import org.olat.portfolio.model.EPFilterSettings; import org.olat.portfolio.model.artefacts.AbstractArtefact; -import org.olat.portfolio.model.structel.EPAbstractMap; import org.olat.portfolio.model.structel.EPPage; import org.olat.portfolio.model.structel.EPStructureElement; import org.olat.portfolio.model.structel.EPStructuredMap; @@ -919,7 +918,9 @@ public class EPFrontendManager extends BasicManager { } /** - * Load a portfolio structure by its primary key + * Load a portfolio structure by its primary key. DON'T USE THIS METHOD + * TO RELOAD AN OBJECT. If you want do this, use the method + * reloadPortfolioStructure(PortfolioStructure structure) * @param key cannot be null * @return The structure element or null if not found */ @@ -927,6 +928,15 @@ public class EPFrontendManager extends BasicManager { return structureManager.loadPortfolioStructureByKey(key); } + /** + * Reload a portfolio structure + * @param structure cannot be null + * @return The reloaded structure element + */ + public PortfolioStructure reloadPortfolioStructure(PortfolioStructure structure){ + return structureManager.reloadPortfolioStructure(structure); + } + /** * Load the OLAT resource with the primary of the structure element * @param key cannot be null diff --git a/src/main/java/org/olat/portfolio/manager/EPStructureManager.java b/src/main/java/org/olat/portfolio/manager/EPStructureManager.java index c789b48ec73..88dc4f7a83d 100755 --- a/src/main/java/org/olat/portfolio/manager/EPStructureManager.java +++ b/src/main/java/org/olat/portfolio/manager/EPStructureManager.java @@ -27,6 +27,7 @@ import java.util.Date; import java.util.Iterator; import java.util.List; +import org.hibernate.ObjectNotFoundException; import org.olat.basesecurity.BaseSecurity; import org.olat.basesecurity.Constants; import org.olat.basesecurity.NamedGroupImpl; @@ -647,7 +648,7 @@ public class EPStructureManager extends BasicManager { protected Integer[] getRestrictionStatistics(PortfolioStructure structure) { if (structure instanceof EPStructureElement) { EPStructureElement structEl = (EPStructureElement) structure; - structEl = (EPStructureElement) loadPortfolioStructureByKey(structEl.getKey()); + structEl = (EPStructureElement) reloadPortfolioStructure(structEl); final List<CollectRestriction> restrictions = structEl.getCollectRestrictions(); if (restrictions != null && !restrictions.isEmpty()) { @@ -1516,9 +1517,23 @@ public class EPStructureManager extends BasicManager { return resources.get(0); } + /** + * Reload an object + * @param structure + * @return The reloaded object or null if not found + */ + public PortfolioStructure reloadPortfolioStructure(PortfolioStructure structure) { + if (structure == null) throw new NullPointerException(); + try { + return (PortfolioStructure)dbInstance.loadObject(EPStructureElement.class, structure.getKey()); + } catch (ObjectNotFoundException e) { + return null; + } + } + public OLATResource loadOlatResourceFromStructureElByKey(Long key) { if (key == null) throw new NullPointerException(); - + StringBuilder sb = new StringBuilder(); sb.append("select element.olatResource from ").append(EPStructureElement.class.getName()).append(" element") .append(" where element.key=:key or element.olatResource.resId=:key "); diff --git a/src/main/java/org/olat/portfolio/ui/artefacts/view/EPMultipleArtefactsAsTableController.java b/src/main/java/org/olat/portfolio/ui/artefacts/view/EPMultipleArtefactsAsTableController.java index 1c327b24cb1..5125661596e 100644 --- a/src/main/java/org/olat/portfolio/ui/artefacts/view/EPMultipleArtefactsAsTableController.java +++ b/src/main/java/org/olat/portfolio/ui/artefacts/view/EPMultipleArtefactsAsTableController.java @@ -229,7 +229,7 @@ public class EPMultipleArtefactsAsTableController extends BasicController implem } else if (CMD_CHOOSE.equals(action)){ fireEvent(ureq, new EPArtefactChoosenEvent(artefact)); } else if (CMD_UNLINK.equals(action)){ - struct = ePFMgr.loadPortfolioStructureByKey(struct.getKey()); + struct = ePFMgr.reloadPortfolioStructure(struct); ePFMgr.removeArtefactFromStructure(artefact, struct); artefactListTblCtrl.modelChanged(); fireEvent(ureq, new EPStructureChangeEvent(EPStructureChangeEvent.ADDED, struct)); diff --git a/src/main/java/org/olat/portfolio/ui/structel/EPPageViewController.java b/src/main/java/org/olat/portfolio/ui/structel/EPPageViewController.java index 83af57afa04..7eee1c06593 100644 --- a/src/main/java/org/olat/portfolio/ui/structel/EPPageViewController.java +++ b/src/main/java/org/olat/portfolio/ui/structel/EPPageViewController.java @@ -152,7 +152,7 @@ public class EPPageViewController extends BasicController { protected void event(UserRequest ureq, Controller source, Event event) { super.event(ureq, source, event); if (event instanceof EPStructureChangeEvent){ - this.page = (EPPage) ePFMgr.loadPortfolioStructureByKey(page.getKey()); + this.page = (EPPage) ePFMgr.reloadPortfolioStructure(page); init(ureq); } } diff --git a/src/main/java/org/olat/portfolio/ui/structel/edit/EPStructureDetailsController.java b/src/main/java/org/olat/portfolio/ui/structel/edit/EPStructureDetailsController.java index 7ed1ba07926..3d183b1047a 100644 --- a/src/main/java/org/olat/portfolio/ui/structel/edit/EPStructureDetailsController.java +++ b/src/main/java/org/olat/portfolio/ui/structel/edit/EPStructureDetailsController.java @@ -295,7 +295,7 @@ public class EPStructureDetailsController extends FormBasicController { */ @Override protected void formOK(final UserRequest ureq) { - editStructure = ePFMgr.loadPortfolioStructureByKey(editStructure.getKey()); + editStructure = ePFMgr.reloadPortfolioStructure(editStructure); editStructure.setTitle(titleEl.getValue()); editStructure.setDescription(descriptionEl.getValue()); editStructure.setArtefactRepresentationMode(viewRadio.getSelectedKey()); diff --git a/src/main/java/org/olat/portfolio/ui/structel/edit/EPStructureTreeAndDetailsEditController.java b/src/main/java/org/olat/portfolio/ui/structel/edit/EPStructureTreeAndDetailsEditController.java index 8e6cf6b02db..eedf6d8d134 100644 --- a/src/main/java/org/olat/portfolio/ui/structel/edit/EPStructureTreeAndDetailsEditController.java +++ b/src/main/java/org/olat/portfolio/ui/structel/edit/EPStructureTreeAndDetailsEditController.java @@ -125,7 +125,7 @@ public class EPStructureTreeAndDetailsEditController extends FormBasicController if (source == mapStyle){ if (!mapStyle.getSelectedKey().equals(mapStyle.getUserObject())){ String newStyle = mapStyle.getSelectedKey(); - rootStructure = ePFMgr.loadPortfolioStructureByKey(rootStructure.getKey()); + rootStructure = ePFMgr.reloadPortfolioStructure(rootStructure); ((EPStructureElement)rootStructure).setStyle(newStyle); ePFMgr.savePortfolioStructure(rootStructure); fireEvent(ureq, Event.CHANGED_EVENT); @@ -136,7 +136,7 @@ public class EPStructureTreeAndDetailsEditController extends FormBasicController private void initOrUpdateToc(UserRequest ureq) { removeAsListenerAndDispose(tocCtrl); // with new links (pages, sub-elements or artefacts) to map, map gets a new version, therefore needs a refresh! - rootStructure = ePFMgr.loadPortfolioStructureByKey(rootStructure.getKey()); + rootStructure = ePFMgr.reloadPortfolioStructure(rootStructure); tocCtrl = new EPTOCController(ureq, getWindowControl(), selectedStructure, rootStructure, secCallback); listenTo(tocCtrl); flc.put("tocCtrl", tocCtrl.getInitialComponent()); @@ -192,7 +192,7 @@ public class EPStructureTreeAndDetailsEditController extends FormBasicController tocCtrl.refreshTree(rootStructure); } else if (event instanceof EPStructureChangeEvent && event.getCommand().equals(EPStructureChangeEvent.ADDED)) { // always reload to be on the save side! - selectedStructure = ePFMgr.loadPortfolioStructureByKey(((EPStructureChangeEvent)event).getPortfolioStructure().getKey()); + selectedStructure = ePFMgr.reloadPortfolioStructure(((EPStructureChangeEvent)event).getPortfolioStructure()); initOrUpdateToc(ureq); initOrUpdateDetailsEditor(ureq); } else if (event.equals(Event.CHANGED_EVENT)){ @@ -210,7 +210,7 @@ public class EPStructureTreeAndDetailsEditController extends FormBasicController if(EPStructureEvent.CHANGE.equals(structureEvent.getCommand())) { PortfolioStructure structure = structureEvent.getStructure(); if(rootStructure.equals(structure)) { - rootStructure = ePFMgr.loadPortfolioStructureByKey(rootStructure.getKey()); + rootStructure = ePFMgr.reloadPortfolioStructure(rootStructure); } // refresh the tree on changes! tocCtrl.update(ureq, structure); -- GitLab