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.wiki.social;
016    
017    import com.liferay.portal.NoSuchModelException;
018    import com.liferay.portal.kernel.repository.model.FileEntry;
019    import com.liferay.portal.kernel.util.GetterUtil;
020    import com.liferay.portal.kernel.util.HttpUtil;
021    import com.liferay.portal.kernel.util.StringBundler;
022    import com.liferay.portal.kernel.util.StringPool;
023    import com.liferay.portal.kernel.util.Validator;
024    import com.liferay.portal.portletfilerepository.PortletFileRepositoryUtil;
025    import com.liferay.portal.security.permission.ActionKeys;
026    import com.liferay.portal.security.permission.PermissionChecker;
027    import com.liferay.portal.service.ServiceContext;
028    import com.liferay.portlet.social.model.BaseSocialActivityInterpreter;
029    import com.liferay.portlet.social.model.SocialActivity;
030    import com.liferay.portlet.social.model.SocialActivityConstants;
031    import com.liferay.portlet.wiki.model.WikiPage;
032    import com.liferay.portlet.wiki.model.WikiPageResource;
033    import com.liferay.portlet.wiki.service.WikiPageLocalServiceUtil;
034    import com.liferay.portlet.wiki.service.WikiPageResourceLocalServiceUtil;
035    import com.liferay.portlet.wiki.service.permission.WikiPagePermission;
036    
037    /**
038     * @author Samuel Kong
039     * @author Ryan Park
040     * @author Zsolt Berentey
041     */
042    public class WikiActivityInterpreter extends BaseSocialActivityInterpreter {
043    
044            @Override
045            public String[] getClassNames() {
046                    return _CLASS_NAMES;
047            }
048    
049            protected String getAttachmentTitle(
050                            SocialActivity activity, WikiPageResource pageResource,
051                            ServiceContext serviceContext)
052                    throws Exception {
053    
054                    int activityType = activity.getType();
055    
056                    if ((activityType == SocialActivityConstants.TYPE_ADD_ATTACHMENT) ||
057                            (activityType ==
058                                    SocialActivityConstants.TYPE_MOVE_ATTACHMENT_TO_TRASH) ||
059                            (activityType ==
060                                    SocialActivityConstants.TYPE_RESTORE_ATTACHMENT_FROM_TRASH)) {
061    
062                            String link = null;
063    
064                            FileEntry fileEntry = null;
065    
066                            try {
067                                    long fileEntryId = GetterUtil.getLong(
068                                            activity.getExtraDataValue("fileEntryId"));
069    
070                                    fileEntry = PortletFileRepositoryUtil.getPortletFileEntry(
071                                            fileEntryId);
072                            }
073                            catch (NoSuchModelException nsme) {
074                            }
075    
076                            String fileEntryTitle = activity.getExtraDataValue(
077                                    "fileEntryTitle");
078    
079                            if ((fileEntry != null) && !fileEntry.isInTrash()) {
080                                    StringBundler sb = new StringBundler(9);
081    
082                                    sb.append(serviceContext.getPathMain());
083                                    sb.append("/wiki/get_page_attachment?p_l_id=");
084                                    sb.append(serviceContext.getPlid());
085                                    sb.append("&nodeId=");
086                                    sb.append(pageResource.getNodeId());
087                                    sb.append("&title=");
088                                    sb.append(HttpUtil.encodeURL(pageResource.getTitle()));
089                                    sb.append("&fileName=");
090                                    sb.append(fileEntryTitle);
091    
092                                    link = sb.toString();
093                            }
094    
095                            return wrapLink(link, fileEntryTitle);
096                    }
097    
098                    return StringPool.BLANK;
099            }
100    
101            @Override
102            protected String getPath(
103                    SocialActivity activity, ServiceContext serviceContext) {
104    
105                    return "/wiki/find_page?pageResourcePrimKey=" + activity.getClassPK();
106            }
107    
108            @Override
109            protected Object[] getTitleArguments(
110                            String groupName, SocialActivity activity, String link,
111                            String title, ServiceContext serviceContext)
112                    throws Exception {
113    
114                    WikiPageResource pageResource =
115                            WikiPageResourceLocalServiceUtil.fetchWikiPageResource(
116                                    activity.getClassPK());
117    
118                    if (pageResource == null) {
119                            return null;
120                    }
121    
122                    String creatorUserName = getUserName(
123                            activity.getUserId(), serviceContext);
124    
125                    title = wrapLink(link, title);
126    
127                    return new Object[] {
128                            groupName, creatorUserName, title,
129                            getAttachmentTitle(activity, pageResource, serviceContext)
130                    };
131            }
132    
133            @Override
134            protected String getTitlePattern(
135                    String groupName, SocialActivity activity) {
136    
137                    int activityType = activity.getType();
138    
139                    if ((activityType == WikiActivityKeys.ADD_COMMENT) ||
140                            (activityType == SocialActivityConstants.TYPE_ADD_COMMENT)) {
141    
142                            if (Validator.isNull(groupName)) {
143                                    return "activity-wiki-page-add-comment";
144                            }
145                            else {
146                                    return "activity-wiki-page-add-comment-in";
147                            }
148                    }
149                    else if (activityType == WikiActivityKeys.ADD_PAGE) {
150                            if (Validator.isNull(groupName)) {
151                                    return "activity-wiki-page-add-page";
152                            }
153                            else {
154                                    return "activity-wiki-page-add-page-in";
155                            }
156                    }
157                    else if (activityType == SocialActivityConstants.TYPE_ADD_ATTACHMENT) {
158                            if (Validator.isNull(groupName)) {
159                                    return "activity-wiki-page-add-attachment";
160                            }
161                            else {
162                                    return "activity-wiki-page-add-attachment-in";
163                            }
164                    }
165                    else if (activityType ==
166                                            SocialActivityConstants.TYPE_MOVE_ATTACHMENT_TO_TRASH) {
167    
168                            if (Validator.isNull(groupName)) {
169                                    return "activity-wiki-page-remove-attachment";
170                            }
171                            else {
172                                    return "activity-wiki-page-remove-attachment-in";
173                            }
174                    }
175                    else if (activityType ==
176                                            SocialActivityConstants.
177                                                    TYPE_RESTORE_ATTACHMENT_FROM_TRASH) {
178    
179                            if (Validator.isNull(groupName)) {
180                                    return "activity-wiki-page-restore-attachment";
181                            }
182                            else {
183                                    return "activity-wiki-page-restore-attachment-in";
184                            }
185                    }
186                    else if (activityType == SocialActivityConstants.TYPE_MOVE_TO_TRASH) {
187                            if (Validator.isNull(groupName)) {
188                                    return "activity-wiki-page-move-to-trash";
189                            }
190                            else {
191                                    return "activity-wiki-page-move-to-trash-in";
192                            }
193                    }
194                    else if (activityType ==
195                                            SocialActivityConstants.TYPE_RESTORE_FROM_TRASH) {
196    
197                            if (Validator.isNull(groupName)) {
198                                    return "activity-wiki-page-restore-from-trash";
199                            }
200                            else {
201                                    return "activity-wiki-page-restore-from-trash-in";
202                            }
203                    }
204                    else if (activityType == WikiActivityKeys.UPDATE_PAGE) {
205                            if (Validator.isNull(groupName)) {
206                                    return "activity-wiki-page-update-page";
207                            }
208                            else {
209                                    return "activity-wiki-page-update-page-in";
210                            }
211                    }
212    
213                    return null;
214            }
215    
216            @Override
217            protected boolean hasPermissions(
218                            PermissionChecker permissionChecker, SocialActivity activity,
219                            String actionId, ServiceContext serviceContext)
220                    throws Exception {
221    
222                    if (!WikiPagePermission.contains(
223                                    permissionChecker, activity.getClassPK(), ActionKeys.VIEW)) {
224    
225                            return false;
226                    }
227    
228                    int activityType = activity.getType();
229    
230                    if (activityType == WikiActivityKeys.UPDATE_PAGE) {
231                            WikiPageResource pageResource =
232                                    WikiPageResourceLocalServiceUtil.getPageResource(
233                                            activity.getClassPK());
234    
235                            double version = GetterUtil.getDouble(
236                                    activity.getExtraDataValue("version"));
237    
238                            WikiPage page = WikiPageLocalServiceUtil.getPage(
239                                    pageResource.getNodeId(), pageResource.getTitle(), version);
240    
241                            if (!page.isApproved() &&
242                                    !WikiPagePermission.contains(
243                                            permissionChecker, activity.getClassPK(),
244                                            ActionKeys.UPDATE)) {
245    
246                                    return false;
247                            }
248                    }
249    
250                    return true;
251            }
252    
253            private static final String[] _CLASS_NAMES = {WikiPage.class.getName()};
254    
255    }