////////////////////////////////////////////////////////////////////////////////
// checkstyle: Checks Java source code for adherence to a set of rules.
// Copyright (C) 2001-2017 the original author or authors.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
////////////////////////////////////////////////////////////////////////////////
package com.puppycrawl.tools.checkstyle.checks.regexp;
import java.util.Optional;
import java.util.regex.Pattern;
import com.puppycrawl.tools.checkstyle.api.AbstractViolationReporter;
/**
* Options for a detector.
* @author Oliver Burn
*/
public final class DetectorOptions {
/**
* Flags to compile a regular expression with.
* See {@link Pattern#flags()}.
*/
private int compileFlags;
/** Used for reporting violations. */
private AbstractViolationReporter reporter;
/**
* Format of the regular expression to check for.
*/
private String format;
/** The message to report on detection. If blank, then use the format. */
private String message = "";
/** Minimum number of times regular expression should occur in a file. */
private int minimum;
/** Maximum number of times regular expression should occur in a file. */
private int maximum;
/** Whether to ignore case when matching. */
private boolean ignoreCase;
/** Used to determine whether to suppress a detected match. */
private MatchSuppressor suppressor;
/** Pattern created from format. Lazily initialized. */
private Pattern pattern;
/** Default constructor.*/
private DetectorOptions() { }
/**
* Returns new Builder object.
* @return Builder object.
*/
public static Builder newBuilder() {
return new DetectorOptions().new Builder();
}
/**
* Format of the regular expression.
* @return format of the regular expression.
*/
public String getFormat() {
return format;
}
/**
* The violation reporter to use.
* @return the violation reporter to use.
*/
public AbstractViolationReporter getReporter() {
return reporter;
}
/**
* The message to report errors with.
* @return the message to report errors with.
*/
public String getMessage() {
return message;
}
/**
* The minimum number of allowed detections.
* @return the minimum number of allowed detections.
*/
public int getMinimum() {
return minimum;
}
/**
* The maximum number of allowed detections.
* @return the maximum number of allowed detections.
*/
public int getMaximum() {
return maximum;
}
/**
* The suppressor to use.
* @return the suppressor to use.
*/
public MatchSuppressor getSuppressor() {
return suppressor;
}
/**
* The pattern to use when matching.
* @return the pattern to use when matching.
*/
public Pattern getPattern() {
if (pattern == null) {
int options = compileFlags;
if (ignoreCase) {
options |= Pattern.CASE_INSENSITIVE;
}
pattern = Pattern.compile(format, options);
}
return pattern;
}
/** Class which implements Builder pattern to build DetectorOptions instance. */
public final class Builder {
/**
* Specifies the violation reporter and returns Builder object.
* @param val for reporting violations.
* @return Builder object.
* @noinspection ReturnOfInnerClass
*/
public Builder reporter(AbstractViolationReporter val) {
reporter = val;
return this;
}
/**
* Specifies the compile flags to compile a regular expression with
* and returns Builder object.
* @param val the format to use when matching lines.
* @return Builder object.
* @noinspection ReturnOfInnerClass
*/
public Builder compileFlags(int val) {
compileFlags = val;
return this;
}
/**
* Specifies the format to use when matching lines and returns Builder object.
* @param val the format to use when matching lines.
* @return Builder object.
* @noinspection ReturnOfInnerClass
*/
public Builder format(String val) {
format = val;
return this;
}
/**
* Specifies message to use when reporting a match and returns Builder object.
* @param val message to use when reporting a match.
* @return Builder object.
* @noinspection ReturnOfInnerClass
*/
public Builder message(String val) {
message = val;
return this;
}
/**
* Specifies the minimum allowed number of detections and returns Builder object.
* @param val the minimum allowed number of detections.
* @return Builder object.
* @noinspection ReturnOfInnerClass
*/
public Builder minimum(int val) {
minimum = val;
return this;
}
/**
* Specifies the maximum allowed number of detections and returns Builder object.
* @param val the maximum allowed number of detections.
* @return Builder object.
* @noinspection ReturnOfInnerClass
*/
public Builder maximum(int val) {
maximum = val;
return this;
}
/**
* Specifies whether to ignore case when matching and returns Builder object.
* @param val whether to ignore case when matching.
* @return Builder object.
* @noinspection ReturnOfInnerClass
*/
public Builder ignoreCase(boolean val) {
ignoreCase = val;
return this;
}
/**
* Specifies the suppressor to use and returns Builder object.
* @param val the suppressor to use.
* @return current instance
* @noinspection ReturnOfInnerClass
*/
public Builder suppressor(MatchSuppressor val) {
suppressor = val;
return this;
}
/**
* Returns new DetectorOptions instance.
* @return DetectorOptions instance.
*/
public DetectorOptions build() {
message = Optional.ofNullable(message).orElse("");
suppressor = Optional.ofNullable(suppressor).orElse(NeverSuppress.INSTANCE);
return DetectorOptions.this;
}
}
}