1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    *
5    *
6    *
7    * The contents of this file are subject to the terms of the Liferay Enterprise
8    * Subscription License ("License"). You may not use this file except in
9    * compliance with the License. You can obtain a copy of the License by
10   * contacting Liferay, Inc. See the License for the specific language governing
11   * permissions and limitations under the License, including but not limited to
12   * distribution rights 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  public class EditItemAction extends PortletAction {
75  
76      public void processAction(
77              ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
78              ActionRequest actionRequest, ActionResponse actionResponse)
79          throws Exception {
80  
81          String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
82  
83          try {
84              if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
85                  updateItem(actionRequest);
86              }
87              else if (cmd.equals(Constants.DELETE)) {
88                  deleteItem(actionRequest);
89              }
90  
91              if (Validator.isNotNull(cmd)) {
92                  sendRedirect(actionRequest, actionResponse);
93              }
94          }
95          catch (Exception e) {
96              if (e instanceof NoSuchCategoryException ||
97                  e instanceof NoSuchItemException ||
98                  e instanceof PrincipalException) {
99  
100                 SessionErrors.add(actionRequest, e.getClass().getName());
101 
102                 setForward(actionRequest, "portlet.shopping.error");
103             }
104             else if (e instanceof DuplicateItemSKUException ||
105                      e instanceof ItemLargeImageNameException ||
106                      e instanceof ItemLargeImageSizeException ||
107                      e instanceof ItemMediumImageNameException ||
108                      e instanceof ItemMediumImageSizeException ||
109                      e instanceof ItemNameException ||
110                      e instanceof ItemSKUException ||
111                      e instanceof ItemSmallImageNameException ||
112                      e instanceof ItemSmallImageSizeException) {
113 
114                 SessionErrors.add(actionRequest, e.getClass().getName());
115             }
116             else {
117                 throw e;
118             }
119         }
120     }
121 
122     public ActionForward render(
123             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
124             RenderRequest renderRequest, RenderResponse renderResponse)
125         throws Exception {
126 
127         try {
128             ActionUtil.getItem(renderRequest);
129         }
130         catch (Exception e) {
131             if (e instanceof NoSuchItemException ||
132                 e instanceof PrincipalException) {
133 
134                 SessionErrors.add(renderRequest, e.getClass().getName());
135 
136                 return mapping.findForward("portlet.shopping.error");
137             }
138             else {
139                 throw e;
140             }
141         }
142 
143         return mapping.findForward(
144             getForward(renderRequest, "portlet.shopping.edit_item"));
145     }
146 
147     protected void deleteItem(ActionRequest actionRequest) throws Exception {
148         long itemId = ParamUtil.getLong(actionRequest, "itemId");
149 
150         ShoppingItemServiceUtil.deleteItem(itemId);
151     }
152 
153     protected void updateItem(ActionRequest actionRequest) throws Exception {
154         UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(
155             actionRequest);
156 
157         long itemId = ParamUtil.getLong(uploadRequest, "itemId");
158 
159         long categoryId = ParamUtil.getLong(uploadRequest, "categoryId");
160         String sku = ParamUtil.getString(uploadRequest, "sku");
161         String name = ParamUtil.getString(uploadRequest, "name");
162         String description = ParamUtil.getString(uploadRequest, "description");
163         String properties = ParamUtil.getString(uploadRequest, "properties");
164 
165         int fieldsCount = ParamUtil.getInteger(uploadRequest, "fieldsCount", 1);
166 
167         List<ShoppingItemField> itemFields = new ArrayList<ShoppingItemField>();
168 
169         for (int i = 0; i < fieldsCount; i ++) {
170             String fieldName = ParamUtil.getString(
171                 uploadRequest, "fieldName" + i);
172             String fieldValues = ParamUtil.getString(
173                 uploadRequest, "fieldValues" + i);
174             String fieldDescription = ParamUtil.getString(
175                 uploadRequest, "fieldDescription" + i);
176 
177             ShoppingItemField itemField = ShoppingItemFieldUtil.create(0);
178 
179             itemField.setName(fieldName);
180             itemField.setValues(fieldValues);
181             itemField.setDescription(fieldDescription);
182 
183             itemFields.add(itemField);
184         }
185 
186         String fieldsQuantities = ParamUtil.getString(
187             uploadRequest, "fieldsQuantities");
188 
189         int pricesCount = ParamUtil.getInteger(uploadRequest, "pricesCount", 1);
190 
191         List<ShoppingItemPrice> itemPrices = new ArrayList<ShoppingItemPrice>();
192 
193         for (int i = 0; i < pricesCount; i ++) {
194             int minQuantity = ParamUtil.getInteger(
195                 uploadRequest, "minQuantity" + i);
196             int maxQuantity = ParamUtil.getInteger(
197                 uploadRequest, "maxQuantity" + i);
198             double price = ParamUtil.getDouble(uploadRequest, "price" + i);
199             double discount = ParamUtil.getDouble(
200                 uploadRequest, "discount" + i) / 100;
201             boolean taxable = ParamUtil.getBoolean(
202                 uploadRequest, "taxable" + i);
203             double shipping = ParamUtil.getDouble(
204                 uploadRequest, "shipping" + i);
205             boolean useShippingFormula = ParamUtil.getBoolean(
206                 uploadRequest, "useShippingFormula" + i);
207             boolean active = ParamUtil.getBoolean(uploadRequest, "active" + i);
208             int defaultPrice = ParamUtil.getInteger(
209                 uploadRequest, "defaultPrice");
210 
211             int status = ShoppingItemPriceImpl.STATUS_ACTIVE_DEFAULT;
212 
213             if ((defaultPrice != i) && active) {
214                 status = ShoppingItemPriceImpl.STATUS_ACTIVE;
215             }
216             else if ((defaultPrice != i) && !active) {
217                 status = ShoppingItemPriceImpl.STATUS_INACTIVE;
218             }
219 
220             ShoppingItemPrice itemPrice = ShoppingItemPriceUtil.create(0);
221 
222             itemPrice.setMinQuantity(minQuantity);
223             itemPrice.setMaxQuantity(maxQuantity);
224             itemPrice.setPrice(price);
225             itemPrice.setDiscount(discount);
226             itemPrice.setTaxable(taxable);
227             itemPrice.setShipping(shipping);
228             itemPrice.setUseShippingFormula(useShippingFormula);
229             itemPrice.setStatus(status);
230 
231             itemPrices.add(itemPrice);
232         }
233 
234         boolean requiresShipping = ParamUtil.getBoolean(
235             uploadRequest, "requiresShipping");
236         int stockQuantity = ParamUtil.getInteger(
237             uploadRequest, "stockQuantity");
238 
239         boolean featured = ParamUtil.getBoolean(uploadRequest, "featured");
240         Boolean sale = null;
241 
242         boolean smallImage = ParamUtil.getBoolean(uploadRequest, "smallImage");
243         String smallImageURL = ParamUtil.getString(
244             uploadRequest, "smallImageURL");
245         File smallFile = uploadRequest.getFile("smallFile");
246 
247         boolean mediumImage = ParamUtil.getBoolean(
248             uploadRequest, "mediumImage");
249         String mediumImageURL = ParamUtil.getString(
250             uploadRequest, "mediumImageURL");
251         File mediumFile = uploadRequest.getFile("mediumFile");
252 
253         boolean largeImage = ParamUtil.getBoolean(uploadRequest, "largeImage");
254         String largeImageURL = ParamUtil.getString(
255             uploadRequest, "largeImageURL");
256         File largeFile = uploadRequest.getFile("largeFile");
257 
258         ServiceContext serviceContext = ServiceContextFactory.getInstance(
259             ShoppingItem.class.getName(), actionRequest);
260 
261         if (itemId <= 0) {
262 
263             // Add item
264 
265             ShoppingItemServiceUtil.addItem(
266                 categoryId, sku, name, description, properties,
267                 fieldsQuantities, requiresShipping, stockQuantity, featured,
268                 sale, smallImage, smallImageURL, smallFile, mediumImage,
269                 mediumImageURL, mediumFile, largeImage, largeImageURL,
270                 largeFile, itemFields, itemPrices, serviceContext);
271         }
272         else {
273 
274             // Update item
275 
276             ShoppingItemServiceUtil.updateItem(
277                 itemId, categoryId, sku, name, description, properties,
278                 fieldsQuantities, requiresShipping, stockQuantity, featured,
279                 sale, smallImage, smallImageURL, smallFile, mediumImage,
280                 mediumImageURL, mediumFile, largeImage, largeImageURL,
281                 largeFile, itemFields, itemPrices, serviceContext);
282         }
283     }
284 
285 }