/*
* Hibernate Search, full-text search for your domain model
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.checkstyle.checks.regexp;
import com.puppycrawl.tools.checkstyle.api.FileContents;
/**
* A MatchSuppressor used to suppress a violation if it happens inside a {@link String}.
*
* @author Davide D'Alto
*/
public class StringSuppressor implements MatchSuppressor {
private FileContents fileContents;
@Override
public boolean shouldSuppress(int aStartLineNo, int aStartColNo, int aEndLineNo, int aEndColNo) {
return isInsideString( fileContents.getLines()[aStartLineNo - 1], aStartColNo, aEndColNo );
}
public void setCurrentContents(FileContents fileContents) {
this.fileContents = fileContents;
}
/**
* Count the quotes before the double spaces and after, if one of the result is odd it means there is an open double
* quote. Do the same for the part of the text after the spaces.
* <p>
* This function is very simple and it works because we are looking for whitespace characters.
*
* @param line
* the full line of text containing the part that we want to check
* @param aStartColNo
* position of the first white space
* @param aEndColNo
* position of the second white space
* @return true if the two white spaces are inside a string (between quotes)
*/
private boolean isInsideString(String line, int aStartColNo, int aEndColNo) {
if ( isEmpty( line ) ) {
return false;
}
else {
String token = line.substring( 0, aStartColNo );
int before = countQuotes( token );
token = line.substring( aEndColNo + 1 );
int after = countQuotes( token );
return odd( before ) || odd( after );
}
}
private boolean isEmpty(String line) {
return line == null || line.isEmpty();
}
private boolean odd(int num) {
return num % 2 != 0.;
}
private int countQuotes(String token) {
int quoteNumber = 0;
for ( int i = 0; i < token.length(); i++ ) {
if ( token.charAt( i ) == '"' ) {
if ( i == 0 || notEscaped( token, i ) ) {
quoteNumber++;
}
}
}
return quoteNumber;
}
private boolean notEscaped(String token, int i) {
return i > 0 && token.charAt( i - 1 ) != '\\';
}
}