com.onboard.service.activity.impl.ActivityServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.onboard.service.activity.impl.ActivityServiceImpl.java

Source

/*******************************************************************************
 * Copyright [2015] [Onboard team of SERC, Peking University]
 *
 * 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 com.onboard.service.activity.impl;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.onboard.domain.mapper.ActivityMapper;
import com.onboard.domain.mapper.NotificationMapper;
import com.onboard.domain.mapper.ProjectMapper;
import com.onboard.domain.mapper.UserProjectMapper;
import com.onboard.domain.mapper.model.ActivityExample;
import com.onboard.domain.mapper.model.NotificationExample;
import com.onboard.domain.mapper.model.UserProjectExample;
import com.onboard.domain.model.Activity;
import com.onboard.domain.model.Notification;
import com.onboard.domain.model.Project;
import com.onboard.domain.model.Todo;
import com.onboard.domain.model.User;
import com.onboard.domain.model.UserProject;
import com.onboard.service.account.UserService;
import com.onboard.service.activity.ActivityActionType;
import com.onboard.service.activity.ActivityService;
import com.onboard.service.web.SessionService;

/**
 * {@link ActivityService}?
 * 
 * @author yewei
 * 
 */
@Transactional
@Service("activityServiceBean")
public class ActivityServiceImpl implements ActivityService {

    @Autowired
    private ActivityMapper activityMapper;

    @Autowired
    private ProjectMapper projectMapper;

    @Autowired
    private UserProjectMapper userProjectMapper;

    @Autowired
    private NotificationMapper notificationMapper;

    @Autowired
    private SessionService session;

    @Autowired
    private UserService userService;

    private void addProjectConstraint(ActivityExample example, List<Integer> projectList) {
        if (projectList != null) {
            example.getOredCriteria().get(0).andProjectIdIn(projectList);
        }
    }

    /**
     * ???
     * 
     * @param activity
     *            activity???
     * @param endTime
     *            
     * @param limit
     *            ????limit?????
     * @param projectList
     *            ?
     * @return
     */
    private List<Activity> getActivitiesTillDay(Activity activity, Date endTime, int limit,
            List<Integer> projectList) {

        if (projectList != null && projectList.isEmpty()) {
            return new ArrayList<Activity>();
        }

        ActivityExample example = new ActivityExample(activity);
        example.setLimit(0, limit);
        example.setOrderByClause("id desc");
        example.getOredCriteria().get(0).andCreatedLessThan(endTime);

        addProjectConstraint(example, projectList);

        List<Activity> activities = activityMapper.selectByExample(example);

        if (activities.size() == limit) {
            Activity end = activities.get(limit - 1);
            Date startTime = new DateTime(end.getCreated()).withTimeAtStartOfDay().toDate();

            example = new ActivityExample(activity);
            example.setOrderByClause("id desc");
            example.getOredCriteria().get(0).andCreatedGreaterThanOrEqualTo(startTime).andIdLessThan(end.getId());

            addProjectConstraint(example, projectList);

            activities.addAll(activityMapper.selectByExample(example));
        }

        return activities;
    }

    /**
     * id??example
     * 
     * @param activity
     * @param start
     * @param limit
     * @return
     */
    private ActivityExample buildBasicExample(Activity activity, int start, int limit) {
        ActivityExample activityExample = new ActivityExample(activity);
        activityExample.setLimit(start, limit);
        activityExample.setOrderByClause("id desc");

        return activityExample;
    }

    private TreeMap<Date, List<Activity>> groupActivitiesByDate(List<Activity> activities) {

        TreeMap<Date, List<Activity>> map = new TreeMap<Date, List<Activity>>(new Comparator<Date>() {

            @Override
            public int compare(Date o1, Date o2) {
                return o2.compareTo(o1);
            }

        });

        for (Activity ac : activities) {
            Date d = new DateTime(ac.getCreated()).withTimeAtStartOfDay().toDate();
            if (!map.containsKey(d)) {
                List<Activity> list = new ArrayList<Activity>();
                list.add(ac);
                map.put(d, list);
            } else {
                map.get(d).add(ac);
            }
        }

        return map;
    }

