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; import com.coverity.ws.v4.UserDataObj; /* * Base class for defect reporting */ public abstract class UserDefectReport implements Integration { final static String UNASSIGNED_OWNER_NAME = "Unassigned"; protected boolean isDryRun; protected String projectName; protected int days; protected long projectId; protected UserDefectReport(String project, int days, boolean isDryRun) { this.projectName = project; this.days = days; this.isDryRun = isDryRun; } protected Map<String, List<MergedDefectDataObj>> getProjectDefectsByOwner() throws CovRemoteServiceException_Exception, DatatypeConfigurationException { Map<String, List<MergedDefectDataObj>> defectsByUser = new HashMap<String, List<MergedDefectDataObj>>(); CimProxy cimProxy = CimProxy.getInstance(); // get project id ProjectDataObj projectData = cimProxy.getProject(projectName); if(projectData != null) { this.projectId = projectData.getProjectKey(); // get users Map<String, String> userMap = new HashMap<String, String>(); List<UserDataObj> userList = cimProxy.getAllUsers(); for(UserDataObj user : userList) { userMap.put(user.getUsername(), user.getEmail()); } // calculate as-of date final long oneDay = 1000 * 60 * 60 * 24; GregorianCalendar calendar = new GregorianCalendar(); calendar.setTimeInMillis(System.currentTimeMillis() - this.days * oneDay); XMLGregorianCalendar lastDetected = DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar); System.out.println("as-of-date=" + lastDetected); // get defects MergedDefectFilterSpecDataObj projectFilter = new MergedDefectFilterSpecDataObj(); projectFilter.setFirstDetectedStartDate(lastDetected); List<MergedDefectDataObj> defects = cimProxy.getMergedDefectsForProject(this.projectName, projectFilter); for(MergedDefectDataObj defect : defects) { if(userMap.containsKey(defect.getOwner())) { List<MergedDefectDataObj> userDefects = (List<MergedDefectDataObj>)defectsByUser.get(defect.getOwner()); if(userDefects == null) { userDefects = new ArrayList<MergedDefectDataObj>(); defectsByUser.put(defect.getOwner(), userDefects); } // System.out.println("cid=" + defect.getCid() + ", owner=" + defect.getOwner()); userDefects.add(defect); } else { List<MergedDefectDataObj> userDefects = (List<MergedDefectDataObj>)defectsByUser.get(UNASSIGNED_OWNER_NAME); if(userDefects == null) { userDefects = new ArrayList<MergedDefectDataObj>(); defectsByUser.put(UNASSIGNED_OWNER_NAME, userDefects); } // System.out.println("cid=" + defect.getCid() + ", owner=" + defect.getOwner()); userDefects.add(defect); } } } else { System.err.println("Unable to find project '" + projectName + "'"); } return defectsByUser; } abstract public boolean execute() throws Exception; }