package it.unisa.sesa.repominer.metrics; import it.unisa.sesa.repominer.db.ChangeDAO; import it.unisa.sesa.repominer.db.PackageMetricDAO; import it.unisa.sesa.repominer.db.ProjectDAO; import it.unisa.sesa.repominer.db.ProjectMetricDAO; import it.unisa.sesa.repominer.db.entities.PackageMetric; import it.unisa.sesa.repominer.db.entities.Project; import it.unisa.sesa.repominer.db.entities.ProjectMetric; import it.unisa.sesa.repominer.db.entities.SourceContainer; import it.unisa.sesa.repominer.metrics.exception.NoChangesException; import it.unisa.sesa.repominer.preferences.PreferenceConstants; import it.unisa.sesa.repominer.preferences.Preferences; import it.unisa.sesa.repominer.preferences.exceptions.IntegerPreferenceException; import it.unisa.sesa.repominer.preferences.exceptions.PeriodLengthTooLong; import java.text.ParseException; import java.util.Date; import java.util.List; /** * This class instantiates and calls methods of {@link ProjectMetrics} and * {@link PackageMetrics}. * * @author RepominerEvo Team * */ public class HistoryMetricsCalculator { /** * This method calculate project metrics for project passed as argument * * @param pProject */ public static void calculateMetrics(Project pProject) { ProjectMetricDAO projecMetricDAO = new ProjectMetricDAO(); ProjectMetrics projectMetrics = new ProjectMetrics(); ProjectMetric nrMetric = projectMetrics.getNumberOfRevision(pProject); projecMetricDAO.saveMetric(nrMetric); System.out.println("NR = " + nrMetric.getValue() + " saved"); Date periodStart = null; Date periodEnd = null; try { periodStart = Preferences.getPeriodStartingDate(); periodEnd = Preferences.getPeriodEndingDate(); ProjectMetric bcc = projectMetrics.getBCCMMetric(pProject, periodStart, periodEnd); projecMetricDAO.saveMetric(bcc); System.out.println("BCCM = " + bcc.getValue() + " saved"); } catch (ParseException e) { System.err .println("BCCM: invalid value for period start/end field into preferences page."); } catch (NoChangesException ex) { System.err.println(ex.getMessage()); } try { int periodLength = Preferences.getPeriodLength(); String periodType = Preferences.getPeriodType(); List<ProjectMetric> bbcPeriods = projectMetrics.getBCCPeriodBased( pProject, periodLength, periodType); int index = 1; for (ProjectMetric singleBCCM : bbcPeriods) { projecMetricDAO.saveMetric(singleBCCM); System.out.println("BCCM period #" + index + " = " + singleBCCM.getValue()); index++; } } catch (IntegerPreferenceException ex) { System.err.println(ex.getMessage()); } catch (PeriodLengthTooLong ex) { System.err.println(ex.getMessage()); } String eccmModality = Preferences.getECCMModality(); if (eccmModality.equals(PreferenceConstants.ECCM_TIME_VALUE)) { try { int periodLength = Preferences.getPeriodLength(); String periodType = Preferences.getPeriodType(); List<ProjectMetric> staticEccPeriods = projectMetrics .getECCPeriodBased(pProject, periodLength, periodType, true); int index = 1; for (ProjectMetric projectMetric : staticEccPeriods) { projecMetricDAO.saveMetric(projectMetric); System.out.println("Normalized ECCM period #" + index + " = " + projectMetric.getValue() + " saved"); index++; } index = 1; List<ProjectMetric> adaptiveEccPeriods = projectMetrics .getECCPeriodBased(pProject, periodLength, periodType, false); for (ProjectMetric projectMetric : adaptiveEccPeriods) { projecMetricDAO.saveMetric(projectMetric); System.out.println("Adaptive ECCM period #" + index + " = " + projectMetric.getValue() + " saved"); index++; } } catch (IntegerPreferenceException ex) { System.err.println(ex.getMessage()); } catch (PeriodLengthTooLong ex) { System.err.println(ex.getMessage()); } } else if (eccmModality .equals(PreferenceConstants.ECCM_MODIFICATION_VALUE)) { try { int modificationLimit = Preferences.getECCMModificationLimit(); List<ProjectMetric> staticEccPeriods = projectMetrics .getECCModificationBased(pProject, modificationLimit, true); int index = 1; if (staticEccPeriods.isEmpty()) { System.err .println("ECCM: no file has changed (0.0 value)!"); } for (ProjectMetric projectMetric : staticEccPeriods) { projecMetricDAO.saveMetric(projectMetric); System.out.println("Normalized ECCM period #" + index + ": " + projectMetric.getValue() + " saved"); index++; } index = 1; List<ProjectMetric> adaptiveEccPeriods = projectMetrics .getECCModificationBased(pProject, modificationLimit, false); if (adaptiveEccPeriods.isEmpty()) { System.out .println("ECCM: no file has changed (0.0 value)!"); } for (ProjectMetric projectMetric : adaptiveEccPeriods) { projecMetricDAO.saveMetric(projectMetric); System.out.println("Adaptive ECCM period #" + index + " = " + projectMetric.getValue() + " saved"); index++; } } catch (IntegerPreferenceException ex) { System.err.println(ex.getMessage()); } catch (NoChangesException ex) { System.err.println(ex.getMessage()); } } else if (eccmModality.equals(PreferenceConstants.ECCM_BURST_VALUE)) { try { int epsValue = Preferences.getEpsParameter(); int minPointsValue = Preferences.getMinPointsParameter(); List<ProjectMetric> staticEccPeriods = projectMetrics .getECCBurstBased(pProject, epsValue, minPointsValue, true); int index = 1; if (staticEccPeriods.isEmpty()) { System.err .println("ECCM-Static: no file has changed or not burst detected (0.0 value)!"); } for (ProjectMetric projectMetric : staticEccPeriods) { projecMetricDAO.saveMetric(projectMetric); System.out.println("Normalized ECCM burst period #" + index + " = " + projectMetric.getValue() + " saved"); index++; } index = 1; List<ProjectMetric> adaptiveEccPeriods = projectMetrics .getECCBurstBased(pProject, epsValue, minPointsValue, false); if (adaptiveEccPeriods.isEmpty()) { System.err .println("ECCM-Adaptive: no file has changed or not burst detected (0.0 value)!"); } for (ProjectMetric projectMetric : adaptiveEccPeriods) { projecMetricDAO.saveMetric(projectMetric); System.out.println("Adaptive ECCM burst period #" + index + " = " + projectMetric.getValue() + " saved"); index++; } } catch (IntegerPreferenceException e) { e.printStackTrace(); } catch (NoChangesException ex) { System.err.println(ex.getMessage()); } } } /** * This method calculate package metrics for package passed as argument * * @param pSourceContainer */ public static void calculateMetrics(SourceContainer pSourceContainer) { PackageMetrics packageMetrics = new PackageMetrics(); PackageMetricDAO packageMetricDAO = new PackageMetricDAO(); Date startDate = new ChangeDAO().getProjectStartDate(new ProjectDAO() .getProject(pSourceContainer.getProjectId())); Date endDate = new ChangeDAO().getProjectEndDate(new ProjectDAO() .getProject(pSourceContainer.getProjectId())); int NAUTH = packageMetrics.getNumberOfAuthor(pSourceContainer); PackageMetric nauth = new PackageMetric(); nauth.setDescription("Number of authors of changes made on a package"); nauth.setName("NAUTH"); nauth.setPackageId(pSourceContainer.getId()); nauth.setValue(new Double(NAUTH)); nauth.setStart(startDate); nauth.setEnd(endDate); packageMetricDAO.saveMetric(nauth); System.out.println("NAUTH = " + NAUTH + " saved"); double changeSetSize = packageMetrics .getMeanDimensionOfModifiedFiles(pSourceContainer); PackageMetric meanChangeSetSize = new PackageMetric(); meanChangeSetSize .setDescription("Mean dimension of modified files of a package"); meanChangeSetSize.setName("mean_CHANGE_SET_SIZE"); meanChangeSetSize.setPackageId(pSourceContainer.getId()); meanChangeSetSize.setValue(new Double(changeSetSize)); meanChangeSetSize.setStart(startDate); meanChangeSetSize.setEnd(endDate); packageMetricDAO.saveMetric(meanChangeSetSize); System.out .println("mean_CHANGE_SET_SIZE = " + changeSetSize + " saved"); double mean_NCHANGE_value = packageMetrics .getMeanNumberOfChange(pSourceContainer); PackageMetric meanNChange = new PackageMetric(); meanNChange .setDescription("Mean number of time in which files of a package have been modified"); meanNChange.setName("mean_NCHANGE"); meanNChange.setPackageId(pSourceContainer.getId()); meanNChange.setValue(new Double(mean_NCHANGE_value)); meanNChange.setStart(startDate); meanNChange.setEnd(endDate); packageMetricDAO.saveMetric(meanNChange); System.out.println("mean_NCHANGE = " + mean_NCHANGE_value + " saved"); double mean_NREF_value = packageMetrics .getMeanNumberOfChangeForRefactoring(pSourceContainer); PackageMetric meanNRefMetric = new PackageMetric(); meanNRefMetric .setDescription("Mean number of time in which files of a package have been refactored"); meanNRefMetric.setName("mean_NREF"); meanNRefMetric.setPackageId(pSourceContainer.getId()); meanNRefMetric.setValue(new Double(mean_NREF_value)); meanNRefMetric.setStart(startDate); meanNRefMetric.setEnd(endDate); packageMetricDAO.saveMetric(meanNRefMetric); System.out.println("mean_NREF = " + mean_NREF_value + " saved"); double mean_NFIX_value = packageMetrics .getMeanNumberOfChangeForBugFix(pSourceContainer); PackageMetric meanNFixMetric = new PackageMetric(); meanNFixMetric .setDescription("Mean number of time in which files of a package have been fixed for a bug"); meanNFixMetric.setName("mean_NFIX"); meanNFixMetric.setPackageId(pSourceContainer.getId()); meanNFixMetric.setValue(new Double(mean_NFIX_value)); meanNFixMetric.setStart(startDate); meanNFixMetric.setEnd(endDate); packageMetricDAO.saveMetric(meanNFixMetric); System.out.println("mean_NFIX = " + mean_NFIX_value + " saved"); Double[] info = packageMetrics .getInsertionsAndDelitionsInfo(pSourceContainer); Double sum = info[0]; PackageMetric sumInsertionsMetric = new PackageMetric(); sumInsertionsMetric .setDescription("Sum of all the insertions or deletions made on the files of a package"); sumInsertionsMetric.setName("Sum_LINES"); sumInsertionsMetric.setPackageId(pSourceContainer.getId()); sumInsertionsMetric.setValue(new Double(sum)); sumInsertionsMetric.setStart(startDate); sumInsertionsMetric.setEnd(endDate); packageMetricDAO.saveMetric(sumInsertionsMetric); System.out.println("Sum_LINES = " + sum + " saved"); Double mean = info[1]; PackageMetric meanInsertionsMetric = new PackageMetric(); meanInsertionsMetric .setDescription("Mean number of insertions or deletions made on the files of a package"); meanInsertionsMetric.setName("Mean_LINES"); meanInsertionsMetric.setPackageId(pSourceContainer.getId()); meanInsertionsMetric.setValue(new Double(mean)); meanInsertionsMetric.setStart(startDate); meanInsertionsMetric.setEnd(endDate); packageMetricDAO.saveMetric(meanInsertionsMetric); System.out.println("Mean_LINES = " + mean + " saved"); Double max = info[2]; PackageMetric maxInsertionsMetric = new PackageMetric(); maxInsertionsMetric .setDescription("Maximum number of insertions or deletions made on the files of a package"); maxInsertionsMetric.setName("Max_LINES"); maxInsertionsMetric.setPackageId(pSourceContainer.getId()); maxInsertionsMetric.setValue(new Double(max)); maxInsertionsMetric.setStart(startDate); maxInsertionsMetric.setEnd(endDate); packageMetricDAO.saveMetric(maxInsertionsMetric); System.out.println("Max_LINES = " + max + " saved"); } }