DashboardListener.java

package sk.iway.iwcm.components.welcome;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import javax.servlet.http.HttpServletRequest;

import com.fasterxml.jackson.core.JsonProcessingException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import org.springframework.ui.ModelMap;

import sk.iway.iwcm.*;
import sk.iway.iwcm.admin.ThymeleafEvent;
import sk.iway.iwcm.admin.layout.AuditDto;
import sk.iway.iwcm.admin.layout.DocDetailsDto;
import sk.iway.iwcm.admin.layout.UserDto;
import sk.iway.iwcm.common.AdminTools;
import sk.iway.iwcm.components.todo.ToDoBean;
import sk.iway.iwcm.components.todo.ToDoDB;
import sk.iway.iwcm.components.users.userdetail.UserDetailsRepository;
import sk.iway.iwcm.doc.DebugTimer;
import sk.iway.iwcm.doc.DocDetails;
import sk.iway.iwcm.i18n.Prop;
import sk.iway.iwcm.io.IwcmFile;
import sk.iway.iwcm.stat.SessionDetails;
import sk.iway.iwcm.stat.SessionHolder;
import sk.iway.iwcm.system.spring.events.WebjetEvent;
import sk.iway.iwcm.users.UserDetails;
import sk.iway.iwcm.users.UsersDB;

/**
 * Doplna data pre admin cast, pocuva na URL /admin/v9/dashboard/
 */
@Component
public class DashboardListener {

    @Autowired
    UserDetailsRepository userDetailsRepository;

