This is an automated email from the ASF dual-hosted git repository.

mridulpathak pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


The following commit(s) were added to refs/heads/trunk by this push:
     new eabcf68a6f Copy item groups parent first in the ShoppingCart copy 
constructor
eabcf68a6f is described below

commit eabcf68a6f1010bef8d87fa5d506977dc9809730
Author: Mridul Pathak <[email protected]>
AuthorDate: Fri Oct 30 18:39:13 2026 +0530

    Copy item groups parent first in the ShoppingCart copy constructor
    
    - The copy constructor cloned the item groups in HashMap order and looked 
each parent up among the groups cloned so far, so a group returned before its 
parent (group 11 among groups 01 to 11) lost its parent. A private static 
copyItemGroup now copies each parent before its children, which also removes 
the this-escape warning from the getItemGroupByNumber call.
    - The copied items kept the groups of the original cart; they now belong to 
the copied groups.
    - The copy now continues nextGroupNumber and nextItemSeq instead of 
restarting them at 1, so a group added to the copy no longer replaces group 01.
---
 .../ofbiz/order/shoppingcart/ShoppingCart.java     | 36 ++++++++++++++++------
 1 file changed, 26 insertions(+), 10 deletions(-)

diff --git 
a/applications/order/src/main/java/org/apache/ofbiz/order/shoppingcart/ShoppingCart.java
 
b/applications/order/src/main/java/org/apache/ofbiz/order/shoppingcart/ShoppingCart.java
index ff43d1f643..5647b1a888 100644
--- 
a/applications/order/src/main/java/org/apache/ofbiz/order/shoppingcart/ShoppingCart.java
+++ 
b/applications/order/src/main/java/org/apache/ofbiz/order/shoppingcart/ShoppingCart.java
@@ -246,26 +246,42 @@ public class ShoppingCart implements 
Iterable<ShoppingCartItem>, Serializable {
             this.additionalPartyRole.put(me.getKey(), new 
LinkedList<>(me.getValue()));
         }
 
-        // clone the groups
+        // clone the groups, each parent before its children, and continue 
their numbering
         for (ShoppingCartItemGroup itemGroup : 
cart.itemGroupByNumberMap.values()) {
-            // get the new parent group by number from the existing set; as 
before the parent must come before all children to work...
-            ShoppingCartItemGroup parentGroup = null;
-            if (itemGroup.getParentGroup() != null) {
-                parentGroup = 
this.getItemGroupByNumber(itemGroup.getParentGroup().getGroupNumber());
-            }
-            ShoppingCartItemGroup newGroup = new 
ShoppingCartItemGroup(itemGroup, parentGroup);
-            itemGroupByNumberMap.put(newGroup.getGroupNumber(), newGroup);
+            copyItemGroup(itemGroup, this.itemGroupByNumberMap);
         }
+        this.nextGroupNumber = cart.nextGroupNumber;
+        this.nextItemSeq = cart.nextItemSeq;
 
-        // clone the items
+        // clone the items, moving them to the cloned groups
         for (ShoppingCartItem item : cart.items()) {
-            cartLines.add(new ShoppingCartItem(item));
+            ShoppingCartItem newItem = new ShoppingCartItem(item);
+            if (item.getItemGroup() != null) {
+                
newItem.setItemGroup(this.itemGroupByNumberMap.get(item.getItemGroup().getGroupNumber()));
+            }
+            cartLines.add(newItem);
         }
 
         this.facilityId = cart.facilityId;
         this.webSiteId = cart.webSiteId;
     }
 
+    /**
+     * Copies an item group into the given map of copies, copying its parent 
groups first.
+     * @param itemGroup the item group to copy
+     * @param copies the copies made so far, by group number
+     * @return the copy of the item group
+     */
+    private static ShoppingCartItemGroup copyItemGroup(ShoppingCartItemGroup 
itemGroup, Map<String, ShoppingCartItemGroup> copies) {
+        ShoppingCartItemGroup copy = copies.get(itemGroup.getGroupNumber());
+        if (copy == null) {
+            ShoppingCartItemGroup parentGroup = itemGroup.getParentGroup();
+            copy = new ShoppingCartItemGroup(itemGroup, parentGroup == null ? 
null : copyItemGroup(parentGroup, copies));
+            copies.put(copy.getGroupNumber(), copy);
+        }
+        return copy;
+    }
+
     /** Creates new empty ShoppingCart object. */
     public ShoppingCart(LocalDispatcher dispatcher, String productStoreId, 
String webSiteId, Locale locale, String currencyUom,
                         String billToCustomerPartyId, String 
billFromVendorPartyId) {

Reply via email to