    private List<Integer> getProjectIdListByUserByCompany(int userId, int companyId, int start, int limit) {
        List<Integer> projects = new ArrayList<Integer>();

        UserProject userProject = new UserProject();
        userProject.setUserId(userId);
        userProject.setCompanyId(companyId);
        UserProjectExample example = new UserProjectExample(userProject);
        example.setLimit(start, limit);

        List<UserProject> userProjectList = userProjectMapper.selectByExample(example);

        for (UserProject up : userProjectList) {
            Project project = new Project(projectMapper.selectByPrimaryKey(up.getProjectId()));
            if (project.getDeleted() == false) {
                projects.add(project.getId());
            }
        }

        return projects;
    }

    @Override
    public Activity create(Activity activity) {
        activityMapper.insertSelective(activity);
        return activity;
    }

    @Override
    public Activity update(Activity activity) {
        activityMapper.updateByPrimaryKey(activity);
        return activity;
    }

    @Override
    public void delete(int id) {
        Notification sample = new Notification();
        sample.setActivityId(id);
        notificationMapper.deleteByExample(new NotificationExample(sample));
        activityMapper.deleteByPrimaryKey(id);
    }

    @Override
    public Activity getById(int id) {
        return activityMapper.selectByPrimaryKey(id);
    }

    @Override
    public List<Activity> getByProject(int projectId, int start, int limit) {
        Activity activity = new Activity();
        activity.setProjectId(projectId);
        ActivityExample activityExample = buildBasicExample(activity, start, limit);
        return activityMapper.selectByExample(activityExample);
    }

    @Override
    public List<Activity> getByProjectTillDay(int projectId, Date endTime, int limit) {

        Activity activity = new Activity();
        activity.setProjectId(projectId);

        return getActivitiesTillDay(activity, endTime, limit, null);
    }

    @Override
    public List<Activity> getByCompany(int companyId, int start, int limit) {
        Activity activity = new Activity();
        activity.setCompanyId(companyId);
        ActivityExample activityExample = buildBasicExample(activity, start, limit);

        return activityMapper.selectByExample(activityExample);
    }

    @Override
    public List<Activity> getByCompanyTillDay(int companyId, Date endTime, int limit) {
        Activity activity = new Activity();
        activity.setCompanyId(companyId);

        return getActivitiesTillDay(activity, endTime, limit, null);
    }

    @Override
    public List<Activity> getLatestByUser(int companyId, int userId, int limit, List<Integer> projectList) {
        Activity activity = new Activity();
        activity.setCreatorId(userId);
        return getLatestByBySampleCompanyByPage(activity, companyId, 0, limit, projectList);
    }

    @Override
    public List<Activity> getLatestByUserByPage(int companyId, int userId, int start, int limit,
            List<Integer> projectList) {
        if (projectList != null && projectList.isEmpty()) {
            return new ArrayList<Activity>();
        }
        Activity sample = new Activity();
        sample.setCreatorId(userId);
        sample.setCompanyId(companyId);

        ActivityExample example = buildBasicExample(sample, start, limit);
        addProjectConstraint(example, projectList);

        return activityMapper.selectByExample(example);
    }

    private List<Activity> appendActivitiesOfLastDay(List<Activity> activities, ActivityExample example) {

        if (activities != null && !activities.isEmpty()) {
            Activity lastActivity = activities.get(activities.size() - 1);
            Date since = new DateTime(lastActivity.getCreated()).withTimeAtStartOfDay().toDate();
            example.getOredCriteria().get(0).andCreatedGreaterThanOrEqualTo(since)
                    .andCreatedLessThan(lastActivity.getCreated());
            activities.addAll(activityMapper.selectByExample(example));
        }

        return activities;
    }

    @Override
    public List<Activity> getByUserGroupByDateReturnList(int companyId, int userId, int limit,
            List<Integer> projectList, Date until) {

        if (projectList != null && projectList.isEmpty()) {
            return new ArrayList<Activity>();
        }

        Activity sample = new Activity();
        sample.setCreatorId(userId);
        sample.setCompanyId(companyId);
        ActivityExample example = new ActivityExample(sample);

        addProjectConstraint(example, projectList);

        example.getOredCriteria().get(0).andCreatedLessThanOrEqualTo(until);
        example.setLimit(limit);
        example.setOrderByClause("id desc");

        List<Activity> originActivities = activityMapper.selectByExample(example);

        if (originActivities == null || originActivities.isEmpty()) {
            return new ArrayList<Activity>();
        }

        // ?activity??activity?limit
        List<Activity> activities = appendActivitiesOfLastDay(originActivities, example);

        return activities;

    }

