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 */
006package org.fcrepo.kernel.impl.services;
007
008import static org.apache.jena.datatypes.xsd.XSDDatatype.XSDlong;
009import static org.apache.jena.datatypes.xsd.impl.XSDDateTimeType.XSDdateTime;
010import static org.apache.jena.graph.NodeFactory.createLiteral;
011import static org.apache.jena.graph.NodeFactory.createURI;
012import static org.apache.jena.vocabulary.RDF.type;
013import static org.fcrepo.kernel.api.RdfLexicon.CREATED_BY;
014import static org.fcrepo.kernel.api.RdfLexicon.CREATED_DATE;
015import static org.fcrepo.kernel.api.RdfLexicon.HAS_MESSAGE_DIGEST;
016import static org.fcrepo.kernel.api.RdfLexicon.HAS_MIME_TYPE;
017import static org.fcrepo.kernel.api.RdfLexicon.HAS_ORIGINAL_NAME;
018import static org.fcrepo.kernel.api.RdfLexicon.HAS_SIZE;
019import static org.fcrepo.kernel.api.RdfLexicon.LAST_MODIFIED_BY;
020import static org.fcrepo.kernel.api.RdfLexicon.LAST_MODIFIED_DATE;
021
022import java.util.ArrayList;
023import java.util.List;
024import java.util.stream.Stream;
025
026import org.apache.jena.graph.Triple;
027import org.fcrepo.kernel.api.models.Binary;
028import org.fcrepo.kernel.api.models.FedoraResource;
029import org.fcrepo.kernel.api.models.TimeMap;
030import org.fcrepo.kernel.api.rdf.DefaultRdfStream;
031import org.fcrepo.kernel.api.services.ManagedPropertiesService;
032import org.springframework.stereotype.Component;
033
034/**
035 * Retrieve the managed properties as triples
036 *
037 * @author dbernstein
038 * @since 2020-01-07
039 */
040@Component
041public class ManagedPropertiesServiceImpl implements ManagedPropertiesService {
042
043    @Override
044    public Stream<Triple> get(final FedoraResource resource) {
045        final List<Triple> triples = new ArrayList<>();
046
047        final var describedResource = resource.getDescribedResource();
048        final var subject = createURI(resolveId(describedResource));
049
050        var createdBy = resource.getCreatedBy();
051        var createdDate = resource.getCreatedDate();
052        var lastModifiedBy = resource.getLastModifiedBy();
053        var lastModifiedDate = resource.getLastModifiedDate();
054
055        if (describedResource instanceof Binary) {
056            final Binary binary = (Binary) describedResource;
057
058            createdBy = binary.getCreatedBy();
059            createdDate = binary.getCreatedDate();
060            lastModifiedBy = binary.getLastModifiedBy();
061            lastModifiedDate = binary.getLastModifiedDate();
062
063            triples.add(Triple.create(subject, HAS_SIZE.asNode(),
064                    createLiteral(String.valueOf(binary.getContentSize()), XSDlong)));
065            if (binary.getFilename() != null) {
066                triples.add(Triple.create(subject, HAS_ORIGINAL_NAME.asNode(), createLiteral(binary.getFilename())));
067            }
068            if (binary.getMimeType() != null) {
069                triples.add(Triple.create(subject, HAS_MIME_TYPE.asNode(), createLiteral(binary.getMimeType())));
070            }
071            if (binary.getContentDigests() != null) {
072                for (var digest : binary.getContentDigests()) {
073                    triples.add(Triple.create(subject, HAS_MESSAGE_DIGEST.asNode(),
074                            createURI(digest.toString())));
075                }
076
077            }
078        }
079
080        triples.add(Triple.create(subject, CREATED_DATE.asNode(),
081                                  createLiteral(createdDate.toString(), XSDdateTime)));
082        triples.add(Triple.create(subject, LAST_MODIFIED_DATE.asNode(),
083                                  createLiteral(lastModifiedDate.toString(), XSDdateTime)));
084        if (createdBy != null) {
085            triples.add(Triple.create(subject, CREATED_BY.asNode(), createLiteral(createdBy)));
086        }
087        if (lastModifiedBy != null) {
088            triples.add(Triple.create(subject, LAST_MODIFIED_BY.asNode(), createLiteral(lastModifiedBy)));
089        }
090
091        describedResource.getSystemTypes(true).forEach(triple -> {
092            triples.add(Triple.create(subject, type.asNode(), createURI(triple.toString())));
093        });
094
095        return new DefaultRdfStream(subject, triples.stream());
096    }
097
098    private String resolveId(final FedoraResource resource) {
099        if (resource instanceof TimeMap) {
100            return resource.getFedoraId().getFullId();
101        }
102        return resource.getId();
103    }
104
105}