ActivityHandlerDelete.java

package org.linkedopenactors.rdfpub.store.rdf4j;

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.ActivityPubObject;
import org.linkedopenactors.rdfpub.domain.commonsrdf.ActivityPubObjectFactory;
import org.linkedopenactors.rdfpub.domain.commonsrdf.ActivityPubStore;
import org.linkedopenactors.rdfpub.domain.commonsrdf.ActivityType;
import org.linkedopenactors.rdfpub.domain.commonsrdf.Tombstone;
import org.linkedopenactors.rdfpub.domain.commonsrdf.vocab.AS;
import org.linkedopenactors.rdfpub.domain.commonsrdf.vocab.PROV;
import org.springframework.stereotype.Component;

@Component
public class ActivityHandlerDelete implements ActivityHandler {

	private RDF rdf;
	private ActivityPubObjectFactory activityPubObjectFactory;

	public ActivityHandlerDelete(RDF rdf, ActivityPubObjectFactory activityPubObjectFactory) {
		this.rdf = rdf;
		this.activityPubObjectFactory = activityPubObjectFactory;		
	}
	
	@Override
	public boolean isResponsibleFor(ActivityType activityType) {
		return ActivityType.DELETE.equals(activityType);
	}

	@Override
	public void addToCollection( ActionInfo actionInfo, IRI collection, ActivityPubStore activityPubStore)  {
//	public void addToOutbox(ActionInfo actionInfo, ActivityPubStore activityPubStore) {
		addTo(actionInfo, collection, activityPubStore);
	}

//	@Override
//	public void addToInbox(ActionInfo actionInfo, ActivityPubStore activityPubStore) {
//		addTo(actionInfo, actionInfo.getStoreOwner().getInbox(), activityPubStore);
//	}

	private void addTo(ActionInfo actionInfo, IRI collection, ActivityPubStore activityPubStore) {
		provPrepare(activityPubStore, actionInfo);
		
		actionInfo.getActivity().getObject().stream()
			.map(x->activityPubStore.find(x))
			.filter(Optional::isPresent)
			.map(Optional::get)
			.map(this::toTombstone)
			.forEach(ts->activityPubStore.add(ts, actionInfo.toString()));

		actionInfo.addMessage("ActivityHandlerDelete#addCollectionItem");
		activityPubStore.addCollectionItem(collection, actionInfo.getActivitySubject(), actionInfo.toString());
		actionInfo.addMessage("ActivityHandlerDelete#add");
		activityPubStore.add(actionInfo.getActivity().asConvertable().isolated(), actionInfo.toString());		
//		activityPubStore.removeCollectionItem TODO !! remove from in/outbox
	}

	
	private Tombstone toTombstone(ActivityPubObject object) {
		Graph graph = rdf.createGraph();
		ActivityPubObject ao = activityPubObjectFactory.create(object.getSubject(), graph);
		ao.addType(rdf.createIRI(AS.Tombstone));
		return ao.asConvertable().asTombstone();

	}
	
	/**
	 * Adds some http://www.w3.org/ns/prov# properties to the activity and the object(s).
	 * @param activity
	 */
	private void provPrepare(ActivityPubStore activityPubStore, ActionInfo actionInfo) {
		actionInfo.getActivity().addType(rdf.createIRI(PROV.Activity));
		actionInfo.getActivity().resolveObject().forEach(o->{
			o.addType(rdf.createIRI(PROV.Entity));
			o.setWasAttributedTo(activityPubStore.getOwner());
		});
	}
}