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 com.google.common.annotations.Beta;
023    import org.sonar.api.batch.fs.InputFile;
024    
025    import java.util.List;
026    
027    /**
028     * Experimental, do not use.
029     * <p/>
030     * This builder is used to declare duplications on files of the project.
031     * Usage:
032     * <code><pre>
033     * DuplicationBuilder builder = context.duplicationBuilder(inputFile);
034     *   .originBlock(2, 10)
035     *   .isDuplicatedBy(inputFile, 14, 22)
036     *   .isDuplicatedBy(anotherInputFile, 3, 11)
037     *   // Start another duplication
038     *   .originBlock(45, 50)
039     *   .isDuplicatedBy(yetAnotherInputFile, 10, 15);
040     *   context.saveDuplications(inputFile, builder.build());
041     * </pre></code>
042     * @since 4.5
043     */
044    @Beta
045    public interface DuplicationBuilder {
046    
047      /**
048       * Declare duplication origin block. Then call {@link #isDuplicatedBy(InputFile, int, int)} to reference all duplicates of this block.
049       * Then call again {@link #originBlock(int, int)} to declare another duplication.
050       */
051      DuplicationBuilder originBlock(int startLine, int endLine);
052    
053      /**
054       * Declare duplicate block of the previously declared {@link #originBlock(int, int)}.
055       * @param sameOrOtherFile duplicate can be in the same file or in another file.
056       */
057      DuplicationBuilder isDuplicatedBy(InputFile sameOrOtherFile, int startLine, int endLine);
058    
059      /**
060       * Call this method when you have declared all duplications of the file.
061       */
062      List<DuplicationGroup> build();
063    }