/* * Licensed to csti consulting * You may obtain a copy of the License at * * http://www.csticonsulting.com * Copyright (c) 2006-Mar 7, 2011 Consultation CS-TI inc. * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.salesmanager.core.util; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; import org.apache.commons.lang.xwork.StringUtils; import org.codehaus.jackson.map.ObjectMapper; import com.salesmanager.core.entity.catalog.Product; import com.salesmanager.core.entity.catalog.ProductAttribute; import com.salesmanager.core.entity.merchant.MerchantStore; import com.salesmanager.core.entity.orders.ShoppingCart; import com.salesmanager.core.entity.orders.ShoppingCartProduct; import com.salesmanager.core.entity.orders.ShoppingCartProductAttribute; import com.salesmanager.core.entity.system.Field; import com.salesmanager.core.entity.system.FieldOption; import com.salesmanager.core.service.ServiceFactory; import com.salesmanager.core.service.catalog.CatalogService; /** * Responsible for serializing the mini shopping cart in JSON format so it can * be saved in the cookie' Also contains a de serialization to rebuild a * ShoppingCart from a JSON String * * @author Carl Samson * */ public class MiniShoppingCartSerializationUtil { /** * Deserialize a Shopping cart string from the cookie * {"ps":[{"p":{"pid","<productid>","qty":"<quantity>","as":[{"a":"<attributeid>"},{"a":"<attributeid>"}]}},{"p":...}] * * @param json * @return com.salesmanager.core.entity.orders.ShoppingCart * @throws Exception */ public static ShoppingCart deserializeJSON(String json, MerchantStore store, Locale locale) throws Exception { if(StringUtils.isBlank(json)) { return null; } ShoppingCart cart = null; Map<String, String> data = new ObjectMapper().readValue(json, HashMap.class); Map<Long,ShoppingCartProduct> productsMap = null; List productsList = null; if(data!=null) { //Collection products = new ArrayList(); productsMap = new HashMap(); productsList = new ArrayList(); for(Object o: data.keySet()) { if(o instanceof String && ((String)o).equals("ps")) { // can parse Object oo = data.get(o); if(oo instanceof List) {//List for(Object ooo:(List)oo) { if(ooo instanceof LinkedHashMap) { Map m = (Map)ooo; //get each products Map field = (Map)m.get("p"); String productId = (String)field.get("pid"); String qty = (String)field.get("q"); long pId = Long.parseLong(productId); ShoppingCartProduct scp = new ShoppingCartProduct(); scp.setProductId(pId); scp.setQuantity(Integer.parseInt(qty)); productsMap.put(pId, scp); productsList.add(scp); List attrList = (List)field.get("as"); if(attrList!=null) { List attributesList = new ArrayList(); for(Object oooo:attrList) { Map values = (Map)oooo; String attrId = (String)values.get("a"); ShoppingCartProductAttribute attribute = new ShoppingCartProductAttribute(); attribute.setAttributeId(Long.parseLong(attrId)); attributesList.add(attribute); } scp.setAttributes(attributesList); } } } } } } } //if shoppingcart != null //get all products, query the catalog and re-create a new ShoppingCart //using values from the database if(productsList!=null) { List productsIds = new ArrayList(); List attributesIds = new ArrayList(); //Map productAttributes = new HashMap(); //int i = 0; for(Object o: productsList) { ShoppingCartProduct p = (ShoppingCartProduct)o; //p.setInternalId(i); productsIds.add(p.getProductId()); List attrs = p.getAttributes(); if(attrs!=null) { List attrsPerProduct = new ArrayList(); for(Object oo: attrs) { ShoppingCartProductAttribute attr = (ShoppingCartProductAttribute)oo; attributesIds.add(attr.getAttributeId());//for doing the query attrsPerProduct.add(attr.getAttributeId()); } //productAttributes.put(p.getInternalId(), attrsPerProduct); } //i++; } CatalogService cservice = (CatalogService)ServiceFactory.getService(ServiceFactory.CatalogService); Collection productCollection = cservice.getProducts(productsIds); Collection attributes = null; Map<Long,Product> pMap = null; if(productCollection!=null && productCollection.size()>0) { pMap = new HashMap(); for(Object o : productCollection) { Product p = (Product)o; pMap.put(p.getProductId(), p); } } Map<Long,ProductAttribute> productAttributesMap = null; if(attributesIds!=null && attributesIds.size()>0) { attributes = cservice.getProductAttributes(attributesIds, locale.getLanguage()); productAttributesMap = new HashMap(); for(Object o : attributes) { ProductAttribute pa = (ProductAttribute)o; productAttributesMap.put(pa.getProductAttributeId(), pa); } } //recreate ShoppingCart cart = new ShoppingCart(); List shoppingCartProducts = new ArrayList(); if(pMap!=null && pMap.size()>0) { LocaleUtil.setLocaleToEntityCollection(productCollection, locale, store.getCurrency()); for(Object o: productsList) { ShoppingCartProduct scp = (ShoppingCartProduct)o; if(pMap.containsKey(scp.getProductId())) { Product p = pMap.get(scp.getProductId()); scp.setImage(p.getSmallImagePath()); scp.setProductName(p.getProductDescription().getProductName()); List productAttributesList = null; List shoppingCartAttributesList = null; shoppingCartProducts.add(scp); List attrs = scp.getAttributes(); if(attrs!=null && attrs.size()>0) { for(Object oo: attrs) { ShoppingCartProductAttribute scpa = (ShoppingCartProductAttribute)oo; if(productAttributesMap.containsKey(scpa.getAttributeId())) { ProductAttribute pa = (ProductAttribute)productAttributesMap.get(scpa.getAttributeId()); if(productAttributesList==null) { productAttributesList = new ArrayList(); } if(shoppingCartAttributesList==null) { shoppingCartAttributesList = new ArrayList(); } productAttributesList.add(pa); shoppingCartAttributesList.add(scpa); } } } if(productAttributesList!=null) { BigDecimal priceWithAttributes = ProductUtil .determinePriceWithAttributes(p, productAttributesList, locale, store.getCurrency()); scp.setPrice(priceWithAttributes); scp.setPriceText(CurrencyUtil .displayFormatedAmountWithCurrency( priceWithAttributes, store .getCurrency())); scp.setAttributes(shoppingCartAttributesList); } else { scp.setPrice(ProductUtil.determinePrice(p, locale, store.getCurrency())); BigDecimal price = ProductUtil.determinePrice(p, locale, store.getCurrency()); scp.setPriceText(CurrencyUtil .displayFormatedAmountWithCurrency(price, store .getCurrency())); } } } } /* for(Object o : productCollection){ Product p = (Product)o; //p.setLocale(locale, currency); if(p.getMerchantId()==store.getMerchantId()) { ShoppingCartProduct scp = new ShoppingCartProduct(); scp.setProductId(p.getProductId()); scp.setImage(p.getSmallImagePath()); scp.setQuantity(1); ShoppingCartProduct temp = productsMap.get(p.getProductId()); if(temp!=null) { scp.setQuantity(temp.getQuantity()); } scp.setProductName(p.getName()); shoppingCartProducts.add(scp); if(attributes!=null) { List productAttributesList = new ArrayList(); List productAttrs = (List)productAttributes.get(p.getProductId()); for(Object x : productAttrs) { Long productAttribute = (Long)x; //get the object from loaded collection for(Object z : attributes) { ProductAttribute pa = (ProductAttribute)z; if(pa.getProductAttributeId()==productAttribute) { ShoppingCartProductAttribute productAttr = new ShoppingCartProductAttribute(); productAttr.setAttributeId(productAttribute); productAttr.setAttributeValue(productAttr.getAttributeValue()); productAttr.setTextValue(productAttr.getTextValue()); productAttributesList.add(productAttr); } } } if(productAttributesList.size()>0 && productAttributesMap.containsKey(p.getProductId())) { List attrs = productAttributesMap.get(p.getProductId()); BigDecimal priceWithAttributes = ProductUtil .determinePriceWithAttributes(p, attrs, locale, store.getCurrency()); scp.setPrice(priceWithAttributes); scp.setPriceText(CurrencyUtil .displayFormatedAmountWithCurrency( priceWithAttributes, store .getCurrency())); scp.setAttributes(productAttributesList); } else { scp.setPrice(ProductUtil.determinePrice(p, locale, store.getCurrency())); BigDecimal price = ProductUtil.determinePrice(p, locale, store.getCurrency()); scp.setPriceText(CurrencyUtil .displayFormatedAmountWithCurrency(price, store .getCurrency())); } } } }*/ cart.setProducts(shoppingCartProducts); } return cart; } /** * {"ps":[{"p":{"pid","<productid>","qty":"<quantity>","as":[{"a":"<attributeid>"},{"a":"<attributeid>"}]}},{"p":...}]} * @param shoppingCart * @return String * @throws Exception */ public static String serializeToJSON(ShoppingCart shoppingCart) throws Exception { if(shoppingCart==null) { return null; } Collection products = shoppingCart.getProducts(); if(products == null || products.size()==0) { return null; } StringBuilder json = new StringBuilder(); json.append("{\"ps\":["); int i = 1; for(Object o: products) { ShoppingCartProduct product = (ShoppingCartProduct)o; json.append("{\"p\":"); json.append("{\"pid\":\""); json.append(product.getProductId()); json.append("\""); json.append(",\"q\":"); json.append("\""); json.append(product.getQuantity()); json.append("\""); List attributes = product.getAttributes(); if(attributes!=null) { json.append(",\"as\":["); int j = 1; for(Object oo : attributes) { ShoppingCartProductAttribute scpa = (ShoppingCartProductAttribute)oo; json.append("{\"a\":"); json.append("\""); json.append(scpa.getAttributeValue()); json.append("\""); json.append("}"); if(j<attributes.size()) { json.append(","); } j++; } json.append("]"); } json.append("}}"); if(i<products.size()) { json.append(","); } i++; } json.append("]}"); return json.toString(); } }