1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
12   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
14   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
15   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
16   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
17   * SOFTWARE.
18   */
19  
20  package com.liferay.portlet.shopping.action;
21  
22  import com.liferay.portal.kernel.servlet.SessionErrors;
23  import com.liferay.portal.kernel.upload.UploadPortletRequest;
24  import com.liferay.portal.kernel.util.Constants;
25  import com.liferay.portal.kernel.util.ParamUtil;
26  import com.liferay.portal.kernel.util.Validator;
27  import com.liferay.portal.security.auth.PrincipalException;
28  import com.liferay.portal.struts.PortletAction;
29  import com.liferay.portal.util.PortalUtil;
30  import com.liferay.portlet.shopping.DuplicateItemSKUException;
31  import com.liferay.portlet.shopping.ItemLargeImageNameException;
32  import com.liferay.portlet.shopping.ItemLargeImageSizeException;
33  import com.liferay.portlet.shopping.ItemMediumImageNameException;
34  import com.liferay.portlet.shopping.ItemMediumImageSizeException;
35  import com.liferay.portlet.shopping.ItemNameException;
36  import com.liferay.portlet.shopping.ItemSKUException;
37  import com.liferay.portlet.shopping.ItemSmallImageNameException;
38  import com.liferay.portlet.shopping.ItemSmallImageSizeException;
39  import com.liferay.portlet.shopping.NoSuchCategoryException;
40  import com.liferay.portlet.shopping.NoSuchItemException;
41  import com.liferay.portlet.shopping.model.ShoppingItemField;
42  import com.liferay.portlet.shopping.model.ShoppingItemPrice;
43  import com.liferay.portlet.shopping.model.impl.ShoppingItemPriceImpl;
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   */
69  public class EditItemAction extends PortletAction {
70  
71      public void processAction(
72              ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
73              ActionRequest actionRequest, ActionResponse actionResponse)
74          throws Exception {
75  
76          String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
77  
78          try {
79              if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
80                  updateItem(actionRequest);
81              }
82              else if (cmd.equals(Constants.DELETE)) {
83                  deleteItem(actionRequest);
84              }
85  
86              if (Validator.isNotNull(cmd)) {
87                  sendRedirect(actionRequest, actionResponse);
88              }
89          }
90          catch (Exception e) {
91              if (e instanceof NoSuchCategoryException ||
92                  e instanceof NoSuchItemException ||
93                  e instanceof PrincipalException) {
94  
95                  SessionErrors.add(actionRequest, e.getClass().getName());
96  
97                  setForward(actionRequest, "portlet.shopping.error");
98              }
99              else if (e instanceof DuplicateItemSKUException ||
100                      e instanceof ItemLargeImageNameException ||
101                      e instanceof ItemLargeImageSizeException ||
102                      e instanceof ItemMediumImageNameException ||
103                      e instanceof ItemMediumImageSizeException ||
104                      e instanceof ItemNameException ||
105                      e instanceof ItemSKUException ||
106                      e instanceof ItemSmallImageNameException ||
107                      e instanceof ItemSmallImageSizeException) {
108 
109                 SessionErrors.add(actionRequest, e.getClass().getName());
110             }
111             else {
112                 throw e;
113             }
114         }
115     }
116 
117     public ActionForward render(
118             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
119             RenderRequest renderRequest, RenderResponse renderResponse)
120         throws Exception {
121 
122         try {
123             ActionUtil.getItem(renderRequest);
124         }
125         catch (Exception e) {
126             if (e instanceof NoSuchItemException ||
127                 e instanceof PrincipalException) {
128 
129                 SessionErrors.add(renderRequest, e.getClass().getName());
130 
131                 return mapping.findForward("portlet.shopping.error");
132             }
133             else {
134                 throw e;
135             }
136         }
137 
138         return mapping.findForward(
139             getForward(renderRequest, "portlet.shopping.edit_item"));
140     }
141 
142     protected void deleteItem(ActionRequest actionRequest) throws Exception {
143         long itemId = ParamUtil.getLong(actionRequest, "itemId");
144 
145         ShoppingItemServiceUtil.deleteItem(itemId);
146     }
147 
148     protected void updateItem(ActionRequest actionRequest) throws Exception {
149         UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(
150             actionRequest);
151 
152         long itemId = ParamUtil.getLong(uploadRequest, "itemId");
153 
154         long categoryId = ParamUtil.getLong(uploadRequest, "categoryId");
155         String sku = ParamUtil.getString(uploadRequest, "sku");
156         String name = ParamUtil.getString(uploadRequest, "name");
157         String description = ParamUtil.getString(uploadRequest, "description");
158         String properties = ParamUtil.getString(uploadRequest, "properties");
159 
160         int fieldsCount = ParamUtil.getInteger(uploadRequest, "fieldsCount", 1);
161 
162         List<ShoppingItemField> itemFields = new ArrayList<ShoppingItemField>();
163 
164         for (int i = 0; i < fieldsCount; i ++) {
165             String fieldName = ParamUtil.getString(
166                 uploadRequest, "fieldName" + i);
167             String fieldValues = ParamUtil.getString(
168                 uploadRequest, "fieldValues" + i);
169             String fieldDescription = ParamUtil.getString(
170                 uploadRequest, "fieldDescription" + i);
171 
172             ShoppingItemField itemField = ShoppingItemFieldUtil.create(0);
173 
174             itemField.setName(fieldName);
175             itemField.setValues(fieldValues);
176             itemField.setDescription(fieldDescription);
177 
178             itemFields.add(itemField);
179         }
180 
181         String fieldsQuantities = ParamUtil.getString(
182             uploadRequest, "fieldsQuantities");
183 
184         int pricesCount = ParamUtil.getInteger(uploadRequest, "pricesCount", 1);
185 
186         List<ShoppingItemPrice> itemPrices = new ArrayList<ShoppingItemPrice>();
187 
188         for (int i = 0; i < pricesCount; i ++) {
189             int minQuantity = ParamUtil.getInteger(
190                 uploadRequest, "minQuantity" + i);
191             int maxQuantity = ParamUtil.getInteger(
192                 uploadRequest, "maxQuantity" + i);
193             double price = ParamUtil.getDouble(uploadRequest, "price" + i);
194             double discount = ParamUtil.getDouble(
195                 uploadRequest, "discount" + i) / 100;
196             boolean taxable = ParamUtil.getBoolean(
197                 uploadRequest, "taxable" + i);
198             double shipping = ParamUtil.getDouble(
199                 uploadRequest, "shipping" + i);
200             boolean useShippingFormula = ParamUtil.getBoolean(
201                 uploadRequest, "useShippingFormula" + i);
202             boolean active = ParamUtil.getBoolean(uploadRequest, "active" + i);
203             int defaultPrice = ParamUtil.getInteger(
204                 uploadRequest, "defaultPrice");
205 
206             int status = ShoppingItemPriceImpl.STATUS_ACTIVE_DEFAULT;
207 
208             if ((defaultPrice != i) && active) {
209                 status = ShoppingItemPriceImpl.STATUS_ACTIVE;
210             }
211             else if ((defaultPrice != i) && !active) {
212                 status = ShoppingItemPriceImpl.STATUS_INACTIVE;
213             }
214 
215             ShoppingItemPrice itemPrice = ShoppingItemPriceUtil.create(0);
216 
217             itemPrice.setMinQuantity(minQuantity);
218             itemPrice.setMaxQuantity(maxQuantity);
219             itemPrice.setPrice(price);
220             itemPrice.setDiscount(discount);
221             itemPrice.setTaxable(taxable);
222             itemPrice.setShipping(shipping);
223             itemPrice.setUseShippingFormula(useShippingFormula);
224             itemPrice.setStatus(status);
225 
226             itemPrices.add(itemPrice);
227         }
228 
229         boolean requiresShipping = ParamUtil.getBoolean(
230             uploadRequest, "requiresShipping");
231         int stockQuantity = ParamUtil.getInteger(
232             uploadRequest, "stockQuantity");
233 
234         boolean featured = ParamUtil.getBoolean(uploadRequest, "featured");
235         Boolean sale = null;
236 
237         boolean smallImage = ParamUtil.getBoolean(uploadRequest, "smallImage");
238         String smallImageURL = ParamUtil.getString(
239             uploadRequest, "smallImageURL");
240         File smallFile = uploadRequest.getFile("smallFile");
241 
242         boolean mediumImage = ParamUtil.getBoolean(
243             uploadRequest, "mediumImage");
244         String mediumImageURL = ParamUtil.getString(
245             uploadRequest, "mediumImageURL");
246         File mediumFile = uploadRequest.getFile("mediumFile");
247 
248         boolean largeImage = ParamUtil.getBoolean(uploadRequest, "largeImage");
249         String largeImageURL = ParamUtil.getString(
250             uploadRequest, "largeImageURL");
251         File largeFile = uploadRequest.getFile("largeFile");
252 
253         String[] communityPermissions = actionRequest.getParameterValues(
254             "communityPermissions");
255         String[] guestPermissions = actionRequest.getParameterValues(
256             "guestPermissions");
257 
258         if (itemId <= 0) {
259 
260             // Add item
261 
262             ShoppingItemServiceUtil.addItem(
263                 categoryId, sku, name, description, properties,
264                 fieldsQuantities, requiresShipping, stockQuantity, featured,
265                 sale, smallImage, smallImageURL, smallFile, mediumImage,
266                 mediumImageURL, mediumFile, largeImage, largeImageURL,
267                 largeFile, itemFields, itemPrices, communityPermissions,
268                 guestPermissions);
269         }
270         else {
271 
272             // Update item
273 
274             ShoppingItemServiceUtil.updateItem(
275                 itemId, 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);
280         }
281     }
282 
283 }