1
2
3
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;
25
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
45
46
47
48
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
87
88
89
90
91
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
121
122
123
124
125
126 @NonNull
127 public Builder reassignedIdentifier(@NonNull String identifier) {
128 this.reassignedIdentifier = identifier;
129 return this;
130 }
131
132
133
134
135
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 }