Constraints
Often it does not make sense to allow more than one option of a given set.
J-Clops allows you to indicate restrictions of this kind by annotating your context
class. In the following example, a user can specify either
--verbose or --quiet, but not both:
@OneOf({"quiet", "verbose"})
public class MyProgram {
private boolean verbose;
public void setVerbose () {
this.verbose = true;
}
public void setQuiet () {
this.verbose = false;
}
...
}
The
@OneOf annotation takes an array of long option names as argument
and forces J-Clops to check that exactly one of these options is always present on the
command line. If you want to be a little less restrictive, i.e., also allow the user to
leave out the options alltogether, and make
--quiet the default, you can
use the
@AtMostOneOf annotation instead:
@AtMostOneOf({"quiet", "verbose"})
public class MyProgram {
private boolean verbose = false;
public void setVerbose () {
this.verbose = true;
}
public void setQuiet () {
this.verbose = false;
}
...
}
Note that the fact that
--quiet is now the default results from
initializing the
verbose field to false and has
nothing to do with J-Clops.
You can use both types of annotations together on the same class (but with different options of course).
Because of limitations in the Java annotation system however,
you need to do some extra work when you want to use
the same type of constraint more than
once:
@OneOfList( {
@OneOf({"quiet", "verbose"}),
@OneOf({"cr", "lf", "crlf"})
} )
@AtMostOneOfList( {
@AtMostOneOf({"small", "medium", "big"}),
@AtMostOneOf({"left", "centered", "right"})
} )
public class MyProgram {
...
}
which is, admittedly, a whole mouthful.