package com.coverity.ps.integrations.reporting;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import com.coverity.ps.common.CimProxy;
import com.coverity.ps.integrations.Integration;
import com.coverity.ws.v4.CovRemoteServiceException_Exception;
import com.coverity.ws.v4.MergedDefectDataObj;
import com.coverity.ws.v4.MergedDefectFilterSpecDataObj;
import com.coverity.ws.v4.ProjectDataObj;
/*
* Base class for defect reporting
*/
public abstract class ComponentDefectReport implements Integration {
protected boolean isDryRun;
protected String projectName;
protected int days;
protected long projectId;
protected XMLGregorianCalendar lastDetected;
protected ComponentDefectReport(String project, int days, boolean isDryRun) {
this.projectName = project;
this.days = days;
this.isDryRun = isDryRun;
}
protected Map<String, List<MergedDefectDataObj>> getProjectDefectsByComponent() throws CovRemoteServiceException_Exception, DatatypeConfigurationException {
Map<String, List<MergedDefectDataObj>> defectsByChecker = new HashMap<String, List<MergedDefectDataObj>>();
CimProxy cimProxy = CimProxy.getInstance();
// get project id
ProjectDataObj projectData = cimProxy.getProject(projectName);
if(projectData != null) {
this.projectId = projectData.getProjectKey();
// calculate as-of date
final long oneDay = 1000 * 60 * 60 * 24;
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTimeInMillis(System.currentTimeMillis() - this.days * oneDay);
this.lastDetected = DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);
System.out.println("as-of-date=" + this.lastDetected);
// get defects
MergedDefectFilterSpecDataObj projectFilter = new MergedDefectFilterSpecDataObj();
projectFilter.setFirstDetectedStartDate(this.lastDetected);
List<MergedDefectDataObj> defects = cimProxy.getMergedDefectsForProject(this.projectName, projectFilter);
for(MergedDefectDataObj defect : defects) {
// TODO: error checking...
final String componentName = defect.getComponentName().substring(defect.getComponentName().lastIndexOf('.') + 1);
List<MergedDefectDataObj> componentDefects = (List<MergedDefectDataObj>)defectsByChecker.get(componentName);
if(componentDefects == null) {
componentDefects = new ArrayList<MergedDefectDataObj>();
defectsByChecker.put(componentName, componentDefects);
}
componentDefects.add(defect);
}
}
else {
System.err.println("Unable to find project '" + projectName + "'");
}
return defectsByChecker;
}
abstract public boolean execute() throws Exception;
}