private void findDuplicatesWithinFiles()

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);
    }