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