From 2a6c42b8d308458d6f6fe9f5cc70f6f73976cffb Mon Sep 17 00:00:00 2001 From: David Gageot Date: Tue, 10 Jul 2012 10:03:38 +0200 Subject: [PATCH] SONAR-3437 Cleaner code and fix Oracle mapping --- .../sonar/batch/index/MeasurePersister.java | 73 ++++---- .../org/sonar/core/persistence/MyBatis.java | 10 +- .../sonar/api/database/model/MeasureDto.java | 160 ------------------ ...ureModelMapper.java => MeasureMapper.java} | 8 +- ...er-oracle.xml => MeasureMapper-oracle.xml} | 21 ++- ...asureModelMapper.xml => MeasureMapper.xml} | 16 +- 6 files changed, 68 insertions(+), 220 deletions(-) delete mode 100644 sonar-plugin-api/src/main/java/org/sonar/api/database/model/MeasureDto.java rename sonar-plugin-api/src/main/java/org/sonar/api/database/model/{MeasureModelMapper.java => MeasureMapper.java} (85%) rename sonar-plugin-api/src/main/resources/org/sonar/api/database/model/{MeasureModelMapper-oracle.xml => MeasureMapper-oracle.xml} (68%) rename sonar-plugin-api/src/main/resources/org/sonar/api/database/model/{MeasureModelMapper.xml => MeasureMapper.xml} (75%) diff --git a/sonar-batch/src/main/java/org/sonar/batch/index/MeasurePersister.java b/sonar-batch/src/main/java/org/sonar/batch/index/MeasurePersister.java index 38b8e7ff3a3..e8ed644c2c8 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/index/MeasurePersister.java +++ b/sonar-batch/src/main/java/org/sonar/batch/index/MeasurePersister.java @@ -19,22 +19,16 @@ */ package org.sonar.batch.index; -import javax.annotation.Nullable; - import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Predicate; -import com.google.common.base.Predicates; -import com.google.common.collect.Iterables; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Lists; import com.google.common.collect.SetMultimap; import org.apache.commons.lang.math.NumberUtils; import org.apache.ibatis.session.SqlSession; import org.slf4j.LoggerFactory; -import org.sonar.api.database.model.MeasureDataDto; -import org.sonar.api.database.model.MeasureDto; +import org.sonar.api.database.model.MeasureMapper; import org.sonar.api.database.model.MeasureModel; -import org.sonar.api.database.model.MeasureModelMapper; import org.sonar.api.database.model.Snapshot; import org.sonar.api.measures.Measure; import org.sonar.api.measures.Metric; @@ -46,13 +40,14 @@ import org.sonar.api.rules.RuleFinder; import org.sonar.api.utils.SonarException; import org.sonar.core.persistence.MyBatis; +import javax.annotation.Nullable; + import java.util.Collection; import java.util.List; import java.util.Map; -import static com.google.common.collect.Iterables.filter; - import static com.google.common.base.Predicates.not; +import static com.google.common.collect.Iterables.filter; public final class MeasurePersister { private final MyBatis mybatis; @@ -80,9 +75,9 @@ public final class MeasurePersister { public void dump() { LoggerFactory.getLogger(getClass()).debug("{} measures to dump", unsavedMeasuresByResource.size()); - List measuresToSave = getMeasuresToSave(); - insert(filter(measuresToSave, HAS_LARGE_DATA)); - batchInsert(filter(measuresToSave, not(HAS_LARGE_DATA))); + List measures = getMeasuresToSave(); + insert(filter(measures, HAS_MEASURE_DATA)); + batchInsert(filter(measures, not(HAS_MEASURE_DATA))); } public void saveMeasure(Resource resource, Measure measure) { @@ -135,8 +130,8 @@ public final class MeasurePersister { && (measure.getVariation5() == null || NumberUtils.compare(measure.getVariation5().doubleValue(), 0.0) == 0); } - private List getMeasuresToSave() { - List batch = Lists.newArrayList(); + private List getMeasuresToSave() { + List measures = Lists.newArrayList(); Map> map = unsavedMeasuresByResource.asMap(); for (Map.Entry> entry : map.entrySet()) { @@ -144,13 +139,13 @@ public final class MeasurePersister { Snapshot snapshot = resourcePersister.getSnapshot(entry.getKey()); for (Measure measure : entry.getValue()) { if (shouldPersistMeasure(resource, measure)) { - batch.add(new MeasureDto(model(measure).setSnapshotId(snapshot.getId()))); + measures.add(model(measure).setSnapshotId(snapshot.getId())); } } } unsavedMeasuresByResource.clear(); - return batch; + return measures; } private MeasureModel model(Measure measure) { @@ -188,27 +183,31 @@ public final class MeasurePersister { return model; } - private void batchInsert(Iterable values) { + private void batchInsert(Iterable values) { SqlSession session = mybatis.openBatchSession(); try { - MeasureModelMapper mapper = session.getMapper(MeasureModelMapper.class); - for (MeasureDto value : values) { + MeasureMapper mapper = session.getMapper(MeasureMapper.class); + + for (MeasureModel value : values) { mapper.insert(value); } + session.commit(); } finally { MyBatis.closeQuietly(session); } } - private void insert(Iterable values) { + private void insert(Iterable values) { SqlSession session = mybatis.openSession(); try { - MeasureModelMapper mapper = session.getMapper(MeasureModelMapper.class); - for (MeasureDto value : values) { + MeasureMapper mapper = session.getMapper(MeasureMapper.class); + + for (MeasureModel value : values) { mapper.insert(value); - mapper.insertData(new MeasureDataDto(value.getId(), value.getSnapshotId(), value.getMeasureData().getData())); + mapper.insertData(value); } + session.commit(); } finally { MyBatis.closeQuietly(session); @@ -216,42 +215,46 @@ public final class MeasurePersister { } private MeasureModel insert(Measure measure, Snapshot snapshot) { - MeasureModel model = model(measure).setSnapshotId(snapshot.getId()); + MeasureModel value = model(measure); + value.setSnapshotId(snapshot.getId()); SqlSession session = mybatis.openSession(); try { - MeasureModelMapper mapper = session.getMapper(MeasureModelMapper.class); - MeasureDto value = new MeasureDto(model); + MeasureMapper mapper = session.getMapper(MeasureMapper.class); + mapper.insert(value); if (value.getMeasureData() != null) { - mapper.insertData(new MeasureDataDto(value.getId(), value.getSnapshotId(), value.getMeasureData().getData())); + mapper.insertData(value); } + session.commit(); } finally { MyBatis.closeQuietly(session); } - return model; + return value; } private MeasureModel update(Measure measure) { - MeasureModel model = model(measure); - model.setId(measure.getId()); + MeasureModel value = model(measure); + value.setId(measure.getId()); SqlSession session = mybatis.openSession(); try { - MeasureModelMapper mapper = session.getMapper(MeasureModelMapper.class); - mapper.update(new MeasureDto(model)); + MeasureMapper mapper = session.getMapper(MeasureMapper.class); + + mapper.update(value); + session.commit(); } finally { MyBatis.closeQuietly(session); } - return model; + return value; } - private static final Predicate HAS_LARGE_DATA = new Predicate() { - public boolean apply(@Nullable MeasureDto measure) { + private static final Predicate HAS_MEASURE_DATA = new Predicate() { + public boolean apply(@Nullable MeasureModel measure) { return (null != measure) && (measure.getMeasureData() != null); } }; diff --git a/sonar-core/src/main/java/org/sonar/core/persistence/MyBatis.java b/sonar-core/src/main/java/org/sonar/core/persistence/MyBatis.java index 73825c29e26..9fd5e305e66 100644 --- a/sonar-core/src/main/java/org/sonar/core/persistence/MyBatis.java +++ b/sonar-core/src/main/java/org/sonar/core/persistence/MyBatis.java @@ -33,9 +33,8 @@ import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import org.slf4j.LoggerFactory; import org.sonar.api.BatchComponent; import org.sonar.api.ServerComponent; -import org.sonar.api.database.model.MeasureDataDto; -import org.sonar.api.database.model.MeasureDto; -import org.sonar.api.database.model.MeasureModelMapper; +import org.sonar.api.database.model.MeasureMapper; +import org.sonar.api.database.model.MeasureModel; import org.sonar.core.dashboard.ActiveDashboardDto; import org.sonar.core.dashboard.ActiveDashboardMapper; import org.sonar.core.dashboard.DashboardDto; @@ -129,8 +128,7 @@ public class MyBatis implements BatchComponent, ServerComponent { loadAlias(conf, "UserRole", UserRoleDto.class); loadAlias(conf, "Widget", WidgetDto.class); loadAlias(conf, "WidgetProperty", WidgetPropertyDto.class); - loadAlias(conf, "MeasureDto", MeasureDto.class); - loadAlias(conf, "MeasureDataDto", MeasureDataDto.class); + loadAlias(conf, "MeasureModel", MeasureModel.class); loadMapper(conf, ActiveDashboardMapper.class); loadMapper(conf, AuthorMapper.class); @@ -156,7 +154,7 @@ public class MyBatis implements BatchComponent, ServerComponent { loadMapper(conf, UserMapper.class); loadMapper(conf, WidgetMapper.class); loadMapper(conf, WidgetPropertyMapper.class); - loadMapper(conf, MeasureModelMapper.class); + loadMapper(conf, MeasureMapper.class); sessionFactory = new SqlSessionFactoryBuilder().build(conf); return this; diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/database/model/MeasureDto.java b/sonar-plugin-api/src/main/java/org/sonar/api/database/model/MeasureDto.java deleted file mode 100644 index 67e015ff5cb..00000000000 --- a/sonar-plugin-api/src/main/java/org/sonar/api/database/model/MeasureDto.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar 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. - * - * 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.api.database.model; - -import java.util.Date; - -public class MeasureDto { - private final Long id; - private final Double value; - private final String textValue; - private final Integer tendency; - private final Integer metricId; - private final Integer snapshotId; - private final Integer projectId; - private final String description; - private final Date measureDate; - private final Integer ruleId; - private final Integer rulePriority; - private final String alertStatus; - private final String alertText; - private final Double variationValue1; - private final Double variationValue2; - private final Double variationValue3; - private final Double variationValue4; - private final Double variationValue5; - private final String url; - private final Integer characteristicId; - private final Integer personId; - private final MeasureData measureData; - - public MeasureDto(MeasureModel model) { - id = model.getId(); - value = model.getValue(); - textValue = model.getTextValue(); - tendency = model.getTendency(); - metricId = model.getMetricId(); - snapshotId = model.getSnapshotId(); - projectId = model.getProjectId(); - description = model.getDescription(); - measureDate = model.getMeasureDate(); - ruleId = model.getRuleId(); - rulePriority = (null == model.getRulePriority()) ? null : model.getRulePriority().ordinal(); - alertStatus = (null == model.getAlertStatus()) ? null : model.getAlertStatus().name(); - alertText = model.getAlertText(); - variationValue1 = model.getVariationValue1(); - variationValue2 = model.getVariationValue2(); - variationValue3 = model.getVariationValue3(); - variationValue4 = model.getVariationValue4(); - variationValue5 = model.getVariationValue5(); - url = model.getUrl(); - characteristicId = (null == model.getCharacteristic()) ? null : model.getCharacteristic().getId(); - personId = model.getPersonId(); - measureData = model.getMeasureData(); - } - - public Long getId() { - return id; - } - - public Double getValue() { - return value; - } - - public String getTextValue() { - return textValue; - } - - public Integer getTendency() { - return tendency; - } - - public Integer getMetricId() { - return metricId; - } - - public Integer getSnapshotId() { - return snapshotId; - } - - public Integer getProjectId() { - return projectId; - } - - public String getDescription() { - return description; - } - - public Date getMeasureDate() { - return measureDate; - } - - public Integer getRuleId() { - return ruleId; - } - - public Integer getRulePriority() { - return rulePriority; - } - - public String getAlertStatus() { - return alertStatus; - } - - public String getAlertText() { - return alertText; - } - - public Double getVariationValue1() { - return variationValue1; - } - - public Double getVariationValue2() { - return variationValue2; - } - - public Double getVariationValue3() { - return variationValue3; - } - - public Double getVariationValue4() { - return variationValue4; - } - - public Double getVariationValue5() { - return variationValue5; - } - - public String getUrl() { - return url; - } - - public Integer getCharacteristicId() { - return characteristicId; - } - - public Integer getPersonId() { - return personId; - } - - public MeasureData getMeasureData() { - return measureData; - } -} diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/database/model/MeasureModelMapper.java b/sonar-plugin-api/src/main/java/org/sonar/api/database/model/MeasureMapper.java similarity index 85% rename from sonar-plugin-api/src/main/java/org/sonar/api/database/model/MeasureModelMapper.java rename to sonar-plugin-api/src/main/java/org/sonar/api/database/model/MeasureMapper.java index 77958804d76..59950963747 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/database/model/MeasureModelMapper.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/database/model/MeasureMapper.java @@ -19,10 +19,10 @@ */ package org.sonar.api.database.model; -public interface MeasureModelMapper { - void insert(MeasureDto measure); +public interface MeasureMapper { + void insert(MeasureModel measure); - void insertData(MeasureDataDto data); + void insertData(MeasureModel data); - void update(MeasureDto measure); + void update(MeasureModel measure); } diff --git a/sonar-plugin-api/src/main/resources/org/sonar/api/database/model/MeasureModelMapper-oracle.xml b/sonar-plugin-api/src/main/resources/org/sonar/api/database/model/MeasureMapper-oracle.xml similarity index 68% rename from sonar-plugin-api/src/main/resources/org/sonar/api/database/model/MeasureModelMapper-oracle.xml rename to sonar-plugin-api/src/main/resources/org/sonar/api/database/model/MeasureMapper-oracle.xml index 655f4cecc7a..4213e3c9003 100644 --- a/sonar-plugin-api/src/main/resources/org/sonar/api/database/model/MeasureModelMapper-oracle.xml +++ b/sonar-plugin-api/src/main/resources/org/sonar/api/database/model/MeasureMapper-oracle.xml @@ -1,9 +1,9 @@ - + - + select project_measures_seq.NEXTVAL from DUAL @@ -14,13 +14,20 @@ VALUES (#{id}, #{value}, #{metricId}, #{snapshotId}, #{ruleId}, #{textValue, jdbcType=VARCHAR}, #{tendency}, #{measureDate, jdbcType=TIMESTAMP}, #{projectId}, #{alertStatus, jdbcType=VARCHAR}, #{alertText, jdbcType=VARCHAR}, - #{url, jdbcType=VARCHAR}, #{description, jdbcType=VARCHAR}, #{rulePriority}, #{characteristicId}, #{variationValue1}, + #{url, jdbcType=VARCHAR}, #{description, jdbcType=VARCHAR}, #{rulePriority.ordinal}, #{characteristic.id}, #{variationValue1}, #{variationValue2}, #{variationValue3}, #{variationValue4}, #{variationValue5}, #{personId} ) - - + + + select measure_data_seq.NEXTVAL from DUAL + + INSERT INTO measure_data (id, measure_id, snapshot_id, data) + VALUES (#{id}, #{measureData.measure.id}, #{snapshotId}, #{measureData.data}) + + + UPDATE project_measures SET value = #{value}, @@ -32,8 +39,8 @@ alert_text = #{alertText, jdbcType=VARCHAR}, url = #{url, jdbcType=VARCHAR}, description = #{description, jdbcType=VARCHAR}, - rule_priority = #{rulePriority}, - characteristic_id = #{characteristicId}, + rule_priority = #{rulePriority.ordinal}, + characteristic_id = #{characteristic.id}, variation_value_1 = #{variationValue1}, variation_value_2 = #{variationValue2}, variation_value_3 = #{variationValue3}, diff --git a/sonar-plugin-api/src/main/resources/org/sonar/api/database/model/MeasureModelMapper.xml b/sonar-plugin-api/src/main/resources/org/sonar/api/database/model/MeasureMapper.xml similarity index 75% rename from sonar-plugin-api/src/main/resources/org/sonar/api/database/model/MeasureModelMapper.xml rename to sonar-plugin-api/src/main/resources/org/sonar/api/database/model/MeasureMapper.xml index b396b9c1d0a..b24af941d6a 100644 --- a/sonar-plugin-api/src/main/resources/org/sonar/api/database/model/MeasureModelMapper.xml +++ b/sonar-plugin-api/src/main/resources/org/sonar/api/database/model/MeasureMapper.xml @@ -1,9 +1,9 @@ - + - + INSERT INTO project_measures ( value, metric_id, snapshot_id, rule_id, text_value, tendency, measure_date, project_id, alert_status, alert_text, url, description, rule_priority, characteristic_id, variation_value_1, @@ -11,17 +11,17 @@ VALUES ( #{value}, #{metricId}, #{snapshotId}, #{ruleId}, #{textValue, jdbcType=VARCHAR}, #{tendency}, #{measureDate, jdbcType=TIMESTAMP}, #{projectId}, #{alertStatus, jdbcType=VARCHAR}, #{alertText, jdbcType=VARCHAR}, - #{url, jdbcType=VARCHAR}, #{description, jdbcType=VARCHAR}, #{rulePriority}, #{characteristicId}, #{variationValue1}, + #{url, jdbcType=VARCHAR}, #{description, jdbcType=VARCHAR}, #{rulePriority.ordinal}, #{characteristic.id}, #{variationValue1}, #{variationValue2}, #{variationValue3}, #{variationValue4}, #{variationValue5}, #{personId} ) - + INSERT INTO measure_data (measure_id, snapshot_id, data) - VALUES (#{measureId}, #{snapshotId}, #{data}) + VALUES (#{measureData.measure.id}, #{snapshotId}, #{measureData.data}) - + UPDATE project_measures SET value = #{value}, @@ -33,8 +33,8 @@ alert_text = #{alertText, jdbcType=VARCHAR}, url = #{url, jdbcType=VARCHAR}, description = #{description, jdbcType=VARCHAR}, - rule_priority = #{rulePriority}, - characteristic_id = #{characteristicId}, + rule_priority = #{rulePriority.ordinal}, + characteristic_id = #{characteristic.id}, variation_value_1 = #{variationValue1}, variation_value_2 = #{variationValue2}, variation_value_3 = #{variationValue3}, -- 2.39.5