001/* 002 * The contents of this file are subject to the license and copyright 003 * detailed in the LICENSE and NOTICE files at the root of the source 004 * tree. 005 */ 006 007package org.fcrepo.persistence.ocfl.impl; 008 009import org.fcrepo.kernel.api.identifiers.FedoraId; 010import org.fcrepo.kernel.api.models.ResourceHeaders; 011import org.fcrepo.persistence.common.ResourceHeadersImpl; 012 013import java.net.URI; 014import java.time.Instant; 015import java.util.ArrayList; 016import java.util.Collection; 017import java.util.Objects; 018 019/** 020 * Adapter for converting between different ResourceHeader implementations. 021 * 022 * @author pwinckles 023 */ 024public class ResourceHeadersAdapter implements ResourceHeaders { 025 026 private final ResourceHeadersImpl kernelHeaders; 027 private final org.fcrepo.storage.ocfl.ResourceHeaders.Builder storageHeaders; 028 029 /** 030 * Default constructor 031 */ 032 public ResourceHeadersAdapter() { 033 kernelHeaders = new ResourceHeadersImpl(); 034 storageHeaders = org.fcrepo.storage.ocfl.ResourceHeaders.builder(); 035 } 036 037 /** 038 * @param storageHeaders storage headers to adapt 039 */ 040 public ResourceHeadersAdapter(final org.fcrepo.storage.ocfl.ResourceHeaders storageHeaders) { 041 this.storageHeaders = org.fcrepo.storage.ocfl.ResourceHeaders 042 .builder(Objects.requireNonNull(storageHeaders, "storageHeaders cannot be null")); 043 this.kernelHeaders = new ResourceHeadersImpl(); 044 045 if (storageHeaders.getId() != null) { 046 kernelHeaders.setId(FedoraId.create(storageHeaders.getId())); 047 } 048 if (storageHeaders.getParent() != null) { 049 kernelHeaders.setParent(FedoraId.create(storageHeaders.getParent())); 050 } 051 if (storageHeaders.getArchivalGroupId() != null) { 052 kernelHeaders.setArchivalGroupId(FedoraId.create(storageHeaders.getArchivalGroupId())); 053 } 054 kernelHeaders.setArchivalGroup(storageHeaders.isArchivalGroup()); 055 kernelHeaders.setContentPath(storageHeaders.getContentPath()); 056 kernelHeaders.setContentSize(storageHeaders.getContentSize()); 057 kernelHeaders.setCreatedBy(storageHeaders.getCreatedBy()); 058 kernelHeaders.setCreatedDate(storageHeaders.getCreatedDate()); 059 kernelHeaders.setDeleted(storageHeaders.isDeleted()); 060 kernelHeaders.setDigests(new ArrayList<>(storageHeaders.getDigests())); 061 this.storageHeaders.withDigests(kernelHeaders.getDigests()); 062 kernelHeaders.setExternalHandling(storageHeaders.getExternalHandling()); 063 kernelHeaders.setExternalUrl(storageHeaders.getExternalUrl()); 064 kernelHeaders.setFilename(storageHeaders.getFilename()); 065 kernelHeaders.setInteractionModel(storageHeaders.getInteractionModel()); 066 kernelHeaders.setLastModifiedBy(storageHeaders.getLastModifiedBy()); 067 kernelHeaders.setLastModifiedDate(storageHeaders.getLastModifiedDate()); 068 kernelHeaders.setMementoCreatedDate(storageHeaders.getMementoCreatedDate()); 069 kernelHeaders.setMimeType(storageHeaders.getMimeType()); 070 kernelHeaders.setObjectRoot(storageHeaders.isObjectRoot()); 071 kernelHeaders.setStateToken(storageHeaders.getStateToken()); 072 kernelHeaders.setHeadersVersion(storageHeaders.getHeadersVersion()); 073 } 074 075 /** 076 * @param kernelHeaders kernel headers to adapt 077 */ 078 public ResourceHeadersAdapter(final ResourceHeadersImpl kernelHeaders) { 079 this.kernelHeaders = Objects.requireNonNull(kernelHeaders, "kernelHeaders cannot be null"); 080 this.storageHeaders = org.fcrepo.storage.ocfl.ResourceHeaders.builder(); 081 082 if (kernelHeaders.getId() != null) { 083 storageHeaders.withId(kernelHeaders.getId().getFullId()); 084 } 085 if (kernelHeaders.getParent() != null) { 086 storageHeaders.withParent(kernelHeaders.getParent().getFullId()); 087 } 088 if (kernelHeaders.getArchivalGroupId() != null) { 089 storageHeaders.withArchivalGroupId(kernelHeaders.getArchivalGroupId().getFullId()); 090 } 091 storageHeaders.withArchivalGroup(kernelHeaders.isArchivalGroup()); 092 storageHeaders.withContentPath(kernelHeaders.getContentPath()); 093 storageHeaders.withContentSize(kernelHeaders.getContentSize()); 094 storageHeaders.withCreatedBy(kernelHeaders.getCreatedBy()); 095 storageHeaders.withCreatedDate(kernelHeaders.getCreatedDate()); 096 storageHeaders.withDeleted(kernelHeaders.isDeleted()); 097 storageHeaders.withDigests(kernelHeaders.getDigests()); 098 storageHeaders.withExternalHandling(kernelHeaders.getExternalHandling()); 099 storageHeaders.withExternalUrl(kernelHeaders.getExternalUrl()); 100 storageHeaders.withFilename(kernelHeaders.getFilename()); 101 storageHeaders.withInteractionModel(kernelHeaders.getInteractionModel()); 102 storageHeaders.withLastModifiedBy(kernelHeaders.getLastModifiedBy()); 103 storageHeaders.withLastModifiedDate(kernelHeaders.getLastModifiedDate()); 104 storageHeaders.withMementoCreatedDate(kernelHeaders.getMementoCreatedDate()); 105 storageHeaders.withMimeType(kernelHeaders.getMimeType()); 106 storageHeaders.withObjectRoot(kernelHeaders.isObjectRoot()); 107 storageHeaders.withStateToken(kernelHeaders.getStateToken()); 108 storageHeaders.withHeadersVersion(kernelHeaders.getHeadersVersion()); 109 } 110 111 /** 112 * @return the headers as storage headers 113 */ 114 public org.fcrepo.storage.ocfl.ResourceHeaders asStorageHeaders() { 115 return storageHeaders.build(); 116 } 117 118 /** 119 * @return the headers as kernel headers 120 */ 121 public ResourceHeadersImpl asKernelHeaders() { 122 return kernelHeaders; 123 } 124 125 private String idToString(final FedoraId id) { 126 if (id == null) { 127 return null; 128 } 129 return id.getFullId(); 130 } 131 132 @Override 133 public FedoraId getId() { 134 return kernelHeaders.getId(); 135 } 136 137 /** 138 * @param id the fedora id to set 139 */ 140 public void setId(final FedoraId id) { 141 kernelHeaders.setId(id); 142 storageHeaders.withId(idToString(id)); 143 } 144 145 @Override 146 public FedoraId getParent() { 147 return kernelHeaders.getParent(); 148 } 149 150 /** 151 * @param parent the parent to set 152 */ 153 public void setParent(final FedoraId parent) { 154 kernelHeaders.setParent(parent); 155 storageHeaders.withParent(idToString(parent)); 156 } 157 158 @Override 159 public FedoraId getArchivalGroupId() { 160 return kernelHeaders.getArchivalGroupId(); 161 } 162 163 /** 164 * @param archivalGroupId the archivalGroupId to set 165 */ 166 public void setArchivalGroupId(final FedoraId archivalGroupId) { 167 kernelHeaders.setArchivalGroupId(archivalGroupId); 168 storageHeaders.withArchivalGroupId(idToString(archivalGroupId)); 169 } 170 171 @Override 172 public String getStateToken() { 173 return kernelHeaders.getStateToken(); 174 } 175 176 /** 177 * @param stateToken the stateToken to set 178 */ 179 public void setStateToken(final String stateToken) { 180 kernelHeaders.setStateToken(stateToken); 181 storageHeaders.withStateToken(stateToken); 182 } 183 184 @Override 185 public String getInteractionModel() { 186 return kernelHeaders.getInteractionModel(); 187 } 188 189 /** 190 * @param interactionModel the interactionModel to set 191 */ 192 public void setInteractionModel(final String interactionModel) { 193 kernelHeaders.setInteractionModel(interactionModel); 194 storageHeaders.withInteractionModel(interactionModel); 195 } 196 197 @Override 198 public String getMimeType() { 199 return kernelHeaders.getMimeType(); 200 } 201 202 /** 203 * @param mimeType the mimeType to set 204 */ 205 public void setMimeType(final String mimeType) { 206 kernelHeaders.setMimeType(mimeType); 207 storageHeaders.withMimeType(mimeType); 208 } 209 210 @Override 211 public String getFilename() { 212 return kernelHeaders.getFilename(); 213 } 214 215 /** 216 * @param filename the filename to set 217 */ 218 public void setFilename(final String filename) { 219 kernelHeaders.setFilename(filename); 220 storageHeaders.withFilename(filename); 221 } 222 223 @Override 224 public long getContentSize() { 225 return kernelHeaders.getContentSize(); 226 } 227 228 /** 229 * @param contentSize the contentSize to set 230 */ 231 public void setContentSize(final Long contentSize) { 232 kernelHeaders.setContentSize(contentSize); 233 storageHeaders.withContentSize(contentSize); 234 } 235 236 @Override 237 public Collection<URI> getDigests() { 238 return kernelHeaders.getDigests(); 239 } 240 241 /** 242 * @param digests the digests to set 243 */ 244 public void setDigests(final Collection<URI> digests) { 245 kernelHeaders.setDigests(digests); 246 storageHeaders.withDigests(digests); 247 } 248 249 @Override 250 public String getExternalHandling() { 251 return kernelHeaders.getExternalHandling(); 252 } 253 254 /** 255 * @param externalHandling the externalHandling to set 256 */ 257 public void setExternalHandling(final String externalHandling) { 258 kernelHeaders.setExternalHandling(externalHandling); 259 storageHeaders.withExternalHandling(externalHandling); 260 } 261 262 @Override 263 public Instant getCreatedDate() { 264 return kernelHeaders.getCreatedDate(); 265 } 266 267 /** 268 * @param createdDate the createdDate to set 269 */ 270 public void setCreatedDate(final Instant createdDate) { 271 kernelHeaders.setCreatedDate(createdDate); 272 storageHeaders.withCreatedDate(createdDate); 273 } 274 275 @Override 276 public String getCreatedBy() { 277 return kernelHeaders.getCreatedBy(); 278 } 279 280 /** 281 * @param createdBy the createdBy to set 282 */ 283 public void setCreatedBy(final String createdBy) { 284 kernelHeaders.setCreatedBy(createdBy); 285 storageHeaders.withCreatedBy(createdBy); 286 } 287 288 @Override 289 public Instant getLastModifiedDate() { 290 return kernelHeaders.getLastModifiedDate(); 291 } 292 293 /** 294 * @param lastModifiedDate the lastModifiedDate to set 295 */ 296 public void setLastModifiedDate(final Instant lastModifiedDate) { 297 kernelHeaders.setLastModifiedDate(lastModifiedDate); 298 storageHeaders.withLastModifiedDate(lastModifiedDate); 299 } 300 301 @Override 302 public String getLastModifiedBy() { 303 return kernelHeaders.getLastModifiedBy(); 304 } 305 306 /** 307 * @param lastModifiedBy the lastModifiedBy to set 308 */ 309 public void setLastModifiedBy(final String lastModifiedBy) { 310 kernelHeaders.setLastModifiedBy(lastModifiedBy); 311 storageHeaders.withLastModifiedBy(lastModifiedBy); 312 } 313 314 @Override 315 public Instant getMementoCreatedDate() { 316 return kernelHeaders.getMementoCreatedDate(); 317 } 318 319 /** 320 * @param mementoCreatedDate the mementoCreatedDate to set 321 */ 322 public void setMementoCreatedDate(final Instant mementoCreatedDate) { 323 kernelHeaders.setMementoCreatedDate(mementoCreatedDate); 324 storageHeaders.withMementoCreatedDate(mementoCreatedDate); 325 } 326 327 /** 328 * @param externalUrl the externalUrl to set 329 */ 330 public void setExternalUrl(final String externalUrl) { 331 kernelHeaders.setExternalUrl(externalUrl); 332 storageHeaders.withExternalUrl(externalUrl); 333 } 334 335 @Override 336 public String getExternalUrl() { 337 return kernelHeaders.getExternalUrl(); 338 } 339 340 /** 341 * 342 * @param flag boolean flag 343 */ 344 public void setArchivalGroup(final boolean flag) { 345 kernelHeaders.setArchivalGroup(flag); 346 storageHeaders.withArchivalGroup(flag); 347 } 348 349 @Override 350 public boolean isArchivalGroup() { 351 return kernelHeaders.isArchivalGroup(); 352 } 353 354 /** 355 * @param flag boolean flag 356 */ 357 public void setObjectRoot(final boolean flag) { 358 kernelHeaders.setObjectRoot(flag); 359 storageHeaders.withObjectRoot(flag); 360 } 361 362 @Override 363 public boolean isObjectRoot() { 364 if (isArchivalGroup()) { 365 return true; 366 } else { 367 return kernelHeaders.isObjectRoot(); 368 } 369 } 370 371 /** 372 * Set deleted status flag. 373 * @param deleted true if deleted (a tombstone). 374 */ 375 public void setDeleted(final boolean deleted) { 376 kernelHeaders.setDeleted(deleted); 377 storageHeaders.withDeleted(deleted); 378 } 379 380 /** 381 * {@inheritDoc} 382 */ 383 @Override 384 public boolean isDeleted() { 385 return kernelHeaders.isDeleted(); 386 } 387 388 /** 389 * {@inheritDoc} 390 */ 391 @Override 392 public String getContentPath() { 393 return kernelHeaders.getContentPath(); 394 } 395 396 /** 397 * Sets the path to the content file associated with the header file 398 * 399 * @param contentPath path to content file 400 */ 401 public void setContentPath(final String contentPath) { 402 kernelHeaders.setContentPath(contentPath); 403 storageHeaders.withContentPath(contentPath); 404 } 405 406 @Override 407 public String getHeadersVersion() { 408 return kernelHeaders.getHeadersVersion(); 409 } 410 411 /** 412 * @param headersVersion the headers version to set 413 */ 414 public void setHeadersVersion(final String headersVersion) { 415 kernelHeaders.setHeadersVersion(headersVersion); 416 storageHeaders.withHeadersVersion(headersVersion); 417 } 418 419}