regex-parser/src/jetbrains/teamcity/util/regex/RegexPattern.java (99 lines of code) (raw):
package jetbrains.teamcity.util.regex;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter;
import org.jetbrains.annotations.NotNull;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author Vladislav.Rassokhin
*/
@XStreamAlias("pattern")
public class RegexPattern {
@NotNull
private static final Severity DEFAULT_SEVERITY = Severity.SPECIAL;
@NotNull
private static final String DEFAULT_DESCRIPTION_EXPR = "$0";
private static final boolean DEFAULT_EAT_LINE = true;
@NotNull
@XStreamAlias("regex")
@XStreamAsAttribute
@XStreamConverter(PatternConverter.class)
private final Pattern myPattern;
@XStreamAlias("output-expr")
@XStreamAsAttribute
private String myDescriptionExpression;
@XStreamAlias("severity")
@XStreamAsAttribute
// @XStreamConverter(SeverityConverter.class)
private Severity mySeverity;
@XStreamAlias("eat-line")
@XStreamAsAttribute
private Boolean myEatLine;
public RegexPattern(@NotNull final Pattern pattern, @NotNull final String descriptionExpression, @NotNull final Severity severity, final boolean eatLine) {
this.myPattern = pattern;
this.myDescriptionExpression = descriptionExpression;
this.mySeverity = severity;
this.myEatLine = eatLine;
}
@NotNull
public Pattern getPattern() {
return myPattern;
}
public String getDescriptionExpression() {
return myDescriptionExpression;
}
public Severity getSeverity() {
return mySeverity;
}
public boolean getEatLine() {
return myEatLine;
}
private String parseStr(@NotNull final Matcher matcher, @NotNull final String str) {
return matcher.replaceAll(str);
}
/**
* @param input - input line.
* @return matcher to interpret the input line.
*/
@NotNull
private Matcher getMatcher(@NotNull final CharSequence input) {
return myPattern.matcher(input);
}
/**
* @param matcher - matcher to parse the input line.
* @return parsed description or {@code null}.
*/
protected String getDescription(@NotNull final Matcher matcher) {
return parseStr(matcher, myDescriptionExpression);
}
/**
* Parse a line of build output and register error/warning for
* Problems view.
*
* @param line - one line of output.
* @param parserManager - {@link ParserManager}.
* @return {@code true} if error/warning/info problem was found.
*/
public boolean processLine(@NotNull final String line, @NotNull final ParserManager parserManager) {
final Matcher matcher = getMatcher(line);
// pattern should cover the whole line
if (!(matcher.find() && matcher.group(0).length() == line.length()))
return false;
applyToManager(matcher, parserManager);
return myEatLine;
}
/**
* Log matched string into {@link ParserManager}.
*
* @param matcher - matcher to parse the input line.
* @param parserManager - {@link ParserManager}.
*/
protected void applyToManager(@NotNull final Matcher matcher, @NotNull final ParserManager parserManager) {
parserManager.log(getDescription(matcher), mySeverity);
}
/**
* Special for XStream. Setting null params to defaults.
*
* @return this
*/
@NotNull
@SuppressWarnings({"UnusedDeclaration"})
private Object readResolve() {
if (myEatLine == null) myEatLine = DEFAULT_EAT_LINE;
if (myDescriptionExpression == null) myDescriptionExpression = DEFAULT_DESCRIPTION_EXPR;
if (mySeverity == null) mySeverity = DEFAULT_SEVERITY;
return this;
}
@Override
public boolean equals(final Object o) {
if (o instanceof RegexPattern) {
final RegexPattern rp = (RegexPattern) o;
return this.myEatLine.equals(rp.myEatLine)
&& this.mySeverity.equals(rp.mySeverity)
&& this.myDescriptionExpression.equals(rp.myDescriptionExpression)
&& this.myPattern.pattern().equals(rp.myPattern.pattern());
}
return super.equals(o);
}
public static class PatternConverter extends AbstractSingleValueConverter {
public String toString(@NotNull final Object o) {
return ((Pattern) o).pattern();
}
public Object fromString(final String s) {
return Pattern.compile(s);
}
public boolean canConvert(final Class aClass) {
return Pattern.class.equals(aClass);
}
}
}