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.AbstractFieldInstance;
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.IBoundDefinitionModelFieldComplex;
15  import gov.nist.secauto.metaschema.databind.model.IBoundInstanceFlag;
16  import gov.nist.secauto.metaschema.databind.model.IBoundInstanceModelChoiceGroup;
17  import gov.nist.secauto.metaschema.databind.model.IBoundInstanceModelGroupedField;
18  import gov.nist.secauto.metaschema.databind.model.IBoundProperty;
19  import gov.nist.secauto.metaschema.databind.model.annotations.BoundGroupedField;
20  import gov.nist.secauto.metaschema.databind.model.annotations.ModelUtil;
21  
22  import java.util.Map;
23  import java.util.function.Predicate;
24  
25  import edu.umd.cs.findbugs.annotations.NonNull;
26  import nl.talsmasoftware.lazy4j.Lazy;
27  
28  public class InstanceModelGroupedFieldComplex
29      extends AbstractFieldInstance<
30          IBoundInstanceModelChoiceGroup,
31          IBoundDefinitionModelFieldComplex,
32          IBoundInstanceModelGroupedField,
33          IBoundDefinitionModelAssembly>
34  
35      // extends AbstractBoundInstanceModelGroupedNamed<BoundGroupedField>
36      implements IBoundInstanceModelGroupedField {
37    @NonNull
38    private final BoundGroupedField annotation;
39    @NonNull
40    private final DefinitionField definition;
41    @NonNull
42    private final Lazy<Map<String, IBoundProperty<?>>> jsonProperties;
43  
44    public InstanceModelGroupedFieldComplex(
45        @NonNull BoundGroupedField annotation,
46        @NonNull DefinitionField definition,
47        @NonNull IBoundInstanceModelChoiceGroup container) {
48      super(container);
49      this.annotation = annotation;
50      this.definition = definition;
51      this.jsonProperties = ObjectUtils.notNull(Lazy.lazy(() -> {
52        Predicate<IBoundInstanceFlag> flagFilter = null;
53        IBoundInstanceFlag jsonKey = getEffectiveJsonKey();
54        if (jsonKey != null) {
55          flagFilter = flag -> !jsonKey.equals(flag);
56        }
57  
58        IBoundInstanceFlag jsonValueKey = getDefinition().getJsonValueKeyFlagInstance();
59        if (jsonValueKey != null) {
60          Predicate<IBoundInstanceFlag> jsonValueKeyFilter = flag -> !flag.equals(jsonValueKey);
61          flagFilter = flagFilter == null ? jsonValueKeyFilter : flagFilter.and(jsonValueKeyFilter);
62        }
63        return getDefinition().getJsonProperties(flagFilter);
64      }));
65    }
66  
67    private BoundGroupedField getAnnotation() {
68      return annotation;
69    }
70  
71    // ------------------------------------------
72    // - Start annotation driven code - CPD-OFF -
73    // ------------------------------------------
74  
75    @Override
76    public Class<? extends IBoundObject> getBoundClass() {
77      return getAnnotation().binding();
78    }
79  
80    @Override
81    public Map<String, IBoundProperty<?>> getJsonProperties() {
82      return ObjectUtils.notNull(jsonProperties.get());
83    }
84  
85    @Override
86    public DefinitionField getDefinition() {
87      return definition;
88    }
89  
90    @Override
91    public String getFormalName() {
92      return ModelUtil.resolveNoneOrValue(getAnnotation().formalName());
93    }
94  
95    @Override
96    public MarkupLine getDescription() {
97      return ModelUtil.resolveToMarkupLine(getAnnotation().description());
98    }
99  
100   @Override
101   public MarkupMultiline getRemarks() {
102     return ModelUtil.resolveToMarkupMultiline(getAnnotation().remarks());
103   }
104 
105   @Override
106   public String getDiscriminatorValue() {
107     return ModelUtil.resolveNoneOrValue(getAnnotation().formalName());
108   }
109 
110   @Override
111   public String getUseName() {
112     return ModelUtil.resolveNoneOrValue(getAnnotation().useName());
113   }
114 
115   @Override
116   public Integer getUseIndex() {
117     return ModelUtil.resolveDefaultInteger(getAnnotation().useIndex());
118   }
119 
120   // ----------------------------------------
121   // - End annotation driven code - CPD-OFF -
122   // ----------------------------------------
123 }