ActivityPubObjectConvertableDefault.java

package org.linkedopenactors.rdfpub.domain.commonsrdf;

import java.util.Optional;

import org.apache.commons.rdf.api.Graph;
import org.apache.commons.rdf.api.IRI;
import org.apache.commons.rdf.api.RDF;
import org.linkedopenactors.rdfpub.domain.commonsrdf.vocab.Vocabularies;

class ActivityPubObjectConvertableDefault implements ActivityPubObjectConvertable {

	private RDF rdf;
	private GraphToStringConverter graphToStringConverter;
	private ActivityPubObject activityPubObject;
	private SubjectProvider subjectProvider;
	private Vocabularies vocabularies;
	private InstanceProperties instanceProperties;
	
	public ActivityPubObjectConvertableDefault(RDF rdf, GraphToStringConverter graphToStringConverter,
			ActivityPubObject activityPubObject, SubjectProvider subjectProvider, Vocabularies vocabularies,
			InstanceProperties instanceProperties) {
		this.rdf = rdf;
		this.graphToStringConverter = graphToStringConverter;
		this.activityPubObject = activityPubObject;
		this.subjectProvider = subjectProvider;
		this.vocabularies = vocabularies;
		this.instanceProperties = instanceProperties;		
	}
	
	@Override
	public Activity asActivity() {
		return new ActivityDefault(rdf, activityPubObject.getSubject(), activityPubObject.asGraph(),
				graphToStringConverter, subjectProvider, vocabularies, instanceProperties);
	}

	@Override
	public Actor asActor() {
		return new ActorDefault(rdf, activityPubObject.getSubject(), activityPubObject.asGraph(),
				graphToStringConverter, subjectProvider, vocabularies, instanceProperties);
	}

	@Override
	public Tombstone asTombstone() {
		return new TombstoneDefault(rdf, activityPubObject.getSubject(), activityPubObject.asGraph(),
				graphToStringConverter, subjectProvider, vocabularies, instanceProperties);
	}

	@Override
	public Optional<ActivityPubObject> resolve(IRI subject) {
		
		if(activityPubObject.asGraph().stream(subject, null, null).findFirst().isPresent()) {
			ActivityPubObjectDefault value = new ActivityPubObjectDefault(rdf, subject, activityPubObject.asGraph(), graphToStringConverter,
					subjectProvider, vocabularies, instanceProperties);
			return Optional.of(value);
		} else {
			return Optional.empty();
		}
	}

	@Override
	public ActivityPubObject isolated() {
		IRI subject = activityPubObject.getSubject();
		Graph isolated = rdf.createGraph();
		Graph g = activityPubObject.asGraph();
		g.stream()
			.filter(s->s.getSubject().equals(subject))
			.forEach(isolated::add);		
		return new ActivityPubObjectDefault(rdf, subject, isolated, graphToStringConverter, subjectProvider, vocabularies, instanceProperties);
	}

	@Override
	public ActivityPubObject asRevison() {
		IRI revisionSubject = subjectProvider.provide(activityPubObject.getSubject());
		Graph revision = rdf.createGraph();
		activityPubObject.asGraph().stream()
			.filter(triple->triple.getSubject().equals(activityPubObject.getSubject()))
			.forEach(t->{
				revision.add(revisionSubject, t.getPredicate(), t.getObject());
			});

		ActivityPubObjectDefault revisionAo = new ActivityPubObjectDefault(rdf, revisionSubject, revision,
				graphToStringConverter, subjectProvider, vocabularies, instanceProperties);
		revisionAo.setWasRevisionOf(activityPubObject.getSubject());
		return revisionAo;
	}

	@Override
	public PublicKey asPublicKey() {
		return new PublicKeyDefault(rdf, activityPubObject.getSubject(), activityPubObject.asGraph(),
				graphToStringConverter, subjectProvider, vocabularies, instanceProperties);
	}

	@Override
	public Endpoints asEndpoints() {
		return new EndpointsDefault(rdf, activityPubObject.getSubject(), activityPubObject.asGraph(),
				graphToStringConverter, subjectProvider, vocabularies, instanceProperties);
	}

	@Override
	public Instance asInstance() {
		return new InstanceDefault(rdf, activityPubObject.getSubject(), activityPubObject.asGraph(),
				graphToStringConverter, subjectProvider, vocabularies, instanceProperties);
	}

	@Override
	public OrderedCollectionPage asOrderedCollectionPage() {
		return new OrderedCollectionPageDefault(rdf, activityPubObject.getSubject(), activityPubObject.asGraph(),
				graphToStringConverter, subjectProvider, vocabularies, instanceProperties);
	}
}