1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package gov.nist.secauto.metaschema.databind.model;
28
29 import gov.nist.secauto.metaschema.core.metapath.MetapathException;
30 import gov.nist.secauto.metaschema.core.model.constraint.ICardinalityConstraint;
31 import gov.nist.secauto.metaschema.core.model.constraint.IConstraint.ISource;
32 import gov.nist.secauto.metaschema.core.model.constraint.IIndexConstraint;
33 import gov.nist.secauto.metaschema.core.model.constraint.IModelConstrained;
34 import gov.nist.secauto.metaschema.core.model.constraint.IUniqueConstraint;
35 import gov.nist.secauto.metaschema.databind.model.annotations.AssemblyConstraints;
36 import gov.nist.secauto.metaschema.databind.model.annotations.ValueConstraints;
37
38 import java.util.Arrays;
39 import java.util.LinkedList;
40 import java.util.List;
41 import java.util.stream.Collectors;
42
43 import edu.umd.cs.findbugs.annotations.NonNull;
44 import edu.umd.cs.findbugs.annotations.Nullable;
45
46
47
48
49 class AssemblyConstraintSupport
50 extends ValueConstraintSupport
51 implements IModelConstrained {
52 @NonNull
53 private final List<IIndexConstraint> indexConstraints;
54 @NonNull
55 private final List<IUniqueConstraint> uniqueConstraints;
56 @NonNull
57 private final List<ICardinalityConstraint> cardinalityConstraints;
58
59 public AssemblyConstraintSupport() {
60 this.indexConstraints = new LinkedList<>();
61 this.uniqueConstraints = new LinkedList<>();
62 this.cardinalityConstraints = new LinkedList<>();
63 }
64
65 @SuppressWarnings("null")
66 public AssemblyConstraintSupport(
67 @Nullable ValueConstraints valueAnnotation,
68 @Nullable AssemblyConstraints assemblyAnnotation,
69 @NonNull ISource source) {
70 super(valueAnnotation, source);
71 if (assemblyAnnotation == null) {
72 this.indexConstraints = new LinkedList<>();
73 this.uniqueConstraints = new LinkedList<>();
74 this.cardinalityConstraints = new LinkedList<>();
75 } else {
76 try {
77 indexConstraints = Arrays.stream(assemblyAnnotation.index())
78 .map(annotation -> ConstraintFactory.newIndexConstraint(annotation, source))
79 .collect(Collectors.toCollection(LinkedList::new));
80
81 uniqueConstraints = Arrays.stream(assemblyAnnotation.isUnique())
82 .map(annotation -> ConstraintFactory.newUniqueConstraint(annotation, source))
83 .collect(Collectors.toCollection(LinkedList::new));
84
85 cardinalityConstraints = Arrays.stream(assemblyAnnotation.hasCardinality())
86 .map(annotation -> ConstraintFactory.newCardinalityConstraint(annotation, source))
87 .collect(Collectors.toCollection(LinkedList::new));
88 } catch (MetapathException ex) {
89 throw new MetapathException(
90 String.format("Unable to compile a Metapath in '%s'. %s", source.getSource(), ex.getLocalizedMessage()),
91 ex);
92 }
93 }
94 getConstraints().addAll(indexConstraints);
95 getConstraints().addAll(uniqueConstraints);
96 getConstraints().addAll(cardinalityConstraints);
97 }
98
99 @Override
100 public List<IIndexConstraint> getIndexConstraints() {
101 return indexConstraints;
102 }
103
104 @Override
105 public List<IUniqueConstraint> getUniqueConstraints() {
106 return uniqueConstraints;
107 }
108
109 @Override
110 public List<ICardinalityConstraint> getHasCardinalityConstraints() {
111 return cardinalityConstraints;
112 }
113
114 @Override
115 public void addConstraint(@NonNull IIndexConstraint constraint) {
116 getConstraints().add(constraint);
117 indexConstraints.add(constraint);
118 }
119
120 @Override
121 public void addConstraint(@NonNull IUniqueConstraint constraint) {
122 getConstraints().add(constraint);
123 uniqueConstraints.add(constraint);
124 }
125
126 @Override
127 public void addConstraint(@NonNull ICardinalityConstraint constraint) {
128 getConstraints().add(constraint);
129 cardinalityConstraints.add(constraint);
130 }
131 }