1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package dev.metaschema.core.testsupport.builder;
7   
8   import java.util.ArrayList;
9   import java.util.Arrays;
10  import java.util.List;
11  import java.util.function.Consumer;
12  
13  import dev.metaschema.core.model.ISource;
14  import dev.metaschema.core.model.constraint.IConstraintSet;
15  import dev.metaschema.core.model.constraint.MetaConstraintSet;
16  import dev.metaschema.core.util.ObjectUtils;
17  import edu.umd.cs.findbugs.annotations.NonNull;
18  
19  /**
20   * Implementation of {@link IConstraintSetBuilder} for creating constraint sets
21   * programmatically.
22   */
23  public class ConstraintSetBuilder implements IConstraintSetBuilder {
24    private ISource source;
25    @NonNull
26    private final List<IConstraintSet> imports = new ArrayList<>();
27    @NonNull
28    private final List<ContextBuilder> contexts = new ArrayList<>();
29  
30    /**
31     * Construct a new builder.
32     */
33    public ConstraintSetBuilder() {
34      // default constructor
35    }
36  
37    @Override
38    @NonNull
39    public IConstraintSetBuilder source(@NonNull ISource source) {
40      this.source = source;
41      return this;
42    }
43  
44    @Override
45    @NonNull
46    public IConstraintSetBuilder imports(@NonNull IConstraintSet... imports) {
47      this.imports.addAll(Arrays.asList(imports));
48      return this;
49    }
50  
51    @Override
52    @NonNull
53    public IConstraintSetBuilder context(@NonNull Consumer<IContextBuilder> contextConfigurer) {
54      ContextBuilder contextBuilder = new ContextBuilder(
55          ObjectUtils.requireNonNull(source, "source must be set before adding contexts"));
56      contextConfigurer.accept(contextBuilder);
57      this.contexts.add(contextBuilder);
58      return this;
59    }
60  
61    @Override
62    @NonNull
63    public IConstraintSet build() {
64      ISource constraintSource = ObjectUtils.requireNonNull(source, "source must be set");
65  
66      // Build contexts
67      List<MetaConstraintSet.Context> builtContexts = new ArrayList<>();
68      for (ContextBuilder contextBuilder : contexts) {
69        builtContexts.add(contextBuilder.build(null));
70      }
71  
72      return new MetaConstraintSet(constraintSource, imports, builtContexts);
73    }
74  }