001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.shopping.action;
016    
017    import com.liferay.portal.kernel.servlet.SessionErrors;
018    import com.liferay.portal.kernel.upload.UploadPortletRequest;
019    import com.liferay.portal.kernel.util.Constants;
020    import com.liferay.portal.kernel.util.ParamUtil;
021    import com.liferay.portal.kernel.util.Validator;
022    import com.liferay.portal.security.auth.PrincipalException;
023    import com.liferay.portal.service.ServiceContext;
024    import com.liferay.portal.service.ServiceContextFactory;
025    import com.liferay.portal.struts.PortletAction;
026    import com.liferay.portal.theme.ThemeDisplay;
027    import com.liferay.portal.util.PortalUtil;
028    import com.liferay.portal.util.WebKeys;
029    import com.liferay.portlet.shopping.DuplicateItemFieldNameException;
030    import com.liferay.portlet.shopping.DuplicateItemSKUException;
031    import com.liferay.portlet.shopping.ItemLargeImageNameException;
032    import com.liferay.portlet.shopping.ItemLargeImageSizeException;
033    import com.liferay.portlet.shopping.ItemMediumImageNameException;
034    import com.liferay.portlet.shopping.ItemMediumImageSizeException;
035    import com.liferay.portlet.shopping.ItemNameException;
036    import com.liferay.portlet.shopping.ItemSKUException;
037    import com.liferay.portlet.shopping.ItemSmallImageNameException;
038    import com.liferay.portlet.shopping.ItemSmallImageSizeException;
039    import com.liferay.portlet.shopping.NoSuchCategoryException;
040    import com.liferay.portlet.shopping.NoSuchItemException;
041    import com.liferay.portlet.shopping.model.ShoppingItem;
042    import com.liferay.portlet.shopping.model.ShoppingItemField;
043    import com.liferay.portlet.shopping.model.ShoppingItemPrice;
044    import com.liferay.portlet.shopping.model.ShoppingItemPriceConstants;
045    import com.liferay.portlet.shopping.model.impl.ShoppingItemImpl;
046    import com.liferay.portlet.shopping.service.ShoppingItemServiceUtil;
047    import com.liferay.portlet.shopping.service.persistence.ShoppingItemFieldUtil;
048    import com.liferay.portlet.shopping.service.persistence.ShoppingItemPriceUtil;
049    
050    import java.io.File;
051    
052    import java.util.ArrayList;
053    import java.util.List;
054    
055    import javax.portlet.ActionRequest;
056    import javax.portlet.ActionResponse;
057    import javax.portlet.PortletConfig;
058    import javax.portlet.RenderRequest;
059    import javax.portlet.RenderResponse;
060    
061    import org.apache.struts.action.ActionForm;
062    import org.apache.struts.action.ActionForward;
063    import org.apache.struts.action.ActionMapping;
064    
065    /**
066     * @author Brian Wing Shun Chan
067     */
068    public class EditItemAction extends PortletAction {
069    
070            @Override
071            public void processAction(
072                            ActionMapping actionMapping, ActionForm actionForm,
073                            PortletConfig portletConfig, ActionRequest actionRequest,
074                            ActionResponse actionResponse)
075                    throws Exception {
076    
077                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
078    
079                    try {
080                            if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
081                                    updateItem(actionRequest);
082                            }
083                            else if (cmd.equals(Constants.DELETE)) {
084                                    deleteItem(actionRequest);
085                            }
086    
087                            if (Validator.isNotNull(cmd)) {
088                                    sendRedirect(actionRequest, actionResponse);
089                            }
090                    }
091                    catch (Exception e) {
092                            if (e instanceof NoSuchCategoryException ||
093                                    e instanceof NoSuchItemException ||
094                                    e instanceof PrincipalException) {
095    
096                                    SessionErrors.add(actionRequest, e.getClass());
097    
098                                    setForward(actionRequest, "portlet.shopping.error");
099                            }
100                            else if (e instanceof DuplicateItemFieldNameException ||
101                                             e instanceof DuplicateItemSKUException ||
102                                             e instanceof ItemLargeImageNameException ||
103                                             e instanceof ItemLargeImageSizeException ||
104                                             e instanceof ItemMediumImageNameException ||
105                                             e instanceof ItemMediumImageSizeException ||
106                                             e instanceof ItemNameException ||
107                                             e instanceof ItemSKUException ||
108                                             e instanceof ItemSmallImageNameException ||
109                                             e instanceof ItemSmallImageSizeException) {
110    
111                                    SessionErrors.add(actionRequest, e.getClass(), e);
112                            }
113                            else {
114                                    throw e;
115                            }
116                    }
117            }
118    
119            @Override
120            public ActionForward render(
121                            ActionMapping actionMapping, ActionForm actionForm,
122                            PortletConfig portletConfig, RenderRequest renderRequest,
123                            RenderResponse renderResponse)
124                    throws Exception {
125    
126                    try {
127                            ActionUtil.getItem(renderRequest);
128                    }
129                    catch (Exception e) {
130                            if (e instanceof NoSuchItemException ||
131                                    e instanceof PrincipalException) {
132    
133                                    SessionErrors.add(renderRequest, e.getClass());
134    
135                                    return actionMapping.findForward("portlet.shopping.error");
136                            }
137                            else {
138                                    throw e;
139                            }
140                    }
141    
142                    return actionMapping.findForward(
143                            getForward(renderRequest, "portlet.shopping.edit_item"));
144            }
145    
146            protected void deleteItem(ActionRequest actionRequest) throws Exception {
147                    long itemId = ParamUtil.getLong(actionRequest, "itemId");
148    
149                    ShoppingItemServiceUtil.deleteItem(itemId);
150            }
151    
152            protected void updateItem(ActionRequest actionRequest) throws Exception {
153                    UploadPortletRequest uploadPortletRequest =
154                            PortalUtil.getUploadPortletRequest(actionRequest);
155    
156                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
157                            WebKeys.THEME_DISPLAY);
158    
159                    long itemId = ParamUtil.getLong(uploadPortletRequest, "itemId");
160    
161                    long groupId = themeDisplay.getScopeGroupId();
162                    long categoryId = ParamUtil.getLong(uploadPortletRequest, "categoryId");
163                    String sku = ParamUtil.getString(uploadPortletRequest, "sku");
164                    String name = ParamUtil.getString(uploadPortletRequest, "name");
165                    String description = ParamUtil.getString(
166                            uploadPortletRequest, "description");
167                    String properties = ParamUtil.getString(
168                            uploadPortletRequest, "properties");
169    
170                    int fieldsCount = ParamUtil.getInteger(
171                            uploadPortletRequest, "fieldsCount", 1);
172    
173                    List<ShoppingItemField> itemFields = new ArrayList<>();
174    
175                    for (int i = 0; i < fieldsCount; i ++) {
176                            String fieldName = ParamUtil.getString(
177                                    uploadPortletRequest, "fieldName" + i);
178                            String fieldValues = ParamUtil.getString(
179                                    uploadPortletRequest, "fieldValues" + i);
180                            String fieldDescription = ParamUtil.getString(
181                                    uploadPortletRequest, "fieldDescription" + i);
182    
183                            ShoppingItemField itemField = ShoppingItemFieldUtil.create(0);
184    
185                            itemField.setName(fieldName);
186                            itemField.setValues(fieldValues);
187                            itemField.setDescription(fieldDescription);
188    
189                            itemFields.add(itemField);
190                    }
191    
192                    String fieldsQuantities = ParamUtil.getString(
193                            uploadPortletRequest, "fieldsQuantities");
194    
195                    int pricesCount = ParamUtil.getInteger(
196                            uploadPortletRequest, "pricesCount", 1);
197    
198                    List<ShoppingItemPrice> itemPrices = new ArrayList<>();
199    
200                    for (int i = 0; i < pricesCount; i ++) {
201                            int minQuantity = ParamUtil.getInteger(
202                                    uploadPortletRequest, "minQuantity" + i);
203                            int maxQuantity = ParamUtil.getInteger(
204                                    uploadPortletRequest, "maxQuantity" + i);
205                            double price = ParamUtil.getDouble(
206                                    uploadPortletRequest, "price" + i, themeDisplay.getLocale());
207    
208                            double discount = ParamUtil.getDouble(
209                                    uploadPortletRequest, "discount" + i, themeDisplay.getLocale());
210    
211                            discount = discount / 100;
212    
213                            boolean taxable = ParamUtil.getBoolean(
214                                    uploadPortletRequest, "taxable" + i);
215                            double shipping = ParamUtil.getDouble(
216                                    uploadPortletRequest, "shipping" + i, themeDisplay.getLocale());
217                            boolean useShippingFormula = ParamUtil.getBoolean(
218                                    uploadPortletRequest, "useShippingFormula" + i);
219                            boolean active = ParamUtil.getBoolean(
220                                    uploadPortletRequest, "active" + i);
221                            int defaultPrice = ParamUtil.getInteger(
222                                    uploadPortletRequest, "defaultPrice");
223    
224                            int status = ShoppingItemPriceConstants.STATUS_ACTIVE_DEFAULT;
225    
226                            if ((defaultPrice != i) && active) {
227                                    status = ShoppingItemPriceConstants.STATUS_ACTIVE;
228                            }
229                            else if ((defaultPrice != i) && !active) {
230                                    status = ShoppingItemPriceConstants.STATUS_INACTIVE;
231                            }
232    
233                            ShoppingItemPrice itemPrice = ShoppingItemPriceUtil.create(0);
234    
235                            itemPrice.setMinQuantity(minQuantity);
236                            itemPrice.setMaxQuantity(maxQuantity);
237                            itemPrice.setPrice(price);
238                            itemPrice.setDiscount(discount);
239                            itemPrice.setTaxable(taxable);
240                            itemPrice.setShipping(shipping);
241                            itemPrice.setUseShippingFormula(useShippingFormula);
242                            itemPrice.setStatus(status);
243    
244                            itemPrices.add(itemPrice);
245                    }
246    
247                    boolean requiresShipping = ParamUtil.getBoolean(
248                            uploadPortletRequest, "requiresShipping");
249    
250                    int stockQuantity = ParamUtil.getInteger(
251                            uploadPortletRequest, "stockQuantity");
252    
253                    if (ParamUtil.getBoolean(uploadPortletRequest, "infiniteStock")) {
254                            stockQuantity = ShoppingItemImpl.STOCK_QUANTITY_INFINITE_STOCK;
255                    }
256    
257                    boolean featured = ParamUtil.getBoolean(
258                            uploadPortletRequest, "featured");
259                    Boolean sale = null;
260    
261                    boolean smallImage = ParamUtil.getBoolean(
262                            uploadPortletRequest, "smallImage");
263                    String smallImageURL = ParamUtil.getString(
264                            uploadPortletRequest, "smallImageURL");
265                    File smallFile = uploadPortletRequest.getFile("smallFile");
266    
267                    boolean mediumImage = ParamUtil.getBoolean(
268                            uploadPortletRequest, "mediumImage");
269                    String mediumImageURL = ParamUtil.getString(
270                            uploadPortletRequest, "mediumImageURL");
271                    File mediumFile = uploadPortletRequest.getFile("mediumFile");
272    
273                    boolean largeImage = ParamUtil.getBoolean(
274                            uploadPortletRequest, "largeImage");
275                    String largeImageURL = ParamUtil.getString(
276                            uploadPortletRequest, "largeImageURL");
277                    File largeFile = uploadPortletRequest.getFile("largeFile");
278    
279                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
280                            ShoppingItem.class.getName(), actionRequest);
281    
282                    if (itemId <= 0) {
283    
284                            // Add item
285    
286                            ShoppingItemServiceUtil.addItem(
287                                    groupId, categoryId, sku, name, description, properties,
288                                    fieldsQuantities, requiresShipping, stockQuantity, featured,
289                                    sale, smallImage, smallImageURL, smallFile, mediumImage,
290                                    mediumImageURL, mediumFile, largeImage, largeImageURL,
291                                    largeFile, itemFields, itemPrices, serviceContext);
292                    }
293                    else {
294    
295                            // Update item
296    
297                            ShoppingItemServiceUtil.updateItem(
298                                    itemId, groupId, categoryId, sku, name, description, properties,
299                                    fieldsQuantities, requiresShipping, stockQuantity, featured,
300                                    sale, smallImage, smallImageURL, smallFile, mediumImage,
301                                    mediumImageURL, mediumFile, largeImage, largeImageURL,
302                                    largeFile, itemFields, itemPrices, serviceContext);
303                    }
304            }
305    
306    }