001    /**
002     * Copyright (c) 2000-2011 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
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    /**
071     * @author Brian Wing Shun Chan
072     * @author Zsolt Berentey
073     */
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                            // Add group
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                            // Update group
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                    // Settings
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                    // Layout set prototypes
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                    // Staging
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    }