package com.coverity.ps.integrations.reporting; import java.util.ArrayList; import java.util.List; import java.util.Map; import com.coverity.ps.common.CimProxy; import com.coverity.ps.common.config.ConfigurationManager; import com.coverity.ps.integrations.Integration; import com.coverity.ws.v4.MergedDefectDataObj; /* * Creates an e-mail report of defects that have been detected in the * last N number of days. Sends an e-mail to a list of specified recipients. */ public class NotifyDefectManagers extends UserDefectReport implements Integration { private List<String> users = new ArrayList<String>(); /** * Constructor * * @param project project name * @param days defects detected in the past N number of days * @param managerList e-mail recipients * @param isDryRun */ public NotifyDefectManagers(String project, int days, String managerList, boolean isDryRun) { super(project, days, isDryRun); String[] managers = managerList.split(","); for(String manager : managers) { this.users.add(manager); } } public boolean execute() throws Exception { ConfigurationManager configurationManager = ConfigurationManager.getInstance(); Map<String, List<MergedDefectDataObj>> defectsByUser = getProjectDefectsByOwner(); System.out.println(defectsByUser.size() + " user(s) with new defects"); StringBuilder html = new StringBuilder(); html.append("<html><body><p>The following defects were detected in project "); html.append(this.projectName); html.append(" within the past "); if (days == 1) { html.append("24 hours.</p>"); } else { html.append(days + " days.</p>"); } for (Map.Entry<String, List<MergedDefectDataObj>> userDefectValues : defectsByUser.entrySet()) { List<MergedDefectDataObj> userDefects = userDefectValues.getValue(); if (userDefects.size() > 0 && userDefectValues.getKey() != UNASSIGNED_OWNER_NAME) { html.append("<p><b>Defect(s) for "); html.append(userDefectValues.getKey()); html.append("</b>"); html.append("<table border=\"1\"><tr><th>CID</th><th>Checker</th><th>File</th></tr>"); for (MergedDefectDataObj defect : userDefects) { StringBuilder defectUrl = new StringBuilder("http://"); defectUrl.append(configurationManager.getAddress()); defectUrl.append(':'); defectUrl.append(configurationManager.getPort()); defectUrl.append("/sourcebrowser.htm?projectId="); defectUrl.append(this.projectId); defectUrl.append("#mergedDefectId="); defectUrl.append(defect.getCid()); html.append("<tr><td><a href=\""); html.append(defectUrl); html.append("\"/a>"); html.append(defect.getCid()); html.append("</td><td>"); html.append(defect.getCheckerName()); html.append("</td><td>"); html.append(defect.getFilePathname()); html.append("</td></tr>"); // System.out.println("user=" + userDefectValues.getKey() + ", defect=" + defect.getCid()); } html.append("</table></p>"); } } // unassigned defects if(defectsByUser.containsKey(UNASSIGNED_OWNER_NAME)) { List<MergedDefectDataObj> userDefects = defectsByUser.get(UNASSIGNED_OWNER_NAME); if (userDefects.size() > 0) { html.append("<p><b>Unassigned Defects</b>"); html.append("<table border=\"1\"><tr><th>CID</th><th>Checker</th><th>File</th></tr>"); for (MergedDefectDataObj defect : userDefects) { StringBuilder defectUrl = new StringBuilder("http://"); defectUrl.append(configurationManager.getAddress()); defectUrl.append(':'); defectUrl.append(configurationManager.getPort()); defectUrl.append("/sourcebrowser.htm?projectId="); defectUrl.append(this.projectId); defectUrl.append("#mergedDefectId="); defectUrl.append(defect.getCid()); html.append("<tr><td><a href=\""); html.append(defectUrl); html.append("\"/a>"); html.append(defect.getCid()); html.append("</td><td>"); html.append(defect.getCheckerName()); html.append("</td><td>"); html.append(defect.getFilePathname()); html.append("</td></tr>"); // System.out.println("user=" + userDefectValues.getKey() + ", defect=" + defect.getCid()); } html.append("</table></p>"); } } html.append("</body></html>"); if(defectsByUser.size() > 0) { if(this.isDryRun) { System.out.println(html); System.out.println("Recipients that would have received e-mail(s): " + this.users); } else { final String subject = "New Coverity defects"; List<String> recipients = CimProxy.getInstance().notify(this.users, subject, html.toString()); for(String recipient : recipients) { System.out.println("e-mail sucessfully sent to " + recipient); } } } return true; } /* * Main command line driver. Please see class constructor for required arguments. */ public static void main(String[] args) { try { if (args.length == 4) { NotifyDefectManagers notifyManagers = new NotifyDefectManagers( args[0], Integer.parseInt(args[1]), args[2], args[3].equalsIgnoreCase("true")); if (notifyManagers.execute()) { System.out.println("\nSuccessful!"); } else { System.out.println("\n*** Unsuccessful ***"); } } else { System.err.println("This program e-mails a list of users new defects that have been detected in the last N number of days."); System.err.println("usage: java " + UserDefectReport.class.getName() + " <project-name> <num-days> <users-to-email> <is-dry-run>"); } } catch (Exception e) { e.printStackTrace(); } } }