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.struts.PortletAction;
32  import com.liferay.portal.util.PortalUtil;
33  import com.liferay.portlet.shopping.DuplicateItemSKUException;
34  import com.liferay.portlet.shopping.ItemLargeImageNameException;
35  import com.liferay.portlet.shopping.ItemLargeImageSizeException;
36  import com.liferay.portlet.shopping.ItemMediumImageNameException;
37  import com.liferay.portlet.shopping.ItemMediumImageSizeException;
38  import com.liferay.portlet.shopping.ItemNameException;
39  import com.liferay.portlet.shopping.ItemSKUException;
40  import com.liferay.portlet.shopping.ItemSmallImageNameException;
41  import com.liferay.portlet.shopping.ItemSmallImageSizeException;
42  import com.liferay.portlet.shopping.NoSuchCategoryException;
43  import com.liferay.portlet.shopping.NoSuchItemException;
44  import com.liferay.portlet.shopping.model.ShoppingItemField;
45  import com.liferay.portlet.shopping.model.ShoppingItemPrice;
46  import com.liferay.portlet.shopping.model.impl.ShoppingItemPriceImpl;
47  import com.liferay.portlet.shopping.service.ShoppingItemServiceUtil;
48  import com.liferay.portlet.shopping.service.persistence.ShoppingItemFieldUtil;
49  import com.liferay.portlet.shopping.service.persistence.ShoppingItemPriceUtil;
50  
51  import java.io.File;
52  
53  import java.util.ArrayList;
54  import java.util.List;
55  
56  import javax.portlet.ActionRequest;
57  import javax.portlet.ActionResponse;
58  import javax.portlet.PortletConfig;
59  import javax.portlet.RenderRequest;
60  import javax.portlet.RenderResponse;
61  
62  import org.apache.struts.action.ActionForm;
63  import org.apache.struts.action.ActionForward;
64  import org.apache.struts.action.ActionMapping;
65  
66  /**
67   * <a href="EditItemAction.java.html"><b><i>View Source</i></b></a>
68   *
69   * @author Brian Wing Shun Chan
70   */
71  public class EditItemAction extends PortletAction {
72  
73      public void processAction(
74              ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
75              ActionRequest actionRequest, ActionResponse actionResponse)
76          throws Exception {
77  
78          String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
79  
80          try {
81              if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
82                  updateItem(actionRequest);
83              }
84              else if (cmd.equals(Constants.DELETE)) {
85                  deleteItem(actionRequest);
86              }
87  
88              if (Validator.isNotNull(cmd)) {
89                  sendRedirect(actionRequest, actionResponse);
90              }
91          }
92          catch (Exception e) {
93              if (e instanceof NoSuchCategoryException ||
94                  e instanceof NoSuchItemException ||
95                  e instanceof PrincipalException) {
96  
97                  SessionErrors.add(actionRequest, e.getClass().getName());
98  
99                  setForward(actionRequest, "portlet.shopping.error");
100             }
101             else if (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().getName());
112             }
113             else {
114                 throw e;
115             }
116         }
117     }
118 
119     public ActionForward render(
120             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
121             RenderRequest renderRequest, RenderResponse renderResponse)
122         throws Exception {
123 
124         try {
125             ActionUtil.getItem(renderRequest);
126         }
127         catch (Exception e) {
128             if (e instanceof NoSuchItemException ||
129                 e instanceof PrincipalException) {
130 
131                 SessionErrors.add(renderRequest, e.getClass().getName());
132 
133                 return mapping.findForward("portlet.shopping.error");
134             }
135             else {
136                 throw e;
137             }
138         }
139 
140         return mapping.findForward(
141             getForward(renderRequest, "portlet.shopping.edit_item"));
142     }
143 
144     protected void deleteItem(ActionRequest actionRequest) throws Exception {
145         long itemId = ParamUtil.getLong(actionRequest, "itemId");
146 
147         ShoppingItemServiceUtil.deleteItem(itemId);
148     }
149 
150     protected void updateItem(ActionRequest actionRequest) throws Exception {
151         UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(
152             actionRequest);
153 
154         long itemId = ParamUtil.getLong(uploadRequest, "itemId");
155 
156         long categoryId = ParamUtil.getLong(uploadRequest, "categoryId");
157         String sku = ParamUtil.getString(uploadRequest, "sku");
158         String name = ParamUtil.getString(uploadRequest, "name");
159         String description = ParamUtil.getString(uploadRequest, "description");
160         String properties = ParamUtil.getString(uploadRequest, "properties");
161 
162         int fieldsCount = ParamUtil.getInteger(uploadRequest, "fieldsCount", 1);
163 
164         List<ShoppingItemField> itemFields = new ArrayList<ShoppingItemField>();
165 
166         for (int i = 0; i < fieldsCount; i ++) {
167             String fieldName = ParamUtil.getString(
168                 uploadRequest, "fieldName" + i);
169             String fieldValues = ParamUtil.getString(
170                 uploadRequest, "fieldValues" + i);
171             String fieldDescription = ParamUtil.getString(
172                 uploadRequest, "fieldDescription" + i);
173 
174             ShoppingItemField itemField = ShoppingItemFieldUtil.create(0);
175 
176             itemField.setName(fieldName);
177             itemField.setValues(fieldValues);
178             itemField.setDescription(fieldDescription);
179 
180             itemFields.add(itemField);
181         }
182 
183         String fieldsQuantities = ParamUtil.getString(
184             uploadRequest, "fieldsQuantities");
185 
186         int pricesCount = ParamUtil.getInteger(uploadRequest, "pricesCount", 1);
187 
188         List<ShoppingItemPrice> itemPrices = new ArrayList<ShoppingItemPrice>();
189 
190         for (int i = 0; i < pricesCount; i ++) {
191             int minQuantity = ParamUtil.getInteger(
192                 uploadRequest, "minQuantity" + i);
193             int maxQuantity = ParamUtil.getInteger(
194                 uploadRequest, "maxQuantity" + i);
195             double price = ParamUtil.getDouble(uploadRequest, "price" + i);
196             double discount = ParamUtil.getDouble(
197                 uploadRequest, "discount" + i) / 100;
198             boolean taxable = ParamUtil.getBoolean(
199                 uploadRequest, "taxable" + i);
200             double shipping = ParamUtil.getDouble(
201                 uploadRequest, "shipping" + i);
202             boolean useShippingFormula = ParamUtil.getBoolean(
203                 uploadRequest, "useShippingFormula" + i);
204             boolean active = ParamUtil.getBoolean(uploadRequest, "active" + i);
205             int defaultPrice = ParamUtil.getInteger(
206                 uploadRequest, "defaultPrice");
207 
208             int status = ShoppingItemPriceImpl.STATUS_ACTIVE_DEFAULT;
209 
210             if ((defaultPrice != i) && active) {
211                 status = ShoppingItemPriceImpl.STATUS_ACTIVE;
212             }
213             else if ((defaultPrice != i) && !active) {
214                 status = ShoppingItemPriceImpl.STATUS_INACTIVE;
215             }
216 
217             ShoppingItemPrice itemPrice = ShoppingItemPriceUtil.create(0);
218 
219             itemPrice.setMinQuantity(minQuantity);
220             itemPrice.setMaxQuantity(maxQuantity);
221             itemPrice.setPrice(price);
222             itemPrice.setDiscount(discount);
223             itemPrice.setTaxable(taxable);
224             itemPrice.setShipping(shipping);
225             itemPrice.setUseShippingFormula(useShippingFormula);
226             itemPrice.setStatus(status);
227 
228             itemPrices.add(itemPrice);
229         }
230 
231         boolean requiresShipping = ParamUtil.getBoolean(
232             uploadRequest, "requiresShipping");
233         int stockQuantity = ParamUtil.getInteger(
234             uploadRequest, "stockQuantity");
235 
236         boolean featured = ParamUtil.getBoolean(uploadRequest, "featured");
237         Boolean sale = null;
238 
239         boolean smallImage = ParamUtil.getBoolean(uploadRequest, "smallImage");
240         String smallImageURL = ParamUtil.getString(
241             uploadRequest, "smallImageURL");
242         File smallFile = uploadRequest.getFile("smallFile");
243 
244         boolean mediumImage = ParamUtil.getBoolean(
245             uploadRequest, "mediumImage");
246         String mediumImageURL = ParamUtil.getString(
247             uploadRequest, "mediumImageURL");
248         File mediumFile = uploadRequest.getFile("mediumFile");
249 
250         boolean largeImage = ParamUtil.getBoolean(uploadRequest, "largeImage");
251         String largeImageURL = ParamUtil.getString(
252             uploadRequest, "largeImageURL");
253         File largeFile = uploadRequest.getFile("largeFile");
254 
255         String[] communityPermissions = PortalUtil.getCommunityPermissions(
256             actionRequest);
257         String[] guestPermissions = PortalUtil.getGuestPermissions(
258             actionRequest);
259 
260         if (itemId <= 0) {
261 
262             // Add item
263 
264             ShoppingItemServiceUtil.addItem(
265                 categoryId, sku, name, description, properties,
266                 fieldsQuantities, requiresShipping, stockQuantity, featured,
267                 sale, smallImage, smallImageURL, smallFile, mediumImage,
268                 mediumImageURL, mediumFile, largeImage, largeImageURL,
269                 largeFile, itemFields, itemPrices, communityPermissions,
270                 guestPermissions);
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);
282         }
283     }
284 
285 }