/*
* This program is copyright (c) 2007 Hortis-GRC SA.
*
* This file is part of Sonar.
* Sonar is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Sonar 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Sonar; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
package ch.hortis.sonar.core.service;
import ch.hortis.sonar.model.File;
import ch.hortis.sonar.model.FileMeasure;
import ch.hortis.sonar.model.MavenProject;
import ch.hortis.sonar.model.MetricMeasure;
import ch.hortis.sonar.model.ProjectMeasure;
import ch.hortis.sonar.model.ProjectTendency;
import ch.hortis.sonar.model.RuleFailure;
import ch.hortis.sonar.model.Snapshot;
import ch.hortis.sonar.service.MeasureKey;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
public class Module {
private Snapshot snapshot;
private Map<MeasureKey, MetricMeasure> measuresByKey;
private List<RuleFailure> ruleFailures;
private EntityManager manager;
protected Module(List<File> files, EntityManager manager) {
// for tests
this.manager = manager;
snapshot = new Snapshot();
measuresByKey = new HashMap<MeasureKey, MetricMeasure>(512);
ruleFailures = new ArrayList<RuleFailure>(1024);
snapshot.setFiles(files);
}
protected Module(Snapshot s, EntityManager manager) {
this.manager = manager;
snapshot = s;
measuresByKey = new HashMap<MeasureKey, MetricMeasure>(snapshot.getFileMeasures().size());
for (FileMeasure measure : snapshot.getFileMeasures()) {
MeasureKey key = new MeasureKey(measure);
measuresByKey.put(key, measure);
}
for (ProjectMeasure measure : snapshot.getProjectMeasures()) {
MeasureKey key = new MeasureKey(measure);
measuresByKey.put(key, measure);
}
ruleFailures = Collections.unmodifiableList(snapshot.getRuleFailures());
}
public MavenProject getMavenProject() {
return snapshot.getMavenProject();
}
public Date getCreatedAt() {
return snapshot.getCreatedAt();
}
public Integer getId() {
return snapshot.getId();
}
public void createMeasure(MeasureKey key, Double value) {
MetricMeasure measure;
Double roundedValue = roundUp(value);
if (key.getFile() == null) {
measure = new ProjectMeasure(snapshot, key.getMetric(), roundedValue);
} else {
measure = new FileMeasure(snapshot, key.getMetric(), roundedValue, key.getFile());
}
createMeasure(measure, key);
}
public void createTendency(MeasureKey key, Double value, Integer level, int days) {
Double roundedValue = roundUp(value);
MetricMeasure measure = new ProjectTendency(snapshot, key.getMetric(), roundedValue, level, days);
createMeasure(measure, key);
}
private void createMeasure(MetricMeasure measure, MeasureKey key) {
if (key.getRule() != null) {
measure.setRule(key.getRule());
measure.setRulesCategory(key.getRule().getRulesCategory());
} else if (key.getRulesCategory() != null) {
measure.setRulesCategory(key.getRulesCategory());
}
measure.setSnapshot(snapshot);
if (measure instanceof ProjectMeasure) {
snapshot.getProjectMeasures().add((ProjectMeasure) measure);
manager.persist(measure);
measuresByKey.put(key, measure);
} else if (measure instanceof FileMeasure) {
snapshot.getFileMeasures().add((FileMeasure) measure);
manager.persist(measure);
measuresByKey.put(key, measure);
} else if (measure instanceof ProjectTendency) {
snapshot.getTendencies().add((ProjectTendency) measure);
manager.persist(measure);
} else {
throw new RuntimeException("Unknown measure type " + measure.getClass().getName());
}
}
public final List<MeasureKey> getMeasureKeys() {
List<MeasureKey> keys = new ArrayList<MeasureKey>(measuresByKey.size());
keys.addAll(measuresByKey.keySet());
return keys;
}
public final MetricMeasure getMeasure(MeasureKey key) {
return measuresByKey.get(key);
}
public final Double getMeasureValue(MeasureKey key) {
MetricMeasure measure = getMeasure(key);
if (measure != null) {
return measure.getValue();
}
return null;
}
public final List<RuleFailure> getRuleFailures() {
return ruleFailures;
}
public final List<File> getFiles() {
return snapshot.getFiles();
}
protected double roundUp(double d) {
BigDecimal bd = new BigDecimal(d);
bd = bd.setScale(2, RoundingMode.HALF_UP);
return bd.doubleValue();
}
}