1
2
3
4
5
6 package dev.metaschema.core.testsupport.builder;
7
8 import java.util.ArrayList;
9 import java.util.List;
10 import java.util.function.Consumer;
11
12 import dev.metaschema.core.metapath.IMetapathExpression;
13 import dev.metaschema.core.model.ISource;
14 import dev.metaschema.core.model.constraint.AbstractConstraintBuilder;
15 import dev.metaschema.core.model.constraint.AssemblyConstraintSet;
16 import dev.metaschema.core.model.constraint.IAllowedValuesConstraint;
17 import dev.metaschema.core.model.constraint.ICardinalityConstraint;
18 import dev.metaschema.core.model.constraint.IConstraint;
19 import dev.metaschema.core.model.constraint.IExpectConstraint;
20 import dev.metaschema.core.model.constraint.IIndexConstraint;
21 import dev.metaschema.core.model.constraint.IIndexHasKeyConstraint;
22 import dev.metaschema.core.model.constraint.IMatchesConstraint;
23 import dev.metaschema.core.model.constraint.IModelConstrained;
24 import dev.metaschema.core.model.constraint.IUniqueConstraint;
25 import dev.metaschema.core.model.constraint.MetaConstraintSet;
26 import edu.umd.cs.findbugs.annotations.NonNull;
27 import edu.umd.cs.findbugs.annotations.Nullable;
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 public class ContextBuilder implements IContextBuilder {
45 @NonNull
46 private final ISource source;
47 @NonNull
48 private final List<IMetapathExpression> metapaths = new ArrayList<>();
49 @NonNull
50 private final List<IConstraint> constraints = new ArrayList<>();
51 @NonNull
52 private final List<ContextBuilder> childContexts = new ArrayList<>();
53
54
55
56
57
58
59
60 public ContextBuilder(@NonNull ISource source) {
61 this.source = source;
62 }
63
64 @Override
65 @NonNull
66 public IContextBuilder metapath(@NonNull String target) {
67 this.metapaths.add(IMetapathExpression.lazyCompile(target, source.getStaticContext()));
68 return this;
69 }
70
71 @Override
72 @NonNull
73 public IContextBuilder constraint(
74 @NonNull AbstractConstraintBuilder<?, ? extends IConstraint> constraintBuilder) {
75 this.constraints.add(constraintBuilder.build());
76 return this;
77 }
78
79 @Override
80 @NonNull
81 public IContextBuilder childContext(@NonNull Consumer<IContextBuilder> childConfigurer) {
82 ContextBuilder childBuilder = new ContextBuilder(source);
83 childConfigurer.accept(childBuilder);
84 this.childContexts.add(childBuilder);
85 return this;
86 }
87
88
89
90
91
92
93
94
95 @NonNull
96 MetaConstraintSet.Context build(@Nullable MetaConstraintSet.Context parent) {
97
98 IModelConstrained modelConstrained = new AssemblyConstraintSet(source);
99
100
101 for (IConstraint constraint : constraints) {
102 addConstraint(modelConstrained, constraint);
103 }
104
105
106 MetaConstraintSet.Context context = new MetaConstraintSet.Context(
107 parent,
108 source,
109 List.copyOf(metapaths),
110 modelConstrained);
111
112
113 List<MetaConstraintSet.Context> builtChildren = new ArrayList<>();
114 for (ContextBuilder childBuilder : childContexts) {
115 builtChildren.add(childBuilder.build(context));
116 }
117 context.addAll(builtChildren);
118
119 return context;
120 }
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139 @SuppressWarnings("PMD.CyclomaticComplexity")
140 private static void addConstraint(@NonNull IModelConstrained modelConstrained, @NonNull IConstraint constraint) {
141 if (constraint instanceof IAllowedValuesConstraint) {
142 modelConstrained.addConstraint((IAllowedValuesConstraint) constraint);
143 } else if (constraint instanceof IMatchesConstraint) {
144 modelConstrained.addConstraint((IMatchesConstraint) constraint);
145 } else if (constraint instanceof IExpectConstraint) {
146 modelConstrained.addConstraint((IExpectConstraint) constraint);
147 } else if (constraint instanceof IIndexHasKeyConstraint) {
148 modelConstrained.addConstraint((IIndexHasKeyConstraint) constraint);
149 } else if (constraint instanceof ICardinalityConstraint) {
150 modelConstrained.addConstraint((ICardinalityConstraint) constraint);
151 } else if (constraint instanceof IIndexConstraint) {
152 modelConstrained.addConstraint((IIndexConstraint) constraint);
153 } else if (constraint instanceof IUniqueConstraint) {
154 modelConstrained.addConstraint((IUniqueConstraint) constraint);
155 } else {
156 throw new UnsupportedOperationException(
157 "Unsupported constraint type: " + constraint.getClass().getName());
158 }
159 }
160 }