1   /**
2    * Copyright (c) 2000-2008 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portlet.messageboards.util;
24  
25  import com.liferay.portal.kernel.language.LanguageUtil;
26  import com.liferay.portal.kernel.portlet.LiferayWindowState;
27  import com.liferay.portal.kernel.util.GetterUtil;
28  import com.liferay.portal.kernel.util.Http;
29  import com.liferay.portal.kernel.util.LocaleUtil;
30  import com.liferay.portal.kernel.util.StringMaker;
31  import com.liferay.portal.kernel.util.StringPool;
32  import com.liferay.portal.kernel.util.StringUtil;
33  import com.liferay.portal.kernel.util.Validator;
34  import com.liferay.portal.model.Group;
35  import com.liferay.portal.model.Organization;
36  import com.liferay.portal.model.Role;
37  import com.liferay.portal.model.UserGroup;
38  import com.liferay.portal.service.GroupLocalServiceUtil;
39  import com.liferay.portal.service.OrganizationLocalServiceUtil;
40  import com.liferay.portal.service.RoleLocalServiceUtil;
41  import com.liferay.portal.service.UserGroupLocalServiceUtil;
42  import com.liferay.portal.service.UserGroupRoleLocalServiceUtil;
43  import com.liferay.portal.service.UserLocalServiceUtil;
44  import com.liferay.portal.theme.ThemeDisplay;
45  import com.liferay.portal.util.ContentUtil;
46  import com.liferay.portal.util.PropsValues;
47  import com.liferay.portlet.messageboards.model.MBBan;
48  import com.liferay.portlet.messageboards.model.MBCategory;
49  import com.liferay.portlet.messageboards.model.MBMessage;
50  import com.liferay.portlet.messageboards.model.MBStatsUser;
51  import com.liferay.portlet.messageboards.model.impl.MBCategoryImpl;
52  import com.liferay.portlet.messageboards.service.MBCategoryLocalServiceUtil;
53  import com.liferay.portlet.messageboards.service.MBMessageLocalServiceUtil;
54  import com.liferay.util.LocalizationUtil;
55  
56  import java.io.IOException;
57  
58  import java.util.Calendar;
59  import java.util.Date;
60  
61  import javax.portlet.PortletPreferences;
62  import javax.portlet.PortletURL;
63  import javax.portlet.RenderRequest;
64  import javax.portlet.RenderResponse;
65  import javax.portlet.WindowState;
66  
67  import javax.servlet.jsp.PageContext;
68  
69  import org.apache.commons.logging.Log;
70  import org.apache.commons.logging.LogFactory;
71  
72  /**
73   * <a href="MBUtil.java.html"><b><i>View Source</i></b></a>
74   *
75   * @author Brian Wing Shun Chan
76   *
77   */
78  public class MBUtil {
79  
80      public static final String POP_PORTLET_PREFIX = "mb.";
81  
82      public static String getBreadcrumbs(
83              long categoryId, long messageId, PageContext pageContext,
84              RenderRequest req, RenderResponse res)
85          throws Exception {
86  
87          if (messageId > 0) {
88              MBMessage message = MBMessageLocalServiceUtil.getMessage(messageId);
89  
90              return getBreadcrumbs(null, message, pageContext, req, res);
91          }
92          else {
93              MBCategory category = null;
94  
95              try {
96                  if ((categoryId > 0) &&
97                      (categoryId != MBCategoryImpl.DEFAULT_PARENT_CATEGORY_ID)) {
98  
99                      category = MBCategoryLocalServiceUtil.getCategory(
100                         categoryId);
101                 }
102             }
103             catch (Exception e) {
104             }
105 
106             return getBreadcrumbs(category, null, pageContext, req, res);
107         }
108     }
109 
110     public static String getBreadcrumbs(
111             MBCategory category, MBMessage message, PageContext pageContext,
112             RenderRequest req, RenderResponse res)
113         throws Exception {
114 
115         if ((message != null) && (category == null)) {
116             category = message.getCategory();
117         }
118 
119         PortletURL categoriesURL = res.createRenderURL();
120 
121         WindowState windowState = req.getWindowState();
122 
123         if (windowState.equals(LiferayWindowState.POP_UP)) {
124             categoriesURL.setWindowState(LiferayWindowState.POP_UP);
125 
126             categoriesURL.setParameter(
127                 "struts_action", "/message_boards/select_category");
128         }
129         else {
130             categoriesURL.setWindowState(WindowState.MAXIMIZED);
131 
132             categoriesURL.setParameter("struts_action", "/message_boards/view");
133             categoriesURL.setParameter(
134                 "categoryId",
135                 String.valueOf(MBCategoryImpl.DEFAULT_PARENT_CATEGORY_ID));
136         }
137 
138         String categoriesLink =
139             "<a href=\"" + categoriesURL.toString() + "\">" +
140                 LanguageUtil.get(pageContext, "categories") + "</a>";
141 
142         if (category == null) {
143             return categoriesLink;
144         }
145 
146         String breadcrumbs = StringPool.BLANK;
147 
148         if (category != null) {
149             for (int i = 0;; i++) {
150                 category = category.toEscapedModel();
151 
152                 PortletURL portletURL = res.createRenderURL();
153 
154                 if (windowState.equals(LiferayWindowState.POP_UP)) {
155                     portletURL.setWindowState(LiferayWindowState.POP_UP);
156 
157                     portletURL.setParameter(
158                         "struts_action", "/message_boards/select_category");
159                     portletURL.setParameter(
160                         "categoryId", String.valueOf(category.getCategoryId()));
161                 }
162                 else {
163                     portletURL.setWindowState(WindowState.MAXIMIZED);
164 
165                     portletURL.setParameter(
166                         "struts_action", "/message_boards/view");
167                     portletURL.setParameter(
168                         "categoryId", String.valueOf(category.getCategoryId()));
169                 }
170 
171                 String categoryLink =
172                     "<a href=\"" + portletURL.toString() + "\">" +
173                         category.getName() + "</a>";
174 
175                 if (i == 0) {
176                     breadcrumbs = categoryLink;
177                 }
178                 else {
179                     breadcrumbs = categoryLink + " &raquo; " + breadcrumbs;
180                 }
181 
182                 if (category.isRoot()) {
183                     break;
184                 }
185 
186                 category = MBCategoryLocalServiceUtil.getCategory(
187                     category.getParentCategoryId());
188             }
189         }
190 
191         breadcrumbs = categoriesLink + " &raquo; " + breadcrumbs;
192 
193         if (message != null) {
194             message = message.toEscapedModel();
195 
196             PortletURL messageURL = res.createRenderURL();
197 
198             messageURL.setWindowState(WindowState.MAXIMIZED);
199 
200             messageURL.setParameter(
201                 "struts_action", "/message_boards/view_message");
202             messageURL.setParameter(
203                 "messageId", String.valueOf(message.getMessageId()));
204 
205             String messageLink =
206                 "<a href=\"" + messageURL.toString() + "\">" +
207                     message.getSubject() + "</a>";
208 
209             breadcrumbs = breadcrumbs + " &raquo; " + messageLink;
210         }
211 
212         return breadcrumbs;
213     }
214 
215     public static String getEmailFromAddress(PortletPreferences prefs) {
216         String emailFromAddress = PropsValues.MESSAGE_BOARDS_EMAIL_FROM_ADDRESS;
217 
218         return prefs.getValue("email-from-address", emailFromAddress);
219     }
220 
221     public static String getEmailFromName(PortletPreferences prefs) {
222         String emailFromName = PropsValues.MESSAGE_BOARDS_EMAIL_FROM_NAME;
223 
224         return prefs.getValue("email-from-name", emailFromName);
225     }
226 
227     public static boolean getEmailHtmlFormat(PortletPreferences prefs) {
228         String emailHtmlFormat = prefs.getValue(
229             "email-html-format", StringPool.BLANK);
230 
231         if (Validator.isNotNull(emailHtmlFormat)) {
232             return GetterUtil.getBoolean(emailHtmlFormat);
233         }
234         else {
235             return PropsValues.MESSAGE_BOARDS_EMAIL_HTML_FORMAT;
236         }
237     }
238 
239     public static boolean getEmailMessageAddedEnabled(
240         PortletPreferences prefs) {
241 
242         String emailMessageAddedEnabled = prefs.getValue(
243             "email-message-added-enabled", StringPool.BLANK);
244 
245         if (Validator.isNotNull(emailMessageAddedEnabled)) {
246             return GetterUtil.getBoolean(emailMessageAddedEnabled);
247         }
248         else {
249             return PropsValues.MESSAGE_BOARDS_EMAIL_MESSAGE_ADDED_ENABLED;
250         }
251     }
252 
253     public static String getEmailMessageAddedBody(PortletPreferences prefs)
254         throws IOException {
255 
256         String emailMessageAddedBody = prefs.getValue(
257             "email-message-added-body", StringPool.BLANK);
258 
259         if (Validator.isNotNull(emailMessageAddedBody)) {
260             return emailMessageAddedBody;
261         }
262         else {
263             return ContentUtil.get(
264                 PropsValues.MESSAGE_BOARDS_EMAIL_MESSAGE_ADDED_BODY);
265         }
266     }
267 
268     public static String getEmailMessageAddedSignature(PortletPreferences prefs)
269         throws IOException {
270 
271         String emailMessageAddedSignature = prefs.getValue(
272             "email-message-added-signature", StringPool.BLANK);
273 
274         if (Validator.isNotNull(emailMessageAddedSignature)) {
275             return emailMessageAddedSignature;
276         }
277         else {
278             return ContentUtil.get(
279                 PropsValues.MESSAGE_BOARDS_EMAIL_MESSAGE_ADDED_SIGNATURE);
280         }
281     }
282 
283     public static String getEmailMessageAddedSubjectPrefix(
284             PortletPreferences prefs)
285         throws IOException {
286 
287         String emailMessageAddedSubjectPrefix = prefs.getValue(
288             "email-message-added-subject-prefix", StringPool.BLANK);
289 
290         if (Validator.isNotNull(emailMessageAddedSubjectPrefix)) {
291             return emailMessageAddedSubjectPrefix;
292         }
293         else {
294             return ContentUtil.get(
295                 PropsValues.MESSAGE_BOARDS_EMAIL_MESSAGE_ADDED_SUBJECT_PREFIX);
296         }
297     }
298 
299     public static boolean getEmailMessageUpdatedEnabled(
300         PortletPreferences prefs) {
301 
302         String emailMessageUpdatedEnabled = prefs.getValue(
303             "email-message-updated-enabled", StringPool.BLANK);
304 
305         if (Validator.isNotNull(emailMessageUpdatedEnabled)) {
306             return GetterUtil.getBoolean(emailMessageUpdatedEnabled);
307         }
308         else {
309             return PropsValues.MESSAGE_BOARDS_EMAIL_MESSAGE_UPDATED_ENABLED;
310         }
311     }
312 
313     public static String getEmailMessageUpdatedBody(PortletPreferences prefs)
314         throws IOException {
315 
316         String emailMessageUpdatedBody = prefs.getValue(
317             "email-message-updated-body", StringPool.BLANK);
318 
319         if (Validator.isNotNull(emailMessageUpdatedBody)) {
320             return emailMessageUpdatedBody;
321         }
322         else {
323             return ContentUtil.get(
324                 PropsValues.MESSAGE_BOARDS_EMAIL_MESSAGE_UPDATED_BODY);
325         }
326     }
327 
328     public static String getEmailMessageUpdatedSignature(
329             PortletPreferences prefs)
330         throws IOException {
331 
332         String emailMessageUpdatedSignature = prefs.getValue(
333             "email-message-updated-signature", StringPool.BLANK);
334 
335         if (Validator.isNotNull(emailMessageUpdatedSignature)) {
336             return emailMessageUpdatedSignature;
337         }
338         else {
339             return ContentUtil.get(
340                 PropsValues.MESSAGE_BOARDS_EMAIL_MESSAGE_UPDATED_SIGNATURE);
341         }
342     }
343 
344     public static String getEmailMessageUpdatedSubjectPrefix(
345             PortletPreferences prefs)
346         throws IOException {
347 
348         String emailMessageUpdatedSubject = prefs.getValue(
349             "email-message-updated-subject-prefix", StringPool.BLANK);
350 
351         if (Validator.isNotNull(emailMessageUpdatedSubject)) {
352             return emailMessageUpdatedSubject;
353         }
354         else {
355             return ContentUtil.get(
356                 PropsValues.
357                     MESSAGE_BOARDS_EMAIL_MESSAGE_UPDATED_SUBJECT_PREFIX);
358         }
359     }
360 
361     public static String getMailId(String mx, long categoryId, long messageId) {
362         StringMaker sm = new StringMaker();
363 
364         sm.append(StringPool.LESS_THAN);
365         sm.append(POP_PORTLET_PREFIX);
366         sm.append(categoryId);
367         sm.append(StringPool.PERIOD);
368         sm.append(messageId);
369         sm.append(StringPool.AT);
370         sm.append(PropsValues.POP_SERVER_SUBDOMAIN);
371         sm.append(StringPool.PERIOD);
372         sm.append(mx);
373         sm.append(StringPool.GREATER_THAN);
374 
375         return sm.toString();
376     }
377 
378     public static String getMailingListAddress(
379         long categoryId, long messageId, String mx) {
380 
381         StringMaker sm = new StringMaker();
382 
383         sm.append(POP_PORTLET_PREFIX);
384         sm.append(categoryId);
385         sm.append(StringPool.PERIOD);
386         sm.append(messageId);
387         sm.append(StringPool.AT);
388         sm.append(PropsValues.POP_SERVER_SUBDOMAIN);
389         sm.append(StringPool.PERIOD);
390         sm.append(mx);
391 
392         return sm.toString();
393     }
394 
395     public static long getMessageId(String mailId) {
396         int x = mailId.indexOf(StringPool.LESS_THAN) + 1;
397         int y = mailId.indexOf(StringPool.AT);
398 
399         long messageId = 0;
400 
401         if ((x > 0 ) && (y != -1)) {
402             String temp = mailId.substring(x, y);
403 
404             int z = temp.indexOf(StringPool.PERIOD);
405 
406             if (z != -1) {
407                 messageId = GetterUtil.getLong(temp.substring(z));
408             }
409         }
410 
411         return messageId;
412     }
413 
414     public static String[] getThreadPriority(
415             PortletPreferences prefs, String languageId, double value,
416             ThemeDisplay themeDisplay)
417         throws Exception {
418 
419         String[] priorities = LocalizationUtil.getPrefsValues(
420             prefs, "priorities", languageId);
421 
422         String[] priorityPair = _findThreadPriority(
423             value, themeDisplay, priorities);
424 
425         if (priorityPair == null) {
426             String defaultLanguageId = LocaleUtil.toLanguageId(
427                 LocaleUtil.getDefault());
428 
429             priorities = LocalizationUtil.getPrefsValues(
430                 prefs, "priorities", defaultLanguageId);
431 
432             priorityPair = _findThreadPriority(value, themeDisplay, priorities);
433         }
434 
435         return priorityPair;
436     }
437 
438     public static Date getUnbanDate(MBBan ban, int expireInterval) {
439         Date banDate = ban.getCreateDate();
440 
441         Calendar cal = Calendar.getInstance();
442 
443         cal.setTime(banDate);
444 
445         cal.add(Calendar.DATE, expireInterval);
446 
447         return cal.getTime();
448     }
449 
450     public static String getUserRank(
451             PortletPreferences prefs, String languageId, int posts)
452         throws Exception {
453 
454         String rank = StringPool.BLANK;
455 
456         String[] ranks = LocalizationUtil.getPrefsValues(
457             prefs, "ranks", languageId);
458 
459         for (int i = 0; i < ranks.length; i++) {
460             String[] kvp = StringUtil.split(ranks[i], StringPool.EQUAL);
461 
462             String kvpName = kvp[0];
463             int kvpPosts = GetterUtil.getInteger(kvp[1]);
464 
465             if (posts >= kvpPosts) {
466                 rank = kvpName;
467             }
468             else {
469                 break;
470             }
471         }
472 
473         return rank;
474     }
475 
476     public static String getUserRank(
477             PortletPreferences prefs, String languageId, MBStatsUser statsUser)
478         throws Exception {
479 
480         String rank = StringPool.BLANK;
481 
482         Group group = GroupLocalServiceUtil.getGroup(
483             statsUser.getGroupId());
484 
485         long companyId = group.getCompanyId();
486 
487         String[] ranks = LocalizationUtil.getPrefsValues(
488             prefs, "ranks", languageId);
489 
490         for (int i = 0; i < ranks.length; i++) {
491             String[] kvp = StringUtil.split(ranks[i], StringPool.EQUAL);
492 
493             String curRank = kvp[0];
494             String curRankValue = kvp[1];
495 
496             String[] curRankValueKvp = StringUtil.split(
497                 curRankValue, StringPool.COLON);
498 
499             if (curRankValueKvp.length <= 1) {
500                 int kvpPosts = GetterUtil.getInteger(curRankValue);
501 
502                 if (statsUser.getMessageCount() >= kvpPosts) {
503                     rank = curRank;
504                 }
505 
506                 continue;
507             }
508 
509             String entityType = curRankValueKvp[0];
510             String entityValue = curRankValueKvp[1];
511 
512             try {
513                 if (_isEntityRank(
514                         companyId, statsUser, entityType, entityValue)) {
515 
516                     return curRank;
517                 }
518             }
519             catch (Exception e) {
520                 if (_log.isWarnEnabled()) {
521                     _log.warn(e);
522                 }
523             }
524         }
525 
526         return rank;
527     }
528 
529     public static boolean isAllowAnonymousPosting(PortletPreferences prefs) {
530         String allowAnonymousPosting = prefs.getValue(
531             "allow-anonymous-posting", StringPool.BLANK);
532 
533         if (Validator.isNotNull(allowAnonymousPosting)) {
534             return GetterUtil.getBoolean(allowAnonymousPosting);
535         }
536         else {
537             return PropsValues.MESSAGE_BOARDS_ANONYMOUS_POSTING_ENABLED;
538         }
539     }
540 
541     private static String[] _findThreadPriority(
542         double value, ThemeDisplay themeDisplay, String[] priorities) {
543 
544         for (int i = 0; i < priorities.length; i++) {
545             String[] priority = StringUtil.split(priorities[i]);
546 
547             try {
548                 String priorityName = priority[0];
549                 String priorityImage = priority[1];
550                 double priorityValue = GetterUtil.getDouble(priority[2]);
551 
552                 if (value == priorityValue) {
553                     if (!priorityImage.startsWith(Http.HTTP)) {
554                         priorityImage =
555                             themeDisplay.getPathThemeImages() + priorityImage;
556                     }
557 
558                     return new String[] {priorityName, priorityImage};
559                 }
560             }
561             catch (Exception e) {
562             }
563         }
564 
565         return null;
566     }
567 
568     private static boolean _isEntityRank(
569             long companyId, MBStatsUser statsUser, String entityType,
570             String entityValue)
571         throws Exception {
572 
573         long groupId = statsUser.getGroupId();
574         long userId = statsUser.getUserId();
575 
576         if (entityType.equals("community-role") ||
577             entityType.equals("organization-role")) {
578 
579             Role role = RoleLocalServiceUtil.getRole(companyId, entityValue);
580 
581             if (UserGroupRoleLocalServiceUtil.hasUserGroupRole(
582                     userId, groupId, role.getRoleId())) {
583 
584                 return true;
585             }
586         }
587         else if (entityType.equals("organization")) {
588             Organization organization =
589                 OrganizationLocalServiceUtil.getOrganization(
590                     companyId, entityValue);
591 
592             if (OrganizationLocalServiceUtil.hasUserOrganization(
593                     userId, organization.getOrganizationId())) {
594 
595                 return true;
596             }
597         }
598         else if (entityType.equals("regular-role")) {
599             if (RoleLocalServiceUtil.hasUserRole(
600                     userId, companyId, entityValue, true)) {
601 
602                 return true;
603             }
604         }
605         else if (entityType.equals("user-group")) {
606             UserGroup userGroup = UserGroupLocalServiceUtil.getUserGroup(
607                 companyId, entityValue);
608 
609             if (UserLocalServiceUtil.hasUserGroupUser(
610                     userGroup.getUserGroupId(), userId)) {
611 
612                 return true;
613             }
614         }
615 
616         return false;
617     }
618 
619     private static Log _log = LogFactory.getLog(MBUtil.class);
620 
621 }