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}