1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package gov.nist.secauto.metaschema.core.mdm.impl;
7   
8   import gov.nist.secauto.metaschema.core.mdm.IDMFieldNodeItem;
9   import gov.nist.secauto.metaschema.core.metapath.item.atomic.IAnyAtomicItem;
10  import gov.nist.secauto.metaschema.core.metapath.item.node.IModelNodeItem;
11  import gov.nist.secauto.metaschema.core.model.IFieldDefinition;
12  import gov.nist.secauto.metaschema.core.model.IFieldInstance;
13  import gov.nist.secauto.metaschema.core.qname.IEnhancedQName;
14  import gov.nist.secauto.metaschema.core.util.CollectionUtil;
15  
16  import java.util.Collection;
17  import java.util.List;
18  
19  import edu.umd.cs.findbugs.annotations.NonNull;
20  
21  /**
22   * This abstract Metapath field node item implementation supports creating a
23   * Metaschema module-based data model.
24   */
25  public abstract class AbstractDMFieldNodeItem
26      extends AbstractDMModelNodeItem<IFieldDefinition, IFieldInstance>
27      implements IDMFieldNodeItem {
28    @NonNull
29    private IAnyAtomicItem value;
30  
31    /**
32     * Construct a new node item.
33     *
34     * @param value
35     *          the initial field value
36     */
37    protected AbstractDMFieldNodeItem(@NonNull IAnyAtomicItem value) {
38      // only allow extending classes to create instances
39      this.value = value;
40    }
41  
42    @Override
43    public IAnyAtomicItem toAtomicItem() {
44      return value;
45    }
46  
47    /**
48     * Change the field's value to the provided value.
49     *
50     * @param value
51     *          the new field value
52     */
53    public void setValue(@NonNull IAnyAtomicItem value) {
54      this.value = getValueItemType().cast(value);
55    }
56  
57    /**
58     * Change the field's value to the provided value.
59     * <p>
60     * This method expects the provided value to align with the object type
61     * supported by the underlying atomic type.
62     *
63     * @param value
64     *          the new field value
65     */
66    public void setValue(@NonNull Object value) {
67      this.value = getValueItemType().newItem(value);
68    }
69  
70    @Override
71    public String stringValue() {
72      return toAtomicItem().asString();
73    }
74  
75    @Override
76    protected String getValueSignature() {
77      return toAtomicItem().toSignature();
78    }
79  
80    @Override
81    public Collection<? extends List<? extends IModelNodeItem<?, ?>>> getModelItems() {
82      // no model items
83      return CollectionUtil.emptyList();
84    }
85  
86    @Override
87    public List<? extends IModelNodeItem<?, ?>> getModelItemsByName(IEnhancedQName name) {
88      // no model items
89      return CollectionUtil.emptyList();
90    }
91  
92  }