com.liferay.calendar.notification.impl.NotificationUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.calendar.notification.impl.NotificationUtil.java

Source

/**
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package com.liferay.calendar.notification.impl;

import com.liferay.calendar.model.Calendar;
import com.liferay.calendar.model.CalendarBooking;
import com.liferay.calendar.model.CalendarNotificationTemplate;
import com.liferay.calendar.model.CalendarResource;
import com.liferay.calendar.notification.NotificationField;
import com.liferay.calendar.notification.NotificationTemplateType;
import com.liferay.calendar.notification.NotificationType;
import com.liferay.calendar.service.configuration.CalendarServiceConfigurationKeys;
import com.liferay.calendar.service.configuration.CalendarServiceConfigurationUtil;
import com.liferay.calendar.service.configuration.CalendarServiceConfigurationValues;
import com.liferay.petra.content.ContentUtil;
import com.liferay.portal.kernel.bean.BeanPropertiesUtil;
import com.liferay.portal.kernel.configuration.Filter;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.service.GroupLocalServiceUtil;
import com.liferay.portal.kernel.service.UserLocalServiceUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Time;
import com.liferay.portal.kernel.util.UnicodeProperties;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @author Eduardo Lundgren
 * @author Marcellus Tavares
 */
public class NotificationUtil {

    public static User getDefaultSenderUser(Calendar calendar) throws Exception {

        CalendarResource calendarResource = calendar.getCalendarResource();

        User user = UserLocalServiceUtil.getUser(calendarResource.getUserId());

        if (calendarResource.isGroup()) {
            Group group = GroupLocalServiceUtil.getGroup(calendarResource.getClassPK());

            user = UserLocalServiceUtil.getUser(group.getCreatorUserId());
        } else if (calendarResource.isUser()) {
            user = UserLocalServiceUtil.getUser(calendarResource.getClassPK());
        }

        return user;
    }

    public static String getDefaultTemplate(NotificationType notificationType,
            NotificationTemplateType notificationTemplateType, NotificationField notificationField)
            throws Exception {

        Filter filter = new Filter(notificationType.toString(), notificationTemplateType.toString());

        String propertyName = CalendarServiceConfigurationKeys.CALENDAR_NOTIFICATION_PREFIX + StringPool.PERIOD
                + notificationField.toString();

        String templatePath = CalendarServiceConfigurationUtil.get(propertyName, filter);

        return ContentUtil.get(NotificationUtil.class.getClassLoader(), templatePath);
    }

    public static String getTemplate(CalendarNotificationTemplate calendarNotificationTemplate,
            NotificationType notificationType, NotificationTemplateType notificationTemplateType,
            NotificationField notificationField) throws Exception {

        String defaultTemplate = getDefaultTemplate(notificationType, notificationTemplateType, notificationField);

        return BeanPropertiesUtil.getString(calendarNotificationTemplate, notificationField.toString(),
                defaultTemplate);
    }

    public static String getTemplatePropertyValue(CalendarNotificationTemplate calendarNotificationTemplate,
            String propertyName) {

        return getTemplatePropertyValue(calendarNotificationTemplate, propertyName, StringPool.BLANK);
    }

    public static String getTemplatePropertyValue(CalendarNotificationTemplate calendarNotificationTemplate,
            String propertyName, String defaultValue) {

        if (calendarNotificationTemplate == null) {
            return defaultValue;
        }

        UnicodeProperties notificationTypeSettingsProperties = calendarNotificationTemplate
                .getNotificationTypeSettingsProperties();

        return notificationTypeSettingsProperties.get(propertyName);
    }

    public static void notifyCalendarBookingRecipients(CalendarBooking calendarBooking,
            NotificationType notificationType, NotificationTemplateType notificationTemplateType, User sender)
            throws Exception {

        NotificationSender notificationSender = NotificationSenderFactory
                .getNotificationSender(notificationType.toString());

        List<NotificationRecipient> notificationRecipients = _getNotificationRecipients(calendarBooking);

        for (NotificationRecipient notificationRecipient : notificationRecipients) {

            User user = notificationRecipient.getUser();

            if (user.equals(sender)) {
                continue;
            }

            NotificationTemplateContext notificationTemplateContext = NotificationTemplateContextFactory
                    .getInstance(notificationType, notificationTemplateType, calendarBooking, user);

            notificationSender.sendNotification(sender.getEmailAddress(), sender.getFullName(),
                    notificationRecipient, notificationTemplateContext);
        }
    }

    public static void notifyCalendarBookingReminders(CalendarBooking calendarBooking, long nowTime)
            throws Exception {

        List<NotificationRecipient> notificationRecipients = _getNotificationRecipients(calendarBooking);

        for (NotificationRecipient notificationRecipient : notificationRecipients) {

            User user = notificationRecipient.getUser();

            long startTime = calendarBooking.getStartTime();

            if (nowTime > startTime) {
                return;
            }

            NotificationType notificationType = null;

            long deltaTime = startTime - nowTime;

            if (_isInCheckInterval(deltaTime, calendarBooking.getFirstReminder())) {

                notificationType = calendarBooking.getFirstReminderNotificationType();
            } else if (_isInCheckInterval(deltaTime, calendarBooking.getSecondReminder())) {

                notificationType = calendarBooking.getSecondReminderNotificationType();
            }

            if (notificationType == null) {
                continue;
            }

            NotificationSender notificationSender = NotificationSenderFactory
                    .getNotificationSender(notificationType.toString());

            NotificationTemplateContext notificationTemplateContext = NotificationTemplateContextFactory
                    .getInstance(notificationType, NotificationTemplateType.REMINDER, calendarBooking, user);

            notificationSender.sendNotification(user.getEmailAddress(), user.getFullName(), notificationRecipient,
                    notificationTemplateContext);
        }
    }

    private static List<NotificationRecipient> _getNotificationRecipients(CalendarBooking calendarBooking)
            throws Exception {

        List<NotificationRecipient> notificationRecipients = new ArrayList<>();

        CalendarResource calendarResource = calendarBooking.getCalendarResource();

        Set<User> users = new HashSet<>();

        if (calendarBooking.isMasterBooking()) {
            users.add(UserLocalServiceUtil.fetchUser(calendarBooking.getUserId()));
        }

        users.add(UserLocalServiceUtil.fetchUser(calendarResource.getUserId()));

        for (User user : users) {
            if (user == null) {
                continue;
            }

            if (!user.isActive()) {
                if (_log.isDebugEnabled()) {
                    _log.debug("Skip inactive user " + user.getUserId());
                }

                continue;
            }

            notificationRecipients.add(new NotificationRecipient(user));
        }

        return notificationRecipients;
    }

    private static boolean _isInCheckInterval(long deltaTime, long intervalStart) {

        long intervalEnd = intervalStart + _CHECK_INTERVAL;

        if ((intervalStart <= deltaTime) && (deltaTime < intervalEnd)) {
            return true;
        }

        return false;
    }

    private static final long _CHECK_INTERVAL = CalendarServiceConfigurationValues.CALENDAR_NOTIFICATION_CHECK_INTERVAL
            * Time.MINUTE;

    private static final Log _log = LogFactoryUtil.getLog(NotificationUtil.class);

}