package hudson.plugins.cigame;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import hudson.Extension;
import hudson.model.Hudson;
import hudson.model.RootAction;
import hudson.model.User;
import hudson.security.ACL;
import hudson.security.AccessControlled;
import hudson.security.Permission;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
/**
* Leader board for users participaing in the game.
*
* @author Erik Ramfelt
*/
@ExportedBean(defaultVisibility = 999)
@Extension
public class LeaderBoardAction implements RootAction, AccessControlled {
private static final long serialVersionUID = 1L;
public String getDisplayName() {
return Messages.Leaderboard_Title();
}
public String getIconFileName() {
return GameDescriptor.ACTION_LOGO_MEDIUM;
}
public String getUrlName() {
return "/cigame"; //$NON-NLS-1$
}
/**
* Returns the user that are participants in the ci game
*
* @return list containing users.
*/
@Exported
public List<UserScore> getUserScores() {
return getUserScores(User.getAll(), Hudson.getInstance().getDescriptorByType(GameDescriptor.class).getNamesAreCaseSensitive());
}
List<UserScore> getUserScores(Collection<User> users, boolean usernameIsCasesensitive) {
ArrayList<UserScore> list = new ArrayList<UserScore>();
Collection<User> players;
if (usernameIsCasesensitive) {
players = users;
} else {
List<User> playerList = new ArrayList<User>();
CaseInsensitiveUserIdComparator caseInsensitiveUserIdComparator = new CaseInsensitiveUserIdComparator();
for (User user : users) {
if (Collections.binarySearch(playerList, user, caseInsensitiveUserIdComparator) < 0) {
playerList.add(user);
}
}
players = playerList;
}
for (User user : players) {
UserScoreProperty property = user.getProperty(UserScoreProperty.class);
if ((property != null) && property.isParticipatingInGame()) {
list.add(new UserScore(user, property.getScore(), user.getDescription()));
}
}
Collections.sort(list, new Comparator<UserScore>() {
public int compare(UserScore o1, UserScore o2) {
if (o1.score < o2.score)
return 1;
if (o1.score > o2.score)
return -1;
return 0;
}
});
return list;
}
public void doResetScores( StaplerRequest req, StaplerResponse rsp ) throws IOException {
if (Hudson.getInstance().getACL().hasPermission(Hudson.ADMINISTER)) {
doResetScores(User.getAll());
}
rsp.sendRedirect2(req.getContextPath());
}
void doResetScores(Collection<User> users) throws IOException {
for (User user : users) {
UserScoreProperty property = user.getProperty(UserScoreProperty.class);
if (property != null) {
property.setScore(0);
user.save();
}
}
}
@ExportedBean(defaultVisibility = 999)
public class UserScore {
private User user;
private double score;
private String description;
public UserScore(User user, double score, String description) {
super();
this.user = user;
this.score = score;
this.description = description;
}
@Exported
public User getUser() {
return user;
}
@Exported
public double getScore() {
return score;
}
@Exported
public String getDescription() {
return description;
}
}
public ACL getACL() {
return Hudson.getInstance().getACL();
}
public void checkPermission(Permission p) {
getACL().checkPermission(p);
}
public boolean hasPermission(Permission p) {
return getACL().hasPermission(p);
}
}