1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portlet.shopping.action;
24  
25  import com.liferay.portal.kernel.servlet.SessionErrors;
26  import com.liferay.portal.kernel.upload.UploadPortletRequest;
27  import com.liferay.portal.kernel.util.Constants;
28  import com.liferay.portal.kernel.util.ParamUtil;
29  import com.liferay.portal.kernel.util.Validator;
30  import com.liferay.portal.security.auth.PrincipalException;
31  import com.liferay.portal.service.ServiceContext;
32  import com.liferay.portal.service.ServiceContextFactory;
33  import com.liferay.portal.struts.PortletAction;
34  import com.liferay.portal.util.PortalUtil;
35  import com.liferay.portlet.shopping.DuplicateItemSKUException;
36  import com.liferay.portlet.shopping.ItemLargeImageNameException;
37  import com.liferay.portlet.shopping.ItemLargeImageSizeException;
38  import com.liferay.portlet.shopping.ItemMediumImageNameException;
39  import com.liferay.portlet.shopping.ItemMediumImageSizeException;
40  import com.liferay.portlet.shopping.ItemNameException;
41  import com.liferay.portlet.shopping.ItemSKUException;
42  import com.liferay.portlet.shopping.ItemSmallImageNameException;
43  import com.liferay.portlet.shopping.ItemSmallImageSizeException;
44  import com.liferay.portlet.shopping.NoSuchCategoryException;
45  import com.liferay.portlet.shopping.NoSuchItemException;
46  import com.liferay.portlet.shopping.model.ShoppingItem;
47  import com.liferay.portlet.shopping.model.ShoppingItemField;
48  import com.liferay.portlet.shopping.model.ShoppingItemPrice;
49  import com.liferay.portlet.shopping.model.impl.ShoppingItemPriceImpl;
50  import com.liferay.portlet.shopping.service.ShoppingItemServiceUtil;
51  import com.liferay.portlet.shopping.service.persistence.ShoppingItemFieldUtil;
52  import com.liferay.portlet.shopping.service.persistence.ShoppingItemPriceUtil;
53  
54  import java.io.File;
55  
56  import java.util.ArrayList;
57  import java.util.List;
58  
59  import javax.portlet.ActionRequest;
60  import javax.portlet.ActionResponse;
61  import javax.portlet.PortletConfig;
62  import javax.portlet.RenderRequest;
63  import javax.portlet.RenderResponse;
64  
65  import org.apache.struts.action.ActionForm;
66  import org.apache.struts.action.ActionForward;
67  import org.apache.struts.action.ActionMapping;
68  
69  /**
70   * <a href="EditItemAction.java.html"><b><i>View Source</i></b></a>
71   *
72   * @author Brian Wing Shun Chan
73   *
74   */
75  public class EditItemAction extends PortletAction {
76  
77      public void processAction(
78              ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
79              ActionRequest actionRequest, ActionResponse actionResponse)
80          throws Exception {
81  
82          String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
83  
84          try {
85              if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
86                  updateItem(actionRequest);
87              }
88              else if (cmd.equals(Constants.DELETE)) {
89                  deleteItem(actionRequest);
90              }
91  
92              if (Validator.isNotNull(cmd)) {
93                  sendRedirect(actionRequest, actionResponse);
94              }
95          }
96          catch (Exception e) {
97              if (e instanceof NoSuchCategoryException ||
98                  e instanceof NoSuchItemException ||
99                  e instanceof PrincipalException) {
100 
101                 SessionErrors.add(actionRequest, e.getClass().getName());
102 
103                 setForward(actionRequest, "portlet.shopping.error");
104             }
105             else if (e instanceof DuplicateItemSKUException ||
106                      e instanceof ItemLargeImageNameException ||
107                      e instanceof ItemLargeImageSizeException ||
108                      e instanceof ItemMediumImageNameException ||
109                      e instanceof ItemMediumImageSizeException ||
110                      e instanceof ItemNameException ||
111                      e instanceof ItemSKUException ||
112                      e instanceof ItemSmallImageNameException ||
113                      e instanceof ItemSmallImageSizeException) {
114 
115                 SessionErrors.add(actionRequest, e.getClass().getName());
116             }
117             else {
118                 throw e;
119             }
120         }
121     }
122 
123     public ActionForward render(
124             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
125             RenderRequest renderRequest, RenderResponse renderResponse)
126         throws Exception {
127 
128         try {
129             ActionUtil.getItem(renderRequest);
130         }
131         catch (Exception e) {
132             if (e instanceof NoSuchItemException ||
133                 e instanceof PrincipalException) {
134 
135                 SessionErrors.add(renderRequest, e.getClass().getName());
136 
137                 return mapping.findForward("portlet.shopping.error");
138             }
139             else {
140                 throw e;
141             }
142         }
143 
144         return mapping.findForward(
145             getForward(renderRequest, "portlet.shopping.edit_item"));
146     }
147 
148     protected void deleteItem(ActionRequest actionRequest) throws Exception {
149         long itemId = ParamUtil.getLong(actionRequest, "itemId");
150 
151         ShoppingItemServiceUtil.deleteItem(itemId);
152     }
153 
154     protected void updateItem(ActionRequest actionRequest) throws Exception {
155         UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(
156             actionRequest);
157 
158         long itemId = ParamUtil.getLong(uploadRequest, "itemId");
159 
160         long categoryId = ParamUtil.getLong(uploadRequest, "categoryId");
161         String sku = ParamUtil.getString(uploadRequest, "sku");
162         String name = ParamUtil.getString(uploadRequest, "name");
163         String description = ParamUtil.getString(uploadRequest, "description");
164         String properties = ParamUtil.getString(uploadRequest, "properties");
165 
166         int fieldsCount = ParamUtil.getInteger(uploadRequest, "fieldsCount", 1);
167 
168         List<ShoppingItemField> itemFields = new ArrayList<ShoppingItemField>();
169 
170         for (int i = 0; i < fieldsCount; i ++) {
171             String fieldName = ParamUtil.getString(
172                 uploadRequest, "fieldName" + i);
173             String fieldValues = ParamUtil.getString(
174                 uploadRequest, "fieldValues" + i);
175             String fieldDescription = ParamUtil.getString(
176                 uploadRequest, "fieldDescription" + i);
177 
178             ShoppingItemField itemField = ShoppingItemFieldUtil.create(0);
179 
180             itemField.setName(fieldName);
181             itemField.setValues(fieldValues);
182             itemField.setDescription(fieldDescription);
183 
184             itemFields.add(itemField);
185         }
186 
187         String fieldsQuantities = ParamUtil.getString(
188             uploadRequest, "fieldsQuantities");
189 
190         int pricesCount = ParamUtil.getInteger(uploadRequest, "pricesCount", 1);
191 
192         List<ShoppingItemPrice> itemPrices = new ArrayList<ShoppingItemPrice>();
193 
194         for (int i = 0; i < pricesCount; i ++) {
195             int minQuantity = ParamUtil.getInteger(
196                 uploadRequest, "minQuantity" + i);
197             int maxQuantity = ParamUtil.getInteger(
198                 uploadRequest, "maxQuantity" + i);
199             double price = ParamUtil.getDouble(uploadRequest, "price" + i);
200             double discount = ParamUtil.getDouble(
201                 uploadRequest, "discount" + i) / 100;
202             boolean taxable = ParamUtil.getBoolean(
203                 uploadRequest, "taxable" + i);
204             double shipping = ParamUtil.getDouble(
205                 uploadRequest, "shipping" + i);
206             boolean useShippingFormula = ParamUtil.getBoolean(
207                 uploadRequest, "useShippingFormula" + i);
208             boolean active = ParamUtil.getBoolean(uploadRequest, "active" + i);
209             int defaultPrice = ParamUtil.getInteger(
210                 uploadRequest, "defaultPrice");
211 
212             int status = ShoppingItemPriceImpl.STATUS_ACTIVE_DEFAULT;
213 
214             if ((defaultPrice != i) && active) {
215                 status = ShoppingItemPriceImpl.STATUS_ACTIVE;
216             }
217             else if ((defaultPrice != i) && !active) {
218                 status = ShoppingItemPriceImpl.STATUS_INACTIVE;
219             }
220 
221             ShoppingItemPrice itemPrice = ShoppingItemPriceUtil.create(0);
222 
223             itemPrice.setMinQuantity(minQuantity);
224             itemPrice.setMaxQuantity(maxQuantity);
225             itemPrice.setPrice(price);
226             itemPrice.setDiscount(discount);
227             itemPrice.setTaxable(taxable);
228             itemPrice.setShipping(shipping);
229             itemPrice.setUseShippingFormula(useShippingFormula);
230             itemPrice.setStatus(status);
231 
232             itemPrices.add(itemPrice);
233         }
234 
235         boolean requiresShipping = ParamUtil.getBoolean(
236             uploadRequest, "requiresShipping");
237         int stockQuantity = ParamUtil.getInteger(
238             uploadRequest, "stockQuantity");
239 
240         boolean featured = ParamUtil.getBoolean(uploadRequest, "featured");
241         Boolean sale = null;
242 
243         boolean smallImage = ParamUtil.getBoolean(uploadRequest, "smallImage");
244         String smallImageURL = ParamUtil.getString(
245             uploadRequest, "smallImageURL");
246         File smallFile = uploadRequest.getFile("smallFile");
247 
248         boolean mediumImage = ParamUtil.getBoolean(
249             uploadRequest, "mediumImage");
250         String mediumImageURL = ParamUtil.getString(
251             uploadRequest, "mediumImageURL");
252         File mediumFile = uploadRequest.getFile("mediumFile");
253 
254         boolean largeImage = ParamUtil.getBoolean(uploadRequest, "largeImage");
255         String largeImageURL = ParamUtil.getString(
256             uploadRequest, "largeImageURL");
257         File largeFile = uploadRequest.getFile("largeFile");
258 
259         ServiceContext serviceContext = ServiceContextFactory.getInstance(
260             ShoppingItem.class.getName(), actionRequest);
261 
262         if (itemId <= 0) {
263 
264             // Add item
265 
266             ShoppingItemServiceUtil.addItem(
267                 categoryId, sku, name, description, properties,
268                 fieldsQuantities, requiresShipping, stockQuantity, featured,
269                 sale, smallImage, smallImageURL, smallFile, mediumImage,
270                 mediumImageURL, mediumFile, largeImage, largeImageURL,
271                 largeFile, itemFields, itemPrices, serviceContext);
272         }
273         else {
274 
275             // Update item
276 
277             ShoppingItemServiceUtil.updateItem(
278                 itemId, categoryId, sku, name, description, properties,
279                 fieldsQuantities, requiresShipping, stockQuantity, featured,
280                 sale, smallImage, smallImageURL, smallFile, mediumImage,
281                 mediumImageURL, mediumFile, largeImage, largeImageURL,
282                 largeFile, itemFields, itemPrices, serviceContext);
283         }
284     }
285 
286 }