<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Hi everyone,<div>Several questions have been raised around groups recently. I have&nbsp;adjusted&nbsp;the spec to answer them. Can you review the wording (esp the addition to the formal rules)? I put changes in&nbsp;<font class="Apple-style-span" color="#E01D27">red</font>.</div><div><br></div><div>The idea is:</div><div>&nbsp;- an interface representing a group sequence cannot have inherited groups</div><div>&nbsp;- a constraint declaration cannot use a group reprensenting a group sequence</div><div>&nbsp;- when a group A is sequenced before B, all groups composing A (via inheritance or group sequence) are sequenced before B</div><div>&nbsp;- if a circularity arise, an exception happens</div><div><br></div><div><br></div><div><br></div><div><span class="Apple-style-span" style="font-family: -webkit-sans-serif; font-size: 14px; "><div class="titlepage" style="font-family: sans-serif; font-size: 14px; "><div style="font-family: sans-serif; font-size: 14px; "><div style="font-family: sans-serif; font-size: 14px; "><h2 class="title" style="clear: both; font-family: sans-serif; color: rgb(0, 51, 153); font-size: 140%; margin-top: 10px; padding-top: 5px; font-weight: bold; ">3.4.&nbsp;Group and group sequence</h2></div></div><div style="font-family: sans-serif; font-size: 14px; "></div></div><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">A group defines a subset of constraints. Instead of validating all constraints for a given object graph, only a subset is validated depending on the group targeted. Each constraint declaration defines the list of groups it belongs to. If no group is explicitly declared, a constraint belongs to the&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;group.</p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">Groups are represented by interfaces.</p><div class="example" style="font-family: sans-serif; font-size: 14px; "><a name="d0e923" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); "></a><p class="title" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); margin-top: 10px; padding-top: 5px; font-weight: bold; "><b style="font-family: sans-serif; font-size: 14px; ">Example&nbsp;3.1.&nbsp;Definition of groups</b></p><pre class="programlisting" style="font-size: 100%; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); background-color: rgb(244, 244, 244); font-family: monospace; width: auto; ">/**
 * Validation group checking a user is billable
 */
public interface Billable {}

/**
 * customer can buy without harrassing checking process
 */
public interface BuyInOneClick {
}</pre></div><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">A constraint can belong to one or more groups.</p><div class="example" style="font-family: sans-serif; font-size: 14px; "><a name="example-assigngrouptoconstraints" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); "></a><p class="title" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); margin-top: 10px; padding-top: 5px; font-weight: bold; "><b style="font-family: sans-serif; font-size: 14px; ">Example&nbsp;3.2.&nbsp;Assign groups to constraints</b></p><pre class="programlisting" style="font-size: 100%; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); background-color: rgb(244, 244, 244); font-family: monospace; width: auto; ">/**
 * User representation
 */
public class User {
    @NotNull
    private String firstname;

    @NotNull(groups = Default.class)
    private String lastname;

    @NotNull(groups = {Billable.class, BuyInOneClick.class})
    private CreditCard defaultCreditCard;
}</pre></div><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">During the validation call, one or more groups are validated. All the constraints belonging to this set of group is evaluated on the object graph. In&nbsp;<a href="file:///Users/manu/projects/specs/303/specbook/build/en/html_single/index.html#example-assigngrouptoconstraints" title="Example&nbsp;3.2.&nbsp;Assign groups to constraints" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); ">Example&nbsp;3.2, “Assign groups to constraints”</a>,<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">@NotNull</tt>&nbsp;is checked on&nbsp;<tt class="literal" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">defaultCreditCard</tt>&nbsp;when either the&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Billable</tt>&nbsp;or&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">BuyInOneClick</tt>&nbsp;group is validated.&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">@NotNull</tt>&nbsp;on&nbsp;<tt class="literal" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">firstname</tt>&nbsp;and on&nbsp;<tt class="literal" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">lastname</tt>&nbsp;are validated when the&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;group is validated. Reminder: constraints held on superclasses and interfaces are considered.</p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;is a group predefined by the specification</p><pre class="programlisting" style="font-size: 100%; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); background-color: rgb(244, 244, 244); font-family: monospace; width: auto; ">package javax.validation.groups;

/**
 * Default Bean Validation group
 *
 * @author Emmanuel Bernard
 */
