package com.coverity.ps.integrations; import java.util.ArrayList; import java.util.HashMap; 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.common.config.ScmConfigData; import com.coverity.ps.common.plugins.scm.ScmPlugin; import com.coverity.ws.v4.DefectStateSpecDataObj; import com.coverity.ws.v4.MergedDefectDataObj; import com.coverity.ws.v4.StreamDataObj; import com.coverity.ws.v4.StreamFilterSpecDataObj; import com.coverity.ws.v4.UserDataObj; /** * Automatic assignment of defects based upon the last person who modified a * given file. This integration uses an SCM plug-in. */ public class AssignDefectOwners implements Integration { private boolean isDryRun; /** * Constructor * * @param isDryRun */ public AssignDefectOwners(boolean isDryRun) { this.isDryRun = isDryRun; } public boolean execute() throws Exception { ConfigurationManager configurationManager = ConfigurationManager.getInstance(); CimProxy cimProxy = CimProxy.getInstance(); // TODO: add support for project (if needed) List<ScmConfigData> scmStreams = configurationManager.getScmStreamData(); for (ScmConfigData scmStreamData : scmStreams) { // check streams StreamFilterSpecDataObj streamFilter = new StreamFilterSpecDataObj(); streamFilter.setNamePattern(scmStreamData.getName()); List<StreamDataObj> stream = cimProxy.getStreams(streamFilter); if (stream.size() != 1) { System.err.println("Unable to find or uniquely identify stream: " + scmStreamData.getName() + "!"); return false; } // get users Map<String, Boolean> userMap = new HashMap<String, Boolean>(); List<UserDataObj> userList = cimProxy.getAllUsers(); for (UserDataObj user : userList) { userMap.put(user.getUsername(), user.isDisabled()); } // get defects List<String> streams = new ArrayList<String>(); streams.add(scmStreamData.getName()); List<MergedDefectDataObj> defects = cimProxy.getAllMergedDefectsForStreams(streams); // load plug-in Class<ScmPlugin> scmClass = (Class<ScmPlugin>) Class.forName(configurationManager.getScmClass()); if (scmClass == null) { System.err.println("Unable load SCM plugin: " + configurationManager.getScmClass() + "!"); return false; } // process defects if (this.isDryRun) { System.out.println("DRY-RUN - stream: " + scmStreamData.getName() + "; processing " + defects.size() + " defect(s)"); } ScmPlugin scm = (ScmPlugin) scmClass.newInstance(); for (MergedDefectDataObj defect : defects) { if (defect.getStatus().equals("New") && defect.getOwner().equals("Unassigned")) { final String coverityPath = defect.getFilePathname(); final String stripPath = scmStreamData.getCimStripPath(); final String prependPath = scmStreamData.getLocalPrependPath(); StringBuffer localfilePath = new StringBuffer(); if (coverityPath.startsWith(stripPath)) { localfilePath.append(coverityPath.substring(stripPath.length())); localfilePath.insert(0, prependPath); } else { localfilePath.append(coverityPath); } if (defect.getOwner() == null || defect.getOwner().length() == 0) { System.out.println("\t*** defect " + defect.getCid() + " already assigned to " + defect.getOwner() + " ***"); } else { String owner = scm.getFileOwner(localfilePath.toString()); if (owner != null && owner.length() > 0) { Boolean isDisabled = userMap.get(owner); if (isDisabled != null && !isDisabled.booleanValue()) { System.out.println("\tassigning defect " + defect.getCid() + " to " + owner + "; file=" + localfilePath); // update defect owner if (!this.isDryRun) { DefectStateSpecDataObj defectStateSpec = new DefectStateSpecDataObj(); defectStateSpec.setOwner(owner); cimProxy.updateDefect(defect.getCid(), "*/" + scmStreamData.getName(), defectStateSpec); } } else { System.out.println("\t*** unable to assign defects to " + owner + ", this user is not in the CIM or might be disabled ***"); } } else { System.out.println("\t*** unable to owner for file=" + localfilePath + " ***"); } } } } } return true; } /* * Main command line driver. Please see class constructor for required * arguments. */ public static void main(String[] args) { try { if (args.length == 1) { AssignDefectOwners assignDefectOwners = new AssignDefectOwners(args[0].equalsIgnoreCase("true")); if (assignDefectOwners.execute()) { System.out.println("\nSuccessful!"); } else { System.out.println("\n*** Unsuccessful ***"); } } else { System.err.println("This program assigns defects to the people who last modified a given file."); System.err.println("usage: java " + AssignDefectOwners.class.getName() + " <is-dry-run>"); } } catch (Exception e) { e.printStackTrace(); } } }