it.av.youeat.service.impl.DialogServiceHibernate.java Source code

Java tutorial

Introduction

Here is the source code for it.av.youeat.service.impl.DialogServiceHibernate.java

Source

/**
 * Copyright 2009 the original author or authors
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
package it.av.youeat.service.impl;

import it.av.youeat.YoueatException;
import it.av.youeat.ocm.model.Dialog;
import it.av.youeat.ocm.model.Eater;
import it.av.youeat.ocm.model.Message;
import it.av.youeat.ocm.util.DateUtil;
import it.av.youeat.service.DialogService;
import it.av.youeat.service.MessageService;
import it.av.youeat.service.SocialService;
import it.av.youeat.service.system.MailService;
import it.av.youeat.util.TemplateUtil;
import it.av.youeat.web.Locales;

import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Set;

import org.apache.wicket.markup.html.WebPage;
import org.hibernate.Criteria;
import org.hibernate.criterion.Conjunction;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.junit.Assert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

/**
 * Implements the operation on {@link Dialog}
 * 
 * @author <a href='mailto:a.vincelli@gmail.com'>Alessandro Vincelli</a>
 * 
 */
@Repository
@Transactional(readOnly = true)
public class DialogServiceHibernate extends ApplicationServiceHibernate<Dialog> implements DialogService {
    @Autowired
    private MessageService messageService;
    @Autowired
    private MailService mailService;
    @Autowired
    private SocialService socialService;
    @Autowired
    private MessageSource messageSource;