public interface Default {
}</pre><div class="section" lang="en" style="font-family: sans-serif; font-size: 14px; "><div class="titlepage" style="font-family: sans-serif; font-size: 14px; "><div style="font-family: sans-serif; font-size: 14px; "><div style="font-family: sans-serif; font-size: 14px; "><h3 class="title" style="font-family: sans-serif; color: rgb(0, 51, 153); font-size: 120%; margin-top: 10px; padding-top: 5px; font-weight: bold; "><a name="constraintdeclarationvalidationprocess-groupsequence-groupinheritance" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); "></a>3.4.1.&nbsp;Group inheritance</h3></div></div><div style="font-family: sans-serif; font-size: 14px; "></div></div><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">In some situations, a group is a super set of one or more groups. This can be described by Bean Validation. A group can inherit one or more groups by using interface inheritance.</p><div class="example" style="font-family: sans-serif; font-size: 14px; "><a name="d0e974" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); "></a><p class="title" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); margin-top: 10px; padding-top: 5px; font-weight: bold; "><b style="font-family: sans-serif; font-size: 14px; ">Example&nbsp;3.3.&nbsp;Groups can inherit other groups</b></p><pre class="programlisting" style="font-size: 100%; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); background-color: rgb(244, 244, 244); font-family: monospace; width: auto; ">/**
 * Customer can buy without harrassing checking process
 */
public interface BuyInOneClick extends Default, Billable {
}</pre></div><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">For a given interface&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Z</tt>, constraints marked as belonging to the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Z</tt>&nbsp;(ie where the annotation&nbsp;<tt class="methodname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">groups</tt>&nbsp;property contains the interface&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Z</tt>) or any of the super interfaces of&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Z</tt>&nbsp;(inherited groups) are considered part of the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Z</tt>.</p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">In the following example:</p><div class="example" style="font-family: sans-serif; font-size: 14px; "><a name="d0e1001" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); "></a><p class="title" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); margin-top: 10px; padding-top: 5px; font-weight: bold; "><b style="font-family: sans-serif; font-size: 14px; ">Example&nbsp;3.4.&nbsp;Use of a inherited group</b></p><pre class="programlisting" style="font-size: 100%; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); background-color: rgb(244, 244, 244); font-family: monospace; width: auto; ">/**
 * User representation
 */
public class User {
    @NotNull
    private String firstname;

    @NotNull(groups = Default.class)
    private String lastname;

