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