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

mbrohl 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 3d349c4870 Fixed: Persist OrderItemAttribute of ShoppingCartItem 
(OFBIZ-12828)
3d349c4870 is described below

commit 3d349c48708723e99220858cc45b8f392ec50eaf
Author: Sebastian Berg <sebastian.b...@ecomify.de>
AuthorDate: Thu Jul 27 15:52:48 2023 +0200

    Fixed: Persist OrderItemAttribute of ShoppingCartItem (OFBIZ-12828)
    
    Fix introduced so that OrderItemAttributes are persisted inside
    ShoppingCartItemAttributes from now on.
    Checkstyle ParameterNumber needed to be increased by one
---
 .../datamodel/entitydef/order-entitymodel.xml      |  15 +++
 .../order/servicedef/services_shoppinglist.xml     |   1 +
 .../shoppinglist/ShoppingListServicesScript.groovy |  61 +++++++-----
 .../ofbiz/order/shoppingcart/ShoppingCart.java     |   7 --
 .../ofbiz/order/shoppingcart/ShoppingCartItem.java | 109 ++++++++++++++++-----
 .../order/shoppinglist/ShoppingListEvents.java     |  74 ++++++++++++--
 config/checkstyle/checkstyle.xml                   |   2 +-
 7 files changed, 199 insertions(+), 70 deletions(-)

diff --git a/applications/datamodel/entitydef/order-entitymodel.xml 
b/applications/datamodel/entitydef/order-entitymodel.xml
index 5bb9f6c56d..f827711b7a 100644
--- a/applications/datamodel/entitydef/order-entitymodel.xml
+++ b/applications/datamodel/entitydef/order-entitymodel.xml
@@ -2951,6 +2951,21 @@ under the License.
         <key-map field-name="productId"/>
       </relation>
     </entity>
+    <entity entity-name="ShoppingListItemAttribute"
+            package-name="org.ofbiz.order.shoppinglist"
+            title="Shopping List Item Attribute Entity">
+      <field name="shoppingListId" type="id"></field>
+      <field name="shoppingListItemSeqId" type="id"></field>
+      <field name="attrName" type="id-long"></field>
+      <field name="attrValue" type="value"></field>
+      <prim-key field="shoppingListId"/>
+      <prim-key field="shoppingListItemSeqId"/>
+      <prim-key field="attrName"/>
+      <relation type="one" fk-name="SHLIST_ITEM_ATTR" 
rel-entity-name="ShoppingListItem">
+        <key-map field-name="shoppingListId"/>
+        <key-map field-name="shoppingListItemSeqId"/>
+      </relation>
+    </entity>
     <entity entity-name="ShoppingListItemSurvey"
             package-name="org.apache.ofbiz.order.shoppinglist"
             title="Shopping List Item">
diff --git a/applications/order/servicedef/services_shoppinglist.xml 
b/applications/order/servicedef/services_shoppinglist.xml
index 947ee8f707..8e46990395 100644
--- a/applications/order/servicedef/services_shoppinglist.xml
+++ b/applications/order/servicedef/services_shoppinglist.xml
@@ -124,6 +124,7 @@ under the License.
         <attribute name="shoppingListId" type="String" mode="IN" 
optional="true"/>
         <attribute name="productStoreId" type="String" mode="INOUT" 
optional="true"/>
         <attribute name="productId" type="String" mode="IN" optional="false"/>
+        <attribute name="shoppingListItemAttributes" type="Map" mode="IN" 
optional="true"/>
         <attribute name="shoppingListItemSeqId" type="String" mode="OUT" 
optional="false"/>
     </service>
     <service name="updateShoppingListItem" engine="groovy" auth="true"
diff --git 
a/applications/order/src/main/groovy/org/apache/ofbiz/order/shoppinglist/ShoppingListServicesScript.groovy
 