    @Override
    public TreeMap<Date, List<Activity>> getByUserGroupByDate(int companyId, int userId, int limit,
            List<Integer> projectList, Date until) {

        List<Activity> activities = this.getByUserGroupByDateReturnList(companyId, userId, limit, projectList,
                until);
        return groupActivitiesByDate(activities);
    }

    @Override
    public List<Activity> getUserVisibleTillDay(int companyId, Integer filterUserId, Integer filterProjectId,
            Date endTime, String filterType, int limit) {

        Activity sample = new Activity();

        if (filterProjectId != null) {
            sample.setProjectId(filterProjectId);
        }
        if (filterUserId != null) {
            sample.setCreatorId(filterUserId);
        }
        if (filterType != null) {
            sample.setAttachType(filterType);
        }

        return this.getUserVisibleBySampleTillDay(companyId, sample, endTime, limit);

    }

    @Override
    public List<Activity> getUserVisibleBySampleTillDay(int companyId, Activity sample, Date endTime, int limit) {
        if (sample == null) {
            return new ArrayList<Activity>();
        }
        sample.setCompanyId(companyId);
        List<Integer> projectList = getProjectIdListByUserByCompany(session.getCurrentUser().getId(), companyId, 0,
                -1);

        return getActivitiesTillDay(sample, endTime, limit, projectList);
    }

    @Override
    public List<Activity> getByTodo(int todoId, int start, int limit) {

        Activity activity = new Activity();
        activity.setAttachId(todoId);
        activity.setAttachType(new Todo().getType());

        ActivityExample activityExample = buildBasicExample(activity, start, limit);

        // TODO hard-coding of subject, subject should be moved to config files
        activityExample.getOredCriteria().get(0).andActionNotEqualTo(ActivityActionType.REPLY);

        return activityMapper.selectByExample(activityExample);
    }

    @Override
    public List<Activity> getByProjectByDate(int projectId, Date date) {

        Activity sample = new Activity();
        sample.setProjectId(projectId);

        ActivityExample example = new ActivityExample(sample);

        DateTime dt = new DateTime(date);
        Date start = dt.withTimeAtStartOfDay().toDate();
        Date end = dt.plusDays(1).toDate();
        example.getOredCriteria().get(0).andCreatedGreaterThanOrEqualTo(start).andCreatedLessThan(end);

        return activityMapper.selectByExample(example);
    }

    @Override
    public List<Activity> getByAttachTypeAndId(String type, int id) {

        Activity activity = new Activity();
        activity.setAttachId(id);
        activity.setAttachType(type);

        ActivityExample example = new ActivityExample(activity);
        example.setOrderByClause("id desc");

        return activityMapper.selectByExample(example);
    }

    @Override
    public List<Activity> getLatestByBySampleCompanyByPage(Activity sample, int companyId, int start, int limit,
            List<Integer> projectList) {

        if (projectList != null && projectList.isEmpty()) {
            return new ArrayList<Activity>();
        }

        sample.setCompanyId(companyId);
        ActivityExample example = buildBasicExample(sample, start, limit);

        addProjectConstraint(example, projectList);

        return activityMapper.selectByExample(example);
    }

    @Override
    public List<Activity> getByActivityExample(ActivityExample example) {
        return activityMapper.selectByExample(example);
    }

    @Override
    public void deleteByAttachTypeAndId(String type, int id) {
        Activity deletingActivity = new Activity();
        deletingActivity.setAttachType(type);
        deletingActivity.setAttachId(id);
        List<Activity> activities = activityMapper.selectByExample(new ActivityExample(deletingActivity));
        for (Activity activity : activities) {
            this.delete(activity.getId());
        }
    }

    @Override
    public List<Activity> getLatestByUserSince(int companyId, int userId, List<Integer> projectList, Date since) {
        Activity sample = new Activity();
        sample.setCreatorId(userId);
        sample.setCompanyId(companyId);
        ActivityExample example = new ActivityExample(sample);
        addProjectConstraint(example, projectList);
        example.getOredCriteria().get(0).andCreatedGreaterThanOrEqualTo(since);
        example.setOrderByClause("created desc");
        List<Activity> originActivities = activityMapper.selectByExample(example);
        return originActivities;
    }

