Przeglądaj źródła

SONAR-6993 Load report metadata in a dedicated step

tags/5.3-RC1
Julien Lancelot 8 lat temu
rodzic
commit
cefeabcce2

+ 10
- 5
server/sonar-server/src/main/java/org/sonar/server/computation/analysis/AnalysisMetadataHolderImpl.java Wyświetl plik

@@ -40,10 +40,11 @@ public class AnalysisMetadataHolderImpl implements MutableAnalysisMetadataHolder
private InitializedProperty<Integer> rootComponentRef = new InitializedProperty<>();

@Override
public void setAnalysisDate(Date date) {
public MutableAnalysisMetadataHolder setAnalysisDate(Date date) {
checkNotNull(date, "Date must not be null");
checkState(!analysisDate.isInitialized(), "Analysis date has already been set");
this.analysisDate.setProperty(date.getTime());
return this;
}

@Override
@@ -58,9 +59,10 @@ public class AnalysisMetadataHolderImpl implements MutableAnalysisMetadataHolder
}

@Override
public void setBaseProjectSnapshot(@Nullable Snapshot baseProjectSnapshot) {
public MutableAnalysisMetadataHolder setBaseProjectSnapshot(@Nullable Snapshot baseProjectSnapshot) {
checkState(!this.baseProjectSnapshot.isInitialized(), "Base project snapshot has already been set");
this.baseProjectSnapshot.setProperty(baseProjectSnapshot);
return this;
}

@Override
@@ -71,9 +73,10 @@ public class AnalysisMetadataHolderImpl implements MutableAnalysisMetadataHolder
}

@Override
public void setCrossProjectDuplicationEnabled(boolean isCrossProjectDuplicationEnabled) {
public MutableAnalysisMetadataHolder setCrossProjectDuplicationEnabled(boolean isCrossProjectDuplicationEnabled) {
checkState(!this.crossProjectDuplicationEnabled.isInitialized(), "Cross project duplication flag has already been set");
this.crossProjectDuplicationEnabled.setProperty(isCrossProjectDuplicationEnabled);
return this;
}

@Override
@@ -83,9 +86,10 @@ public class AnalysisMetadataHolderImpl implements MutableAnalysisMetadataHolder
}

@Override
public void setBranch(@Nullable String branch) {
public MutableAnalysisMetadataHolder setBranch(@Nullable String branch) {
checkState(!this.branch.isInitialized(), "Branch has already been set");
this.branch.setProperty(branch);
return this;
}

@Override
@@ -95,9 +99,10 @@ public class AnalysisMetadataHolderImpl implements MutableAnalysisMetadataHolder
}

