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