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}