b/applications/order/src/main/groovy/org/apache/ofbiz/order/shoppinglist/ShoppingListServicesScript.groovy
index 8333299b71..72f151b2f9 100644
--- 
a/applications/order/src/main/groovy/org/apache/ofbiz/order/shoppinglist/ShoppingListServicesScript.groovy
+++ 
b/applications/order/src/main/groovy/org/apache/ofbiz/order/shoppinglist/ShoppingListServicesScript.groovy
@@ -73,41 +73,50 @@ Map updateShoppingList() {
 
 /**
  * Create a ShoppingList Item
+ * @return
  */
 Map createShoppingListItem() {
     Map result = success()
     List shoppingListItems = from('ShoppingListItem')
             .where(productId: parameters.productId,
-                    shoppingListId: parameters.shoppingListId)
+            shoppingListId: parameters.shoppingListId)
             .queryList()
+    // Check if we have a matching ShoppingListItem (with equal 
ShoppingListItemAttributes!) and update its quantity
     if (shoppingListItems) {
-        GenericValue shoppingListItem = shoppingListItems[0]
-
-        shoppingListItem.quantity = shoppingListItem.quantity ?: 0.0
-        parameters.quantity = parameters.quantity ?: 0.0
-
-        BigDecimal totalQty = shoppingListItem.quantity + parameters.quantity
-        Map serviceResult = run service: 'updateShoppingListItem', with: [*: 
shoppingListItem,
-                                                                          
quantity: totalQty]
-        if (!ServiceUtil.isSuccess(serviceResult)) {
-            return error(serviceResult.errorMessage)
-        }
-        result.shoppingListItemSeqId = shoppingListItem.shoppingListItemSeqId
-    } else {
-        GenericValue shoppingList = 
from('ShoppingList').where(parameters).queryOne()
-        GenericValue product = from('Product').where(parameters).queryOne()
-        if (!product) {
-            return error(UtilProperties.getMessage('ProductUiLabels', 
'ProductErrorProductNotFound', parameters.locale))
+        for (GenericValue shoppingListItem : shoppingListItems) {
+            List slItemAttributes = select('attrName', 'attrValue')
+                    .from('ShoppingListItemAttribute')
+                    .where('shoppingListId', parameters.shoppingListId, 
'shoppingListItemSeqId', shoppingListItem.shoppingListItemSeqId)
+                    .queryList()
+            if ((!slItemAttributes && !parameters.shoppingListItemAttributes) 
||
+                UtilValidate.areEqual(slItemAttributes, 
parameters.shoppingListItemAttributes)) {
+                    BigDecimal totalquantity = shoppingListItem.quantity + 
parameters.quantity
+                    result.shoppingListItemSeqId = 
shoppingListItem.shoppingListItemSeqId
+                    Map serviceResult = run service: 'updateShoppingListItem', 
with: [*       : shoppingListItem,
+                        quantity: totalquantity]
+                    if (!ServiceUtil.isSuccess(serviceResult)) {
+                        return error(serviceResult.errorMessage)
+                    }
+                    // Exit here, because we found an existing item update, 
otherwise we have to create a new one below
+                    return result
+            }
         }
-        GenericValue newEntity = makeValue('ShoppingListItem')
-        newEntity.setNonPKFields(parameters)
-        newEntity.shoppingListId = parameters.shoppingListId
-        delegator.setNextSubSeqId(newEntity, 'shoppingListItemSeqId', 5, 1)
-        newEntity.create()
-
-        result.shoppingListItemSeqId = newEntity.shoppingListItemSeqId
-        updateLastAdminModified(shoppingList, userLogin)
     }
+    // Create new ShoppingListItem
+    GenericValue shoppingList = 
from('ShoppingList').where(parameters).queryOne()
+    GenericValue product = from('Product').where(parameters).queryOne()
+    if (!product) {
+        return error(UtilProperties.getMessage('ProductUiLabels', 
'ProductErrorProductNotFound', parameters.locale))
+    }
+    GenericValue newEntity = makeValue('ShoppingListItem')
+    newEntity.setNonPKFields(parameters)
+    newEntity.shoppingListId = parameters.shoppingListId
+    delegator.setNextSubSeqId(newEntity, 'shoppingListItemSeqId', 5, 1)
+    newEntity.create()
+
+    result.shoppingListItemSeqId = newEntity.shoppingListItemSeqId
+    updateLastAdminModified(shoppingList, userLogin)
+
     return result
 }
 
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 fef531cd16..42f9c702ec 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
@@ -652,12 +652,6 @@ public class ShoppingCart implements 
Iterable<ShoppingCartItem>, Serializable {
                     reserveAfterDate, features, attributes, prodCatalogId, 
configWrapper, itemType, itemGroup, dispatcher,
                     this, Boolean.TRUE, Boolean.TRUE, parentProductId, 
Boolean.FALSE, Boolean.FALSE);
         }
