001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.mobiledevicerules.action;
016    
017    import com.liferay.portal.kernel.bean.BeanParamUtil;
018    import com.liferay.portal.kernel.bean.BeanPropertiesUtil;
019    import com.liferay.portal.kernel.mobile.device.rulegroup.ActionHandlerManagerUtil;
020    import com.liferay.portal.kernel.mobile.device.rulegroup.action.ActionHandler;
021    import com.liferay.portal.kernel.servlet.SessionErrors;
022    import com.liferay.portal.kernel.util.Constants;
023    import com.liferay.portal.kernel.util.LocalizationUtil;
024    import com.liferay.portal.kernel.util.ParamUtil;
025    import com.liferay.portal.kernel.util.StringPool;
026    import com.liferay.portal.kernel.util.StringUtil;
027    import com.liferay.portal.kernel.util.UnicodeProperties;
028    import com.liferay.portal.mobile.device.rulegroup.action.impl.LayoutTemplateModificationActionHandler;
029    import com.liferay.portal.mobile.device.rulegroup.action.impl.SimpleRedirectActionHandler;
030    import com.liferay.portal.mobile.device.rulegroup.action.impl.SiteRedirectActionHandler;
031    import com.liferay.portal.mobile.device.rulegroup.action.impl.ThemeModificationActionHandler;
032    import com.liferay.portal.security.auth.PrincipalException;
033    import com.liferay.portal.service.ServiceContext;
034    import com.liferay.portal.service.ServiceContextFactory;
035    import com.liferay.portal.util.WebKeys;
036    import com.liferay.portlet.mobiledevicerules.ActionTypeException;
037    import com.liferay.portlet.mobiledevicerules.NoSuchActionException;
038    import com.liferay.portlet.mobiledevicerules.NoSuchRuleGroupException;
039    import com.liferay.portlet.mobiledevicerules.model.MDRAction;
040    import com.liferay.portlet.mobiledevicerules.model.MDRRuleGroup;
041    import com.liferay.portlet.mobiledevicerules.model.MDRRuleGroupInstance;
042    import com.liferay.portlet.mobiledevicerules.service.MDRActionServiceUtil;
043    import com.liferay.portlet.mobiledevicerules.service.MDRRuleGroupInstanceLocalServiceUtil;
044    
045    import java.util.HashMap;
046    import java.util.Locale;
047    import java.util.Map;
048    
049    import javax.portlet.ActionRequest;
050    import javax.portlet.ActionResponse;
051    import javax.portlet.PortletConfig;
052    import javax.portlet.RenderRequest;
053    import javax.portlet.RenderResponse;
054    import javax.portlet.ResourceRequest;
055    import javax.portlet.ResourceResponse;
056    
057    import org.apache.struts.action.ActionForm;
058    import org.apache.struts.action.ActionForward;
059    import org.apache.struts.action.ActionMapping;
060    
061    /**
062     * @author Edward Han
063     */
064    public class EditActionAction extends EditRuleAction {
065    
066            public EditActionAction() {
067                    registerEditorJSP(
068                            LayoutTemplateModificationActionHandler.class, "layout_tpl");
069                    registerEditorJSP(SimpleRedirectActionHandler.class, "simple_url");
070                    registerEditorJSP(SiteRedirectActionHandler.class, "site_url");
071                    registerEditorJSP(ThemeModificationActionHandler.class, "theme");
072            }
073    
074            @Override
075            public void processAction(
076                            ActionMapping actionMapping, ActionForm actionForm,
077                            PortletConfig portletConfig, ActionRequest actionRequest,
078                            ActionResponse actionResponse)
079                    throws Exception {
080    
081                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
082    
083                    try {
084                            if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
085                                    updateAction(actionRequest);
086                            }
087                            else if (cmd.equals(Constants.DELETE)) {
088                                    deleteActions(actionRequest);
089                            }
090    
091                            sendRedirect(actionRequest, actionResponse);
092                    }
093                    catch (Exception e) {
094                            if (e instanceof PrincipalException) {
095                                    SessionErrors.add(actionRequest, e.getClass());
096    
097                                    setForward(actionRequest, "portlet.mobile_device_rules.error");
098                            }
099                            else if (e instanceof ActionTypeException ||
100                                             e instanceof NoSuchActionException ||
101                                             e instanceof NoSuchRuleGroupException) {
102    
103                                    SessionErrors.add(actionRequest, e.getClass());
104                            }
105                            else {
106                                    throw e;
107                            }
108                    }
109            }
110    
111            @Override
112            public ActionForward render(
113                            ActionMapping actionMapping, ActionForm actionForm,
114                            PortletConfig portletConfig, RenderRequest renderRequest,
115                            RenderResponse renderResponse)
116                    throws Exception {
117    
118                    long actionId = ParamUtil.getLong(renderRequest, "actionId");
119    
120                    MDRAction action = MDRActionServiceUtil.fetchAction(actionId);
121    
122                    renderRequest.setAttribute(
123                            WebKeys.MOBILE_DEVICE_RULES_RULE_GROUP_ACTION, action);
124    
125                    String type = BeanPropertiesUtil.getString(action, "type");
126    
127                    renderRequest.setAttribute(
128                            WebKeys.MOBILE_DEVICE_RULES_RULE_GROUP_ACTION_TYPE, type);
129    
130                    String editorJSP = getEditorJSP(type);
131    
132                    renderRequest.setAttribute(
133                            WebKeys.MOBILE_DEVICE_RULES_RULE_GROUP_ACTION_EDITOR_JSP,
134                            editorJSP);
135    
136                    long ruleGroupInstanceId = BeanParamUtil.getLong(
137                            action, renderRequest, "ruleGroupInstanceId");
138    
139                    MDRRuleGroupInstance ruleGroupInstance =
140                            MDRRuleGroupInstanceLocalServiceUtil.getMDRRuleGroupInstance(
141                                    ruleGroupInstanceId);
142    
143                    renderRequest.setAttribute(
144                            WebKeys.MOBILE_DEVICE_RULES_RULE_GROUP_INSTANCE, ruleGroupInstance);
145    
146                    MDRRuleGroup ruleGroup = ruleGroupInstance.getRuleGroup();
147    
148                    renderRequest.setAttribute(
149                            WebKeys.MOBILE_DEVICE_RULES_RULE_GROUP, ruleGroup);
150    
151                    return actionMapping.findForward(
152                            "portlet.mobile_device_rules.edit_action");
153            }
154    
155            @Override
156            public void serveResource(
157                            ActionMapping actionMapping, ActionForm actionForm,
158                            PortletConfig portletConfig, ResourceRequest resourceRequest,
159                            ResourceResponse resourceResponse)
160                    throws Exception {
161    
162                    long actionId = ParamUtil.getLong(resourceRequest, "actionId");
163    
164                    MDRAction action = MDRActionServiceUtil.fetchAction(actionId);
165    
166                    resourceRequest.setAttribute(
167                            WebKeys.MOBILE_DEVICE_RULES_RULE_GROUP_ACTION, action);
168    
169                    String type = ParamUtil.getString(resourceRequest, "type");
170    
171                    includeEditorJSP(
172                            portletConfig, resourceRequest, resourceResponse, type);
173            }
174    
175            protected void deleteActions(ActionRequest actionRequest) throws Exception {
176                    long[] deleteActionIds = null;
177    
178                    long actionId = ParamUtil.getLong(actionRequest, "actionId");
179    
180                    if (actionId > 0) {
181                            deleteActionIds = new long[] {actionId};
182                    }
183                    else {
184                            deleteActionIds = StringUtil.split(
185                                    ParamUtil.getString(actionRequest, "actionIds"), 0L);
186                    }
187    
188                    for (long deleteActionId : deleteActionIds) {
189                            MDRActionServiceUtil.deleteAction(deleteActionId);
190                    }
191            }
192    
193            @Override
194            protected String getEditorJSP(String type) {
195                    ActionHandler actionHandler = ActionHandlerManagerUtil.getActionHandler(
196                            type);
197    
198                    String editorJSP = null;
199    
200                    if (actionHandler != null) {
201                            editorJSP = _editorJSPs.get(actionHandler.getClass());
202                    }
203    
204                    if (editorJSP == null) {
205                            editorJSP = StringPool.BLANK;
206                    }
207    
208                    return editorJSP;
209            }
210    
211            protected void registerEditorJSP(Class<?> clazz, String jspPrefix) {
212                    _editorJSPs.put(
213                            clazz,
214                            "/html/portlet/mobile_device_rules/action/" + jspPrefix + ".jsp");
215            }
216    
217            protected void updateAction(ActionRequest actionRequest) throws Exception {
218                    long actionId = ParamUtil.getLong(actionRequest, "actionId");
219    
220                    long ruleGroupInstanceId = ParamUtil.getLong(
221                            actionRequest, "ruleGroupInstanceId");
222                    Map<Locale, String> nameMap = LocalizationUtil.getLocalizationMap(
223                            actionRequest, "name");
224                    Map<Locale, String> descriptionMap =
225                            LocalizationUtil.getLocalizationMap(actionRequest, "description");
226                    String type = ParamUtil.getString(actionRequest, "type");
227    
228                    ActionHandler actionHandler = ActionHandlerManagerUtil.getActionHandler(
229                            type);
230    
231                    if (actionHandler == null) {
232                            throw new ActionTypeException();
233                    }
234    
235                    UnicodeProperties typeSettingsProperties = getTypeSettingsProperties(
236                            actionRequest, actionHandler.getPropertyNames());
237    
238                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
239                            actionRequest);
240    
241                    if (actionId <= 0) {
242                            MDRActionServiceUtil.addAction(
243                                    ruleGroupInstanceId, nameMap, descriptionMap, type,
244                                    typeSettingsProperties, serviceContext);
245                    }
246                    else {
247                            MDRActionServiceUtil.updateAction(
248                                    actionId, nameMap, descriptionMap, type, typeSettingsProperties,
249                                    serviceContext);
250                    }
251            }
252    
253            private Map<Class<?>, String> _editorJSPs = new HashMap<Class<?>, String>();
254    
255    }