    @NotNull(groups = {Billable.class})
    private CreditCard defaultCreditCard;
}</pre></div><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">validating the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">BuyInOneClick</tt>&nbsp;will lead to the following constraints checking:</p><div class="itemizedlist" style="font-family: sans-serif; font-size: 14px; "><ul type="disc" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><li style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">@NotNull</tt>&nbsp;on&nbsp;<tt class="literal" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">firstname</tt>&nbsp;and&nbsp;<tt class="literal" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">lastname</tt></p></li><li style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">@NotNull</tt>&nbsp;on&nbsp;<tt class="literal" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">defaultCreditCard</tt></p></li></ul></div><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">because&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;and&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Billable</tt>&nbsp;are subinterfaces of&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">BuyInOneClick</tt>.</p></div><div class="section" lang="en" style="font-family: sans-serif; font-size: 14px; "><div class="titlepage" style="font-family: sans-serif; font-size: 14px; "><div style="font-family: sans-serif; font-size: 14px; "><div style="font-family: sans-serif; font-size: 14px; "><h3 class="title" style="font-family: sans-serif; color: rgb(0, 51, 153); font-size: 120%; margin-top: 10px; padding-top: 5px; font-weight: bold; "><a name="constraintdeclarationvalidationprocess-groupsequence-groupsequence" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); "></a>3.4.2.&nbsp;Group sequence</h3></div></div><div style="font-family: sans-serif; font-size: 14px; "></div></div><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">By default, constraints are evaluated in no particular order and this regardless of which groups they belong to. It is however useful in some situations to to control the order of constraints evaluation. There are often scenarios where a preliminary set of constraints should be evaluated prior to other constraints. Here are two examples:</p><div class="itemizedlist" style="font-family: sans-serif; font-size: 14px; "><ul type="disc" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><li style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">The second group depends on a stable state to run properly. This stable state is verified by the first previous group.</p></li><li style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">The second group is a heavy consumer of time, CPU or memory and its evaluation should be avoided if possible.</p></li></ul></div><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">To implement such ordering, a group can be defined as a sequence of other groups. Each group in a group sequence must be processed sequentially in the order defined by<tt class="methodname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">@GroupSequence.value</tt>&nbsp;when the group defined as a sequence is requested.&nbsp;<font class="Apple-style-span" face="Helvetica"><font class="Apple-style-span" color="#E01D27">Note that a group member of a sequence can itself be composed of several groups via inheritance or sequence definition. In this case, each composed group must respect the sequence order as well.</font></font></p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">Processing a group is defined in&nbsp;<a href="file:///Users/manu/projects/specs/303/specbook/build/en/html_single/index.html#constraintdeclarationvalidationprocess-validationroutine" title="3.5.&nbsp;Validation routine" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); ">Section&nbsp;3.5, “Validation routine”</a>&nbsp;; if one of the groups processed in the sequence generates one or more constraint violation, the groups following in the sequence must not be processed. This ensure that a set of constraint is evaluated only if another set of constraint is valid.</p><p style="font-family: sans-serif; font-size: 14px; "><font class="Apple-style-span" color="#E01D27">Groups defining a sequence and groups composing a sequence must not be involved in a cyclic dependency either directly or indirectly, either through cascaded sequence definition or group inheritance.</font></p><p style="font-family: sans-serif; font-size: 14px; "><font class="Apple-style-span" color="#E01D27">Groups defining a sequence should not directly inherit other groups. In other words, the interface hosting the group sequence should not have any super interface.</font></p><p style="font-family: sans-serif; font-size: 14px; "><font class="Apple-style-span" color="#E01D27">Groups defining a sequence should not be used directly in constraint declarations. In other words, the interface hosting the group sequence should not be used in a constraint declaration.</font></p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">To define a group as a sequence, the interface must be annotated with the&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">@GroupSequence</tt>&nbsp;annotation.</p><pre class="programlisting" style="font-size: 100%; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); background-color: rgb(244, 244, 244); font-family: monospace; width: auto; ">@Target({TYPE})
@Retention(RUNTIME)
public @interface GroupSequence {
    Class&lt;?>[] value();
}</pre><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">Here is a usage example</p><div class="example" style="font-family: sans-serif; font-size: 14px; "><a name="example-groupsequence" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); "></a><p class="title" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); margin-top: 10px; padding-top: 5px; font-weight: bold; "><b style="font-family: sans-serif; font-size: 14px; ">Example&nbsp;3.5.&nbsp;Make use of group sequence</b></p><pre class="programlisting" style="font-size: 100%; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); background-color: rgb(244, 244, 244); font-family: monospace; width: auto; ">@ZipCodeCoherenceChecker(groups = Address.HighLevelCoherence.class)
public class Address {
    @NotNull @Size(max = 50)
    private String street1;

    @ZipCode
    private String zipcode;

    @NotNull @Size(max = 30)
    private String city;

    /**
     * check conherence on the overall object
     * Needs basic checking to be green first
     */
    public interface HighLevelCoherence {}

