org.sonar.plugins.scmstats.measures.ChangeLogHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.sonar.plugins.scmstats.measures.ChangeLogHandler.java

Source

/*
 * Sonar SCM Stats Plugin
 * Copyright (C) 2012 Patroklos PAPAPETROU
 * dev@sonar.codehaus.org
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
 */
package org.sonar.plugins.scmstats.measures;

import com.google.common.annotations.VisibleForTesting;
import java.util.*;
import org.joda.time.DateTime;
import org.sonar.api.batch.SensorContext;
import org.sonar.plugins.scmstats.ScmStatsConstants;
import org.sonar.plugins.scmstats.model.ChangeLogInfo;
import org.sonar.plugins.scmstats.model.CommitsList;
import org.sonar.plugins.scmstats.utils.MapUtils;

public class ChangeLogHandler {

    private Map<String, CommitsList> commitsPerUser = new HashMap<String, CommitsList>();
    private Map<String, Integer> commitsPerClockHour = new HashMap<String, Integer>();
    private Map<String, Integer> commitsPerWeekDay = new HashMap<String, Integer>();
    private Map<String, Integer> commitsPerMonth = new HashMap<String, Integer>();
    private final List<ChangeLogInfo> changeLogs = new ArrayList<ChangeLogInfo>();
    private final List<String> ignoredAuthors;
    private final List<String> mergedAuthors;

    public ChangeLogHandler(List<String> ignoredAuthors, List<String> mergedAuthors) {
        this.ignoredAuthors = ignoredAuthors;
        this.mergedAuthors = mergedAuthors;
    }

    public final void addChangeLog(String authorName, Date commitDate, Map<String, Integer> fileStatus) {
        if (org.apache.commons.collections.MapUtils.getIntValue(fileStatus, ScmStatsConstants.ACTIVITY_ADD) > 0
                || org.apache.commons.collections.MapUtils.getIntValue(fileStatus,
                        ScmStatsConstants.ACTIVITY_MODIFY) > 0
                || org.apache.commons.collections.MapUtils.getIntValue(fileStatus,
                        ScmStatsConstants.ACTIVITY_DELETE) > 0) {

            changeLogs.add(new ChangeLogInfo(authorName, commitDate, fileStatus));
        }
    }

    public void generateMeasures() {
        for (ChangeLogInfo changeLogInfo : changeLogs) {

            if (!ignoredAuthors.contains(changeLogInfo.getAuthor())) {
                commitsPerUser = updateAuthorActivity(commitsPerUser, changeLogInfo);

                DateTime dt = new DateTime(changeLogInfo.getCommitDate());

                commitsPerClockHour = MapUtils.updateMap(commitsPerClockHour,
                        String.format("%2d", dt.getHourOfDay()).replace(' ', '0'));
                commitsPerWeekDay = MapUtils.updateMap(commitsPerWeekDay, dt.dayOfWeek().getAsString());
                commitsPerMonth = MapUtils.updateMap(commitsPerMonth,
                        String.format("%2d", dt.getMonthOfYear()).replace(' ', '0'));
            }
        }
    }

    public void saveMeasures(SensorContext context, String period) {
        PeriodMeasuresCreatorFactory factory = new PeriodMeasuresCreatorFactory();
        AbstractPeriodMeasuresCreator measuresCreator = factory.getPeriodMeasureCreator(context, period);

        measuresCreator.getCommitsPerMonthMeasure(commitsPerMonth).save();
        measuresCreator.getCommitsPerWeekDayMeasure(commitsPerWeekDay).save();
        measuresCreator.getCommitsPerClockHourMeasure(commitsPerClockHour).save();
        measuresCreator.getCommitsPerUserMeasure(commitsPerUser).save();

    }

    @VisibleForTesting
    protected Map<String, CommitsList> updateAuthorActivity(final Map<String, CommitsList> map,
            final ChangeLogInfo changeLogInfo) {

        final String author = getBasicAuthor(changeLogInfo.getAuthor());

        final Map<String, CommitsList> authorActivity = new HashMap<String, CommitsList>();
        authorActivity.putAll(map);

        final Map<String, Integer> activity = changeLogInfo.getActivity();
        List<Integer> stats = (authorActivity.get(author) == null ? getInitialActivity(activity)
                : authorActivity.get(author).getCommits());

        if (authorActivity.containsKey(author)) {
            final Integer commits = stats.get(0) + 1;
            stats.set(0, commits);
            updateActivity(stats, activity, 1, ScmStatsConstants.ACTIVITY_ADD);
            updateActivity(stats, activity, 2, ScmStatsConstants.ACTIVITY_MODIFY);
            updateActivity(stats, activity, 3, ScmStatsConstants.ACTIVITY_DELETE);
        }
        authorActivity.put(author, new CommitsList(stats));
        return authorActivity;
    }

    private void updateActivity(final List<Integer> stats, final Map<String, Integer> activityType, final int pos,
            final String action) {
        final Integer actions = stats.get(pos)
                + org.apache.commons.collections.MapUtils.getInteger(activityType, action, 0);
        stats.set(pos, actions);
    }

    private List<Integer> getInitialActivity(final Map<String, Integer> activity) {
        return Arrays.asList(1,
                org.apache.commons.collections.MapUtils.getInteger(activity, ScmStatsConstants.ACTIVITY_ADD, 0),
                org.apache.commons.collections.MapUtils.getInteger(activity, ScmStatsConstants.ACTIVITY_MODIFY, 0),
                org.apache.commons.collections.MapUtils.getInteger(activity, ScmStatsConstants.ACTIVITY_DELETE, 0));
    }

    @VisibleForTesting
    protected String getBasicAuthor(String author) {
        if (mergedAuthors != null && !mergedAuthors.isEmpty()) {
            for (String mergeList : mergedAuthors) {
                String[] mergeConfiguration = mergeList.split("=");
                if (mergeConfiguration.length == 2) {
                    String basicAuthor = mergeConfiguration[0];
                    if (author.equals(basicAuthor)) {
                        return basicAuthor;
                    }
                    String secondaryAuthorsList = mergeConfiguration[1];
                    List<String> secondaryAuthors = Arrays.asList(secondaryAuthorsList.split(";"));
                    if (secondaryAuthors.contains(author)) {
                        return basicAuthor;
                    }
                }
            }
        }
        return author;
    }

    public Map<String, Integer> getCommitsPerClockHour() {
        return commitsPerClockHour;
    }

    public Map<String, Integer> getCommitsPerMonth() {
        return commitsPerMonth;
    }

    public Map<String, CommitsList> getCommitsPerUser() {
        return commitsPerUser;
    }

    public Map<String, Integer> getCommitsPerWeekDay() {
        return commitsPerWeekDay;
    }

    public List<ChangeLogInfo> getChangeLogs() {
        return changeLogs;
    }
}