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 kernelHeaders.setStorageRelativePath(storageHeaders.getStorageRelativePath()); 074 } 075 076 /** 077 * @param kernelHeaders kernel headers to adapt 078 */ 079 public ResourceHeadersAdapter(final ResourceHeadersImpl kernelHeaders) { 080 this.kernelHeaders = Objects.requireNonNull(kernelHeaders, "kernelHeaders cannot be null"); 081 this.storageHeaders = org.fcrepo.storage.ocfl.ResourceHeaders.builder(); 082 083 if (kernelHeaders.getId() != null) { 084 storageHeaders.withId(kernelHeaders.getId().getFullId()); 085 } 086 if (kernelHeaders.getParent() != null) { 087 storageHeaders.withParent(kernelHeaders.getParent().getFullId()); 088 } 089 if (kernelHeaders.getArchivalGroupId() != null) { 090 storageHeaders.withArchivalGroupId(kernelHeaders.getArchivalGroupId().getFullId()); 091 } 092 storageHeaders.withArchivalGroup(kernelHeaders.isArchivalGroup()); 093 storageHeaders.withContentPath(kernelHeaders.getContentPath()); 094 storageHeaders.withContentSize(kernelHeaders.getContentSize()); 095 storageHeaders.withCreatedBy(kernelHeaders.getCreatedBy()); 096 storageHeaders.withCreatedDate(kernelHeaders.getCreatedDate()); 097 storageHeaders.withDeleted(kernelHeaders.isDeleted()); 098 storageHeaders.withDigests(kernelHeaders.getDigests()); 099 storageHeaders.withExternalHandling(kernelHeaders.getExternalHandling()); 100 storageHeaders.withExternalUrl(kernelHeaders.getExternalUrl()); 101 storageHeaders.withFilename(kernelHeaders.getFilename()); 102 storageHeaders.withInteractionModel(kernelHeaders.getInteractionModel()); 103 storageHeaders.withLastModifiedBy(kernelHeaders.getLastModifiedBy()); 104 storageHeaders.withLastModifiedDate(kernelHeaders.getLastModifiedDate()); 105 storageHeaders.withMementoCreatedDate(kernelHeaders.getMementoCreatedDate()); 106 storageHeaders.withMimeType(kernelHeaders.getMimeType()); 107 storageHeaders.withObjectRoot(kernelHeaders.isObjectRoot()); 108 storageHeaders.withStateToken(kernelHeaders.getStateToken()); 109 storageHeaders.withHeadersVersion(kernelHeaders.getHeadersVersion()); 110 } 111 112 /** 113 * @return the headers as storage headers 114 */ 115 public org.fcrepo.storage.ocfl.ResourceHeaders asStorageHeaders() { 116 return storageHeaders.build(); 117 } 118 119 /** 120 * @return the headers as kernel headers 121 */ 122 public ResourceHeadersImpl asKernelHeaders() { 123 return kernelHeaders; 124 } 125 126 private String idToString(final FedoraId id) { 127 if (id == null) { 128 return null; 129 } 130 return id.getFullId(); 131 } 132 133 @Override 134 public FedoraId getId() { 135 return kernelHeaders.getId(); 136 } 137 138 /** 139 * @param id the fedora id to set 140 */ 141 public void setId(final FedoraId id) { 142 kernelHeaders.setId(id); 143 storageHeaders.withId(idToString(id)); 144 } 145 146 @Override 147 public FedoraId getParent() { 148 return kernelHeaders.getParent(); 149 } 150 151 /** 152 * @param parent the parent to set 153 */ 154 public void setParent(final FedoraId parent) { 155 kernelHeaders.setParent(parent); 156 storageHeaders.withParent(idToString(parent)); 157 } 158 159 @Override 160 public FedoraId getArchivalGroupId() { 161 return kernelHeaders.getArchivalGroupId(); 162 } 163 164 /** 165 * @param archivalGroupId the archivalGroupId to set 166 */ 167 public void setArchivalGroupId(final FedoraId archivalGroupId) { 168 kernelHeaders.setArchivalGroupId(archivalGroupId); 169 storageHeaders.withArchivalGroupId(idToString(archivalGroupId)); 170 } 171 172 @Override 173 public String getStateToken() { 174 return kernelHeaders.getStateToken(); 175 } 176 177 /** 178 * @param stateToken the stateToken to set 179 */ 180 public void setStateToken(final String stateToken) { 181 kernelHeaders.setStateToken(stateToken); 182 storageHeaders.withStateToken(stateToken); 183 } 184 185 @Override 186 public String getInteractionModel() { 187 return kernelHeaders.getInteractionModel(); 188 } 189 190 /** 191 * @param interactionModel the interactionModel to set 192 */ 193 public void setInteractionModel(final String interactionModel) { 194 kernelHeaders.setInteractionModel(interactionModel); 195 storageHeaders.withInteractionModel(interactionModel); 196 } 197 198 @Override 199 public String getMimeType() { 200 return kernelHeaders.getMimeType(); 201 } 202 203 /** 204 * @param mimeType the mimeType to set 205 */ 206 public void setMimeType(final String mimeType) { 207 kernelHeaders.setMimeType(mimeType); 208 storageHeaders.withMimeType(mimeType); 209 } 210 211 @Override 212 public String getFilename() { 213 return kernelHeaders.getFilename(); 214 } 215 216 /** 217 * @param filename the filename to set 218 */ 219 public void setFilename(final String filename) { 220 kernelHeaders.setFilename(filename); 221 storageHeaders.withFilename(filename); 222 } 223 224 @Override 225 public long getContentSize() { 226 return kernelHeaders.getContentSize(); 227 } 228 229 /** 230 * @param contentSize the contentSize to set 231 */ 232 public void setContentSize(final Long contentSize) { 233 kernelHeaders.setContentSize(contentSize); 234 storageHeaders.withContentSize(contentSize); 235 } 236 237 @Override 238 public Collection<URI> getDigests() { 239 return kernelHeaders.getDigests(); 240 } 241 242 /** 243 * @param digests the digests to set 244 */ 245 public void setDigests(final Collection<URI> digests) { 246 kernelHeaders.setDigests(digests); 247 storageHeaders.withDigests(digests); 248 } 249 250 @Override 251 public String getExternalHandling() { 252 return kernelHeaders.getExternalHandling(); 253 } 254 255 /** 256 * @param externalHandling the externalHandling to set 257 */ 258 public void setExternalHandling(final String externalHandling) { 259 kernelHeaders.setExternalHandling(externalHandling); 260 storageHeaders.withExternalHandling(externalHandling); 261 } 262 263 @Override 264 public Instant getCreatedDate() { 265 return kernelHeaders.getCreatedDate(); 266 } 267 268 /** 269 * @param createdDate the createdDate to set 270 */ 271 public void setCreatedDate(final Instant createdDate) { 272 kernelHeaders.setCreatedDate(createdDate); 273 storageHeaders.withCreatedDate(createdDate); 274 } 275 276 @Override 277 public String getCreatedBy() { 278 return kernelHeaders.getCreatedBy(); 279 } 280 281 /** 282 * @param createdBy the createdBy to set 283 */ 284 public void setCreatedBy(final String createdBy) { 285 kernelHeaders.setCreatedBy(createdBy); 286 storageHeaders.withCreatedBy(createdBy); 287 } 288 289 @Override 290 public Instant getLastModifiedDate() { 291 return kernelHeaders.getLastModifiedDate(); 292 } 293 294 /** 295 * @param lastModifiedDate the lastModifiedDate to set 296 */ 297 public void setLastModifiedDate(final Instant lastModifiedDate) { 298 kernelHeaders.setLastModifiedDate(lastModifiedDate); 299 storageHeaders.withLastModifiedDate(lastModifiedDate); 300 } 301 302 @Override 303 public String getLastModifiedBy() { 304 return kernelHeaders.getLastModifiedBy(); 305 } 306 307 /** 308 * @param lastModifiedBy the lastModifiedBy to set 309 */ 310 public void setLastModifiedBy(final String lastModifiedBy) { 311 kernelHeaders.setLastModifiedBy(lastModifiedBy); 312 storageHeaders.withLastModifiedBy(lastModifiedBy); 313 } 314 315 @Override 316 public Instant getMementoCreatedDate() { 317 return kernelHeaders.getMementoCreatedDate(); 318 } 319 320 /** 321 * @param mementoCreatedDate the mementoCreatedDate to set 322 */ 323 public void setMementoCreatedDate(final Instant mementoCreatedDate) { 324 kernelHeaders.setMementoCreatedDate(mementoCreatedDate); 325 storageHeaders.withMementoCreatedDate(mementoCreatedDate); 326 } 327 328 /** 329 * @param externalUrl the externalUrl to set 330 */ 331 public void setExternalUrl(final String externalUrl) { 332 kernelHeaders.setExternalUrl(externalUrl); 333 storageHeaders.withExternalUrl(externalUrl); 334 } 335 336 @Override 337 public String getExternalUrl() { 338 return kernelHeaders.getExternalUrl(); 339 } 340 341 /** 342 * 343 * @param flag boolean flag 344 */ 345 public void setArchivalGroup(final boolean flag) { 346 kernelHeaders.setArchivalGroup(flag); 347 storageHeaders.withArchivalGroup(flag); 348 } 349 350 @Override 351 public boolean isArchivalGroup() { 352 return kernelHeaders.isArchivalGroup(); 353 } 354 355 /** 356 * @param flag boolean flag 357 */ 358 public void setObjectRoot(final boolean flag) { 359 kernelHeaders.setObjectRoot(flag); 360 storageHeaders.withObjectRoot(flag); 361 } 362 363 @Override 364 public boolean isObjectRoot() { 365 if (isArchivalGroup()) { 366 return true; 367 } else { 368 return kernelHeaders.isObjectRoot(); 369 } 370 } 371 372 /** 373 * Set deleted status flag. 374 * @param deleted true if deleted (a tombstone). 375 */ 376 public void setDeleted(final boolean deleted) { 377 kernelHeaders.setDeleted(deleted); 378 storageHeaders.withDeleted(deleted); 379 } 380 381 /** 382 * {@inheritDoc} 383 */ 384 @Override 385 public boolean isDeleted() { 386 return kernelHeaders.isDeleted(); 387 } 388 389 /** 390 * {@inheritDoc} 391 */ 392 @Override 393 public String getContentPath() { 394 return kernelHeaders.getContentPath(); 395 } 396 397 /** 398 * Sets the path to the content file associated with the header file 399 * 400 * @param contentPath path to content file 401 */ 402 public void setContentPath(final String contentPath) { 403 kernelHeaders.setContentPath(contentPath); 404 storageHeaders.withContentPath(contentPath); 405 } 406 407 @Override 408 public String getHeadersVersion() { 409 return kernelHeaders.getHeadersVersion(); 410 } 411 412 /** 413 * @param headersVersion the headers version to set 414 */ 415 public void setHeadersVersion(final String headersVersion) { 416 kernelHeaders.setHeadersVersion(headersVersion); 417 storageHeaders.withHeadersVersion(headersVersion); 418 } 419 420 @Override 421 public String getStorageRelativePath() { 422 return kernelHeaders.getStorageRelativePath(); 423 } 424}