Skip to content

Commit

Permalink
Revert "SONAR-6589 Fix bad key computation"
Browse files Browse the repository at this point in the history
This reverts commit a28cb79.
  • Loading branch information
Simon Brandhof committed May 28, 2015
1 parent 8657ef7 commit 924e053
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 144 deletions.
Expand Up @@ -33,6 +33,7 @@
import org.sonar.server.computation.ComputationContext; import org.sonar.server.computation.ComputationContext;
import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.Component;
import org.sonar.server.computation.component.ComponentImpl; import org.sonar.server.computation.component.ComponentImpl;
import org.sonar.server.computation.component.DepthTraversalTypeAwareVisitor;
import org.sonar.server.db.DbClient; import org.sonar.server.db.DbClient;


/** /**
Expand All @@ -48,95 +49,92 @@ public PopulateComponentsUuidAndKeyStep(DbClient dbClient) {


@Override @Override
public void execute(ComputationContext context) { public void execute(ComputationContext context) {
DbSession session = dbClient.openSession(false); new ComponentDepthTraversalTypeAwareVisitor(context).visit(context.getRoot());
try { }
BatchReportReader reportReader = context.getReportReader();
String branch = context.getReportMetadata().hasBranch() ? context.getReportMetadata().getBranch() : null;
BatchReport.Component project = reportReader.readComponent(context.getReportMetadata().getRootComponentRef());
String projectKey = ComponentKeys.createKey(project.getKey(), branch);


Map<String, String> componentUuidByKey = new HashMap<>(); @Override
List<ComponentDto> components = dbClient.componentDao().selectComponentsFromProjectKey(session, projectKey); public String getDescription() {
for (ComponentDto componentDto : components) { return "Feed components uuid";
componentUuidByKey.put(componentDto.getKey(), componentDto.uuid()); }
}
private class ComponentDepthTraversalTypeAwareVisitor extends DepthTraversalTypeAwareVisitor {


ComponentContext componentContext = new ComponentContext(reportReader, componentUuidByKey, branch); private final BatchReportReader reportReader;
private final Map<String, String> componentUuidByKey;


Component root = context.getRoot(); @Nullable
processProject(componentContext, root, projectKey); private final String branch;
processChildren(componentContext, root, root);
session.commit(); private Component nearestModule;
} finally {
session.close(); public ComponentDepthTraversalTypeAwareVisitor(ComputationContext context) {
super(Component.Type.FILE, Order.PRE_ORDER);
this.componentUuidByKey = new HashMap<>();
this.branch = context.getReportMetadata().hasBranch() ? context.getReportMetadata().getBranch() : null;
this.reportReader = context.getReportReader();
this.nearestModule = null;
} }
}


private void recursivelyProcessComponent(ComponentContext componentContext, Component component, Component module) { @Override
switch (component.getType()) { public void visitProject(Component project) {
case MODULE: executeForProject(project);
processModule(componentContext, component); nearestModule = project;
processChildren(componentContext, component, component);
break;
case DIRECTORY:
case FILE:
processDirectoryAndFile(componentContext, component, module);
processChildren(componentContext, component, module);
break;
default:
throw new IllegalStateException(String.format("Unsupported component type '%s'", component.getType()));
} }
}


private void processChildren(ComponentContext componentContext, Component component, Component nearestModule) { @Override
for (Component child : component.getChildren()) { public void visitModule(Component module) {
recursivelyProcessComponent(componentContext, child, nearestModule); executeForModule(module);
nearestModule = module;
} }
}


private void processProject(ComponentContext componentContext, Component component, String projectKey) { @Override
feedComponent((ComponentImpl) component, projectKey, componentContext.componentUuidByKey); public void visitDirectory(Component directory) {
} executeForDirectoryAndFile(directory);
}


private void processModule(ComponentContext componentContext, Component component) { @Override
BatchReport.Component batchComponent = componentContext.reportReader.readComponent(component.getRef()); public void visitFile(Component file) {
String componentKey = ComponentKeys.createKey(batchComponent.getKey(), componentContext.branch); executeForDirectoryAndFile(file);
feedComponent((ComponentImpl) component, componentKey, componentContext.componentUuidByKey); }
}


private void processDirectoryAndFile(ComponentContext componentContext, Component component, Component module) { private void executeForProject(Component component) {
BatchReport.Component batchComponent = componentContext.reportReader.readComponent(component.getRef()); BatchReport.Component project = reportReader.readComponent(component.getRef());
// TODO fail if path is null String projectKey = ComponentKeys.createKey(project.getKey(), branch);
String componentKey = ComponentKeys.createEffectiveKey(module.getKey(), batchComponent.getPath()); DbSession session = dbClient.openSession(false);
feedComponent((ComponentImpl) component, componentKey, componentContext.componentUuidByKey); try {
} List<ComponentDto> components = dbClient.componentDao().selectComponentsFromProjectKey(session, projectKey);
for (ComponentDto componentDto : components) {
componentUuidByKey.put(componentDto.getKey(), componentDto.uuid());
}

feedComponent((ComponentImpl) component, projectKey);
} finally {
session.close();
}
}


private void feedComponent(ComponentImpl component, String componentKey, Map<String, String> componentUuidByKey) { private void executeForModule(Component component) {
component.setKey(componentKey); BatchReport.Component batchComponent = reportReader.readComponent(component.getRef());
String componentKey = ComponentKeys.createKey(batchComponent.getKey(), branch);
feedComponent((ComponentImpl) component, componentKey);
}


String componentUuid = componentUuidByKey.get(componentKey); private void executeForDirectoryAndFile(Component component) {
if (componentUuid == null) { BatchReport.Component batchComponent = reportReader.readComponent(component.getRef());
component.setUuid(Uuids.create()); // TODO fail if path is null
} else { String componentKey = ComponentKeys.createEffectiveKey(nearestModule.getKey(), batchComponent.getPath());
component.setUuid(componentUuid); feedComponent((ComponentImpl) component, componentKey);
} }
}


private static class ComponentContext { private void feedComponent(ComponentImpl component, String componentKey) {
private final BatchReportReader reportReader; component.setKey(componentKey);
private final Map<String, String> componentUuidByKey;
private final String branch;


public ComponentContext(BatchReportReader reportReader, Map<String, String> componentUuidByKey, @Nullable String branch) { String componentUuid = componentUuidByKey.get(componentKey);
this.reportReader = reportReader; if (componentUuid == null) {
this.componentUuidByKey = new HashMap<>(); component.setUuid(Uuids.create());
this.branch = branch; } else {
component.setUuid(componentUuid);
}
} }
} }

@Override
public String getDescription() {
return "Feed components uuid";
}

} }
Expand Up @@ -88,7 +88,7 @@ protected ComputationStep step() {
} }


@Test @Test
public void compute_keys_and_uuids() throws Exception { public void add_components() throws Exception {
File reportDir = temp.newFolder(); File reportDir = temp.newFolder();
BatchReportWriter writer = new BatchReportWriter(reportDir); BatchReportWriter writer = new BatchReportWriter(reportDir);
writer.writeMetadata(BatchReport.Metadata.newBuilder() writer.writeMetadata(BatchReport.Metadata.newBuilder()
Expand Down Expand Up @@ -240,76 +240,6 @@ public void use_branch_to_generate_keys() throws Exception {
assertThat(componentsByRef.get(4).getKey()).isEqualTo("MODULE_KEY:origin/master:src/main/java/dir/Foo.java"); assertThat(componentsByRef.get(4).getKey()).isEqualTo("MODULE_KEY:origin/master:src/main/java/dir/Foo.java");
} }


@Test
public void compute_keys_and_uuids_on_project_having_module_and_directory() throws Exception {
File reportDir = temp.newFolder();
BatchReportWriter writer = new BatchReportWriter(reportDir);
writer.writeMetadata(BatchReport.Metadata.newBuilder()
.setRootComponentRef(1)
.build());

writer.writeComponent(BatchReport.Component.newBuilder()
.setRef(1)
.setType(Constants.ComponentType.PROJECT)
.setKey(PROJECT_KEY)
.addChildRef(2)
.addChildRef(5)
.build());
writer.writeComponent(BatchReport.Component.newBuilder()
.setRef(2)
.setType(Constants.ComponentType.MODULE)
.setKey("MODULE_KEY")
.addChildRef(3)
.build());
writer.writeComponent(BatchReport.Component.newBuilder()
.setRef(3)
.setType(Constants.ComponentType.DIRECTORY)
.setPath("src/main/java/dir")
.addChildRef(4)
.build());
writer.writeComponent(BatchReport.Component.newBuilder()
.setRef(4)
.setType(Constants.ComponentType.FILE)
.setPath("src/main/java/dir/Foo.java")
.build());
writer.writeComponent(BatchReport.Component.newBuilder()
.setRef(5)
.setType(Constants.ComponentType.DIRECTORY)
.setPath("/")
.addChildRef(6)
.build());
writer.writeComponent(BatchReport.Component.newBuilder()
.setRef(6)
.setType(Constants.ComponentType.FILE)
.setPath("pom.xml")
.build());

BatchReportReader batchReportReader = new BatchReportReader(reportDir);
ComputationContext context = new ComputationContext(batchReportReader, PROJECT_KEY, projectSettings,
dbClient, ComponentTreeBuilders.from(batchReportReader), languageRepository);
sut.execute(context);

Map<Integer, Component> componentsByRef = getComponentsByRef(context.getRoot());

assertThat(componentsByRef.get(1).getKey()).isEqualTo(PROJECT_KEY);
assertThat(componentsByRef.get(1).getUuid()).isNotNull();

assertThat(componentsByRef.get(2).getKey()).isEqualTo("MODULE_KEY");
assertThat(componentsByRef.get(2).getUuid()).isNotNull();

assertThat(componentsByRef.get(3).getKey()).isEqualTo("MODULE_KEY:src/main/java/dir");
assertThat(componentsByRef.get(3).getUuid()).isNotNull();

assertThat(componentsByRef.get(4).getKey()).isEqualTo("MODULE_KEY:src/main/java/dir/Foo.java");
assertThat(componentsByRef.get(4).getUuid()).isNotNull();

assertThat(componentsByRef.get(5).getKey()).isEqualTo(PROJECT_KEY + ":/");
assertThat(componentsByRef.get(5).getUuid()).isNotNull();

assertThat(componentsByRef.get(6).getKey()).isEqualTo(PROJECT_KEY + ":pom.xml");
assertThat(componentsByRef.get(6).getUuid()).isNotNull();
}

private static Map<Integer, Component> getComponentsByRef(Component root) { private static Map<Integer, Component> getComponentsByRef(Component root) {
Map<Integer, Component> componentsByRef = new HashMap<>(); Map<Integer, Component> componentsByRef = new HashMap<>();
feedComponentByRef(root, componentsByRef); feedComponentByRef(root, componentsByRef);
Expand Down

0 comments on commit 924e053

Please sign in to comment.