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}