    /**
     * check both basic constraints and high level ones.
     * high level constraints are not cheked if basic constraints fail
     */
    @GroupSequence({Default.class, HighLevelCoherence.class})
    public interface Complete {}
}</pre></div><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">In&nbsp;<a href="file:///Users/manu/projects/specs/303/specbook/build/en/html_single/index.html#example-groupsequence" title="Example&nbsp;3.5.&nbsp;Make use of group sequence" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); ">Example&nbsp;3.5, “Make use of group sequence”</a>, when the&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Address.Complete</tt>&nbsp;group is validated, all constraints belonging to the&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;group are validated. If any of them fail, the validation skips the&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">HighLevelCoherence</tt>&nbsp;group. If all&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;constraints pass,&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">HighLevelCoherence</tt>&nbsp;constraints are evaluated.</p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in; font-family: sans-serif; font-size: 14px; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; background-color: rgb(255, 255, 204); "><h3 class="title" style="font-family: sans-serif; color: rgb(0, 51, 153); font-size: 120%; margin-top: 10px; padding-top: 5px; font-weight: bold; ">Note</h3><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">A given constraint can belong to two groups ordered by a sequence. In this case, the constraint is evaluated as part of the first group and ignored in the subsequent group(s). See<a href="file:///Users/manu/projects/specs/303/specbook/build/en/html_single/index.html#constraintdeclarationvalidationprocess-validationroutine" title="3.5.&nbsp;Validation routine" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); ">Section&nbsp;3.5, “Validation routine”</a>&nbsp;for more informations.</p></div></div><div class="section" lang="en" style="font-family: sans-serif; font-size: 14px; "><div class="titlepage" style="font-family: sans-serif; font-size: 14px; "><div style="font-family: sans-serif; font-size: 14px; "><div style="font-family: sans-serif; font-size: 14px; "><h3 class="title" style="font-family: sans-serif; color: rgb(0, 51, 153); font-size: 120%; margin-top: 10px; padding-top: 5px; font-weight: bold; "><a name="constraintdeclarationvalidationprocess-groupsequence-redefiningdefaultgroup" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); "></a>3.4.3.&nbsp;Redefining the Default group for a class</h3></div></div><div style="font-family: sans-serif; font-size: 14px; "></div></div><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">In&nbsp;<a href="file:///Users/manu/projects/specs/303/specbook/build/en/html_single/index.html#example-groupsequence" title="Example&nbsp;3.5.&nbsp;Make use of group sequence" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); ">Example&nbsp;3.5, “Make use of group sequence”</a>, validating the&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;group does not validate&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">HighLevelCoherence</tt>&nbsp;constraints. To ensure a complete validation, a user must use the&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Complete</tt>group. This breaks some of the encapsulation you could expect. You can work around this by redefining what the&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;group means for a given class. To redefine&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;for a class, place a<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">@GroupSequence</tt>&nbsp;annotation on the class ; this sequence expresses the sequence of groups that does substitute&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;for this class.</p><div class="example" style="font-family: sans-serif; font-size: 14px; "><a name="example-overridedefaultgroup" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); "></a><p class="title" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); margin-top: 10px; padding-top: 5px; font-weight: bold; "><b style="font-family: sans-serif; font-size: 14px; ">Example&nbsp;3.6.&nbsp;Redefining Default group for Address</b></p><pre class="programlisting" style="font-size: 100%; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); background-color: rgb(244, 244, 244); font-family: monospace; width: auto; ">@GroupSequence({Address.class, HighLevelCoherence.class})
@ZipCodeCoherenceChecker(groups = Address.HighLevelCoherence.class)
public class Address {
    @NotNull @Size(max = 50)
    private String street1;

    @ZipCode
    private String zipcode;

    @NotNull @Size(max = 30)
    private String city;

    /**
     * check conherence on the overall object
     * Needs basic checking to be green first
     */
    public interface HighLevelCoherence {}
}</pre></div><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">In&nbsp;<a href="file:///Users/manu/projects/specs/303/specbook/build/en/html_single/index.html#example-overridedefaultgroup" title="Example&nbsp;3.6.&nbsp;Redefining Default group for Address" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); ">Example&nbsp;3.6, “Redefining Default group for Address”</a>, when an address object is validated for the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>, all constraints belonging to the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;and hosted on&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Address</tt>&nbsp;are evaluated. If none fails, all&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">HighLevelCoherence</tt>&nbsp;constraints present on&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Address</tt>&nbsp;are evaluated. In other words, when validating the&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;group for&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Address</tt>, the group sequence defined on the&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Address</tt>&nbsp;class is used.</p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">Since sequences cannot have circular dependencies, using&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;in the declaration of a sequence is not an option. Constraints hosted on a class&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">A</tt>&nbsp;and belonging to the&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;group (by default or explicitly) implicitly belong to the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">A</tt>.</p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">A sequence defined on a class&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">A</tt>&nbsp;(ie. redefining the&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;groups for the class) must contain the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">A</tt>. In other words, the default constraints hosted on a class must be part of the sequence definition.</p></div><div class="section" lang="en" style="font-family: sans-serif; font-size: 14px; "><div class="titlepage" style="font-family: sans-serif; font-size: 14px; "><div style="font-family: sans-serif; font-size: 14px; "><div style="font-family: sans-serif; font-size: 14px; "><h3 class="title" style="font-family: sans-serif; color: rgb(0, 51, 153); font-size: 120%; margin-top: 10px; padding-top: 5px; font-weight: bold; "><a name="constraintdeclarationvalidationprocess-groupsequence-implicitgrouping" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); "></a>3.4.4.&nbsp;Implicit grouping</h3></div></div><div style="font-family: sans-serif; font-size: 14px; "></div></div><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">It is possible to implicitly group some constraints in the same group without explicitly listing such a group in the constraint declaration. Every constraint hosted on an interface&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Z</tt>&nbsp;and part of the<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;group (implicitly or explicitly) belongs to the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Z</tt>. This is useful to validate the partial state of an object based on a role represented by an interface.</p><div class="example" style="font-family: sans-serif; font-size: 14px; "><a name="d0e1206" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); "></a><p class="title" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); margin-top: 10px; padding-top: 5px; font-weight: bold; "><b style="font-family: sans-serif; font-size: 14px; ">Example&nbsp;3.7.&nbsp;Example of interface / group hosting constraints</b></p><pre class="programlisting" style="font-size: 100%; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); background-color: rgb(244, 244, 244); font-family: monospace; width: auto; ">/**
 * Auditable object contract
 */
