1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package dev.metaschema.core.metapath.item.atomic.impl;
7   
8   import dev.metaschema.core.datatype.markup.IMarkupString;
9   import dev.metaschema.core.metapath.item.atomic.AbstractAnyAtomicItem;
10  import dev.metaschema.core.metapath.item.atomic.IMarkupItem;
11  import dev.metaschema.core.metapath.item.function.IMapKey;
12  import dev.metaschema.core.metapath.item.function.impl.AbstractStringMapKey;
13  import edu.umd.cs.findbugs.annotations.NonNull;
14  
15  /**
16   * An abstract implementation of a Metapath atomic item representing a
17   * markup-based data value.
18   *
19   * @param <TYPE>
20   *          the Java type of this markup item
21   */
22  // FIXME: Should this be a subtype of IStringItem?
23  public abstract class AbstractMarkupItem<TYPE extends IMarkupString<TYPE>>
24      extends AbstractAnyAtomicItem<TYPE>
25      implements IMarkupItem {
26  
27    /**
28     * Construct a new item.
29     *
30     * @param value
31     *          the item's data value
32     */
33    protected AbstractMarkupItem(@NonNull TYPE value) {
34      super(value);
35    }
36  
37    @Override
38    public IMarkupString<TYPE> asMarkup() {
39      return getValue();
40    }
41  
42    @Override
43    public int hashCode() {
44      return asMarkup().hashCode();
45    }
46  
47    @Override
48    protected String getValueSignature() {
49      return "'" + asString() + "'";
50    }
51  
52    @Override
53    public boolean equals(Object obj) {
54      return this == obj
55          || obj instanceof IMarkupItem && compareTo((IMarkupItem) obj) == 0;
56    }
57  
58    @Override
59    public IMapKey asMapKey() {
60      return new MapKey();
61    }
62  
63    private final class MapKey
64        extends AbstractStringMapKey {
65      @Override
66      public IMarkupItem getKey() {
67        return AbstractMarkupItem.this;
68      }
69  
70      @Override
71      public String asString() {
72        return getKey().asString();
73      }
74    }
75  }