    /**
     * Pripravi data pre overview/welcome obrazovku, zatial taketo skarede natvrdo
     * riesenie
     *
     * @param model
     * @param request
     */
    @EventListener(condition = "#event.clazz eq 'sk.iway.iwcm.admin.ThymeleafEvent' && event.source.page=='dashboard'")
    protected void setOverviewData(final WebjetEvent<ThymeleafEvent> event) {
        try {
            DebugTimer dt = new DebugTimer("DashboardListener");

            ModelMap model = event.getSource().getModel();
            HttpServletRequest request = event.getSource().getRequest();
            Identity user = UsersDB.getCurrentUser(request);
            Prop prop = Prop.getInstance(request);

            // backdata
            WelcomeDataBean backData = WelcomeDataBackTime.getWelcomeDataBackTime();
            model.addAttribute("overviewBackData", JsonTools.objectToJSON(backData));
            dt.diff("After backData");

            // prihlaseny admini
            List<UserDto> admins = new ArrayList<>();
            if (user.isEnabledItem("welcomeShowLoggedAdmins")) {
                Set<Integer> allreadyAddedUserIds = new HashSet<>();
                List<SessionDetails> sessions = SessionHolder.getInstance().getList();
                for (SessionDetails session : sessions) {
                    if (session.getLoggedUserId() > 0 && session.isAdmin()) {
                        Integer userId = Integer.valueOf(session.getLoggedUserId());
                        if (allreadyAddedUserIds.contains(userId))
                            continue;

                        UserDetails u = UsersDB.getUser(session.getLoggedUserId());
                        if (u != null) {
                            UserDto admin = new UserDto(u);
                            admins.add(admin);
                            allreadyAddedUserIds.add(userId);
                        }
                    }
                }
            }
            model.addAttribute("overviewAdmins", JsonTools.objectToJSON(admins));
            dt.diff("After admins");

            int size = Constants.getInt("dashboardRecentSize");

            // posledne stranky
            List<DocDetails> recentPages = AdminTools.getMyRecentPages(user, size);
            List<DocDetailsDto> recentPagesDto = recentPages.stream().map(DocDetailsDto::new)
                    .collect(Collectors.toList());
            model.addAttribute("overviewRecentPages", JsonTools.objectToJSON(recentPagesDto));
            dt.diff("After recent pages");

            // zmenene stranky
            List<DocDetails> changedPages = AdminTools.getRecentPages(40, user);
            List<DocDetailsDto> changedPagesDto = changedPages.stream().limit(size).map(DocDetailsDto::new)
                    .collect(Collectors.toList());
            model.addAttribute("overviewChangedPages", JsonTools.objectToJSON(changedPagesDto));
            dt.diff("After changed pages");

            // audit
            List<AdminlogBean> adminlog = Adminlog.getLastEvents(size);
            List<AuditDto> adminlogDto;
            if (user.isEnabledItem("cmp_adminlog")) adminlogDto = adminlog.stream().map(AuditDto::new).collect(Collectors.toList());
            else adminlogDto = new ArrayList<>();
            model.addAttribute("overviewAdminlog", JsonTools.objectToJSON(adminlogDto));
            dt.diff("After adminlog");

            // to do
            List<ToDoBean> todos = (new ToDoDB()).getToDo(user.getUserId());
            model.addAttribute("overviewTodo", JsonTools.objectToJSON(todos));
            dt.diff("After todo");

            //ak existuje subor /WEB-INF/update/error-log.txt tak zobrazime link nanho
            IwcmFile logFile = new IwcmFile(Tools.getRealPath("/WEB-INF/update/error-log.txt"));
            boolean showErrorLog = false;
            if(logFile.exists())
            {
                IwcmFile tmpLogFile = new IwcmFile(Tools.getRealPath("/files/protected/admin/error-log.txt"));
                FileTools.copyFile(logFile, tmpLogFile);
                showErrorLog = true;
            }
            model.addAttribute("showErrorLog", showErrorLog);
            dt.diff("After error log");

            //check minimal java version
            int requiredJavaVersion = Constants.getInt("javaMinimalVersion");
            String currentJavaVersion = System.getProperty("java.version");
            if ("tester".equals(user.getLogin()) && request.getParameter("javaVersion") != null) {
                currentJavaVersion = request.getParameter("javaVersion");
            }
            if (Tools.isNotEmpty(currentJavaVersion) && requiredJavaVersion > 0) {
                int i = currentJavaVersion.indexOf(".");
                if (i > 0) {
                    int currentJavaVersionMajor = Tools.getIntValue(currentJavaVersion.substring(0, i), -1);
                    if (currentJavaVersionMajor > 0 && requiredJavaVersion > currentJavaVersionMajor) {
                        String message = prop.getText("system.javaVersionWarningText", ""+requiredJavaVersion, currentJavaVersion);
                        model.addAttribute("javaVersionWarningText", message);
                    }
                }
            }

            //Warning to license expiration date coming in 2 months
            Long expirationDate = Constants.getLong("licenseExpiryDate");
            if(expirationDate > 0L) {
                Calendar cal = Calendar.getInstance();
                cal.add(Calendar.MONTH, 2);
                if(cal.getTimeInMillis() >= expirationDate)
                {
                    String message = prop.getText("overview.license.expirationWarning", Tools.formatDate(expirationDate));
                    model.addAttribute("licenceExpirationWarningText", message);
                }
            }

            if (Constants.getBoolean("useAmazonSES")) {
                String message = prop.getText("overview.useAmazonSES.deprecated");
                model.addAttribute("amazonSesWarningText", message);
            }

            boolean show2FARecommendation = false;
            String overview2fawarning = prop.getText("overview.2fa.warning");
            if (Tools.isEmpty(Constants.getString("ldapProviderUrl")) && Tools.isEmpty(Constants.getString("adminLogonMethod")) && Tools.isNotEmpty(overview2fawarning) && overview2fawarning.length() > 2) {
                String mobileDevice = userDetailsRepository.getMobileDeviceByUserId((long)user.getUserId());
                if (Tools.isEmpty(mobileDevice)) {
                    show2FARecommendation = true;
                }
            }
            model.addAttribute("show2FARecommendation", show2FARecommendation);

        } catch (JsonProcessingException e) {
            Logger.error(DashboardListener.class, e);
        }
    }
}