From a47f9330fd9d238d8d57d6180ea93e93f1378951 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Fri, 15 Jul 2011 17:59:50 +0200 Subject: [PATCH] [Bug #1108] Fixed problem if label is created by another user Resolved an issue when the label is created by another user, and you try to create it again while editing the order. FEA: ItEr75S04BugFixing --- .../orders/labels/AssignedLabelsModel.java | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/labels/AssignedLabelsModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/labels/AssignedLabelsModel.java index deeb4c16d..f7acf8c56 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/labels/AssignedLabelsModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/labels/AssignedLabelsModel.java @@ -30,6 +30,7 @@ import org.navalplanner.business.labels.daos.ILabelDAO; import org.navalplanner.business.labels.entities.Label; import org.navalplanner.business.labels.entities.LabelType; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.transaction.annotation.Transactional; /** @@ -126,9 +127,31 @@ public abstract class AssignedLabelsModel implements IAssignedLabelsModel return result; } + @Transactional(readOnly = true) public Label createLabel(final String labelName, final LabelType labelType) { - Label label = adHocTransactionService + Label label = createAndSaveLabelOrGetFromDatabase(labelName, labelType); + addLabelToConversation(label); + return label; + } + + private Label createAndSaveLabelOrGetFromDatabase(final String labelName, + final LabelType labelType) { + Label label; + try { + label = saveLabelOnAnotherTransaction(labelName, labelType); + label.dontPoseAsTransientObjectAnymore(); + } catch (DataIntegrityViolationException e) { + // Label was already created by another user while editing the order + label = labelDAO.findByNameAndType(labelName, labelType); + forceLoad(label); + } + return label; + } + + private Label saveLabelOnAnotherTransaction(final String labelName, + final LabelType labelType) { + return adHocTransactionService .runOnAnotherTransaction(new IOnTransaction