001
014
015 package com.liferay.portlet.sites.action;
016
017 import com.liferay.portal.DuplicateGroupException;
018 import com.liferay.portal.GroupFriendlyURLException;
019 import com.liferay.portal.GroupNameException;
020 import com.liferay.portal.LayoutSetVirtualHostException;
021 import com.liferay.portal.NoSuchGroupException;
022 import com.liferay.portal.NoSuchLayoutException;
023 import com.liferay.portal.RequiredGroupException;
024 import com.liferay.portal.kernel.dao.orm.QueryUtil;
025 import com.liferay.portal.kernel.exception.PortalException;
026 import com.liferay.portal.kernel.exception.SystemException;
027 import com.liferay.portal.kernel.servlet.SessionErrors;
028 import com.liferay.portal.kernel.servlet.SessionMessages;
029 import com.liferay.portal.kernel.staging.StagingUtil;
030 import com.liferay.portal.kernel.util.Constants;
031 import com.liferay.portal.kernel.util.HttpUtil;
032 import com.liferay.portal.kernel.util.ParamUtil;
033 import com.liferay.portal.kernel.util.UnicodeProperties;
034 import com.liferay.portal.kernel.util.Validator;
035 import com.liferay.portal.liveusers.LiveUsers;
036 import com.liferay.portal.model.Group;
037 import com.liferay.portal.model.GroupConstants;
038 import com.liferay.portal.model.Layout;
039 import com.liferay.portal.model.MembershipRequest;
040 import com.liferay.portal.model.MembershipRequestConstants;
041 import com.liferay.portal.security.auth.PrincipalException;
042 import com.liferay.portal.service.GroupLocalServiceUtil;
043 import com.liferay.portal.service.GroupServiceUtil;
044 import com.liferay.portal.service.LayoutLocalServiceUtil;
045 import com.liferay.portal.service.LayoutSetServiceUtil;
046 import com.liferay.portal.service.MembershipRequestLocalServiceUtil;
047 import com.liferay.portal.service.MembershipRequestServiceUtil;
048 import com.liferay.portal.service.ServiceContext;
049 import com.liferay.portal.service.ServiceContextFactory;
050 import com.liferay.portal.struts.PortletAction;
051 import com.liferay.portal.theme.ThemeDisplay;
052 import com.liferay.portal.util.PortalUtil;
053 import com.liferay.portal.util.WebKeys;
054 import com.liferay.portlet.asset.AssetCategoryException;
055 import com.liferay.portlet.asset.AssetTagException;
056 import com.liferay.portlet.sites.util.SitesUtil;
057
058 import java.util.List;
059
060 import javax.portlet.ActionRequest;
061 import javax.portlet.ActionResponse;
062 import javax.portlet.PortletConfig;
063 import javax.portlet.RenderRequest;
064 import javax.portlet.RenderResponse;
065
066 import org.apache.struts.action.ActionForm;
067 import org.apache.struts.action.ActionForward;
068 import org.apache.struts.action.ActionMapping;
069
070
074 public class EditGroupAction extends PortletAction {
075
076 @Override
077 public void processAction(
078 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
079 ActionRequest actionRequest, ActionResponse actionResponse)
080 throws Exception {
081
082 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
083 WebKeys.THEME_DISPLAY);
084
085 String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
086
087 String redirect = ParamUtil.getString(actionRequest, "redirect");
088
089 try {
090 String closeRedirect = ParamUtil.getString(
091 actionRequest, "closeRedirect");
092
093 if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
094 Object[] returnValue = updateGroup(actionRequest);
095
096 Group group = (Group)returnValue[0];
097 String oldFriendlyURL = (String)returnValue[1];
098 String oldStagingFriendlyURL = (String)returnValue[2];
099
100 redirect = HttpUtil.setParameter(
101 redirect, "doAsGroupId", group.getGroupId());
102 closeRedirect = updateCloseRedirect(
103 closeRedirect, group, themeDisplay, oldFriendlyURL,
104 oldStagingFriendlyURL);
105 }
106 else if (cmd.equals(Constants.DEACTIVATE) ||
107 cmd.equals(Constants.RESTORE)) {
108
109 updateActive(actionRequest, cmd);
110 }
111 else if (cmd.equals(Constants.DELETE)) {
112 deleteGroup(actionRequest);
113 }
114
115 if (Validator.isNotNull(closeRedirect)) {
116 SessionMessages.add(
117 actionRequest,
118 portletConfig.getPortletName() + ".doCloseRedirect",
119 closeRedirect);
120 }
121
122 sendRedirect(actionRequest, actionResponse, redirect);
123 }
124 catch (Exception e) {
125 if (e instanceof NoSuchGroupException ||
126 e instanceof PrincipalException) {
127
128 SessionErrors.add(actionRequest, e.getClass().getName());
129
130 setForward(actionRequest, "portlet.sites_admin.error");
131 }
132 else if (e instanceof AssetCategoryException ||
133 e instanceof AssetTagException ||
134 e instanceof DuplicateGroupException ||
135 e instanceof GroupFriendlyURLException ||
136 e instanceof GroupNameException ||
137 e instanceof LayoutSetVirtualHostException ||
138 e instanceof RequiredGroupException) {
139
140 SessionErrors.add(actionRequest, e.getClass().getName(), e);
141
142 if (cmd.equals(Constants.DEACTIVATE) ||
143 cmd.equals(Constants.DELETE) ||
144 cmd.equals(Constants.RESTORE)) {
145
146 if (Validator.isNotNull(redirect)) {
147 actionResponse.sendRedirect(redirect);
148 }
149 }
150 }
151 else {
152 throw e;
153 }
154 }
155 }
156
157 @Override
158 public ActionForward render(
159 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
160 RenderRequest renderRequest, RenderResponse renderResponse)
161 throws Exception {
162
163 try {
164 ActionUtil.getGroup(renderRequest);
165 }
166 catch (Exception e) {
167 if (e instanceof NoSuchGroupException ||
168 e instanceof PrincipalException) {
169
170 SessionErrors.add(renderRequest, e.getClass().getName());
171
172 return mapping.findForward("portlet.sites_admin.error");
173 }
174 else {
175 throw e;
176 }
177 }
178
179 return mapping.findForward(
180 getForward(renderRequest, "portlet.sites_admin.edit_site"));
181 }
182
183 protected void deleteGroup(ActionRequest actionRequest) throws Exception {
184 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
185 WebKeys.THEME_DISPLAY);
186
187 long groupId = ParamUtil.getLong(actionRequest, "groupId");
188
189 if ((groupId == themeDisplay.getDoAsGroupId()) ||
190 (groupId == themeDisplay.getScopeGroupId()) ||
191 (groupId == getRefererGroupId(themeDisplay))) {
192
193 throw new RequiredGroupException(String.valueOf(groupId));
194 }
195
196 GroupServiceUtil.deleteGroup(groupId);
197
198 LiveUsers.deleteGroup(themeDisplay.getCompanyId(), groupId);
199 }
200
201 protected long getRefererGroupId(ThemeDisplay themeDisplay)
202 throws Exception {
203
204 long refererGroupId = 0;
205
206 try {
207 Layout refererLayout = LayoutLocalServiceUtil.getLayout(
208 themeDisplay.getRefererPlid());
209
210 refererGroupId = refererLayout.getGroupId();
211 }
212 catch (NoSuchLayoutException nsle) {
213 }
214
215 return refererGroupId;
216 }
217
218 protected void updateActive(ActionRequest actionRequest, String cmd)
219 throws Exception {
220
221 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
222 WebKeys.THEME_DISPLAY);
223
224 long groupId = ParamUtil.getLong(actionRequest, "groupId");
225
226 if ((groupId == themeDisplay.getDoAsGroupId()) ||
227 (groupId == themeDisplay.getScopeGroupId()) ||
228 (groupId == getRefererGroupId(themeDisplay))) {
229
230 throw new RequiredGroupException(String.valueOf(groupId));
231 }
232
233 Group group = GroupServiceUtil.getGroup(groupId);
234
235 boolean active = false;
236
237 if (cmd.equals(Constants.RESTORE)) {
238 active = true;
239 }
240
241 ServiceContext serviceContext = ServiceContextFactory.getInstance(
242 Group.class.getName(), actionRequest);
243
244 GroupServiceUtil.updateGroup(
245 groupId, group.getName(), group.getDescription(), group.getType(),
246 group.getFriendlyURL(), active, serviceContext);
247 }
248
249 protected String updateCloseRedirect(
250 String closeRedirect, Group group, ThemeDisplay themeDisplay,
251 String oldFriendlyURL, String oldStagingFriendlyURL)
252 throws SystemException, PortalException {
253
254 if (Validator.isNull(closeRedirect) || (group == null)) {
255 return closeRedirect;
256 }
257
258 String oldPath = null;
259 String newPath = null;
260
261 if (Validator.isNotNull(oldFriendlyURL)) {
262 oldPath = oldFriendlyURL;
263 newPath = group.getFriendlyURL();
264
265 if (closeRedirect.indexOf(oldPath) != -1) {
266 closeRedirect = PortalUtil.updateRedirect(
267 closeRedirect, oldPath, newPath);
268 }
269 else {
270 closeRedirect = PortalUtil.getGroupFriendlyURL(
271 group, false, themeDisplay);
272 }
273 }
274
275 if (Validator.isNotNull(oldStagingFriendlyURL)) {
276 Group stagingGroup = group.getStagingGroup();
277
278 if (GroupLocalServiceUtil.fetchGroup(
279 stagingGroup.getGroupId()) == null) {
280
281 oldPath = oldStagingFriendlyURL;
282 newPath = group.getFriendlyURL();
283 }
284 else {
285 oldPath = oldStagingFriendlyURL;
286 newPath = stagingGroup.getFriendlyURL();
287 }
288
289 if (closeRedirect.contains(oldPath)) {
290 closeRedirect = PortalUtil.updateRedirect(
291 closeRedirect, oldPath, newPath);
292 }
293 else {
294 closeRedirect = PortalUtil.getGroupFriendlyURL(
295 group, false, themeDisplay);
296 }
297 }
298
299 return closeRedirect;
300 }
301
302 protected Object[] updateGroup(ActionRequest actionRequest)
303 throws Exception {
304
305 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
306 WebKeys.THEME_DISPLAY);
307
308 long userId = PortalUtil.getUserId(actionRequest);
309
310 long liveGroupId = ParamUtil.getLong(actionRequest, "liveGroupId");
311
312 String name = ParamUtil.getString(actionRequest, "name");
313 String description = ParamUtil.getString(actionRequest, "description");
314 int type = ParamUtil.getInteger(actionRequest, "type");
315 String friendlyURL = ParamUtil.getString(actionRequest, "friendlyURL");
316 boolean active = ParamUtil.getBoolean(actionRequest, "active");
317
318 ServiceContext serviceContext = ServiceContextFactory.getInstance(
319 Group.class.getName(), actionRequest);
320
321 Group liveGroup = null;
322 String oldFriendlyURL = null;
323 String oldStagingFriendlyURL = null;
324
325 if (liveGroupId <= 0) {
326
327
328
329 liveGroup = GroupServiceUtil.addGroup(
330 name, description, type, friendlyURL, true, active,
331 serviceContext);
332
333 LiveUsers.joinGroup(
334 themeDisplay.getCompanyId(), liveGroup.getGroupId(), userId);
335 }
336 else {
337
338
339
340 liveGroup = GroupLocalServiceUtil.getGroup(liveGroupId);
341
342 oldFriendlyURL = liveGroup.getFriendlyURL();
343
344 liveGroup = GroupServiceUtil.updateGroup(
345 liveGroupId, name, description, type, friendlyURL, active,
346 serviceContext);
347
348 if (type == GroupConstants.TYPE_SITE_OPEN) {
349 List<MembershipRequest> membershipRequests =
350 MembershipRequestLocalServiceUtil.search(
351 liveGroupId, MembershipRequestConstants.STATUS_PENDING,
352 QueryUtil.ALL_POS, QueryUtil.ALL_POS);
353
354 for (MembershipRequest membershipRequest : membershipRequests) {
355 MembershipRequestServiceUtil.updateStatus(
356 membershipRequest.getMembershipRequestId(),
357 themeDisplay.translate(
358 "your-membership-has-been-approved"),
359 MembershipRequestConstants.STATUS_APPROVED);
360
361 LiveUsers.joinGroup(
362 themeDisplay.getCompanyId(),
363 membershipRequest.getGroupId(),
364 new long[] {membershipRequest.getUserId()});
365 }
366 }
367 }
368
369
370
371 UnicodeProperties typeSettingsProperties =
372 liveGroup.getTypeSettingsProperties();
373
374 String customJspServletContextName = ParamUtil.getString(
375 actionRequest, "customJspServletContextName");
376
377 typeSettingsProperties.setProperty(
378 "customJspServletContextName", customJspServletContextName);
379
380 String googleAnalyticsId = ParamUtil.getString(
381 actionRequest, "googleAnalyticsId");
382
383 typeSettingsProperties.setProperty(
384 "googleAnalyticsId", googleAnalyticsId);
385
386 String publicRobots = ParamUtil.getString(
387 actionRequest, "publicRobots");
388 String privateRobots = ParamUtil.getString(
389 actionRequest, "privateRobots");
390
391 typeSettingsProperties.setProperty("false-robots.txt", publicRobots);
392 typeSettingsProperties.setProperty("true-robots.txt", privateRobots);
393
394 String publicVirtualHost = ParamUtil.getString(
395 actionRequest, "publicVirtualHost");
396 String privateVirtualHost = ParamUtil.getString(
397 actionRequest, "privateVirtualHost");
398
399 LayoutSetServiceUtil.updateVirtualHost(
400 liveGroup.getGroupId(), false, publicVirtualHost);
401
402 LayoutSetServiceUtil.updateVirtualHost(
403 liveGroup.getGroupId(), true, privateVirtualHost);
404
405 if (liveGroup.hasStagingGroup()) {
406 Group stagingGroup = liveGroup.getStagingGroup();
407
408 oldStagingFriendlyURL = stagingGroup.getFriendlyURL();
409
410 publicVirtualHost = ParamUtil.getString(
411 actionRequest, "stagingPublicVirtualHost");
412 privateVirtualHost = ParamUtil.getString(
413 actionRequest, "stagingPrivateVirtualHost");
414 friendlyURL = ParamUtil.getString(
415 actionRequest, "stagingFriendlyURL");
416
417 LayoutSetServiceUtil.updateVirtualHost(
418 stagingGroup.getGroupId(), false, publicVirtualHost);
419
420 LayoutSetServiceUtil.updateVirtualHost(
421 stagingGroup.getGroupId(), true, privateVirtualHost);
422
423 GroupServiceUtil.updateFriendlyURL(
424 stagingGroup.getGroupId(), friendlyURL);
425 }
426
427 liveGroup = GroupServiceUtil.updateGroup(
428 liveGroup.getGroupId(), typeSettingsProperties.toString());
429
430
431
432 long publicLayoutSetPrototypeId = ParamUtil.getLong(
433 actionRequest, "publicLayoutSetPrototypeId");
434 long privateLayoutSetPrototypeId = ParamUtil.getLong(
435 actionRequest, "privateLayoutSetPrototypeId");
436
437 if ((publicLayoutSetPrototypeId == 0) &&
438 (privateLayoutSetPrototypeId == 0)) {
439
440 long layoutSetPrototypeId = ParamUtil.getLong(
441 actionRequest, "layoutSetPrototypeId");
442 int layoutSetVisibility = ParamUtil.getInteger(
443 actionRequest, "layoutSetVisibility");
444
445 if (layoutSetVisibility == _LAYOUT_SET_VISIBILITY_PRIVATE) {
446 privateLayoutSetPrototypeId = layoutSetPrototypeId;
447 }
448 else {
449 publicLayoutSetPrototypeId = layoutSetPrototypeId;
450 }
451 }
452
453 if ((publicLayoutSetPrototypeId > 0) ||
454 (privateLayoutSetPrototypeId > 0)) {
455
456 SitesUtil.applyLayoutSetPrototypes(
457 liveGroup, publicLayoutSetPrototypeId,
458 privateLayoutSetPrototypeId, serviceContext);
459 }
460
461
462
463 StagingUtil.updateStaging(actionRequest, liveGroup);
464
465 return new Object[] {liveGroup, oldFriendlyURL, oldStagingFriendlyURL};
466 }
467
468 private static final int _LAYOUT_SET_VISIBILITY_PRIVATE = 1;
469
470 }