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 java.util.stream.Stream.empty; 009 010import java.util.ArrayList; 011import java.util.List; 012import java.util.stream.Stream; 013 014import javax.inject.Inject; 015 016import org.fcrepo.kernel.api.Transaction; 017import org.fcrepo.kernel.api.models.FedoraResource; 018import org.fcrepo.kernel.api.rdf.LdpTriplePreferences; 019import org.fcrepo.kernel.api.services.ContainmentTriplesService; 020import org.fcrepo.kernel.api.services.ManagedPropertiesService; 021import org.fcrepo.kernel.api.services.MembershipService; 022import org.fcrepo.kernel.api.services.ReferenceService; 023import org.fcrepo.kernel.api.services.ResourceTripleService; 024 025import org.apache.jena.graph.Triple; 026import org.springframework.beans.factory.annotation.Autowired; 027import org.springframework.beans.factory.annotation.Qualifier; 028import org.springframework.stereotype.Component; 029 030/** 031 * Implementation of the ResourceTripleService 032 * @author whikloj 033 * @since 6.0.0 034 */ 035@Component 036public class ResourceTripleServiceImpl implements ResourceTripleService { 037 038 @Inject 039 private ManagedPropertiesService managedPropertiesService; 040 041 @Inject 042 private ContainmentTriplesService containmentTriplesService; 043 044 @Autowired 045 @Qualifier("referenceService") 046 private ReferenceService referenceService; 047 048 @Inject 049 private MembershipService membershipService; 050 051 @Override 052 public Stream<Triple> getResourceTriples(final Transaction tx, final FedoraResource resource, 053 final LdpTriplePreferences preferences, final int limit) { 054 final List<Stream<Triple>> streams = new ArrayList<>(); 055 056 // Provide user RDF if we didn't ask for omit=ldp:PreferMinimalContainer. 057 if (preferences.displayUserRdf()) { 058 streams.add(resource.getTriples()); 059 } 060 // Provide server-managed triples if we didn't ask for omit=fedora:ServerManaged or 061 // omit=ldp:PreferMinimalContainer 062 if (preferences.displayServerManaged()) { 063 streams.add(this.managedPropertiesService.get(resource)); 064 } 065 // containment triples about this resource, return by default. Containment is server managed so also 066 // check for that prefer tag. 067 if (preferences.displayContainment()) { 068 if (limit == -1) { 069 streams.add(this.containmentTriplesService.get(tx, resource)); 070 } else { 071 streams.add(this.containmentTriplesService.get(tx, resource).limit(limit)); 072 } 073 } 074 075 // LDP container membership triples for this resource, returned by default. Membership is server managed so 076 // also check that tag. 077 if (preferences.displayMembership()) { 078 streams.add(membershipService.getMembership(tx, resource.getFedoraId())); 079 } 080 081 // Include inbound references to this object, NOT returned by default. 082 if (preferences.displayReferences()) { 083 streams.add(referenceService.getInboundReferences(tx, resource)); 084 } 085 086 return streams.stream().reduce(empty(), Stream::concat); 087 } 088 089}