ru.org.linux.comment.CommentPrepareService.java Source code

Java tutorial

Introduction

Here is the source code for ru.org.linux.comment.CommentPrepareService.java

Source

/*
 * Copyright 1998-2017 Linux.org.ru
 *    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 ru.org.linux.comment;

import com.google.common.base.Strings;
import com.google.common.collect.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import ru.org.linux.site.ApiDeleteInfo;
import ru.org.linux.site.DeleteInfo;
import ru.org.linux.site.Template;
import ru.org.linux.spring.dao.DeleteInfoDao;
import ru.org.linux.spring.dao.MessageText;
import ru.org.linux.spring.dao.MsgbaseDao;
import ru.org.linux.spring.dao.UserAgentDao;
import ru.org.linux.topic.Topic;
import ru.org.linux.topic.TopicPermissionService;
import ru.org.linux.user.*;
import ru.org.linux.util.bbcode.LorCodeService;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Service
public class CommentPrepareService {
    @Autowired
    private UserDao userDao;

    @Autowired
    private LorCodeService lorCodeService;

    @Autowired
    private MsgbaseDao msgbaseDao;

    @Autowired
    private TopicPermissionService topicPermissionService;

    @Autowired
    private UserService userService;

    @Autowired
    private DeleteInfoDao deleteInfoDao;

    @Autowired
    private UserAgentDao userAgentDao;

    @Autowired
    private RemarkDao remarkDao;

    private PreparedComment prepareComment(@Nonnull Comment comment, boolean secure) throws UserNotFoundException {
        MessageText messageText = msgbaseDao.getMessageText(comment.getId());
        User author = userDao.getUserCached(comment.getUserid());

        return prepareComment(messageText, author, null, comment, null, secure, null, null);
    }

    private PreparedComment prepareComment(MessageText messageText, User author, @Nullable String remark,
            @Nonnull Comment comment, CommentList comments, boolean secure, Template tmpl, Topic topic)
            throws UserNotFoundException {
        String processedMessage = prepareCommentText(messageText,
                !topicPermissionService.followAuthorLinks(author));

        ReplyInfo replyInfo = null;
        boolean deletable = false;
        boolean editable = false;

        if (comments != null) {
            if (comment.getReplyTo() != 0) {
                CommentNode replyNode = comments.getNode(comment.getReplyTo());

                boolean replyDeleted = replyNode == null;
                if (replyDeleted) {
                    //    
                    replyInfo = new ReplyInfo(comment.getReplyTo(), replyDeleted);
                } else {
                    Comment reply = replyNode.getComment();

                    boolean samePage = false;

                    if (tmpl != null) {
                        int replyPage = comments.getCommentPage(reply, tmpl.getProf());
                        samePage = comments.getCommentPage(comment, tmpl.getProf()) == replyPage;
                    }

                    String replyAuthor = userDao.getUserCached(reply.getUserid()).getNick();

                    replyInfo = new ReplyInfo(reply.getId(), replyAuthor,
                            Strings.emptyToNull(reply.getTitle().trim()), reply.getPostdate(), samePage,
                            replyDeleted);
                }
            }

            boolean haveAnswers = comments.getNode(comment.getId()).isHaveAnswers();

            if (tmpl != null && topic != null) {
                final User currentUser = tmpl.getCurrentUser();

                deletable = topicPermissionService.isCommentDeletableNow(comment, currentUser, topic, haveAnswers);

                if (currentUser != null) {
                    editable = topicPermissionService.isCommentEditableNow(comment, currentUser, haveAnswers,
                            topic);
                }
            }
        }

        Userpic userpic = null;

        if (tmpl != null && tmpl.getProf().isShowPhotos()) {
            userpic = userService.getUserpic(author, tmpl.getProf().getAvatarMode(), false);
        }

        ApiUserRef ref = userService.ref(author, tmpl != null ? tmpl.getCurrentUser() : null);

        ApiDeleteInfo deleteInfo = loadDeleteInfo(comment);

        EditSummary editSummary = loadEditSummary(comment);

        String postIP = null;
        String userAgent = null;

        if (tmpl != null && tmpl.isModeratorSession()) {
            postIP = comment.getPostIP();
            userAgent = userAgentDao.getUserAgentById(comment.getUserAgentId());
        }

        return new PreparedComment(comment, ref, processedMessage, replyInfo, deletable, editable, remark, userpic,
                deleteInfo, editSummary, postIP, userAgent);
    }

    private ApiDeleteInfo loadDeleteInfo(Comment comment) throws UserNotFoundException {
        ApiDeleteInfo deleteInfo = null;

        if (comment.isDeleted()) {
            DeleteInfo info = deleteInfoDao.getDeleteInfo(comment.getId());

            if (info != null) {
                deleteInfo = new ApiDeleteInfo(userDao.getUserCached(info.getUserid()).getNick(), info.getReason());
            }
        }

        return deleteInfo;
    }

    private EditSummary loadEditSummary(Comment comment) throws UserNotFoundException {
        EditSummary editSummary = null;

        if (comment.getEditCount() > 0) {
            editSummary = new EditSummary(userDao.getUserCached(comment.getEditorId()).getNick(),
                    comment.getEditDate(), comment.getEditCount());
        }

        return editSummary;
    }

    private PreparedRSSComment prepareRSSComment(@Nonnull MessageText messageText, @Nonnull Comment comment,
            boolean secure) throws UserNotFoundException {
        User author = userDao.getUserCached(comment.getUserid());

        String processedMessage = prepareCommentTextRSS(messageText, secure);

        return new PreparedRSSComment(comment, author, processedMessage);
    }

    public PreparedComment prepareCommentForReplayto(Comment comment, boolean secure) throws UserNotFoundException {
        return prepareComment(comment, secure);
    }

    /**
     *   ? ? ?
     *    ???     ??     
     * @param comment  
     * @param message  ?
     * @param secure   ??
     * @return  
     * @throws UserNotFoundException
     */
    public PreparedComment prepareCommentForEdit(Comment comment, String message, boolean secure)
            throws UserNotFoundException {
        User author = userDao.getUserCached(comment.getUserid());
        String processedMessage = lorCodeService.parseComment(message, false);

        ApiUserRef ref = userService.ref(author, null);

        return new PreparedComment(comment, ref, processedMessage, null, // reply
                false, // deletable
                false, // editable
                null, // Remark
                null, // userpic
                null, null, null, null);
    }

    public List<PreparedRSSComment> prepareCommentListRSS(@Nonnull List<Comment> list, boolean secure)
            throws UserNotFoundException {
        List<PreparedRSSComment> commentsPrepared = new ArrayList<>(list.size());
        for (Comment comment : list) {
            MessageText messageText = msgbaseDao.getMessageText(comment.getId());

            commentsPrepared.add(prepareRSSComment(messageText, comment, secure));
        }
        return commentsPrepared;
    }

    private Map<Integer, User> loadUsers(Iterable<Integer> userIds) {
        ImmutableMap.Builder<Integer, User> builder = ImmutableMap.builder();

        for (User user : userService.getUsersCached(ImmutableSet.copyOf(userIds))) {
            builder.put(user.getId(), user);
        }

        return builder.build();
    }

    public List<PreparedComment> prepareCommentList(@Nonnull CommentList comments, @Nonnull List<Comment> list,
            boolean secure, @Nonnull Template tmpl, @Nonnull Topic topic) throws UserNotFoundException {
        if (list.isEmpty()) {
            return ImmutableList.of();
        }

        Map<Integer, MessageText> texts = msgbaseDao.getMessageText(Lists.transform(list, Comment::getId));

        Map<Integer, User> users = loadUsers(Iterables.transform(list, Comment::getUserid));
        User currentUser = tmpl.getCurrentUser();

        Map<Integer, Remark> remarks;

        if (currentUser != null) {
            remarks = remarkDao.getRemarks(currentUser, users.values());
        } else {
            remarks = ImmutableMap.of();
        }

        List<PreparedComment> commentsPrepared = new ArrayList<>(list.size());
        for (Comment comment : list) {
            MessageText text = texts.get(comment.getId());

            User author = users.get(comment.getUserid());

            Remark remark = remarks.get(author.getId());

            String remarkText = null;

            if (remark != null) {
                remarkText = remark.getText();
            }

            commentsPrepared.add(prepareComment(text, author, remarkText, comment, comments, secure, tmpl, topic));
        }

        return commentsPrepared;
    }

    /**
     *  html ? ? ?
     *
     * @param messageText ? ?
     * @return ? html ?
     */
    private String prepareCommentText(MessageText messageText, boolean nofollow) {
        if (messageText.isLorcode()) {
            return lorCodeService.parseComment(messageText.getText(), nofollow);
        } else {
            return "<p>" + messageText.getText() + "</p>";
        }
    }

    /**
     *  RSS ? ? ?
     *
     * @param messageText ? ?
     * @param secure https ??
     * @return ? html ?
     */
    private String prepareCommentTextRSS(MessageText messageText, final boolean secure) {
        return lorCodeService.prepareTextRSS(messageText.getText(), messageText.isLorcode());
    }
}