001    /*
002     * SonarQube, open source software quality management tool.
003     * Copyright (C) 2008-2014 SonarSource
004     * mailto:contact AT sonarsource DOT com
005     *
006     * SonarQube is free software; you can redistribute it and/or
007     * modify it under the terms of the GNU Lesser General Public
008     * License as published by the Free Software Foundation; either
009     * version 3 of the License, or (at your option) any later version.
010     *
011     * SonarQube is distributed in the hope that it will be useful,
012     * but WITHOUT ANY WARRANTY; without even the implied warranty of
013     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
014     * Lesser General Public License for more details.
015     *
016     * You should have received a copy of the GNU Lesser General Public License
017     * along with this program; if not, write to the Free Software Foundation,
018     * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
019     */
020    package org.sonar.api.batch.sensor.duplication;
021    
022    import org.sonar.api.batch.fs.InputFile;
023    
024    import java.util.List;
025    
026    /**
027     * This builder is used to declare duplications on files of the project.
028     * Usage:
029     * <code><pre>
030     * DuplicationBuilder builder = context.duplicationBuilder(inputFile);
031     *   .originBlock(2, 10)
032     *   .isDuplicatedBy(inputFile, 14, 22)
033     *   .isDuplicatedBy(anotherInputFile, 3, 11)
034     *   // Start another duplication
035     *   .originBlock(45, 50)
036     *   .isDuplicatedBy(yetAnotherInputFile, 10, 15);
037     *   context.saveDuplications(inputFile, builder.build());
038     * </pre></code>
039     * @since 4.5
040     */
041    public interface DuplicationBuilder {
042    
043      /**
044       * Declare duplication origin block. Then call {@link #isDuplicatedBy(InputFile, int, int)} to reference all duplicates of this block.
045       * Then call again {@link #originBlock(int, int)} to declare another duplication.
046       */
047      DuplicationBuilder originBlock(int startLine, int endLine);
048    
049      /**
050       * Declare duplicate block of the previously declared {@link #originBlock(int, int)}.
051       * @param sameOrOtherFile duplicate can be in the same file or in another file.
052       */
053      DuplicationBuilder isDuplicatedBy(InputFile sameOrOtherFile, int startLine, int endLine);
054    
055      /**
056       * Call this method when you have declared all duplications of the file.
057       */
058      List<DuplicationGroup> build();
059    }