public interface Auditable {
    @NotNull String getCreationDate();
    @NotNull String getLastUpdate();
    @NotNull String getLastModifier();
    @NotNull String getLastReader();
}

/**
 * Represents an order in the system
 */
public class Order implements Auditable {
    private String creationDate;
    private String lastUpdate;
    private String lastModifier;
    private String lastReader;

    private String orderNumber;

    public String getCreationDate() {
        return this.creationDate;
    }

    public String getLastUpdate() {
        return this.lastUpdate;
    }

    public String getLastModifier() {
        return this.lastModifier;
    }

    public String getLastReader() {
        return this.lastReader;
    }

    @NotNull @Size(min=10, max=10)
    public String getOrderNumber() {
        return this.orderNumber;
    }
}</pre></div><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">When an&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Order</tt>&nbsp;object is validated on the&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;group, the following constraints are validated:&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">@NotNull</tt>&nbsp;on&nbsp;<tt class="methodname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">getCreationDate</tt>,&nbsp;<tt class="methodname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">getLastUpdate</tt>,&nbsp;<tt class="methodname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">getLastModifier</tt>,&nbsp;<tt class="methodname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">getLastReader</tt>,<tt class="methodname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">getOrderNumber</tt>&nbsp;and&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">@Size</tt>&nbsp;on&nbsp;<tt class="methodname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">getOrderNumber</tt>&nbsp;as all belong to the&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;group.</p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">When an&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Order</tt>&nbsp;object is validated on the&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Auditable</tt>&nbsp;group, the following constraints are validated:&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">@NotNull</tt>&nbsp;on&nbsp;<tt class="methodname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">getCreationDate</tt>,&nbsp;<tt class="methodname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">getLastUpdate</tt>,&nbsp;<tt class="methodname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">getLastModifier</tt>,&nbsp;<tt class="methodname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">getLastReader</tt>. Only the constraints present on&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Auditable</tt>&nbsp;(and any of its super interfaces) and belonging to the&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;group are validated when the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Auditable</tt>&nbsp;is requested. It allows the caller to validate that a given object can be safely audited even if the object state itself is not valid.</p></div><div class="section" lang="en" style="font-family: sans-serif; font-size: 14px; "><div class="titlepage" style="font-family: sans-serif; font-size: 14px; "><div style="font-family: sans-serif; font-size: 14px; "><div style="font-family: sans-serif; font-size: 14px; "><h3 class="title" style="font-family: sans-serif; color: rgb(0, 51, 153); font-size: 120%; margin-top: 10px; padding-top: 5px; font-weight: bold; "><a name="constraintdeclarationvalidationprocess-groupsequence-formaldefinition" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); "></a>3.4.5.&nbsp;Formal group definitions</h3></div></div><div style="font-family: sans-serif; font-size: 14px; "></div></div><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">The formal rules defining groups are as followed.&nbsp;<span class="emphasis" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><em style="font-family: sans-serif; font-size: 14px; ">Text in italic are comments about the rules.</em></span></p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">For every class&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt>:</p><div class="itemizedlist" style="font-family: sans-serif; font-size: 14px; "><ul type="disc" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><li style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">A. For each superclass&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Y</tt>&nbsp;of&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt>, the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Y</tt>&nbsp;contains all constraints of the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Y</tt>&nbsp;of&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Y</tt></p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><span class="emphasis" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><em style="font-family: sans-serif; font-size: 14px; ">this rule prepares formal concepts for recursive discovery</em></span></p></li><li style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">B. The group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt>&nbsp;contains the following constraints:</p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><span class="emphasis" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><em style="font-family: sans-serif; font-size: 14px; ">group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt>&nbsp;is a group used on sequences redefining the default group on a class (see&nbsp;<a href="file:///Users/manu/projects/specs/303/specbook/build/en/html_single/index.html#constraintdeclarationvalidationprocess-groupsequence-redefiningdefaultgroup" title="3.4.3.&nbsp;Redefining the Default group for a class" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); ">Section&nbsp;3.4.3, “Redefining the Default group for a class”</a>)</em></span></p><div class="orderedlist" style="font-family: sans-serif; font-size: 14px; "><ol type="1" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><li style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">every constraint declared by the class&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt>&nbsp;which does not declare a group or does declare the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;explicitly.</p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><span class="emphasis" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><em style="font-family: sans-serif; font-size: 14px; ">all&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;constraints hosted on&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt></em></span></p></li><li style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">every constraint declared by any interface implemented by&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt>&nbsp;and not annotated&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">@GroupSequence</tt>&nbsp;which does not explicitly declare a group or does declare the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;explicitly.</p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><span class="emphasis" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><em style="font-family: sans-serif; font-size: 14px; ">all&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;constraints hosted on interfaces of&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt>: constraints are inherited by the class hierarchy. Interfaces marked as&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">@GroupSequence</tt>&nbsp;are ignored.</em></span></p></li><li style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">if&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt>&nbsp;has a direct superclass&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Y</tt>, every constraint in the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Y</tt></p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><span class="emphasis" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><em style="font-family: sans-serif; font-size: 14px; ">all&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;constraints hosted on the superclasses of&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt>: constraints are inherited by the class hierarchy</em></span></p></li></ol></div></li><li style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">C. If&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt>&nbsp;has no&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">@GroupSequence</tt>&nbsp;annotation, the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;contains the following constraints:</p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><span class="emphasis" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><em style="font-family: sans-serif; font-size: 14px; ">this rule defines which constraints are evaluated when validating&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;on&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt>.</em></span></p><div class="orderedlist" style="font-family: sans-serif; font-size: 14px; "><ol type="1" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><li style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">every constraint in the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt></p></li><li style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">if&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt>&nbsp;has a direct superclass&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Y</tt>, every constraint in the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;of&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Y</tt></p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><span class="emphasis" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><em style="font-family: sans-serif; font-size: 14px; ">this rule is necessary in case&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Y</tt>&nbsp;redefines the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt></em></span></p></li></ol></div></li><li style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">D. If&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt>&nbsp;does have a&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">@GroupSequence</tt>&nbsp;annotation, the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;contains every constraint belonging to every group declared by the&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">@GroupSequence</tt>&nbsp;annotation.</p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><span class="emphasis" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><em style="font-family: sans-serif; font-size: 14px; ">this rule describes how a class can redefine the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;for itself (see&nbsp;<a href="file:///Users/manu/projects/specs/303/specbook/build/en/html_single/index.html#constraintdeclarationvalidationprocess-groupsequence-redefiningdefaultgroup" title="3.4.3.&nbsp;Redefining the Default group for a class" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); ">Section&nbsp;3.4.3, “Redefining the Default group for a class”</a>)</em></span></p><div class="itemizedlist" style="font-family: sans-serif; font-size: 14px; "><ul type="circle" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><li style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">the&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">@GroupSequence</tt>&nbsp;annotation must declare the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt></p></li></ul></div></li><li style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">E. For every interface&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Z</tt>, the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Z</tt>&nbsp;contains the following constraints:</p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><span class="emphasis" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><em style="font-family: sans-serif; font-size: 14px; ">this rule defines how non&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;groups are defined</em></span></p><div class="orderedlist" style="font-family: sans-serif; font-size: 14px; "><ol type="1" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><li style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">every constraint declared by the interface&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Z</tt>&nbsp;which does not explicitly declare a group or does declare the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;explicitly.</p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><span class="emphasis" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><em style="font-family: sans-serif; font-size: 14px; ">all&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;constraints hosted on&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Z</tt>: this rule formally defines implicit grouping per interface (see&nbsp;<a href="file:///Users/manu/projects/specs/303/specbook/build/en/html_single/index.html#constraintdeclarationvalidationprocess-groupsequence-implicitgrouping" title="3.4.4.&nbsp;Implicit grouping" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); ">Section&nbsp;3.4.4, “Implicit grouping”</a>)</em></span></p></li><li style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">every constraint declared by any superinterface not annotated&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">@GroupSequence</tt>&nbsp;of the interface&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Z</tt>&nbsp;which does not explicitly declare a group</p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><span class="emphasis" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><em style="font-family: sans-serif; font-size: 14px; ">all&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Default</tt>&nbsp;constraints hosted on interfaces of&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Z</tt>: groups can be inherited (see&nbsp;<a href="file:///Users/manu/projects/specs/303/specbook/build/en/html_single/index.html#constraintdeclarationvalidationprocess-groupsequence-groupinheritance" title="3.4.1.&nbsp;Group inheritance" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); ">Section&nbsp;3.4.1, “Group inheritance”</a>)</em></span></p></li><li style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">every constraint declared by the class&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt>&nbsp;which explicitly declares the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Z</tt></p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><span class="emphasis" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><em style="font-family: sans-serif; font-size: 14px; ">every constraint hosted by&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt>&nbsp;and marked as belonging to the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Z</tt></em></span></p></li><li style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">every constraint declared by any interface implemented by&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt>&nbsp;and not annotated&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">@GroupSequence</tt>&nbsp;which explicitly declares the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Z</tt></p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><span class="emphasis" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><em style="font-family: sans-serif; font-size: 14px; ">every constraint hosted by any interface of&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt>&nbsp;and marked as belonging to the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Z</tt></em></span></p></li><li style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">if&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt>&nbsp;has a direct superclass&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Y</tt>, every constraint in the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Z</tt>&nbsp;of&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Y</tt></p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><span class="emphasis" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><em style="font-family: sans-serif; font-size: 14px; ">every constraint hosted by any superclass of&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">X</tt>&nbsp;and marked as belonging to the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Z</tt></em></span></p></li></ol></div></li><li style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); ">F. For every interface&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Z</tt>&nbsp;annotated&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">@GroupSequence</tt>, the group&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">Z</tt>&nbsp;contains every constraint belonging to every group declared by the&nbsp;<tt class="classname" style="font-size: 100%; color: rgb(17, 17, 17); font-family: monospace; ">@GroupSequence</tt>&nbsp;annotation.</p><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><span class="emphasis" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><em style="font-family: sans-serif; font-size: 14px; ">defines the composition side of group sequence but does not define the ordering behavior of sequence (see&nbsp;<a href="file:///Users/manu/projects/specs/303/specbook/build/en/html_single/index.html#constraintdeclarationvalidationprocess-groupsequence-groupsequence" title="3.4.2.&nbsp;Group sequence" style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 204); ">Section&nbsp;3.4.2, “Group sequence”</a>)</em></span></p></li></ul></div><p style="font-family: sans-serif; font-size: 14px; color: rgb(0, 0, 0); "><br></p><p style="font-family: sans-serif; font-size: 14px; "><font class="Apple-style-span" color="#E01D27">When a given group&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">G</font></tt><font class="Apple-style-span" color="#E01D27">&nbsp;(represented by an interface&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">G</font></tt><font class="Apple-style-span" color="#E01D27">) is requested for the validation of a class&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">X</font></tt><font class="Apple-style-span" color="#E01D27">:</font></p><div class="itemizedlist" style="font-family: sans-serif; font-size: 14px; "><ul type="disc" style="font-family: sans-serif; font-size: 14px; "><li style="font-family: sans-serif; font-size: 14px; "><p style="font-family: sans-serif; font-size: 14px; "><font class="Apple-style-span" color="#E01D27">constraints belonging to the group&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">G</font></tt><font class="Apple-style-span" color="#E01D27">&nbsp;are evaluated</font></p></li><li style="font-family: sans-serif; font-size: 14px; "><p style="font-family: sans-serif; font-size: 14px; "><font class="Apple-style-span" color="#E01D27">if the interface&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">G</font></tt><font class="Apple-style-span" color="#E01D27">&nbsp;is not annotated&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">@GroupSequence</font></tt><font class="Apple-style-span" color="#E01D27">, every group represented by the super interface of&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">G</font></tt><font class="Apple-style-span" color="#E01D27">&nbsp;are requested for validation</font></p></li><li style="font-family: sans-serif; font-size: 14px; "><p style="font-family: sans-serif; font-size: 14px; "><font class="Apple-style-span" color="#E01D27">if the interface&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">G</font></tt><font class="Apple-style-span" color="#E01D27">&nbsp;is annotated with&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">@GroupSequence</font></tt><font class="Apple-style-span" color="#E01D27">, every group represented by the interfaces declared by the&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">@GroupSequence</font></tt><font class="Apple-style-span" color="#E01D27">&nbsp;annotation are requested for validation</font></p><div class="itemizedlist" style="font-family: sans-serif; font-size: 14px; "><ul type="circle" style="font-family: sans-serif; font-size: 14px; "><li style="font-family: sans-serif; font-size: 14px; "><p style="font-family: sans-serif; font-size: 14px; "><font class="Apple-style-span" color="#E01D27">the validation of groups declared to the&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">@GroupSequence</font></tt><font class="Apple-style-span" color="#E01D27">&nbsp;must happen in the sequencing order declared by&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">@GroupSequence</font></tt><font class="Apple-style-span" color="#E01D27">: the sequencing order is propagated to the groups composing the sequenced group (via inheritance or group sequence)</font></p></li><li style="font-family: sans-serif; font-size: 14px; "><p style="font-family: sans-serif; font-size: 14px; "><font class="Apple-style-span" color="#E01D27">if a group validation triggers the failure of one or more constraints, groups following in the sequence must not be evaluated.</font></p></li></ul></div></li><li style="font-family: sans-serif; font-size: 14px; "><p style="font-family: sans-serif; font-size: 14px; "><font class="Apple-style-span" color="#E01D27">if the group&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">G</font></tt><font class="Apple-style-span" color="#E01D27">&nbsp;represents the&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">Default</font></tt><font class="Apple-style-span" color="#E01D27">&nbsp;group of&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">X</font></tt><font class="Apple-style-span" color="#E01D27">&nbsp;overridden by&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">@GroupSequence</font></tt><font class="Apple-style-span" color="#E01D27">, operations are equivalent</font></p></li></ul></div><p style="font-family: sans-serif; font-size: 14px; "><font class="Apple-style-span" color="#E01D27">When the&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">Default</font></tt><font class="Apple-style-span" color="#E01D27">&nbsp;group of a given class&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">X</font></tt><font class="Apple-style-span" color="#E01D27">&nbsp;is overridden via&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">@GroupSequence</font></tt><font class="Apple-style-span" color="#E01D27">, its validation is as followed:</font></p><div class="itemizedlist" style="font-family: sans-serif; font-size: 14px; "><ul type="disc" style="font-family: sans-serif; font-size: 14px; "><li style="font-family: sans-serif; font-size: 14px; "><p style="font-family: sans-serif; font-size: 14px; "><font class="Apple-style-span" color="#E01D27">every group represented by the interfaces declared by the&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">@GroupSequence</font></tt><font class="Apple-style-span" color="#E01D27">&nbsp;annotation are requested for validation</font></p><div class="itemizedlist" style="font-family: sans-serif; font-size: 14px; "><ul type="circle" style="font-family: sans-serif; font-size: 14px; "><li style="font-family: sans-serif; font-size: 14px; "><p style="font-family: sans-serif; font-size: 14px; "><font class="Apple-style-span" color="#E01D27">the validation of groups declared to the&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">@GroupSequence</font></tt><font class="Apple-style-span" color="#E01D27">&nbsp;must happen in the sequencing order declared by&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">@GroupSequence</font></tt><font class="Apple-style-span" color="#E01D27">: the sequencing order is propagated to the groups composing the sequenced group (via inheritance or group sequence)</font></p></li><li style="font-family: sans-serif; font-size: 14px; "><p style="font-family: sans-serif; font-size: 14px; "><font class="Apple-style-span" color="#E01D27">if a group validation triggers the failure of one or more constraints, groups following in the sequence must not be evaluated.</font></p></li></ul></div></li></ul></div><p style="font-family: sans-serif; font-size: 14px; "><font class="Apple-style-span" color="#E01D27">Unless defined by a&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">@GroupSequence</font></tt><font class="Apple-style-span" color="#E01D27">, evaluation ordering is not constrained. In particular, several groups can be validated in the same pass. If a group definition leads to a circular sequencing order between groups, an exception is raised.</font></p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in; font-family: sans-serif; font-size: 14px; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; background-color: rgb(255, 255, 204); "><h3 class="title" style="font-family: sans-serif; font-size: 120%; margin-top: 10px; padding-top: 5px; font-weight: bold; "><font class="Apple-style-span" color="#E01D27">Note</font></h3><p style="font-family: sans-serif; font-size: 14px; "><font class="Apple-style-span" color="#E01D27">A group&nbsp;</font><tt class="classname" style="font-size: 100%; font-family: monospace; "><font class="Apple-style-span" color="#E01D27">G</font></tt><font class="Apple-style-span" color="#E01D27">&nbsp;sequenced (directly or indirectly) to be executed before itself is not considered a circular reference.</font></p></div></div></span></div></div></body></html>