@Override
public void setRootComponentRef(int rootComponentRef) {
public MutableAnalysisMetadataHolder setRootComponentRef(int rootComponentRef) {
checkState(!this.rootComponentRef.isInitialized(), "Root component ref has already been set");
this.rootComponentRef.setProperty(rootComponentRef);
return this;
}

@Override

+ 5
- 5
server/sonar-server/src/main/java/org/sonar/server/computation/analysis/MutableAnalysisMetadataHolder.java Wyświetl plik

@@ -29,26 +29,26 @@ public interface MutableAnalysisMetadataHolder extends AnalysisMetadataHolder {
* @throws NullPointerException if specified date is {@code null}
* @throws IllegalStateException if the analysis date has already been set
*/
void setAnalysisDate(Date date);
MutableAnalysisMetadataHolder setAnalysisDate(Date date);

/**
* @throws IllegalStateException if baseProjectSnapshot has already been set
*/
void setBaseProjectSnapshot(@Nullable Snapshot baseProjectSnapshot);
MutableAnalysisMetadataHolder setBaseProjectSnapshot(@Nullable Snapshot baseProjectSnapshot);

/**
* @throws IllegalStateException if cross project duplication flag has already been set
*/
void setCrossProjectDuplicationEnabled(boolean isCrossProjectDuplicationEnabled);
MutableAnalysisMetadataHolder setCrossProjectDuplicationEnabled(boolean isCrossProjectDuplicationEnabled);

/**
* @throws IllegalStateException if branch has already been set
*/
void setBranch(@Nullable String branch);
MutableAnalysisMetadataHolder setBranch(@Nullable String branch);

/**
* @throws IllegalStateException if root component ref has already been set
*/
void setRootComponentRef(int rootComponentRef);
MutableAnalysisMetadataHolder setRootComponentRef(int rootComponentRef);

}

+ 2
- 5
server/sonar-server/src/main/java/org/sonar/server/computation/step/BuildComponentTreeStep.java Wyświetl plik

@@ -21,7 +21,6 @@ package org.sonar.server.computation.step;

import com.google.common.base.Function;
import com.google.common.collect.Iterables;
import java.util.Date;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -61,10 +60,8 @@ public class BuildComponentTreeStep implements ComputationStep {

@Override
public void execute() {
analysisMetadataHolder.setAnalysisDate(new Date(reportReader.readMetadata().getAnalysisDate()));
BatchReport.Metadata reportMetadata = reportReader.readMetadata();
String branch = reportMetadata.hasBranch() ? reportMetadata.getBranch() : null;
BatchReport.Component reportProject = reportReader.readComponent(reportMetadata.getRootComponentRef());
String branch = analysisMetadataHolder.getBranch();
BatchReport.Component reportProject = reportReader.readComponent(analysisMetadataHolder.getRootComponentRef());
UuidFactory uuidFactory = new UuidFactory(dbClient, moduleKey(reportProject, branch));
Component project = new ComponentRootBuilder(reportProject, uuidFactory, branch).build();
treeRootHolder.setRoot(project);

+ 54
- 0
server/sonar-server/src/main/java/org/sonar/server/computation/step/LoadReportAnalysisMetadataHolderStep.java Wyświetl plik

@@ -0,0 +1,54 @@
/*
* SonarQube, open source software quality management tool.
* Copyright (C) 2008-2014 SonarSource
* mailto:contact AT sonarsource DOT com
*
* SonarQube 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.
*
* SonarQube 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 02110-1301, USA.
*/

package org.sonar.server.computation.step;

import java.util.Date;
import org.sonar.batch.protocol.output.BatchReport;
import org.sonar.server.computation.analysis.MutableAnalysisMetadataHolder;
import org.sonar.server.computation.batch.BatchReportReader;

/**
* Feed analysis metadata holder with metadata from the analysis report.
*/
public class LoadReportAnalysisMetadataHolderStep implements ComputationStep {

private final BatchReportReader reportReader;
private final MutableAnalysisMetadataHolder mutableAnalysisMetadataHolder;

public LoadReportAnalysisMetadataHolderStep(BatchReportReader reportReader, MutableAnalysisMetadataHolder mutableAnalysisMetadataHolder) {
this.reportReader = reportReader;
this.mutableAnalysisMetadataHolder = mutableAnalysisMetadataHolder;
}

@Override
public void execute() {
BatchReport.Metadata reportMetadata = reportReader.readMetadata();
mutableAnalysisMetadataHolder.setRootComponentRef(reportMetadata.getRootComponentRef());
mutableAnalysisMetadataHolder.setBranch(reportMetadata.hasBranch() ? reportMetadata.getBranch() : null);
mutableAnalysisMetadataHolder.setAnalysisDate(new Date(reportMetadata.getAnalysisDate()));
mutableAnalysisMetadataHolder.setCrossProjectDuplicationEnabled(reportMetadata.hasCrossProjectDuplicationActivated() && reportMetadata.getCrossProjectDuplicationActivated());
}

@Override
public String getDescription() {
return "Load analysis metadata";
}
}

+ 1
- 0
server/sonar-server/src/main/java/org/sonar/server/computation/step/ReportComputationSteps.java Wyświetl plik

@@ -42,6 +42,7 @@ public class ReportComputationSteps implements ComputationSteps {
LogScannerContextStep.class,

// Builds Component tree
LoadReportAnalysisMetadataHolderStep.class,
BuildComponentTreeStep.class,
ValidateProjectStep.class,


+ 11
- 7
server/sonar-server/src/test/java/org/sonar/server/computation/analysis/MutableAnalysisMetadataHolderRule.java Wyświetl plik

@@ -30,7 +30,7 @@ public class MutableAnalysisMetadataHolderRule extends ExternalResource implemen
private AnalysisMetadataHolderImpl delegate = new AnalysisMetadataHolderImpl();

@Override
protected void before() throws Throwable {
protected void after() {
delegate = new AnalysisMetadataHolderImpl();
}

@@ -39,9 +39,9 @@ public class MutableAnalysisMetadataHolderRule extends ExternalResource implemen
return delegate.getAnalysisDate();
}

@Override
public void setAnalysisDate(Date date) {
public MutableAnalysisMetadataHolderRule setAnalysisDate(Date date) {
delegate.setAnalysisDate(date);
return this;
}

@Override
@@ -50,8 +50,9 @@ public class MutableAnalysisMetadataHolderRule extends ExternalResource implemen
}

@Override
public void setBaseProjectSnapshot(@Nullable Snapshot baseProjectSnapshot) {
public MutableAnalysisMetadataHolderRule setBaseProjectSnapshot(@Nullable Snapshot baseProjectSnapshot) {
delegate.setBaseProjectSnapshot(baseProjectSnapshot);
return this;
}

@Override
@@ -66,8 +67,9 @@ public class MutableAnalysisMetadataHolderRule extends ExternalResource implemen
}

@Override
public void setCrossProjectDuplicationEnabled(boolean isCrossProjectDuplicationEnabled) {
public MutableAnalysisMetadataHolderRule setCrossProjectDuplicationEnabled(boolean isCrossProjectDuplicationEnabled) {
delegate.setCrossProjectDuplicationEnabled(isCrossProjectDuplicationEnabled);
return this;
}

@Override
@@ -76,13 +78,15 @@ public class MutableAnalysisMetadataHolderRule extends ExternalResource implemen
}

@Override
public void setBranch(@Nullable String branch) {
public MutableAnalysisMetadataHolderRule setBranch(@Nullable String branch) {
delegate.setBranch(branch);
return this;
}

@Override
public void setRootComponentRef(int rootComponentRef) {
public MutableAnalysisMetadataHolderRule setRootComponentRef(int rootComponentRef) {
delegate.setRootComponentRef(rootComponentRef);
return this;
}

@Override

+ 13
- 21
server/sonar-server/src/test/java/org/sonar/server/computation/step/BuildComponentTreeStepTest.java Wyświetl plik

@@ -26,7 +26,6 @@ import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Nullable;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@@ -34,11 +33,12 @@ import org.junit.runner.RunWith;
import org.sonar.api.utils.System2;
import org.sonar.batch.protocol.Constants;
import org.sonar.batch.protocol.output.BatchReport;
import org.sonar.batch.protocol.output.BatchReport.Metadata;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.SnapshotDto;
import org.sonar.server.computation.analysis.AnalysisMetadataHolderImpl;
import org.sonar.server.computation.analysis.MutableAnalysisMetadataHolder;
import org.sonar.server.computation.analysis.MutableAnalysisMetadataHolderRule;
import org.sonar.server.computation.batch.BatchReportReaderRule;
import org.sonar.server.computation.component.Component;
@@ -75,6 +75,8 @@ public class BuildComponentTreeStepTest {
static final String REPORT_DIR_KEY_2 = "src/main/java/dir2";
static final String REPORT_FILE_KEY_2 = "src/main/java/dir2/File2.java";

static final Date ANALYSIS_DATE = new Date();

@Rule
public DbTester dbTester = DbTester.create(System2.INSTANCE);

@@ -85,22 +87,15 @@ public class BuildComponentTreeStepTest {
public MutableTreeRootHolderRule treeRootHolder = new MutableTreeRootHolderRule();

@Rule
public MutableAnalysisMetadataHolderRule analysisMetadataHolder = new MutableAnalysisMetadataHolderRule();

Date someDate = new Date();
public MutableAnalysisMetadataHolderRule analysisMetadataHolder = new MutableAnalysisMetadataHolderRule()
.setRootComponentRef(ROOT_REF)
.setAnalysisDate(ANALYSIS_DATE)
.setBranch(null);

DbClient dbClient = dbTester.getDbClient();

BuildComponentTreeStep underTest = new BuildComponentTreeStep(dbClient, reportReader, treeRootHolder, analysisMetadataHolder);

@Before
public void setUp() {
reportReader.setMetadata(Metadata.newBuilder()
.setRootComponentRef(ROOT_REF)
.setAnalysisDate(someDate.getTime())
.build());
}

@Test(expected = NullPointerException.class)
public void fails_if_root_component_does_not_exist_in_reportReader() {
underTest.execute();
@@ -130,8 +125,6 @@ public class BuildComponentTreeStepTest {
assertThat(root.getType()).isEqualTo(Component.Type.valueOf(componentType.name()));
assertThat(root.getReportAttributes().getRef()).isEqualTo(ROOT_REF);
assertThat(root.getChildren()).isEmpty();

assertThat(analysisMetadataHolder.getAnalysisDate().getTime()).isEqualTo(someDate.getTime());
}

@Test
@@ -158,8 +151,6 @@ public class BuildComponentTreeStepTest {
Component dir2 = module.getChildren().get(1);
verifyComponent(dir2, Component.Type.DIRECTORY, DIR_REF_2, 1);
verifyComponent(dir2.getChildren().iterator().next(), Component.Type.FILE, FILE_3_REF, 0);

assertThat(analysisMetadataHolder.getAnalysisDate().getTime()).isEqualTo(someDate.getTime());
}

@Test
@@ -199,11 +190,12 @@ public class BuildComponentTreeStepTest {

@Test
public void use_branch_to_generate_keys() {
reportReader.setMetadata(BatchReport.Metadata.newBuilder()
MutableAnalysisMetadataHolder analysisMetadataHolder = new AnalysisMetadataHolderImpl()
.setRootComponentRef(ROOT_REF)
.setBranch("origin/master")
.setProjectKey("")
.build());
.setAnalysisDate(ANALYSIS_DATE)
.setBranch("origin/master");

BuildComponentTreeStep underTest = new BuildComponentTreeStep(dbClient, reportReader, treeRootHolder, analysisMetadataHolder);

reportReader.putComponent(componentWithKey(ROOT_REF, PROJECT, REPORT_PROJECT_KEY, MODULE_REF));
reportReader.putComponent(componentWithKey(MODULE_REF, MODULE, REPORT_MODULE_KEY, DIR_REF_1));

+ 127
- 0
server/sonar-server/src/test/java/org/sonar/server/computation/step/LoadReportAnalysisMetadataHolderStepTest.java Wyświetl plik

@@ -0,0 +1,127 @@
/*
* SonarQube, open source software quality management tool.
* Copyright (C) 2008-2014 SonarSource
* mailto:contact AT sonarsource DOT com
*
* SonarQube 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.
*
* SonarQube 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 02110-1301, USA.
*/

package org.sonar.server.computation.step;

import org.junit.Rule;
import org.junit.Test;
import org.sonar.batch.protocol.output.BatchReport;
import org.sonar.server.computation.analysis.MutableAnalysisMetadataHolderRule;
import org.sonar.server.computation.batch.BatchReportReaderRule;

import static org.assertj.core.api.Assertions.assertThat;

public class LoadReportAnalysisMetadataHolderStepTest {

static long ANALYSIS_DATE = 123456789L;

static String BRANCH = "origin/master";

@Rule
public BatchReportReaderRule reportReader = new BatchReportReaderRule();

@Rule
public MutableAnalysisMetadataHolderRule analysisMetadataHolder = new MutableAnalysisMetadataHolderRule();

ComputationStep underTest = new LoadReportAnalysisMetadataHolderStep(reportReader, analysisMetadataHolder);

@Test
public void set_root_component_ref() throws Exception {
reportReader.setMetadata(
BatchReport.Metadata.newBuilder()
.setRootComponentRef(1)
.build());

underTest.execute();

assertThat(analysisMetadataHolder.getRootComponentRef()).isEqualTo(1);
}

@Test
public void set_analysis_date() throws Exception {
reportReader.setMetadata(
BatchReport.Metadata.newBuilder()
.setAnalysisDate(ANALYSIS_DATE)
.build());

underTest.execute();

assertThat(analysisMetadataHolder.getAnalysisDate()).isEqualTo(ANALYSIS_DATE);
}

@Test
public void set_branch() throws Exception {
reportReader.setMetadata(
BatchReport.Metadata.newBuilder()
.setBranch(BRANCH)
.build());

underTest.execute();

assertThat(analysisMetadataHolder.getBranch()).isEqualTo(BRANCH);
}

@Test
public void set_null_branch_when_nothing_in_the_report() throws Exception {
reportReader.setMetadata(
BatchReport.Metadata.newBuilder()
.build());

underTest.execute();

assertThat(analysisMetadataHolder.getBranch()).isNull();
}

@Test
public void set_cross_project_duplication_to_true() throws Exception {
reportReader.setMetadata(
BatchReport.Metadata.newBuilder()
.setCrossProjectDuplicationActivated(true)
.build());

underTest.execute();

assertThat(analysisMetadataHolder.isCrossProjectDuplicationEnabled()).isEqualTo(true);
}

@Test
public void set_cross_project_duplication_to_false() throws Exception {
reportReader.setMetadata(
BatchReport.Metadata.newBuilder()
.setCrossProjectDuplicationActivated(false)
.build());

underTest.execute();

assertThat(analysisMetadataHolder.isCrossProjectDuplicationEnabled()).isEqualTo(false);
}

@Test
public void set_cross_project_duplication_to_false_when_nothing_in_the_report() throws Exception {
reportReader.setMetadata(
BatchReport.Metadata.newBuilder()
.build());

underTest.execute();

assertThat(analysisMetadataHolder.isCrossProjectDuplicationEnabled()).isEqualTo(false);
}

}

Ładowanie…
Anuluj
Zapisz