1
2
3
4
5
6 package dev.metaschema.core.model.constraint;
7
8 import dev.metaschema.core.model.IModelInstanceAbsolute;
9 import dev.metaschema.core.model.constraint.impl.DefaultCardinalityConstraint;
10 import dev.metaschema.core.util.ObjectUtils;
11 import edu.umd.cs.findbugs.annotations.NonNull;
12 import edu.umd.cs.findbugs.annotations.Nullable;
13
14
15
16
17
18 public interface ICardinalityConstraint extends IConfigurableMessageConstraint {
19 @Override
20 default Type getType() {
21 return Type.CARDINALITY;
22 }
23
24
25
26
27
28
29
30
31
32 @Nullable
33 Integer getMinOccurs();
34
35
36
37
38
39
40
41
42
43 @Nullable
44 Integer getMaxOccurs();
45
46 @Override
47 default <T, R> R accept(IConstraintVisitor<T, R> visitor, T state) {
48 return visitor.visitCardinalityConstraint(this, state);
49 }
50
51
52
53
54
55
56 @NonNull
57 static Builder builder() {
58 return new Builder();
59 }
60
61
62
63
64
65 final class Builder
66 extends AbstractConfigurableMessageConstraintBuilder<Builder, ICardinalityConstraint> {
67 private Integer minOccurs;
68 private Integer maxOccurs;
69
70 private Builder() {
71
72 }
73
74
75
76
77
78
79
80
81 public Builder minOccurs(int value) {
82 this.minOccurs = value;
83 return this;
84 }
85
86
87
88
89
90
91
92
93 public Builder maxOccurs(int value) {
94 this.maxOccurs = value;
95 return this;
96 }
97
98 @Override
99 protected Builder getThis() {
100 return this;
101 }
102
103 @Override
104 protected void validate() {
105 super.validate();
106
107 if (getMinOccurs() == null && getMaxOccurs() == null) {
108 throw new ConstraintInitializationException("At least one of minOccurs or maxOccurs must be provided.");
109 }
110 }
111
112 private Integer getMinOccurs() {
113 return minOccurs;
114 }
115
116 private Integer getMaxOccurs() {
117 return maxOccurs;
118 }
119
120 @Override
121 protected ICardinalityConstraint newInstance() {
122 return new DefaultCardinalityConstraint(
123 getId(),
124 getFormalName(),
125 getDescription(),
126 ObjectUtils.notNull(getSource()),
127 getLevel(),
128 getTarget(),
129 getProperties(),
130 getMinOccurs(),
131 getMaxOccurs(),
132 getMessage(),
133 getRemarks());
134 }
135 }
136 }