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 gov.nist.secauto.metaschema.core.model.IFlagInstance;
9   import gov.nist.secauto.metaschema.core.model.IModelDefinition;
10  import gov.nist.secauto.metaschema.core.qname.IEnhancedQName;
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.Stream;
16  
17  import edu.umd.cs.findbugs.annotations.NonNull;
18  import edu.umd.cs.findbugs.annotations.Nullable;
19  
20  /**
21   * A JSON schema for a given Metaschema-based model object based on a module
22   * definition that can have flags, which is part of a larger JSON schema.
23   *
24   * @param <D>
25   *          the Java type of the Metaschema module definition
26   */
27  public abstract class AbstractJsonSchemaModelDefinition<D extends IModelDefinition>
28      extends AbstractJsonSchemaDefinition<D>
29      implements IJsonSchemaModelDefinition {
30    @Nullable
31    private final IEnhancedQName jsonKeyFlagName;
32    @NonNull
33    private final List<IJsonSchemaPropertyFlag> flagProperties;
34  
35    /**
36     * Construct a new JSON schema definition based on a Metaschema module
37     * model-based definition.
38     *
39     * @param definition
40     *          the Metaschema module definition
41     * @param jsonKeyFlagName
42     *          optional, the name of the definitions JSON key flag
43     * @param state
44     *          the generation state used to generate this JSON schema
45     */
46    public AbstractJsonSchemaModelDefinition(
47        @NonNull D definition,
48        @Nullable IEnhancedQName jsonKeyFlagName,
49        @NonNull IJsonGenerationState state) {
50      super(definition, state);
51      this.jsonKeyFlagName = jsonKeyFlagName;
52      this.flagProperties = JsonSchemaHelper.buildFlagProperties(definition, jsonKeyFlagName, state);
53    }
54  
55    @Override
56    public String generateDefinitionName(IJsonGenerationState state) {
57      return state.generateJsonSchemaDefinitionName(
58          getDefinition(),
59          jsonKeyFlagName == null ? null : state.toFlagName(jsonKeyFlagName),
60          null);
61    }
62  
63    @Override
64    public IFlagInstance getJsonKeyFlag() {
65      return getDefinition().getJsonKey();
66    }
67  
68    @Override
69    @Nullable
70    public IEnhancedQName getJsonKeyFlagName() {
71      return jsonKeyFlagName;
72    }
73  
74    @Override
75    public List<IJsonSchemaPropertyFlag> getFlagProperties() {
76      return flagProperties;
77    }
78  
79    @Override
80    public Stream<IJsonSchemaDefinable> collectDefinitions(
81        Set<IJsonSchemaDefinitionAssembly> visited,
82        IJsonGenerationState state) {
83      Stream<IJsonSchemaDefinable> retval = Stream.concat(
84          Stream.of(this),
85          getFlagProperties().stream()
86              .flatMap(property -> property.collectDefinitions(visited, state)));
87  
88      IFlagInstance jsonKeyFlag = getJsonKeyFlag();
89      if (jsonKeyFlag != null) {
90        retval = Stream.concat(retval, Stream.of(state.getFlagDefinition(jsonKeyFlag.getDefinition())));
91      }
92  
93      return ObjectUtils.notNull(retval);
94    }
95  }