1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package dev.metaschema.core.model.constraint.impl;
7   
8   import dev.metaschema.core.datatype.markup.MarkupMultiline;
9   import dev.metaschema.core.metapath.IMetapathExpression;
10  import dev.metaschema.core.model.ISource;
11  import dev.metaschema.core.model.constraint.ILet;
12  import dev.metaschema.core.qname.IEnhancedQName;
13  import edu.umd.cs.findbugs.annotations.NonNull;
14  import edu.umd.cs.findbugs.annotations.Nullable;
15  
16  /**
17   * A variable assignment for use in Metaschema module constraints.
18   * <p>
19   * This class is immutable.
20   */
21  @SuppressWarnings("PMD.DataClass")
22  public class DefaultLet implements ILet {
23    @SuppressWarnings("PMD.AvoidUsingVolatile") // Required for thread-safe lazy init
24    @Nullable
25    private volatile String cachedIdentifier;
26    @NonNull
27    private final IEnhancedQName name;
28    @NonNull
29    private final IMetapathExpression valueExpression;
30    @NonNull
31    private final ISource source;
32    @Nullable
33    private final MarkupMultiline remarks;
34  
35    /**
36     * Construct a new let statement.
37     *
38     * @param name
39     *          the variable name
40     * @param metapath
41     *          the Metapath expression used to query the value
42     * @param source
43     *          the source of the let statement
44     * @param remarks
45     *          remarks about the let statement
46     */
47    public DefaultLet(
48        @NonNull IEnhancedQName name,
49        @NonNull IMetapathExpression metapath,
50        @NonNull ISource source,
51        @Nullable MarkupMultiline remarks) {
52      this.name = name;
53      this.valueExpression = metapath;
54      this.source = source;
55      this.remarks = remarks;
56    }
57  
58    @Override
59    public String getInternalIdentifier() {
60      String result = cachedIdentifier;
61      if (result == null) {
62        result = ILet.super.getInternalIdentifier();
63        cachedIdentifier = result;
64      }
65      return result;
66    }
67  
68    @Override
69    public IEnhancedQName getName() {
70      return name;
71    }
72  
73    @Override
74    public IMetapathExpression getValueExpression() {
75      return valueExpression;
76    }
77  
78    @Override
79    @NonNull
80    public ISource getSource() {
81      return source;
82    }
83  
84    @Override
85    public MarkupMultiline getRemarks() {
86      return remarks;
87    }
88  }