1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package dev.metaschema.oscal.lib.profile.resolver.support;
7   
8   import java.net.URI;
9   
10  import dev.metaschema.core.metapath.item.node.IModelNodeItem;
11  import dev.metaschema.core.util.ObjectUtils;
12  import edu.umd.cs.findbugs.annotations.NonNull;
13  
14  public abstract class AbstractEntityItem implements IEntityItem {
15  
16    @NonNull
17    private final String originalIdentifier;
18    @NonNull
19    private IModelNodeItem<?, ?> instance;
20    @NonNull
21    private final ItemType itemType;
22    @NonNull
23    private final URI source;
24    private int referenceCount; // 0 by default
25    // private boolean resolved; // false by default
26  
27    protected AbstractEntityItem(@NonNull Builder builder) {
28      this.itemType = ObjectUtils.requireNonNull(builder.itemType, "itemType");
29      this.originalIdentifier = ObjectUtils.requireNonNull(builder.originalIdentifier, "originalIdentifier");
30      this.instance = ObjectUtils.requireNonNull(builder.instance, "instance");
31      this.source = ObjectUtils.requireNonNull(builder.source, "source");
32    }
33  
34    @Override
35    @NonNull
36    public String getOriginalIdentifier() {
37      return originalIdentifier;
38    }
39  
40    @Override
41    @NonNull
42    public abstract String getIdentifier();
43  
44    // @NonNull
45    // public String getIdentifier() {
46    // final String checkedReassignedIdentifier = reassignedIdentifier;
47    // return checkedReassignedIdentifier == null ? originalIdentifier :
48    // checkedReassignedIdentifier;
49    // }
50  
51    @Override
52    @NonNull
53    public IModelNodeItem<?, ?> getInstance() {
54      return instance;
55    }
56  
57    @Override
58    public void setInstance(IModelNodeItem<?, ?> item) {
59      instance = item;
60    }
61  
62    @Override
63    @NonNull
64    @SuppressWarnings("unchecked")
65    public <T> T getInstanceValue() {
66      return ObjectUtils.notNull((T) getInstance().getValue());
67    }
68  
69    @Override
70    @NonNull
71    public ItemType getItemType() {
72      return itemType;
73    }
74  
75    @Override
76    @NonNull
77    public URI getSource() {
78      return source;
79    }
80  
81    @Override
82    public int getReferenceCount() {
83      return referenceCount;
84    }
85  
86    // public boolean isResolved() {
87    // return resolved;
88    // }
89    //
90    // public void markResolved() {
91    // resolved = true;
92    // }
93  
94    @Override
95    public void incrementReferenceCount() {
96      referenceCount += 1;
97    }
98  
99    @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 }