From a34186bbf19de1addcc51ea2bbcbc4ec04bb4367 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Thu, 30 Jun 2011 08:54:51 -0700 Subject: [PATCH] Added a better form validation for non-existent/typo in labels --- changelog.html | 2 + .../java/hudson/model/AbstractProject.java | 11 ++- core/src/main/java/hudson/model/Label.java | 71 +++++++++++++++++++ .../java/hudson/model/labels/LabelAtom.java | 21 ++++++ .../hudson/model/labels/LabelExpression.java | 36 +++++++++- .../hudson/model/labels/LabelVisitor.java | 24 +++++++ .../hudson/model/Messages.properties | 1 + .../model/labels/LabelExpressionTest.java | 15 ++++ 8 files changed, 176 insertions(+), 5 deletions(-) create mode 100644 core/src/main/java/hudson/model/labels/LabelVisitor.java diff --git a/changelog.html b/changelog.html index 37b6c40ca7..0d69a9a3d3 100644 --- a/changelog.html +++ b/changelog.html @@ -75,6 +75,8 @@ Upcoming changes (issue 10066)
  • Groovy script console is now syntax highlighted. +
  • + Improved the form validation to the "restrict where jobs can run" field.
  • Text area to enter description is now syntax highlighted. diff --git a/core/src/main/java/hudson/model/AbstractProject.java b/core/src/main/java/hudson/model/AbstractProject.java index d97505ff43..c111792991 100644 --- a/core/src/main/java/hudson/model/AbstractProject.java +++ b/core/src/main/java/hudson/model/AbstractProject.java @@ -1859,9 +1859,16 @@ public abstract class AbstractProject

    ,R extends A return FormValidation.error(e, Messages.AbstractProject_AssignedLabelString_InvalidBooleanExpression(e.getMessage())); } - // TODO: if there's an atom in the expression that is empty, report it - if (Jenkins.getInstance().getLabel(value).isEmpty()) + Label l = Jenkins.getInstance().getLabel(value); + if (l.isEmpty()) { + for (LabelAtom a : l.listAtoms()) { + if (a.isEmpty()) { + LabelAtom nearest = LabelAtom.findNearest(a.getName()); + return FormValidation.warning(Messages.AbstractProject_AssignedLabelString_NoMatch_DidYouMean(a.getName(),nearest.getDisplayName())); + } + } return FormValidation.warning(Messages.AbstractProject_AssignedLabelString_NoMatch()); + } return FormValidation.ok(); } diff --git a/core/src/main/java/hudson/model/Label.java b/core/src/main/java/hudson/model/Label.java index 68235cddc2..e03abcc52c 100644 --- a/core/src/main/java/hudson/model/Label.java +++ b/core/src/main/java/hudson/model/Label.java @@ -29,9 +29,17 @@ import static hudson.Util.fixNull; import hudson.model.labels.LabelAtom; import hudson.model.labels.LabelExpression; +import hudson.model.labels.LabelExpression.And; +import hudson.model.labels.LabelExpression.Binary; +import hudson.model.labels.LabelExpression.Iff; +import hudson.model.labels.LabelExpression.Implies; +import hudson.model.labels.LabelExpression.Not; +import hudson.model.labels.LabelExpression.Or; +import hudson.model.labels.LabelExpression.Paren; import hudson.model.labels.LabelExpressionLexer; import hudson.model.labels.LabelExpressionParser; import hudson.model.labels.LabelOperatorPrecedence; +import hudson.model.labels.LabelVisitor; import hudson.slaves.NodeProvisioner; import hudson.slaves.Cloud; import hudson.util.QuotedStringTokenizer; @@ -358,6 +366,22 @@ public abstract class Label extends Actionable implements Comparable