in codeanalyzer/src/main/java/nl/obren/sokrates/sourcecode/duplication/impl/Blocks.java [204:250]
private void findDuplicatesWithinFiles() {
resetProgressValues(files.getFiles().size());
reportProgress("Finding duplicates within files");
files.getFiles().forEach(fileLineIndexes -> {
if (progressFeedback != null && progressFeedback.canceled()) {
return;
}
reportProgressNextStep();
List<DuplicateRange> ranges = new ArrayList<>();
FileInfoForDuplication copy = new FileInfoForDuplication();
copy.setSourceFile(fileLineIndexes.getSourceFile());
copy.setBlocks(fileLineIndexes.getBlocks());
copy.getLineIDs().addAll(fileLineIndexes.getLineIDs());
for (int blockSize = copy.getBiggestBlockSize(); blockSize >= minDuplicationBlockSize; blockSize--) {
final int currentBlockSize = blockSize;
final List<Block> blocks = copy.extractBlocks(currentBlockSize);
blocks.forEach(block -> {
block.extractAllPossibleSubBlocks(currentBlockSize).forEach(subBlock -> {
List<Integer> indexesOf = copy.indexesOf(subBlock);
if (indexesOf.size() > 1) {
DuplicationInstance instance = duplicationInstances.get(subBlock.getStringKey());
if (instance == null) {
instance = new DuplicationInstance();
instance.setBlockSize(currentBlockSize);
}
final DuplicationInstance currentInstance = instance;
indexesOf.forEach(index -> {
DuplicateRange range = new DuplicateRange(index, index + currentBlockSize - 1);
if (!alreadyIncludedInRange(ranges, range)) {
addFileToDuplicationInstance(currentInstance, copy.getSourceFile(), index + 1, currentBlockSize);
ranges.add(range);
}
});
if (instance.getDuplicatedFileBlocks().size() > 1) {
duplicationInstances.put(subBlock.getStringKey(), instance);
}
}
// copy.clearSubBlock(subBlock);
});
});
}
});
resetProgressValues(0);
}