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); } }