1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portlet.shopping.action;
16  
17  import com.liferay.portal.kernel.servlet.SessionErrors;
18  import com.liferay.portal.kernel.upload.UploadPortletRequest;
19  import com.liferay.portal.kernel.util.Constants;
20  import com.liferay.portal.kernel.util.ParamUtil;
21  import com.liferay.portal.kernel.util.Validator;
22  import com.liferay.portal.security.auth.PrincipalException;
23  import com.liferay.portal.service.ServiceContext;
24  import com.liferay.portal.service.ServiceContextFactory;
25  import com.liferay.portal.struts.PortletAction;
26  import com.liferay.portal.theme.ThemeDisplay;
27  import com.liferay.portal.util.PortalUtil;
28  import com.liferay.portal.util.WebKeys;
29  import com.liferay.portlet.shopping.DuplicateItemSKUException;
30  import com.liferay.portlet.shopping.ItemLargeImageNameException;
31  import com.liferay.portlet.shopping.ItemLargeImageSizeException;
32  import com.liferay.portlet.shopping.ItemMediumImageNameException;
33  import com.liferay.portlet.shopping.ItemMediumImageSizeException;
34  import com.liferay.portlet.shopping.ItemNameException;
35  import com.liferay.portlet.shopping.ItemSKUException;
36  import com.liferay.portlet.shopping.ItemSmallImageNameException;
37  import com.liferay.portlet.shopping.ItemSmallImageSizeException;
38  import com.liferay.portlet.shopping.NoSuchCategoryException;
39  import com.liferay.portlet.shopping.NoSuchItemException;
40  import com.liferay.portlet.shopping.model.ShoppingItem;
41  import com.liferay.portlet.shopping.model.ShoppingItemField;
42  import com.liferay.portlet.shopping.model.ShoppingItemPrice;
43  import com.liferay.portlet.shopping.model.ShoppingItemPriceConstants;
44  import com.liferay.portlet.shopping.service.ShoppingItemServiceUtil;
45  import com.liferay.portlet.shopping.service.persistence.ShoppingItemFieldUtil;
46  import com.liferay.portlet.shopping.service.persistence.ShoppingItemPriceUtil;
47  
48  import java.io.File;
49  
50  import java.util.ArrayList;
51  import java.util.List;
52  
53  import javax.portlet.ActionRequest;
54  import javax.portlet.ActionResponse;
55  import javax.portlet.PortletConfig;
56  import javax.portlet.RenderRequest;
57  import javax.portlet.RenderResponse;
58  
59  import org.apache.struts.action.ActionForm;
60  import org.apache.struts.action.ActionForward;
61  import org.apache.struts.action.ActionMapping;
62  
63  /**
64   * <a href="EditItemAction.java.html"><b><i>View Source</i></b></a>
65   *
66   * @author Brian Wing Shun Chan
67   */
68  public class EditItemAction extends PortletAction {
69  
70      public void processAction(
71              ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
72              ActionRequest actionRequest, ActionResponse actionResponse)
73          throws Exception {
74  
75          String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
76  
77          try {
78              if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
79                  updateItem(actionRequest);
80              }
81              else if (cmd.equals(Constants.DELETE)) {
82                  deleteItem(actionRequest);
83              }
84  
85              if (Validator.isNotNull(cmd)) {
86                  sendRedirect(actionRequest, actionResponse);
87              }
88          }
89          catch (Exception e) {
90              if (e instanceof NoSuchCategoryException ||
91                  e instanceof NoSuchItemException ||
92                  e instanceof PrincipalException) {
93  
94                  SessionErrors.add(actionRequest, e.getClass().getName());
95  
96                  setForward(actionRequest, "portlet.shopping.error");
97              }
98              else if (e instanceof DuplicateItemSKUException ||
99                       e instanceof ItemLargeImageNameException ||
100                      e instanceof ItemLargeImageSizeException ||
101                      e instanceof ItemMediumImageNameException ||
102                      e instanceof ItemMediumImageSizeException ||
103                      e instanceof ItemNameException ||
104                      e instanceof ItemSKUException ||
105                      e instanceof ItemSmallImageNameException ||
106                      e instanceof ItemSmallImageSizeException) {
107 
108                 SessionErrors.add(actionRequest, e.getClass().getName());
109             }
110             else {
111                 throw e;
112             }
113         }
114     }
115 
116     public ActionForward render(
117             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
118             RenderRequest renderRequest, RenderResponse renderResponse)
119         throws Exception {
120 
121         try {
122             ActionUtil.getItem(renderRequest);
123         }
124         catch (Exception e) {
125             if (e instanceof NoSuchItemException ||
126                 e instanceof PrincipalException) {
127 
128                 SessionErrors.add(renderRequest, e.getClass().getName());
129 
130                 return mapping.findForward("portlet.shopping.error");
131             }
132             else {
133                 throw e;
134             }
135         }
136 
137         return mapping.findForward(
138             getForward(renderRequest, "portlet.shopping.edit_item"));
139     }
140 
141     protected void deleteItem(ActionRequest actionRequest) throws Exception {
142         long itemId = ParamUtil.getLong(actionRequest, "itemId");
143 
144         ShoppingItemServiceUtil.deleteItem(itemId);
145     }
146 
147     protected void updateItem(ActionRequest actionRequest) throws Exception {
148         UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(
149             actionRequest);
150 
151         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
152             WebKeys.THEME_DISPLAY);
153 
154         long itemId = ParamUtil.getLong(uploadRequest, "itemId");
155 
156         long groupId = themeDisplay.getScopeGroupId();
157         long categoryId = ParamUtil.getLong(uploadRequest, "categoryId");
158         String sku = ParamUtil.getString(uploadRequest, "sku");
159         String name = ParamUtil.getString(uploadRequest, "name");
160         String description = ParamUtil.getString(uploadRequest, "description");
161         String properties = ParamUtil.getString(uploadRequest, "properties");
162 
163         int fieldsCount = ParamUtil.getInteger(uploadRequest, "fieldsCount", 1);
164 
165         List<ShoppingItemField> itemFields = new ArrayList<ShoppingItemField>();
166 
167         for (int i = 0; i < fieldsCount; i ++) {
168             String fieldName = ParamUtil.getString(
169                 uploadRequest, "fieldName" + i);
170             String fieldValues = ParamUtil.getString(
171                 uploadRequest, "fieldValues" + i);
172             String fieldDescription = ParamUtil.getString(
173                 uploadRequest, "fieldDescription" + i);
174 
175             ShoppingItemField itemField = ShoppingItemFieldUtil.create(0);
176 
177             itemField.setName(fieldName);
178             itemField.setValues(fieldValues);
179             itemField.setDescription(fieldDescription);
180 
181             itemFields.add(itemField);
182         }
183 
184         String fieldsQuantities = ParamUtil.getString(
185             uploadRequest, "fieldsQuantities");
186 
187         int pricesCount = ParamUtil.getInteger(uploadRequest, "pricesCount", 1);
188 
189         List<ShoppingItemPrice> itemPrices = new ArrayList<ShoppingItemPrice>();
190 
191         for (int i = 0; i < pricesCount; i ++) {
192             int minQuantity = ParamUtil.getInteger(
193                 uploadRequest, "minQuantity" + i);
194             int maxQuantity = ParamUtil.getInteger(
195                 uploadRequest, "maxQuantity" + i);
196             double price = ParamUtil.getDouble(uploadRequest, "price" + i);
197             double discount = ParamUtil.getDouble(
198                 uploadRequest, "discount" + i) / 100;
199             boolean taxable = ParamUtil.getBoolean(
200                 uploadRequest, "taxable" + i);
201             double shipping = ParamUtil.getDouble(
202                 uploadRequest, "shipping" + i);
203             boolean useShippingFormula = ParamUtil.getBoolean(
204                 uploadRequest, "useShippingFormula" + i);
205             boolean active = ParamUtil.getBoolean(uploadRequest, "active" + i);
206             int defaultPrice = ParamUtil.getInteger(
207                 uploadRequest, "defaultPrice");
208 
209             int status = ShoppingItemPriceConstants.STATUS_ACTIVE_DEFAULT;
210 
211             if ((defaultPrice != i) && active) {
212                 status = ShoppingItemPriceConstants.STATUS_ACTIVE;
213             }
214             else if ((defaultPrice != i) && !active) {
215                 status = ShoppingItemPriceConstants.STATUS_INACTIVE;
216             }
217 
218             ShoppingItemPrice itemPrice = ShoppingItemPriceUtil.create(0);
219 
220             itemPrice.setMinQuantity(minQuantity);
221             itemPrice.setMaxQuantity(maxQuantity);
222             itemPrice.setPrice(price);
223             itemPrice.setDiscount(discount);
224             itemPrice.setTaxable(taxable);
225             itemPrice.setShipping(shipping);
226             itemPrice.setUseShippingFormula(useShippingFormula);
227             itemPrice.setStatus(status);
228 
229             itemPrices.add(itemPrice);
230         }
231 
232         boolean requiresShipping = ParamUtil.getBoolean(
233             uploadRequest, "requiresShipping");
234         int stockQuantity = ParamUtil.getInteger(
235             uploadRequest, "stockQuantity");
236 
237         boolean featured = ParamUtil.getBoolean(uploadRequest, "featured");
238         Boolean sale = null;
239 
240         boolean smallImage = ParamUtil.getBoolean(uploadRequest, "smallImage");
241         String smallImageURL = ParamUtil.getString(
242             uploadRequest, "smallImageURL");
243         File smallFile = uploadRequest.getFile("smallFile");
244 
245         boolean mediumImage = ParamUtil.getBoolean(
246             uploadRequest, "mediumImage");
247         String mediumImageURL = ParamUtil.getString(
248             uploadRequest, "mediumImageURL");
249         File mediumFile = uploadRequest.getFile("mediumFile");
250 
251         boolean largeImage = ParamUtil.getBoolean(uploadRequest, "largeImage");
252         String largeImageURL = ParamUtil.getString(
253             uploadRequest, "largeImageURL");
254         File largeFile = uploadRequest.getFile("largeFile");
255 
256         ServiceContext serviceContext = ServiceContextFactory.getInstance(
257             ShoppingItem.class.getName(), actionRequest);
258 
259         if (itemId <= 0) {
260 
261             // Add item
262 
263             ShoppingItemServiceUtil.addItem(
264                 groupId, categoryId, sku, name, description, properties,
265                 fieldsQuantities, requiresShipping, stockQuantity, featured,
266                 sale, smallImage, smallImageURL, smallFile, mediumImage,
267                 mediumImageURL, mediumFile, largeImage, largeImageURL,
268                 largeFile, itemFields, itemPrices, serviceContext);
269         }
270         else {
271 
272             // Update item
273 
274             ShoppingItemServiceUtil.updateItem(
275                 itemId, groupId, categoryId, sku, name, description, properties,
276                 fieldsQuantities, requiresShipping, stockQuantity, featured,
277                 sale, smallImage, smallImageURL, smallFile, mediumImage,
278                 mediumImageURL, mediumFile, largeImage, largeImageURL,
279                 largeFile, itemFields, itemPrices, serviceContext);
280         }
281     }
282 
283 }