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}