}
for (ComponentLinkDto dto : previousLinks) {
- if (!linkType.contains(dto.getType())) {
+ if (!linkType.contains(dto.getType()) && ComponentLinkDto.PROVIDED_TYPES.contains(dto.getType())) {
dbClient.componentLinkDao().delete(session, dto.getId());
}
}
private static String convertType(Constants.ComponentLinkType type) {
switch (type) {
case HOME:
- return "homepage";
+ return ComponentLinkDto.TYPE_HOME_PAGE;
case SCM:
- return "scm";
+ return ComponentLinkDto.TYPE_SOURCES;
case SCM_DEV:
- return "scm_dev";
+ return ComponentLinkDto.TYPE_SOURCES_DEV;
case CI:
- return "ci";
+ return ComponentLinkDto.TYPE_CI;
case ISSUE:
- return "issue";
+ return ComponentLinkDto.TYPE_ISSUE_TRACKER;
default:
throw new IllegalArgumentException(String.format("Unsupported type %s", type.name()));
}
import org.sonar.server.component.DefaultRubyComponentService;
import org.sonar.server.component.db.ComponentDao;
import org.sonar.server.component.db.ComponentIndexDao;
+import org.sonar.server.component.db.ComponentLinkDao;
import org.sonar.server.component.db.SnapshotDao;
import org.sonar.server.component.ws.*;
import org.sonar.server.computation.ComputationThreadLauncher;
System2.INSTANCE,
// DB
- MeasureDao.class,
- MetricDao.class,
- ComponentDao.class,
- SnapshotDao.class,
- MeasureFilterDao.class,
- AnalysisReportDao.class,
- ComponentIndexDao.class,
DbClient.class,
// Elasticsearch
IssueIndex.class,
IssueDao.class,
- ActivityDao.class
+ // measures
+ MeasureDao.class,
+ MetricDao.class,
+ MeasureFilterDao.class,
+
+ // components
+ ComponentDao.class,
+ ComponentIndexDao.class,
+ ComponentLinkDao.class,
+ SnapshotDao.class,
+
+ ActivityDao.class,
+ AnalysisReportDao.class
));
components.addAll(CorePropertyDefinitions.all());
components.addAll(DatabaseMigrations.CLASSES);
assertThat(dbTester.countRowsOfTable("project_links")).isEqualTo(0);
}
+ @Test
+ public void not_delete_custom_link() throws Exception {
+ dbTester.prepareDbUnit(getClass(), "not_delete_custom_link.xml");
+
+ File reportDir = temp.newFolder();
+ BatchReportWriter writer = new BatchReportWriter(reportDir);
+ writer.writeMetadata(BatchReport.Metadata.newBuilder()
+ .setRootComponentRef(1)
+ .setProjectKey("PROJECT_KEY")
+ .setAnalysisDate(150000000L)
+ .build());
+
+ writer.writeComponent(BatchReport.Component.newBuilder()
+ .setRef(1)
+ .setType(Constants.ComponentType.PROJECT)
+ .setUuid("ABCD")
+ .build());
+
+ step.execute(new ComputationContext(new BatchReportReader(reportDir), mock(ComponentDto.class)));
+
+ dbTester.assertDbUnit(getClass(), "not_delete_custom_link.xml", "project_links");
+ }
+
@Test
public void fail_when_trying_to_add_same_link_type_multiple_times() throws Exception {
dbTester.prepareDbUnit(getClass(), "empty.xml");
--- /dev/null
+<dataset>
+
+ <project_links id="1" component_uuid="ABCD" link_type="custom" name="custom" href="http://www.custom.org"/>
+
+</dataset>
package org.sonar.core.component;
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+
/**
* Component links should be merge in a 'links' column (using protobuf for instance) of the projects table.
* But to do this we'll have to wait for the measure filters page (where links are displayed) to be rewritten in JS/WS (because it's in Rails for the moment).
*/
public class ComponentLinkDto {
+ public static String TYPE_HOME_PAGE = "homepage";
+ public static String TYPE_CI = "ci";
+ public static String TYPE_ISSUE_TRACKER = "issue";
+ public static String TYPE_SOURCES = "scm";
+ public static String TYPE_SOURCES_DEV = "scm_dev";
+
+ public static List<String> PROVIDED_TYPES = ImmutableList.of(TYPE_HOME_PAGE, TYPE_CI, TYPE_ISSUE_TRACKER, TYPE_SOURCES, TYPE_SOURCES_DEV);
+
private Long id;
private String componentUuid;
private String type;