1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package gov.nist.secauto.metaschema.schemagen.json.impl;
7   
8   import com.fasterxml.jackson.databind.node.ObjectNode;
9   
10  import gov.nist.secauto.metaschema.core.model.IChoiceGroupInstance;
11  import gov.nist.secauto.metaschema.core.util.ObjectUtils;
12  
13  import java.util.List;
14  import java.util.Set;
15  import java.util.stream.Collectors;
16  import java.util.stream.Stream;
17  
18  import edu.umd.cs.findbugs.annotations.NonNull;
19  
20  /**
21   * Supports generation of a JSON schema based on a Metaschema
22   * {@link IChoiceGroupInstance}, which can be generated inline or as a JSON
23   * schema definition.
24   */
25  public class JsonSchemaPropertyChoiceGroup
26      extends AbstractJsonSchemaPropertyNamed<IChoiceGroupInstance> {
27    @NonNull
28    private final List<IJsonSchemaPropertyGrouped> choiceInstances;
29  
30    /**
31     * Construct a new JSON schema property.
32     *
33     * @param instance
34     *          the instance to construct the property for
35     * @param state
36     *          the JSON generation state used to get JSON schema information
37     */
38    public JsonSchemaPropertyChoiceGroup(
39        @NonNull IChoiceGroupInstance instance,
40        @NonNull IJsonGenerationState state) {
41      super(instance, instance.getGroupAsName() == null ? "[unknown]" : ObjectUtils.notNull(instance.getGroupAsName()));
42      this.choiceInstances = ObjectUtils.notNull(instance.getNamedModelInstances().stream()
43          .map(state::getJsonSchemaPropertyGrouped)
44          .collect(Collectors.toUnmodifiableList()));
45    }
46  
47    @Override
48    public boolean isRequired() {
49      return getInstance().getMinOccurs() > 0;
50    }
51  
52    @Override
53    public Stream<IJsonSchemaDefinable> collectDefinitions(
54        Set<IJsonSchemaDefinitionAssembly> visited,
55        IJsonGenerationState state) {
56      return ObjectUtils.notNull(choiceInstances.stream()
57          .flatMap(choice -> choice.collectDefinitions(visited, state)));
58    }
59  
60    @Override
61    protected void generateMetadata(ObjectNode obj, IJsonGenerationState state) {
62      // do nothing
63    }
64  
65    @Override
66    protected void generateBody(ObjectNode obj, IJsonGenerationState state) {
67      ICardinalityBehavior.behaviorFor(getInstance())
68          .generate(obj, getInstance(), choiceInstances, state);
69      assert !obj.isEmpty();
70    }
71  }