    @Override
    public List<Activity> getByProjectBetweenDates(int projectId, Date start, Date end) {

        Activity sample = new Activity();
        sample.setProjectId(projectId);

        ActivityExample example = new ActivityExample(sample);

        DateTime dt = new DateTime(start);
        start = dt.withTimeAtStartOfDay().toDate();
        dt = new DateTime(end);
        end = dt.withTimeAtStartOfDay().plusDays(1).toDate();
        example.getOredCriteria().get(0).andCreatedGreaterThanOrEqualTo(start).andCreatedLessThan(end);
        example.setOrderByClause("id desc");
        return activityMapper.selectByExample(example);
    }

    @Override
    public List<Activity> getByProjectUserBetweenDates(int projectId, int userId, Date start, Date end) {

        Activity sample = new Activity();
        sample.setProjectId(projectId);
        sample.setCreatorId(userId);

        ActivityExample example = new ActivityExample(sample);

        DateTime dt = new DateTime(start);
        start = dt.withTimeAtStartOfDay().toDate();
        dt = new DateTime(end);
        end = dt.withTimeAtStartOfDay().plusDays(1).toDate();
        example.getOredCriteria().get(0).andCreatedGreaterThanOrEqualTo(start).andCreatedLessThan(end);
        example.setOrderByClause("id desc");
        return activityMapper.selectByExample(example);
    }

    private Integer getCountByCompanyUserBetweenDates(int companyId, int userId, Date start, Date end) {
        Activity sample = new Activity();
        sample.setCompanyId(companyId);
        sample.setCreatorId(userId);

        ActivityExample example = new ActivityExample(sample);

        DateTime dt = new DateTime(start);
        start = dt.withTimeAtStartOfDay().toDate();
        dt = new DateTime(end);
        end = dt.withTimeAtStartOfDay().plusDays(1).toDate();
        example.getOredCriteria().get(0).andCreatedGreaterThanOrEqualTo(start).andCreatedLessThan(end);
        example.setOrderByClause("id desc");
        return activityMapper.countByExample(example);
    }

    @Override
    public Map<Integer, Integer> getActivityCountForUsers(Integer companyId, Date since, Date until) {
        List<User> companyUsers = userService.getUserByCompanyId(companyId);
        Map<Integer, Integer> activityCountMap = Maps.newHashMap();
        for (User user : companyUsers) {
            activityCountMap.put(user.getId(),
                    getCountByCompanyUserBetweenDates(companyId, user.getId(), since, until));
        }
        return activityCountMap;
    }

    @Override
    public List<Map<String, ?>> getActivityCountForUsersGroupByDate(Integer companyId, Date since, Date until) {
        List<User> companyUsers = userService.getUserByCompanyId(companyId);
        List<Map<String, ?>> result = Lists.newArrayList();
        Map<Integer, Integer> activityCountMap;
        DateTime dt = new DateTime(since);
        dt = dt.withTimeAtStartOfDay();
        DateTime end = new DateTime(until);
        end = end.withTimeAtStartOfDay().plusDays(1).minusMinutes(1);
        while (dt.toDate().before(end.toDate())) {
            activityCountMap = Maps.newHashMap();
            for (User user : companyUsers) {
                activityCountMap.put(user.getId(),
                        getCountByCompanyUserBetweenDates(companyId, user.getId(), dt.toDate(), dt.toDate()));
            }
            result.add(ImmutableMap.of("time", dt.toDate().getTime(), "counts", activityCountMap));
            dt = dt.plusDays(1);
        }
        return result;
    }

    @Override
    public List<Activity> getActivitiesByCompanyAndDates(Integer companyId, Date since, Date until) {
        Activity activity = new Activity();
        activity.setCompanyId(companyId);
        ActivityExample example = new ActivityExample(activity);

        DateTime dt = new DateTime(since);
        since = dt.withTimeAtStartOfDay().toDate();
        dt = new DateTime(until);
        until = dt.withTimeAtStartOfDay().plusDays(1).toDate();
        example.getOredCriteria().get(0).andCreatedGreaterThanOrEqualTo(since).andCreatedLessThan(until);
        example.setOrderByClause("id desc");

        return activityMapper.selectByExample(example);
    }
}