    /**
     * {@inheritDoc}
     */
    @Override
    @Transactional
    public void delete(Dialog dialog, Eater eater) {
        if (dialog.getReceiver().equals(eater)) {
            dialog.setDeletedFromReceiver(true);
        } else if (dialog.getSender().equals(eater)) {
            dialog.setDeletedFromSender(true);
        } else {
            throw new YoueatException("Given eater is not an owner of the given dialog");
        }
        super.save(dialog);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public List<Dialog> getCreatedDialogs(Eater eater) {
        Conjunction senderFilter = Restrictions.conjunction();
        Criterion critBySender1 = Restrictions.eq(Dialog.SENDER_FIELD, eater);
        Criterion critBySender2 = Restrictions.eq(Dialog.DELETED_FROM_SENDER_FIELD, false);
        senderFilter.add(critBySender1);
        senderFilter.add(critBySender2);
        Order orderBYDate = Order.desc(Dialog.CREATION_TIME_FIELD);
        return findByCriteria(orderBYDate, senderFilter);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int countCreatedDialogs(Eater eater) {
        Criteria criteria = getHibernateSession().createCriteria(getPersistentClass());
        Conjunction senderFilter = Restrictions.conjunction();
        Criterion critBySender1 = Restrictions.eq(Dialog.SENDER_FIELD, eater);
        Criterion critBySender2 = Restrictions.eq(Dialog.DELETED_FROM_SENDER_FIELD, false);
        senderFilter.add(critBySender1);
        senderFilter.add(critBySender2);
        criteria.add(senderFilter);
        criteria.setProjection(Projections.rowCount());
        return ((Long) criteria.list().get(0)).intValue();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public List<Dialog> getDialogs(Eater eater, boolean excludeSingleMessage) {
        Conjunction receiverFilter = Restrictions.conjunction();
        Criterion critByReceiver1 = Restrictions.eq(Dialog.RECEIVER_FIELD, eater);
        Criterion critByReceiver2 = Restrictions.eq(Dialog.DELETED_FROM_RECEIVER_FIELD, false);
        receiverFilter.add(critByReceiver1);
        receiverFilter.add(critByReceiver2);

        Conjunction senderFilter = Restrictions.conjunction();
        Criterion critBySender1 = Restrictions.eq(Dialog.SENDER_FIELD, eater);
        Criterion critBySender2 = Restrictions.eq(Dialog.DELETED_FROM_SENDER_FIELD, false);
        senderFilter.add(critBySender1);
        senderFilter.add(critBySender2);

        Disjunction or = Restrictions.disjunction();
        or.add(receiverFilter);
        or.add(senderFilter);
        Order orderBYDate = Order.desc(Dialog.CREATION_TIME_FIELD);
        List<Dialog> results = findByCriteria(orderBYDate, or);
        if (excludeSingleMessage) {
            for (int i = 0; i < results.size(); i++) {
                if (results.get(i).getSender().equals(eater) && results.get(i).getMessages().size() == 1) {
                    results.remove(i);
                }
            }
        }
        return results;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @Transactional
    public Dialog readDiscussion(String dialogId, Eater eater) {
        Dialog dialog = getByID(dialogId);
        for (Message msg : dialog.getMessages()) {
            if (!msg.getSender().equals(eater)) {
                messageService.markMessageAsRead(msg);
            }
        }
        return dialog;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @Transactional
    public Dialog reply(Message message, Dialog dialog, Eater recipient, WebPage page) {
        message.setSentTime(DateUtil.getTimestamp());
        message.setDialog(dialog);
        dialog.getMessages().add(message);
        Dialog savedDialog = save(dialog);
        sendNotification(recipient, message, page);
        return savedDialog;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @Transactional
    public Dialog startNewDialog(Eater sender, Eater recipient, Message message, WebPage page) {
        return startNewDialog(sender, recipient, message, true, page);
    }

    /**
     * Create a new dialog containing the new message.
     * 
     * @param sender the creator of the dialog
     * @param recipient the receiver of the first message of the dialog
     * @param message to send
     * @param sendNotifcation true to send email notification to the recipient
     * @return the created dialog
     */
    @Transactional
    Dialog startNewDialog(Eater sender, Eater recipient, Message message, boolean sendNotifcation, WebPage page) {
        message.setSentTime(DateUtil.getTimestamp());
        message.setSender(sender);
        Dialog dialog = new Dialog();
        dialog.setCreationTime(DateUtil.getTimestamp());
        dialog.setReceiver(recipient);
        dialog.setSender(sender);
        dialog.getMessages().add(message);
        message.setDialog(dialog);
        dialog = save(dialog);
        if (sendNotifcation) {
            sendNotification(recipient, message, page);
        }
        return dialog;
    }

    private void sendNotification(Eater recipient, Message message, WebPage page) {
        if (recipient.isSocialNetworkEater()) {
            socialService.sendMessageReceivedNotification(recipient, message, page);
        } else {
            mailService.sendMessageReceivedNotification(recipient, message, page);
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @Transactional
    public void removeByEater(Eater eater) {
        List<Dialog> dialogs = getDialogs(eater, false);
        for (Dialog dialog : dialogs) {
            this.remove(dialog);
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @Transactional
    public void remove(Dialog dialog) {
        messageService.remove(dialog.getMessages());
        super.remove(dialog);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @Transactional
    public void sendFriendSuggestions(Eater sender, Eater recipient, Set<Eater> friendsToSuggest, WebPage page) {
        Assert.assertNotNull(friendsToSuggest);
        if (!friendsToSuggest.isEmpty()) {
            Message message = createMessageForFriendSuggestion(sender, friendsToSuggest, recipient);
            startNewDialog(sender, recipient, message, false, page);
            //send a custom mail notification
            sendFriendSuggestionNotification(sender, friendsToSuggest, recipient, page);
        }
    }

    /**
     * Created an i18n message containing a list of a new friend to suggest
     * 
     * @param sender the sender of the suggestion
     * @param friendsToSuggest the friend to suggest
     * @param recipient the recipient of the suggestion
     * @return a message containing the friends to suggest
     */
    Message createMessageForFriendSuggestion(Eater sender, Set<Eater> friendsToSuggest, Eater recipient) {
        Locale locale = Locales.getSupportedLocale(recipient.getLanguage().getLanguage());
        if (friendsToSuggest.size() == 1) {
            Eater eaterToSuggest = friendsToSuggest.iterator().next();
            // params [1=sender]
            Object[] params = { sender.getFirstname() };
            String title = messageSource.getMessage("suggestNewFriend.title", params, locale);

            StringBuffer textBody = new StringBuffer();
            // params [1=sender], [2=newFriend]
            Object[] paramsBody = { TemplateUtil.templateEater(sender),
                    TemplateUtil.templateEater(eaterToSuggest) };
            textBody.append(messageSource.getMessage("suggestNewFriend.body", paramsBody, locale));
            return new Message(title, textBody.toString());
        } else {
            // params [1=sender]
            Object[] params = { sender.getFirstname() };
            String title = messageSource.getMessage("suggestNewFriend.titleMultipleUsers", params, locale);
            StringBuffer friendsList = new StringBuffer();
            for (Iterator<Eater> iterator = friendsToSuggest.iterator(); iterator.hasNext();) {
                Eater eaterToSuggest = (Eater) iterator.next();
                friendsList.append(TemplateUtil.templateEater(eaterToSuggest));
                if (iterator.hasNext()) {
                    friendsList.append(", ");
                }
            }
            StringBuffer textBody = new StringBuffer();
            // params [1=sender], [2=newFriendListCommaSepared]
            Object[] params2 = { TemplateUtil.templateEater(sender), friendsList.toString() };
            textBody.append(messageSource.getMessage("suggestNewFriend.bodyMultipleUsers", params2, locale));
            return new Message(title, textBody.toString());
        }
    }

    /**
     * Send a notification about the friend suggestion
     *  
     * @param sender the sender of the suggestion
     * @param friendsToSuggest list of friend to suggest
     * @param recipient the recipient of the suggestions and the recipient of the email notification
     */
    void sendFriendSuggestionNotification(Eater sender, Set<Eater> friendsToSuggest, Eater recipient,
            WebPage page) {
        if (recipient.isSocialNetworkEater()) {
            socialService.sendFriendSuggestionNotification(sender, friendsToSuggest, recipient, page);
        } else {
            mailService.sendFriendSuggestionNotification(sender, friendsToSuggest, recipient, page);
        }
    }

}