-        // add order item attributes
-        if (UtilValidate.isNotEmpty(orderItemAttributes)) {
-            for (Entry<String, String> entry : orderItemAttributes.entrySet()) 
{
-                item.setOrderItemAttribute(entry.getKey(), entry.getValue());
-            }
-        }
 
         return this.addItem(0, item);
 
@@ -5013,7 +5007,6 @@ public class ShoppingCart implements 
Iterable<ShoppingCartItem>, Serializable {
                     }
 
                     List<GenericValue> supplierProducts = 
UtilGenerics.cast(getSuppliersForProductResult.get("supplierProducts"));
-
                     if (supplierProducts.isEmpty()) {
                         return ServiceUtil.returnError(
                             "Sorry! No supplier available to droship product 
#" + productId + " with quantity "
diff --git 
a/applications/order/src/main/java/org/apache/ofbiz/order/shoppingcart/ShoppingCartItem.java
 
b/applications/order/src/main/java/org/apache/ofbiz/order/shoppingcart/ShoppingCartItem.java
index 3ba990b1a6..8a3064b45d 100644
--- 
a/applications/order/src/main/java/org/apache/ofbiz/order/shoppingcart/ShoppingCartItem.java
+++ 
b/applications/order/src/main/java/org/apache/ofbiz/order/shoppingcart/ShoppingCartItem.java
@@ -31,6 +31,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 
 import org.apache.ofbiz.base.util.Debug;
@@ -532,20 +533,44 @@ public class ShoppingCartItem implements 
java.io.Serializable {
                 parentProductId, skipInventoryChecks, skipProductChecks);
     }
 
+    /**
+     * Method for backwards compatibility after extending makeItem method 
below with
+     * additional orderItemAttributes parameter.
+     */
+    public static ShoppingCartItem makeItem(Integer cartLocation, String 
productId, BigDecimal selectedAmount,
+            BigDecimal quantity, BigDecimal unitPrice,
+            Timestamp reservStart, BigDecimal reservLength, BigDecimal 
reservPersons, String accommodationMapId,
+            String accommodationSpotId, Timestamp shipBeforeDate, Timestamp 
shipAfterDate, Timestamp reserveAfterDate,
+            Map<String, GenericValue> additionalProductFeatureAndAppls, 
Map<String, Object> attributes,
+            String prodCatalogId, ProductConfigWrapper configWrapper,
+            String itemType, ShoppingCart.ShoppingCartItemGroup itemGroup, 
LocalDispatcher dispatcher,
+            ShoppingCart cart, Boolean triggerExternalOpsBool, Boolean 
triggerPriceRulesBool, String parentProductId,
+            Boolean skipInventoryChecks, Boolean skipProductChecks)
+            throws CartItemModifyException, ItemNotFoundException {
+
+        return makeItem(cartLocation, productId, selectedAmount, quantity, 
unitPrice,
+                reservStart, reservLength, reservPersons, null, null, 
shipBeforeDate, shipAfterDate, null,
+                additionalProductFeatureAndAppls, attributes, null, 
prodCatalogId, configWrapper,
+                itemType, itemGroup, dispatcher, cart, triggerExternalOpsBool, 
triggerPriceRulesBool,
+                parentProductId, skipInventoryChecks, skipProductChecks);
+
+    }
+
     /**
      * Makes a ShoppingCartItem and adds it to the cart.
-     * @param accommodationMapId  Optional. reservations add into workeffort
+     * @param accommodationMapId Optional. reservations add into workeffort
      * @param accommodationSpotId Optional. reservations add into workeffort
-     */
-    public static ShoppingCartItem makeItem(Integer cartLocation, String 
productId, BigDecimal selectedAmount, BigDecimal quantity,
-                                            BigDecimal unitPrice,
-                                            Timestamp reservStart, BigDecimal 
reservLength, BigDecimal reservPersons, String accommodationMapId,
-                                            String accommodationSpotId, 
Timestamp shipBeforeDate, Timestamp shipAfterDate, Timestamp reserveAfterDate,
-                                            Map<String, GenericValue> 
additionalProductFeatureAndAppls, Map<String, Object> attributes,
-                                            String prodCatalogId, 
ProductConfigWrapper configWrapper,
-                                            String itemType, 
ShoppingCart.ShoppingCartItemGroup itemGroup, LocalDispatcher dispatcher,
-                                            ShoppingCart cart, Boolean 
triggerExternalOpsBool, Boolean triggerPriceRulesBool, String parentProductId,
-                                            Boolean skipInventoryChecks, 
Boolean skipProductChecks)
+     * @param orderItemAttributes Optional.
+     */
+    public static ShoppingCartItem makeItem(Integer cartLocation, String 
productId, BigDecimal selectedAmount,
+            BigDecimal quantity, BigDecimal unitPrice, Timestamp reservStart, 
BigDecimal reservLength,
+            BigDecimal reservPersons, String accommodationMapId, String 
accommodationSpotId, Timestamp shipBeforeDate,
+            Timestamp shipAfterDate, Timestamp reserveAfterDate, Map<String,
+            GenericValue> additionalProductFeatureAndAppls, Map<String, 
Object> attributes,
+            Map<String, String> orderItemAttributes, String prodCatalogId, 
ProductConfigWrapper configWrapper,
+            String itemType, ShoppingCart.ShoppingCartItemGroup itemGroup, 
LocalDispatcher dispatcher,
+            ShoppingCart cart, Boolean triggerExternalOpsBool, Boolean 
triggerPriceRulesBool, String parentProductId,
+            Boolean skipInventoryChecks, Boolean skipProductChecks)
             throws CartItemModifyException, ItemNotFoundException {
         Delegator delegator = cart.getDelegator();
         GenericValue product = findProduct(delegator, skipProductChecks, 
prodCatalogId, productId, cart.getLocale());
@@ -553,16 +578,17 @@ public class ShoppingCartItem implements 
java.io.Serializable {
 
         if (parentProductId != null) {
             try {
-                parentProduct = 
EntityQuery.use(delegator).from("Product").where("productId", 
parentProductId).cache().queryOne();
+                parentProduct = 
EntityQuery.use(delegator).from("Product").where("productId", 
parentProductId).cache()
+                        .queryOne();
             } catch (GenericEntityException e) {
                 Debug.logWarning(e.toString(), MODULE);
             }
         }
         return makeItem(cartLocation, product, selectedAmount, quantity, 
unitPrice,
-                reservStart, reservLength, reservPersons, accommodationMapId, 
accommodationSpotId, shipBeforeDate, shipAfterDate, reserveAfterDate,
-                additionalProductFeatureAndAppls, attributes, prodCatalogId, 
configWrapper,
-                itemType, itemGroup, dispatcher, cart, triggerExternalOpsBool, 
triggerPriceRulesBool, parentProduct, skipInventoryChecks,
-                skipProductChecks);
+                reservStart, reservLength, reservPersons, accommodationMapId, 
accommodationSpotId, shipBeforeDate,
+                shipAfterDate, reserveAfterDate, 
additionalProductFeatureAndAppls, attributes, orderItemAttributes,
+                prodCatalogId, configWrapper, itemType, itemGroup, dispatcher, 
cart, triggerExternalOpsBool,
+                triggerPriceRulesBool, parentProduct, skipInventoryChecks, 
skipProductChecks);
     }
 
     /**
@@ -610,23 +636,48 @@ public class ShoppingCartItem implements 
java.io.Serializable {
                 triggerExternalOpsBool, triggerPriceRulesBool, parentProduct, 
skipInventoryChecks, skipProductChecks);
     }
 
+    /**
+     * Method for backwards compatibility after extending makeItem method 
below with
+     * additional orderItemAttributes parameter.
+     */
+    public static ShoppingCartItem makeItem(Integer cartLocation, GenericValue 
product, BigDecimal selectedAmount,
+            BigDecimal quantity, BigDecimal unitPrice, Timestamp reservStart, 
BigDecimal reservLength,
+            BigDecimal reservPersons,
+            String accommodationMapId, String accommodationSpotId,
+            Timestamp shipBeforeDate, Timestamp shipAfterDate, Timestamp 
reserveAfterDate,
+            Map<String, GenericValue> additionalProductFeatureAndAppls, 
Map<String, Object> attributes,
+            String prodCatalogId, ProductConfigWrapper configWrapper, String 
itemType,
+            ShoppingCart.ShoppingCartItemGroup itemGroup, LocalDispatcher 
dispatcher,
+            ShoppingCart cart, Boolean triggerExternalOpsBool, Boolean 
triggerPriceRulesBool,
+            GenericValue parentProduct, Boolean skipInventoryChecks, Boolean 
skipProductChecks)
+            throws CartItemModifyException {
+
+        return makeItem(cartLocation, product, selectedAmount,
+                quantity, unitPrice, reservStart, reservLength, reservPersons,
+                null, null, shipBeforeDate, shipAfterDate, null, 
additionalProductFeatureAndAppls, attributes, null,
+                prodCatalogId, configWrapper, itemType, itemGroup, dispatcher, 
cart,
+                triggerExternalOpsBool, triggerPriceRulesBool, parentProduct, 
skipInventoryChecks, skipProductChecks);
+    }
+
     /**
      * Makes a ShoppingCartItem and adds it to the cart.
-     * @param accommodationMapId  Optional. reservations add into workeffort
+     * @param accommodationMapId Optional. reservations add into workeffort
      * @param accommodationSpotId Optional. reservations add into workeffort
+     * @param orderItemAttributes Optional.
      */
     public static ShoppingCartItem makeItem(Integer cartLocation, GenericValue 
product, BigDecimal selectedAmount,
-                                            BigDecimal quantity, BigDecimal 
unitPrice, Timestamp reservStart, BigDecimal reservLength,
-                                            BigDecimal reservPersons, String 
accommodationMapId, String accommodationSpotId,
-                                            Timestamp shipBeforeDate, 
Timestamp shipAfterDate, Timestamp reserveAfterDate,
-                                            Map<String, GenericValue> 
additionalProductFeatureAndAppls, Map<String, Object> attributes,
-                                            String prodCatalogId, 
ProductConfigWrapper configWrapper, String itemType,
-                                            ShoppingCart.ShoppingCartItemGroup 
itemGroup, LocalDispatcher dispatcher,
-                                            ShoppingCart cart, Boolean 
triggerExternalOpsBool, Boolean triggerPriceRulesBool,
-                                            GenericValue parentProduct, 
Boolean skipInventoryChecks, Boolean skipProductChecks)
+            BigDecimal quantity, BigDecimal unitPrice, Timestamp reservStart, 
BigDecimal reservLength,
+            BigDecimal reservPersons, String accommodationMapId, String 
accommodationSpotId,
+            Timestamp shipBeforeDate, Timestamp shipAfterDate, Timestamp 
reserveAfterDate,
+            Map<String, GenericValue> additionalProductFeatureAndAppls, 
Map<String, Object> attributes,
+            Map<String, String> orderItemAttributes, String prodCatalogId, 
ProductConfigWrapper configWrapper,
+            String itemType, ShoppingCart.ShoppingCartItemGroup itemGroup, 
LocalDispatcher dispatcher,
+            ShoppingCart cart, Boolean triggerExternalOpsBool, Boolean 
triggerPriceRulesBool,
+            GenericValue parentProduct, Boolean skipInventoryChecks, Boolean 
skipProductChecks)
             throws CartItemModifyException {
 
-        ShoppingCartItem newItem = new ShoppingCartItem(product, 
additionalProductFeatureAndAppls, attributes, prodCatalogId, configWrapper,
+        ShoppingCartItem newItem = new ShoppingCartItem(product, 
additionalProductFeatureAndAppls, attributes,
+                prodCatalogId, configWrapper,
                 cart.getLocale(), itemType, itemGroup, parentProduct);
 
         selectedAmount = selectedAmount == null ? BigDecimal.ZERO : 
selectedAmount;
@@ -717,6 +768,12 @@ public class ShoppingCartItem implements 
java.io.Serializable {
         // if triggerPriceRules is true this price will be overriden
         newItem.setBasePrice(unitPrice);
 
+        if (UtilValidate.isNotEmpty(orderItemAttributes)) {
+            for (Entry<String, String> entry : orderItemAttributes.entrySet()) 
{
+                newItem.setOrderItemAttribute(entry.getKey(), 
entry.getValue());
+            }
+        }
+
         // add to cart before setting quantity so that we can get order total, 
etc
         if (cartLocation == null) {
             cart.addItemToEnd(newItem);
diff --git 
a/applications/order/src/main/java/org/apache/ofbiz/order/shoppinglist/ShoppingListEvents.java
 
b/applications/order/src/main/java/org/apache/ofbiz/order/shoppinglist/ShoppingListEvents.java
index 08a1112864..dbc98caa17 100644
--- 
a/applications/order/src/main/java/org/apache/ofbiz/order/shoppinglist/ShoppingListEvents.java
+++ 
b/applications/order/src/main/java/org/apache/ofbiz/order/shoppinglist/ShoppingListEvents.java
@@ -152,10 +152,13 @@ public class ShoppingListEvents {
                     Debug.logInfo("Adding cart item to shopping list [" + 
shoppingListId + "], allowPromo=" + allowPromo + ", item.getIsPromo()="
                             + item.getIsPromo() + ", item.getProductId()=" + 
item.getProductId() + ", item.getQuantity()=" + item.getQuantity(),
                             MODULE);
+                    Map<String, String> itemAttributes = 
item.getOrderItemAttributes();
                     Map<String, Object> serviceResult = null;
                     try {
-                        Map<String, Object> ctx = UtilMisc.<String, 
Object>toMap("userLogin", userLogin, "shoppingListId", shoppingListId,
+                        Map<String, Object> ctx = UtilMisc.<String, 
Object>toMap("userLogin", userLogin,
+                                "shoppingListId", shoppingListId,
                                 "productId", item.getProductId(), "quantity", 
item.getQuantity());
+                        ctx.put("shoppingListItemAttributes", itemAttributes);
                         ctx.put("reservStart", item.getReservStart());
                         ctx.put("reservLength", item.getReservLength());
                         ctx.put("reservPersons", item.getReservPersons());
@@ -173,6 +176,24 @@ public class ShoppingListEvents {
                         errMsg = UtilProperties.getMessage(RES_ERROR, 
"shoppinglistevents.error_adding_item_to_shopping_list", cart.getLocale());
                         throw new IllegalArgumentException(errMsg);
                     }
+
+                    // store all currenlty existing OrderItemAttributes as 
ShoppingListItemAttributes
+                    if (UtilValidate.isNotEmpty(itemAttributes)) {
+                        for (Map.Entry<String, String> itemAttrib : 
itemAttributes.entrySet()) {
+                            try {
+                                GenericValue sliAttrib = 
delegator.makeValue("ShoppingListItemAttribute", UtilMisc
+                                        .toMap("shoppingListId", 
shoppingListId,
+                                                "shoppingListItemSeqId", 
serviceResult.get("shoppingListItemSeqId"),
+                                                "attrName", 
itemAttrib.getKey(), "attrValue", itemAttrib.getValue()));
+                                delegator.createOrStore(sliAttrib);
+                            } catch (GenericEntityException e) {
+                                Debug.logError(e, "Problems creating 
ShoppingListItemAttribute entity", MODULE);
+                                errMsg = UtilProperties.getMessage(RES_ERROR,
+                                        
"shoppinglistevents.error_adding_item_to_shopping_list", cart.getLocale());
+                                throw new IllegalArgumentException(errMsg);
+                            }
+                        }
+                    }
                 }
             }
         }
@@ -258,6 +279,9 @@ public class ShoppingListEvents {
         // get the survey info for all the items
         Map<String, List<String>> shoppingListSurveyInfo = 
getItemSurveyInfos(shoppingListItems);
 
+        // get the itemAttributeInfos for all the items
+        Map<String, Map<String, String>> itemAttributeInfos = 
getItemAttributeInfos(shoppingListItems);
+
         // add the items
         StringBuilder eventMessage = new StringBuilder();
         for (GenericValue shoppingListItem : shoppingListItems) {
@@ -292,15 +316,13 @@ public class ShoppingListEvents {
                 }
                 // TODO: add code to check for survey response requirement
 
-                // i cannot get the addOrDecrease function to accept a null 
reservStart field: i get a null pointer exception a null constant works
-                // ....
-                if (reservStart == null) {
-                    cart.addOrIncreaseItem(productId, null, quantity, null, 
null, null, null, null, null, attributes, prodCatalogId, configWrapper,
-                            null, null, null, dispatcher);
-                } else {
-                    cart.addOrIncreaseItem(productId, null, quantity, 
reservStart, reservLength, reservPersons, null, null, null, null, null,
-                            attributes, prodCatalogId, configWrapper, null, 
null, null, dispatcher);
-                }
+                // add shoppingListItemAttributes as orderItemAttributes to 
cart item
+                Map<String, String> orderItemAttributes = 
itemAttributeInfos.get(listId + "." + itemId);
+
+                cart.addOrIncreaseItem(productId, null, quantity, reservStart, 
reservLength, reservPersons, null, null,
+                        null, null, null, attributes, orderItemAttributes, 
prodCatalogId, configWrapper, null, null,
+                        null, dispatcher);
+
                 Map<String, Object> messageMap = UtilMisc.<String, 
Object>toMap("productId", productId);
                 errMsg = UtilProperties.getMessage(RES_ERROR, 
"shoppinglistevents.added_product_to_cart", messageMap, cart.getLocale());
                 eventMessage.append(errMsg).append("\n");
@@ -554,6 +576,7 @@ public class ShoppingListEvents {
     public static int clearListInfo(Delegator delegator, String 
shoppingListId) throws GenericEntityException {
         // remove the survey responses first
         delegator.removeByAnd("ShoppingListItemSurvey", 
UtilMisc.toMap("shoppingListId", shoppingListId));
+        delegator.removeByAnd("ShoppingListItemAttribute", 
UtilMisc.toMap("shoppingListId", shoppingListId));
 
         // next remove the items
         return delegator.removeByAnd("ShoppingListItem", 
UtilMisc.toMap("shoppingListId", shoppingListId));
@@ -578,6 +601,37 @@ public class ShoppingListEvents {
         return -1;
     }
 
+    /**
+     * Returns Map keyed on item sequence ID containing a map of item 
attributes
+     */
+    public static Map<String, Map<String, String>> 
getItemAttributeInfos(List<GenericValue> items) {
+        Map<String, Map<String, String>> attributeInfos = new HashMap<>();
+        if (UtilValidate.isNotEmpty(items)) {
+            for (GenericValue item : items) {
+                String listId = item.getString("shoppingListId");
+                String itemId = item.getString("shoppingListItemSeqId");
+                String itemKey = listId + "." + itemId;
+
+                try {
+                    List<GenericValue> itemAttributes = 
item.getRelated("ShoppingListItemAttribute", null, null, true);
+                    for (GenericValue attribute : itemAttributes) {
+                        Map<String, String> attribMap = 
attributeInfos.get(itemKey);
+                        if (attribMap == null) {
+                            attribMap = new HashMap<>();
+                            attributeInfos.put(itemKey, attribMap);
+                        }
+                        attribMap.put(attribute.getString("attrName"), 
attribute.getString("attrValue"));
+                    }
+                } catch (GenericEntityException e) {
+                    Debug.logWarning(e, "Error loading related 
ShoppingListItemAttributes for shoppingListItem "
+                            + item);
+                }
+            }
+        }
+
+        return attributeInfos;
+    }
+
     /**
      * Returns Map keyed on item sequence ID containing a list of survey 
response IDs
      */
diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml
index 0c68c12a6a..a1655112b6 100644
--- a/config/checkstyle/checkstyle.xml
+++ b/config/checkstyle/checkstyle.xml
@@ -79,7 +79,7 @@ under the License.
             <property name="countEmpty" value="false"/>
         </module>
         <module name="ParameterNumber">
-            <property name="max" value="26"/>
+            <property name="max" value="27"/>
             <property name="tokens" value="METHOD_DEF"/>
             <property name="ignoreOverriddenMethods" value="true"/>
         </module>

Reply via email to