package com.coverity.ps.integrations; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import com.coverity.ps.common.CimProxy; import com.coverity.ws.v4.DefectStateSpecDataObj; import com.coverity.ws.v4.MergedDefectDataObj; import com.coverity.ws.v4.ProjectDataObj; import com.coverity.ws.v4.StreamDataObj; /** * Sets the severity for defects in a project or stream */ public class AssignSeverity implements Integration { private boolean isDryRun; private String streamName; private String projectName; private String configFile; /** * Sets the severity for defects in a project or stream * * @param name stream or project name * @param isProject true if project name, stream otherwise * @param configFile path to the XML mapping file * @param isDryRun */ public AssignSeverity(String name, boolean isProject, String configFile, boolean isDryRun) { this.isDryRun = isDryRun; this.configFile = configFile; if(isProject) { this.projectName = name; this.streamName = ""; } else { this.projectName = ""; this.streamName = name; } } public boolean execute() throws Exception { CimProxy cimProxy = CimProxy.getInstance(); Map<String, String> defectMapping = getDefectMapping(); // get streams List<String> streams = new ArrayList<String>(); if(projectName != null && projectName.length() > 0) { ProjectDataObj project = cimProxy.getProject(this.projectName); for(StreamDataObj stream : project.getStreamLinks()) { streams.add(stream.getId().getName()); } } else { streams.add(this.streamName); } // update defects List<MergedDefectDataObj> defects = cimProxy.getAllMergedDefectsForStreams(streams); for(MergedDefectDataObj defect : defects) { String severity = defect.getSeverity(); final String checkerName = defect.getCheckerName(); if(severity.equals("Unspecified") && defectMapping.containsKey(checkerName)) { severity = defectMapping.get(checkerName); if(!this.isDryRun) { DefectStateSpecDataObj defectStateSpec = new DefectStateSpecDataObj(); defectStateSpec.setSeverity(severity); if(this.projectName != null && this.projectName.length() > 0) { cimProxy.updateDefect(defect.getCid(), this.projectName + "/*", defectStateSpec); } else { cimProxy.updateDefect(defect.getCid(), "*/" + this.streamName, defectStateSpec); } System.out.println("set: defect=" + defect.getCid() + ", severity=" + severity); } else { System.out.println("DRY_RUN - set: defect=" + defect.getCid() + ", severity=" + severity); } } } return true; } private Map<String, String> getDefectMapping() throws Exception { DocumentBuilderFactory documentFactory = DocumentBuilderFactory .newInstance(); DocumentBuilder documentBuilder = documentFactory.newDocumentBuilder(); Document document = documentBuilder.parse(this.configFile); // get checker mapping Map<String, String> defectMapping = new HashMap<String, String>(); NodeList checkerNode = document.getDocumentElement().getElementsByTagName("checker"); for(int i = 0; i < checkerNode.getLength(); i++) { Element checkerElem = (Element) checkerNode.item(i); String checker = checkerElem.getAttribute("name"); String severity = checkerElem.getAttribute("severity"); defectMapping.put(checker, severity); } return defectMapping; } /* * Main command line driver. Please see class constructor for required arguments. */ public static void main(String[] args) { try { if(args.length == 4) { AssignSeverity assignSeverity = new AssignSeverity( args[0], args[1].equalsIgnoreCase("true"), args[2], args[3].equalsIgnoreCase("true")); assignSeverity.execute(); } } catch (Exception e) { e.printStackTrace(); } } }