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 java.net.URI;
9   
10  import dev.metaschema.core.metapath.item.atomic.AbstractAnyAtomicItem;
11  import dev.metaschema.core.metapath.item.atomic.IAnyUriItem;
12  import dev.metaschema.core.metapath.item.function.IMapKey;
13  import dev.metaschema.core.metapath.item.function.impl.AbstractStringMapKey;
14  import dev.metaschema.core.util.ObjectUtils;
15  import edu.umd.cs.findbugs.annotations.NonNull;
16  import nl.talsmasoftware.lazy4j.Lazy;
17  
18  /**
19   * An abstract implementation of a Metapath atomic item containing a URI data
20   * value.
21   */
22  public abstract class AbstractUriItem
23      extends AbstractAnyAtomicItem<URI>
24      implements IAnyUriItem {
25  
26    @SuppressWarnings("synthetic-access")
27    private final Lazy<String> stringValue = Lazy.of(super::asString);
28  
29    /**
30     * Construct a new item that wraps the provided value.
31     *
32     * @param value
33     *          the value to wrap
34     */
35    protected AbstractUriItem(@NonNull URI value) {
36      super(value);
37    }
38  
39    @Override
40    @NonNull
41    public URI asUri() {
42      return getValue();
43    }
44  
45    @Override
46    public String asString() {
47      return ObjectUtils.notNull(stringValue.get());
48    }
49  
50    @Override
51    public IMapKey asMapKey() {
52      return new MapKey();
53    }
54  
55    @Override
56    public int hashCode() {
57      return asUri().hashCode();
58    }
59  
60    @Override
61    protected String getValueSignature() {
62      return "'" + asString() + "'";
63    }
64  
65    @Override
66    public boolean equals(Object obj) {
67      return this == obj
68          || obj instanceof IAnyUriItem && compareTo((IAnyUriItem) obj) == 0;
69  
70    }
71  
72    private final class MapKey
73        extends AbstractStringMapKey {
74  
75      @Override
76      public IAnyUriItem getKey() {
77        return AbstractUriItem.this;
78      }
79  
80      @Override
81      public String asString() {
82        return getKey().asString();
83      }
84    }
85  }