1   /**
2    * Copyright (c) 2000-2010 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   *
12   * 
13   */
14  
15  package com.liferay.portlet.journal.action;
16  
17  import com.liferay.portal.kernel.servlet.SessionErrors;
18  import com.liferay.portal.kernel.util.Constants;
19  import com.liferay.portal.kernel.util.ParamUtil;
20  import com.liferay.portal.kernel.util.StringUtil;
21  import com.liferay.portal.kernel.util.Validator;
22  import com.liferay.portal.model.Layout;
23  import com.liferay.portal.security.auth.PrincipalException;
24  import com.liferay.portal.struts.PortletAction;
25  import com.liferay.portal.theme.ThemeDisplay;
26  import com.liferay.portal.util.PortalUtil;
27  import com.liferay.portal.util.WebKeys;
28  import com.liferay.portlet.ActionRequestImpl;
29  import com.liferay.portlet.PortletURLImpl;
30  import com.liferay.portlet.journal.DuplicateStructureIdException;
31  import com.liferay.portlet.journal.NoSuchStructureException;
32  import com.liferay.portlet.journal.RequiredStructureException;
33  import com.liferay.portlet.journal.StructureDescriptionException;
34  import com.liferay.portlet.journal.StructureIdException;
35  import com.liferay.portlet.journal.StructureNameException;
36  import com.liferay.portlet.journal.StructureXsdException;
37  import com.liferay.portlet.journal.model.JournalStructure;
38  import com.liferay.portlet.journal.service.JournalStructureServiceUtil;
39  import com.liferay.portlet.journal.util.JournalUtil;
40  
41  import javax.portlet.ActionRequest;
42  import javax.portlet.ActionResponse;
43  import javax.portlet.PortletConfig;
44  import javax.portlet.PortletRequest;
45  import javax.portlet.RenderRequest;
46  import javax.portlet.RenderResponse;
47  import javax.portlet.WindowState;
48  
49  import org.apache.struts.action.ActionForm;
50  import org.apache.struts.action.ActionForward;
51  import org.apache.struts.action.ActionMapping;
52  
53  /**
54   * <a href="EditStructureAction.java.html"><b><i>View Source</i></b></a>
55   *
56   * @author Brian Wing Shun Chan
57   */
58  public class EditStructureAction extends PortletAction {
59  
60      public void processAction(
61              ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
62              ActionRequest actionRequest, ActionResponse actionResponse)
63          throws Exception {
64  
65          String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
66  
67          JournalStructure structure = null;
68  
69          try {
70              if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
71                  structure = updateStructure(actionRequest);
72              }
73              else if (cmd.equals(Constants.DELETE)) {
74                  deleteStructures(actionRequest);
75              }
76  
77              if (Validator.isNotNull(cmd)) {
78                  String redirect = ParamUtil.getString(
79                      actionRequest, "redirect");
80  
81                  if (structure != null) {
82                      boolean saveAndContinue = ParamUtil.getBoolean(
83                          actionRequest, "saveAndContinue");
84  
85                      if (saveAndContinue) {
86                          redirect = getSaveAndContinueRedirect(
87                              portletConfig, actionRequest, structure, redirect);
88                      }
89                  }
90  
91                  sendRedirect(actionRequest, actionResponse, redirect);
92              }
93          }
94          catch (Exception e) {
95              if (e instanceof NoSuchStructureException ||
96                  e instanceof PrincipalException) {
97  
98                  SessionErrors.add(actionRequest, e.getClass().getName());
99  
100                 setForward(actionRequest, "portlet.journal.error");
101             }
102             else if (e instanceof DuplicateStructureIdException ||
103                      e instanceof RequiredStructureException ||
104                      e instanceof StructureDescriptionException ||
105                      e instanceof StructureIdException ||
106                      e instanceof StructureNameException ||
107                      e instanceof StructureXsdException) {
108 
109                 SessionErrors.add(actionRequest, e.getClass().getName());
110 
111                 if (e instanceof RequiredStructureException) {
112                     actionResponse.sendRedirect(
113                         ParamUtil.getString(actionRequest, "redirect"));
114                 }
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             String cmd = ParamUtil.getString(renderRequest, Constants.CMD);
129 
130             if (!cmd.equals(Constants.ADD)) {
131                 ActionUtil.getStructure(renderRequest);
132             }
133         }
134         catch (NoSuchStructureException nsse) {
135 
136             // Let this slide because the user can manually input a structure id
137             // for a new structure that does not yet exist.
138 
139         }
140         catch (Exception e) {
141             if (//e instanceof NoSuchStructureException ||
142                 e instanceof PrincipalException) {
143 
144                 SessionErrors.add(renderRequest, e.getClass().getName());
145 
146                 return mapping.findForward("portlet.journal.error");
147             }
148             else {
149                 throw e;
150             }
151         }
152 
153         return mapping.findForward(
154             getForward(renderRequest, "portlet.journal.edit_structure"));
155     }
156 
157     protected void deleteStructures(ActionRequest actionRequest)
158         throws Exception {
159 
160         long groupId = ParamUtil.getLong(actionRequest, "groupId");
161 
162         String[] deleteStructureIds = StringUtil.split(
163             ParamUtil.getString(actionRequest, "deleteStructureIds"));
164 
165         for (int i = 0; i < deleteStructureIds.length; i++) {
166             JournalStructureServiceUtil.deleteStructure(
167                 groupId, deleteStructureIds[i]);
168 
169             JournalUtil.removeRecentStructure(
170                 actionRequest, deleteStructureIds[i]);
171         }
172     }
173 
174     protected String getSaveAndContinueRedirect(
175             PortletConfig portletConfig, ActionRequest actionRequest,
176             JournalStructure structure, String redirect)
177         throws Exception {
178 
179         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
180             WebKeys.THEME_DISPLAY);
181 
182         String originalRedirect = ParamUtil.getString(
183             actionRequest, "originalRedirect");
184 
185         PortletURLImpl portletURL = new PortletURLImpl(
186             (ActionRequestImpl)actionRequest, portletConfig.getPortletName(),
187             themeDisplay.getPlid(), PortletRequest.RENDER_PHASE);
188 
189         portletURL.setWindowState(WindowState.MAXIMIZED);
190 
191         portletURL.setParameter("struts_action", "/journal/edit_structure");
192         portletURL.setParameter(Constants.CMD, Constants.UPDATE, false);
193         portletURL.setParameter("redirect", redirect, false);
194         portletURL.setParameter("originalRedirect", originalRedirect, false);
195         portletURL.setParameter(
196             "groupId", String.valueOf(structure.getGroupId()), false);
197         portletURL.setParameter(
198             "structureId", structure.getStructureId(), false);
199 
200         return portletURL.toString();
201     }
202 
203     protected JournalStructure updateStructure(ActionRequest actionRequest)
204         throws Exception {
205 
206         String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
207 
208         Layout layout = (Layout)actionRequest.getAttribute(WebKeys.LAYOUT);
209 
210         long groupId = ParamUtil.getLong(actionRequest, "groupId");
211 
212         String structureId = ParamUtil.getString(actionRequest, "structureId");
213         boolean autoStructureId = ParamUtil.getBoolean(
214             actionRequest, "autoStructureId");
215 
216         String name = ParamUtil.getString(actionRequest, "name");
217         String description = ParamUtil.getString(actionRequest, "description");
218         String xsd = ParamUtil.getString(actionRequest, "xsd");
219 
220         String[] communityPermissions = PortalUtil.getCommunityPermissions(
221             actionRequest);
222         String[] guestPermissions = PortalUtil.getGuestPermissions(
223             actionRequest);
224 
225         JournalStructure structure = null;
226 
227         if (cmd.equals(Constants.ADD)) {
228 
229             // Add structure
230 
231             structure = JournalStructureServiceUtil.addStructure(
232                 structureId, autoStructureId, layout.getPlid(), name,
233                 description, xsd, communityPermissions, guestPermissions);
234         }
235         else {
236 
237             // Update structure
238 
239             structure = JournalStructureServiceUtil.updateStructure(
240                 groupId, structureId, name, description, xsd);
241         }
242 
243         // Recent structures
244 
245         JournalUtil.addRecentStructure(actionRequest, structure);
246 
247         return structure;
248     }
249 
250 }