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}