001/*
002 * SPDX-FileCopyrightText: none
003 * SPDX-License-Identifier: CC0-1.0
004 */
005
006package dev.metaschema.oscal.lib.profile.resolver.support;
007
008import java.net.URI;
009
010import dev.metaschema.core.metapath.item.node.IModelNodeItem;
011import dev.metaschema.core.util.ObjectUtils;
012import edu.umd.cs.findbugs.annotations.NonNull;
013
014public abstract class AbstractEntityItem implements IEntityItem {
015
016  @NonNull
017  private final String originalIdentifier;
018  @NonNull
019  private IModelNodeItem<?, ?> instance;
020  @NonNull
021  private final ItemType itemType;
022  @NonNull
023  private final URI source;
024  private int referenceCount; // 0 by default
025  // private boolean resolved; // false by default
026
027  protected AbstractEntityItem(@NonNull Builder builder) {
028    this.itemType = ObjectUtils.requireNonNull(builder.itemType, "itemType");
029    this.originalIdentifier = ObjectUtils.requireNonNull(builder.originalIdentifier, "originalIdentifier");
030    this.instance = ObjectUtils.requireNonNull(builder.instance, "instance");
031    this.source = ObjectUtils.requireNonNull(builder.source, "source");
032  }
033
034  @Override
035  @NonNull
036  public String getOriginalIdentifier() {
037    return originalIdentifier;
038  }
039
040  @Override
041  @NonNull
042  public abstract String getIdentifier();
043
044  // @NonNull
045  // public String getIdentifier() {
046  // final String checkedReassignedIdentifier = reassignedIdentifier;
047  // return checkedReassignedIdentifier == null ? originalIdentifier :
048  // checkedReassignedIdentifier;
049  // }
050
051  @Override
052  @NonNull
053  public IModelNodeItem<?, ?> getInstance() {
054    return instance;
055  }
056
057  @Override
058  public void setInstance(IModelNodeItem<?, ?> item) {
059    instance = item;
060  }
061
062  @Override
063  @NonNull
064  @SuppressWarnings("unchecked")
065  public <T> T getInstanceValue() {
066    return ObjectUtils.notNull((T) getInstance().getValue());
067  }
068
069  @Override
070  @NonNull
071  public ItemType getItemType() {
072    return itemType;
073  }
074
075  @Override
076  @NonNull
077  public URI getSource() {
078    return source;
079  }
080
081  @Override
082  public int getReferenceCount() {
083    return referenceCount;
084  }
085
086  // public boolean isResolved() {
087  // return resolved;
088  // }
089  //
090  // public void markResolved() {
091  // resolved = true;
092  // }
093
094  @Override
095  public void incrementReferenceCount() {
096    referenceCount += 1;
097  }
098
099  @Override
100  public int resetReferenceCount() {
101    int retval = referenceCount;
102    referenceCount = 0;
103    return retval;
104  }
105
106  static final class Builder {
107    private String originalIdentifier;
108    private String reassignedIdentifier;
109    private IModelNodeItem<?, ?> instance;
110    private ItemType itemType;
111    private URI source;
112
113    @NonNull
114    public Builder instance(@NonNull IModelNodeItem<?, ?> item, @NonNull ItemType itemType) {
115      this.instance = item;
116      this.itemType = itemType;
117      return this;
118    }
119
120    // @NonNull
121    // public Builder reassignedIdentifier(@NonNull UUID identifier) {
122    // // no need to normalize, since UUIDs are formatted lower case
123    // return reassignedIdentifier(identifier.toString());
124    // }
125
126    @NonNull
127    public Builder reassignedIdentifier(@NonNull String identifier) {
128      this.reassignedIdentifier = identifier;
129      return this;
130    }
131    //
132    // @NonNull
133    // public Builder originalIdentifier(@NonNull UUID identifier) {
134    // // no need to normalize, since UUIDs are formatted lower case
135    // return originalIdentifier(identifier.toString());
136    // }
137
138    @NonNull
139    public Builder originalIdentifier(@NonNull String identifier) {
140      this.originalIdentifier = identifier;
141      return this;
142    }
143
144    @NonNull
145    public Builder source(@NonNull URI source) {
146      this.source = source;
147      return this;
148    }
149
150    @NonNull
151    public IEntityItem build() {
152      return reassignedIdentifier == null ? new OriginalEntityItem(this) : new ReassignedEntityItem(this);
153    }
154  }
155
156  static final class OriginalEntityItem
157      extends AbstractEntityItem {
158
159    protected OriginalEntityItem(@NonNull Builder builder) {
160      super(builder);
161    }
162
163    @Override
164    public String getIdentifier() {
165      return getOriginalIdentifier();
166    }
167
168    @Override
169    public boolean isIdentifierReassigned() {
170      return false;
171    }
172  }
173
174  static final class ReassignedEntityItem
175      extends AbstractEntityItem {
176    @NonNull
177    private final String reassignedIdentifier;
178
179    protected ReassignedEntityItem(@NonNull Builder builder) {
180      super(builder);
181      this.reassignedIdentifier = ObjectUtils.requireNonNull(builder.reassignedIdentifier);
182    }
183
184    @Override
185    public String getIdentifier() {
186      return reassignedIdentifier;
187    }
188
189    @Override
190    public boolean isIdentifierReassigned() {
191      return true;
192    }
193  }
194}