import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.batch.fs.internal.DefaultInputFile;
-import org.sonar.api.database.DatabaseSession;
-import org.sonar.api.database.model.Snapshot;
-import org.sonar.api.resources.Project;
import org.sonar.batch.index.BatchComponentCache;
-import org.sonar.core.duplication.DuplicationDao;
import org.sonar.core.duplication.DuplicationUnitDto;
import org.sonar.duplications.block.Block;
import org.sonar.duplications.block.ByteArray;
-import javax.persistence.Query;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
public class DbDuplicationsIndex {
- private static final String RESOURCE_ID = "resourceId";
- private static final String LAST = "last";
-
private final Map<ByteArray, Collection<Block>> cache = Maps.newHashMap();
- private final int currentProjectSnapshotId;
- private final Integer lastSnapshotId;
- private final String languageKey;
- private final DuplicationDao dao;
- private final DatabaseSession session;
private final BatchComponentCache resourceCache;
- public DbDuplicationsIndex(Project currentProject, DuplicationDao dao,
- String language, DatabaseSession session, BatchComponentCache resourceCache) {
- this.dao = dao;
- this.session = session;
+ public DbDuplicationsIndex(BatchComponentCache resourceCache) {
this.resourceCache = resourceCache;
- Snapshot lastSnapshot = getLastSnapshot(currentProject.getId());
- this.currentProjectSnapshotId = resourceCache.get(currentProject.getEffectiveKey()).snapshotId();
- this.lastSnapshotId = lastSnapshot == null ? null : lastSnapshot.getId();
- this.languageKey = language;
- }
-
- private Snapshot getLastSnapshot(int resourceId) {
- String hql = "SELECT s FROM " + Snapshot.class.getSimpleName() + " s WHERE s.last=:last AND s.resourceId=:resourceId";
- Query query = session.createQuery(hql);
- query.setParameter(LAST, true);
- query.setParameter(RESOURCE_ID, resourceId);
- return session.getSingleResult(query, null);
}
int getSnapshotIdFor(InputFile inputFile) {
}
public void prepareCache(InputFile inputFile) {
- int resourceSnapshotId = getSnapshotIdFor(inputFile);
- List<DuplicationUnitDto> units = dao.selectCandidates(resourceSnapshotId, lastSnapshotId, languageKey);
+ List<DuplicationUnitDto> units = new ArrayList<>();
cache.clear();
// TODO Godin: maybe remove conversion of units to blocks?
for (DuplicationUnitDto unit : units) {
List<DuplicationUnitDto> units = Lists.newArrayList();
for (Block block : blocks) {
DuplicationUnitDto unit = new DuplicationUnitDto(
- currentProjectSnapshotId,
+ // TODO batch is no more creating snapshot
+ null,
resourceSnapshotId,
block.getBlockHash().toString(),
block.getIndexInFile(),
block.getEndLine());
units.add(unit);
}
-
- dao.insert(units);
}
}
package org.sonar.batch.cpd.index;
import com.google.common.annotations.VisibleForTesting;
+import javax.annotation.Nullable;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.sonar.api.batch.BatchSide;
import org.sonar.api.CoreProperties;
+import org.sonar.api.batch.BatchSide;
import org.sonar.api.config.Settings;
-import org.sonar.api.database.DatabaseSession;
import org.sonar.api.resources.Project;
import org.sonar.batch.bootstrap.DefaultAnalysisMode;
-import org.sonar.batch.index.BatchComponentCache;
-import org.sonar.core.duplication.DuplicationDao;
-
-import javax.annotation.Nullable;
@BatchSide
public class IndexFactory {
- private static final Logger LOG = LoggerFactory.getLogger(IndexFactory.class);
-
private final Settings settings;
- private final DuplicationDao dao;
private final DefaultAnalysisMode mode;
- private final DatabaseSession session;
- private final BatchComponentCache resourceCache;
- public IndexFactory(DefaultAnalysisMode mode, Settings settings, @Nullable DuplicationDao dao, @Nullable DatabaseSession session, BatchComponentCache resourceCache) {
+ public IndexFactory(DefaultAnalysisMode mode, Settings settings) {
this.mode = mode;
this.settings = settings;
- this.dao = dao;
- this.session = session;
- this.resourceCache = resourceCache;
- }
-
- /**
- * Used by new sensor mode
- */
- public IndexFactory(DefaultAnalysisMode mode, Settings settings, BatchComponentCache resourceCache) {
- this(mode, settings, null, null, resourceCache);
}
public SonarDuplicationsIndex create(@Nullable Project project, String languageKey) {
- if (verifyCrossProject(project, LOG) && dao != null && session != null) {
- return new SonarDuplicationsIndex(new DbDuplicationsIndex(project, dao, languageKey, session, resourceCache));
- }
return new SonarDuplicationsIndex();
}
import org.slf4j.Logger;
import org.sonar.api.CoreProperties;
import org.sonar.api.config.Settings;
-import org.sonar.api.database.DatabaseSession;
import org.sonar.api.resources.Project;
import org.sonar.batch.bootstrap.DefaultAnalysisMode;
-import org.sonar.batch.index.BatchComponentCache;
-import org.sonar.core.duplication.DuplicationDao;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
project = new Project("foo");
settings = new Settings();
analysisMode = mock(DefaultAnalysisMode.class);
- factory = new IndexFactory(analysisMode, settings, mock(DuplicationDao.class), mock(DatabaseSession.class), new BatchComponentCache());
+ factory = new IndexFactory(analysisMode, settings);
logger = mock(Logger.class);
}