1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package gov.nist.secauto.metaschema.databind.model.impl;
7   
8   import gov.nist.secauto.metaschema.core.datatype.markup.MarkupLine;
9   import gov.nist.secauto.metaschema.core.datatype.markup.MarkupMultiline;
10  import gov.nist.secauto.metaschema.core.model.AbstractAssemblyInstance;
11  import gov.nist.secauto.metaschema.core.model.IBoundObject;
12  import gov.nist.secauto.metaschema.core.util.ObjectUtils;
13  import gov.nist.secauto.metaschema.databind.model.IBoundDefinitionModelAssembly;
14  import gov.nist.secauto.metaschema.databind.model.IBoundInstanceModelChoiceGroup;
15  import gov.nist.secauto.metaschema.databind.model.IBoundInstanceModelGroupedAssembly;
16  import gov.nist.secauto.metaschema.databind.model.IBoundProperty;
17  import gov.nist.secauto.metaschema.databind.model.annotations.BoundGroupedAssembly;
18  import gov.nist.secauto.metaschema.databind.model.annotations.ModelUtil;
19  
20  import java.util.Map;
21  
22  import edu.umd.cs.findbugs.annotations.NonNull;
23  import nl.talsmasoftware.lazy4j.Lazy;
24  
25  /**
26   * Represents an assembly model instance that is a member of a choice group
27   * instance.
28   */
29  public class InstanceModelGroupedAssembly
30      extends AbstractAssemblyInstance<
31          IBoundInstanceModelChoiceGroup,
32          IBoundDefinitionModelAssembly,
33          IBoundInstanceModelGroupedAssembly,
34          IBoundDefinitionModelAssembly>
35      // extends AbstractBoundInstanceModelGroupedNamed<BoundGroupedAssembly>
36      implements IBoundInstanceModelGroupedAssembly {
37    @NonNull
38    private final BoundGroupedAssembly annotation;
39    @NonNull
40    private final IBoundDefinitionModelAssembly definition;
41    @NonNull
42    private final Lazy<Map<String, IBoundProperty<?>>> jsonProperties;
43  
44    /**
45     * Construct a new field model instance instance that is a member of a choice
46     * group instance.
47     *
48     * @param annotation
49     *          the Java annotation the instance is bound to
50     * @param definition
51     *          the assembly definition this instance is bound to
52     * @param container
53     *          the choice group instance containing the instance
54     */
55    public InstanceModelGroupedAssembly(
56        @NonNull BoundGroupedAssembly annotation,
57        @NonNull IBoundDefinitionModelAssembly definition,
58        @NonNull IBoundInstanceModelChoiceGroup container) {
59      super(container);
60      this.annotation = annotation;
61      this.definition = definition;
62      // IBoundInstanceFlag jsonKey = getEffectiveJsonKey();
63      // Predicate<IBoundInstanceFlag> flagFilter = jsonKey == null ? null : (flag) ->
64      // !jsonKey.equals(flag);
65      // return getDefinition().getJsonProperties(flagFilter);
66      this.jsonProperties = ObjectUtils.notNull(Lazy.lazy(() -> getDefinition().getJsonProperties(null)));
67    }
68  
69    private BoundGroupedAssembly getAnnotation() {
70      return annotation;
71    }
72  
73    // ------------------------------------------
74    // - Start annotation driven code - CPD-OFF -
75    // ------------------------------------------
76  
77    @Override
78    public Class<? extends IBoundObject> getBoundClass() {
79      return getAnnotation().binding();
80    }
81  
82    @Override
83    public Map<String, IBoundProperty<?>> getJsonProperties() {
84      return ObjectUtils.notNull(jsonProperties.get());
85    }
86  
87    @Override
88    public IBoundDefinitionModelAssembly getDefinition() {
89      return definition;
90    }
91  
92    @Override
93    public String getFormalName() {
94      return ModelUtil.resolveNoneOrValue(getAnnotation().formalName());
95    }
96  
97    @Override
98    public MarkupLine getDescription() {
99      return ModelUtil.resolveToMarkupLine(getAnnotation().description());
100   }
101 
102   @Override
103   public MarkupMultiline getRemarks() {
104     return ModelUtil.resolveToMarkupMultiline(getAnnotation().remarks());
105   }
106 
107   @Override
108   public String getDiscriminatorValue() {
109     return ModelUtil.resolveNoneOrValue(getAnnotation().discriminatorValue());
110   }
111 
112   @Override
113   public String getUseName() {
114     return ModelUtil.resolveNoneOrValue(getAnnotation().useName());
115   }
116 
117   @Override
118   public Integer getUseIndex() {
119     return ModelUtil.resolveDefaultInteger(getAnnotation().useIndex());
120   }
121 }