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<ShoppingItemField>();
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<ShoppingItemPrice>();
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);
207                            double discount = ParamUtil.getDouble(
208                                    uploadPortletRequest, "discount" + i) / 100;
209                            boolean taxable = ParamUtil.getBoolean(
210                                    uploadPortletRequest, "taxable" + i);
211                            double shipping = ParamUtil.getDouble(
212                                    uploadPortletRequest, "shipping" + i);
213                            boolean useShippingFormula = ParamUtil.getBoolean(
214                                    uploadPortletRequest, "useShippingFormula" + i);
215                            boolean active = ParamUtil.getBoolean(
216                                    uploadPortletRequest, "active" + i);
217                            int defaultPrice = ParamUtil.getInteger(
218                                    uploadPortletRequest, "defaultPrice");
219    
220                            int status = ShoppingItemPriceConstants.STATUS_ACTIVE_DEFAULT;
221    
222                            if ((defaultPrice != i) && active) {
223                                    status = ShoppingItemPriceConstants.STATUS_ACTIVE;
224                            }
225                            else if ((defaultPrice != i) && !active) {
226                                    status = ShoppingItemPriceConstants.STATUS_INACTIVE;
227                            }
228    
229                            ShoppingItemPrice itemPrice = ShoppingItemPriceUtil.create(0);
230    
231                            itemPrice.setMinQuantity(minQuantity);
232                            itemPrice.setMaxQuantity(maxQuantity);
233                            itemPrice.setPrice(price);
234                            itemPrice.setDiscount(discount);
235                            itemPrice.setTaxable(taxable);
236                            itemPrice.setShipping(shipping);
237                            itemPrice.setUseShippingFormula(useShippingFormula);
238                            itemPrice.setStatus(status);
239    
240                            itemPrices.add(itemPrice);
241                    }
242    
243                    boolean requiresShipping = ParamUtil.getBoolean(
244                            uploadPortletRequest, "requiresShipping");
245    
246                    int stockQuantity = ParamUtil.getInteger(
247                            uploadPortletRequest, "stockQuantity");
248    
249                    if (ParamUtil.getBoolean(uploadPortletRequest, "infiniteStock")) {
250                            stockQuantity = ShoppingItemImpl.STOCK_QUANTITY_INFINITE_STOCK;
251                    }
252    
253                    boolean featured = ParamUtil.getBoolean(
254                            uploadPortletRequest, "featured");
255                    Boolean sale = null;
256    
257                    boolean smallImage = ParamUtil.getBoolean(
258                            uploadPortletRequest, "smallImage");
259                    String smallImageURL = ParamUtil.getString(
260                            uploadPortletRequest, "smallImageURL");
261                    File smallFile = uploadPortletRequest.getFile("smallFile");
262    
263                    boolean mediumImage = ParamUtil.getBoolean(
264                            uploadPortletRequest, "mediumImage");
265                    String mediumImageURL = ParamUtil.getString(
266                            uploadPortletRequest, "mediumImageURL");
267                    File mediumFile = uploadPortletRequest.getFile("mediumFile");
268    
269                    boolean largeImage = ParamUtil.getBoolean(
270                            uploadPortletRequest, "largeImage");
271                    String largeImageURL = ParamUtil.getString(
272                            uploadPortletRequest, "largeImageURL");
273                    File largeFile = uploadPortletRequest.getFile("largeFile");
274    
275                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
276                            ShoppingItem.class.getName(), actionRequest);
277    
278                    if (itemId <= 0) {
279    
280                            // Add item
281    
282                            ShoppingItemServiceUtil.addItem(
283                                    groupId, categoryId, sku, name, description, properties,
284                                    fieldsQuantities, requiresShipping, stockQuantity, featured,
285                                    sale, smallImage, smallImageURL, smallFile, mediumImage,
286                                    mediumImageURL, mediumFile, largeImage, largeImageURL,
287                                    largeFile, itemFields, itemPrices, serviceContext);
288                    }
289                    else {
290    
291                            // Update item
292    
293                            ShoppingItemServiceUtil.updateItem(
294                                    itemId, groupId, categoryId, sku, name, description, properties,
295                                    fieldsQuantities, requiresShipping, stockQuantity, featured,
296                                    sale, smallImage, smallImageURL, smallFile, mediumImage,
297                                    mediumImageURL, mediumFile, largeImage, largeImageURL,
298                                    largeFile, itemFields, itemPrices, serviceContext);
299                    }
300            }
301    
302    }