package hudson.views;
import hudson.Extension;
import hudson.model.AbstractItem;
import hudson.model.Descriptor;
import hudson.model.SCMedItem;
import hudson.model.TopLevelItem;
import hudson.scm.SCM;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import org.kohsuke.stapler.DataBoundConstructor;
/**
* Simple JobFilter that filters jobs based on a regular expression, and
* making use of negate and exclude flags.
*
* TODO limitation - cannot perform validations in hetero list?
*
* @author Jacob Robertson
*/
public class RegExJobFilter extends AbstractIncludeExcludeJobFilter {
static enum ValueType {
NAME, DESCRIPTION, SCM
}
transient private ValueType valueType;
private String valueTypeString;
private String regex;
transient private Pattern pattern;
@DataBoundConstructor
public RegExJobFilter(String regex, String includeExcludeTypeString, String valueTypeString) {
super(includeExcludeTypeString);
this.regex = regex;
this.pattern = Pattern.compile(regex);
this.valueTypeString = valueTypeString;
this.valueType = ValueType.valueOf(valueTypeString);
}
Object readResolve() {
if (regex != null) {
pattern = Pattern.compile(regex);
}
if (valueTypeString != null) {
valueType = ValueType.valueOf(valueTypeString);
}
return super.readResolve();
}
public List<String> getMatchValues(TopLevelItem item) {
List<String> values = new ArrayList<String>();
if (valueType == ValueType.DESCRIPTION) {
if (item instanceof AbstractItem) {
values.add(((AbstractItem) item).getDescription());
}
} else if (valueType == ValueType.SCM) {
if (item instanceof SCMedItem) {
SCM scm = ((SCMedItem) item).getScm();
List<String> scmvalues = ScmFilterHelper.getValues(scm);
values.addAll(scmvalues);
}
} else { // if (valueType == ValueType.NAME) {
values.add(item.getName());
}
return values;
}
public boolean matches(TopLevelItem item) {
List<String> matchValues = getMatchValues(item);
boolean matched = false;
for (String matchValue: matchValues) {
if (matchValue != null &&
pattern.matcher(matchValue).matches()) {
matched = true;
break;
}
}
return matched;
}
public String getRegex() {
return regex;
}
public String getValueTypeString() {
return valueTypeString;
}
@Extension
public static class DescriptorImpl extends Descriptor<ViewJobFilter> {
@Override
public String getDisplayName() {
return "Regular Expression Job Filter";
}
@Override
public String getHelpFile() {
return "/plugin/view-job-filters/regex-help.html";
}
/**
* Checks if the regular expression is valid.
*
* Does not work in hetero-list?
*
public FormValidation doCheckRegex( @QueryParameter String value ) throws IOException, ServletException, InterruptedException {
String v = Util.fixEmpty(value);
if (v != null) {
try {
Pattern.compile(v);
} catch (PatternSyntaxException pse) {
return FormValidation.error(pse.getMessage());
}
}
return FormValidation.ok();
}
*/
}
}