package org.kalipo.agent;
import org.kalipo.aop.KalipoExceptionHandler;
import org.kalipo.domain.User;
import org.kalipo.repository.CommentRepository;
import org.kalipo.repository.UserRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import javax.inject.Inject;
import java.util.List;
/**
* Scheduled jobs for User entity
*/
@Service
@KalipoExceptionHandler
public class UserAgent {
private final Logger log = LoggerFactory.getLogger(UserAgent.class);
@Inject
private CommentRepository commentRepository;
@Inject
private UserRepository userRepository;
// todo midnight
@Scheduled(fixedDelay = 20000)
public void setTrustworthiness() {
try {
List<User> users = userRepository.findAll();
for (User user : users) {
double rejectedCount = commentRepository.getRejectedCommentCountOfUser(user.getLogin());
double deletedCount = commentRepository.getDeletedCommentCountOfUser(user.getLogin());
double approvedCount = commentRepository.getApprovedCommentCountOfUser(user.getLogin());
// todo include reputation
int boostRejected = 2;
double trustworthiness = log(approvedCount) / Math.max(1, boostRejected * log(rejectedCount + deletedCount));
if(user.getTrustworthiness() != trustworthiness) {
log.info(String.format("User %s with (approved:%s, rejected:%s, deleted:%s) -> %s trustworthiness", user.getLogin(), approvedCount, rejectedCount, deletedCount, trustworthiness));
user.setTrustworthiness(trustworthiness);
}
}
userRepository.save(users);
} catch (Exception e) {
log.error("Failed calculating reputation.", e);
}
}
private double log(double v) {
return Math.log(Math.max(1, v));
}
}