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