001//////////////////////////////////////////////////////////////////////////////// 002// checkstyle: Checks Java source code for adherence to a set of rules. 003// Copyright (C) 2001-2017 the original author or authors. 004// 005// This library is free software; you can redistribute it and/or 006// modify it under the terms of the GNU Lesser General Public 007// License as published by the Free Software Foundation; either 008// version 2.1 of the License, or (at your option) any later version. 009// 010// This library is distributed in the hope that it will be useful, 011// but WITHOUT ANY WARRANTY; without even the implied warranty of 012// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 013// Lesser General Public License for more details. 014// 015// You should have received a copy of the GNU Lesser General Public 016// License along with this library; if not, write to the Free Software 017// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 018//////////////////////////////////////////////////////////////////////////////// 019 020package com.puppycrawl.tools.checkstyle.checks.header; 021 022import java.io.File; 023import java.util.Arrays; 024 025import com.puppycrawl.tools.checkstyle.api.FileText; 026 027/** 028 * Checks the header of the source against a fixed header file. 029 * In default configuration,if header is not specified, 030 * the default value of header is set to null 031 * and the check does not rise any violations. 032 * 033 * @author Lars Kühne 034 */ 035public class HeaderCheck extends AbstractHeaderCheck { 036 037 /** 038 * A key is pointing to the warning message text in "messages.properties" 039 * file. 040 */ 041 public static final String MSG_MISSING = "header.missing"; 042 043 /** 044 * A key is pointing to the warning message text in "messages.properties" 045 * file. 046 */ 047 public static final String MSG_MISMATCH = "header.mismatch"; 048 049 /** Empty array to avoid instantiations. */ 050 private static final int[] EMPTY_INT_ARRAY = new int[0]; 051 052 /** The header lines to ignore in the check, sorted. */ 053 private int[] ignoreLines = EMPTY_INT_ARRAY; 054 055 /** 056 * Returns true if lineNo is header lines or false. 057 * @param lineNo a line number 058 * @return if {@code lineNo} is one of the ignored header lines. 059 */ 060 private boolean isIgnoreLine(int lineNo) { 061 return Arrays.binarySearch(ignoreLines, lineNo) >= 0; 062 } 063 064 /** 065 * Checks if a code line matches the required header line. 066 * @param lineNumber the line number to check against the header 067 * @param line the line contents 068 * @return true if and only if the line matches the required header line 069 */ 070 private boolean isMatch(int lineNumber, String line) { 071 // skip lines we are meant to ignore 072 return isIgnoreLine(lineNumber + 1) 073 || getHeaderLines().get(lineNumber).equals(line); 074 } 075 076 /** 077 * Set the lines numbers to ignore in the header check. 078 * @param list comma separated list of line numbers to ignore in header. 079 */ 080 public void setIgnoreLines(int... list) { 081 if (list.length == 0) { 082 ignoreLines = EMPTY_INT_ARRAY; 083 } 084 else { 085 ignoreLines = new int[list.length]; 086 System.arraycopy(list, 0, ignoreLines, 0, list.length); 087 Arrays.sort(ignoreLines); 088 } 089 } 090 091 @Override 092 protected void processFiltered(File file, FileText fileText) { 093 if (getHeaderLines().size() > fileText.size()) { 094 log(1, MSG_MISSING); 095 } 096 else { 097 for (int i = 0; i < getHeaderLines().size(); i++) { 098 if (!isMatch(i, fileText.get(i))) { 099 log(i + 1, MSG_MISMATCH, getHeaderLines().get(i)); 100 break; 101 } 102 } 103 } 104 } 105 106 @Override 107 protected void postProcessHeaderLines() { 108 // no code 109 } 110}