All Downloads are FREE. Search and download functionalities are using the official Maven repository.

edu.stanford.protege.webprotege.revision.RevisionDetailsExtractor Maven / Gradle / Ivy

The newest version!
package edu.stanford.protege.webprotege.revision;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import edu.stanford.protege.webprotege.axiom.AxiomSubjectProvider;
import edu.stanford.protege.webprotege.change.AddAxiomChange;
import edu.stanford.protege.webprotege.change.OntologyChange;
import edu.stanford.protege.webprotege.change.OntologyChangeVisitorEx;
import edu.stanford.protege.webprotege.change.RemoveAxiomChange;
import org.semanticweb.owlapi.model.HasIRI;
import org.semanticweb.owlapi.model.IRI;

import javax.annotation.Nonnull;
import javax.inject.Inject;
import java.util.Objects;

/**
 * Matthew Horridge
 * Stanford Center for Biomedical Informatics Research
 * 23 Apr 2018
 */
public class RevisionDetailsExtractor {

    private final AxiomSubjectProvider axiomSubjectProvider;

    @Inject
    public RevisionDetailsExtractor(AxiomSubjectProvider axiomSubjectProvider) {
        this.axiomSubjectProvider = axiomSubjectProvider;
    }

    public RevisionDetails extractRevisionDetails(Revision revision) {
        ImmutableList.Builder builder = ImmutableList.builder();
        ImmutableSet.Builder subjectsBuilder = ImmutableSet.builder();
        revision.getChanges().stream()
                .filter(OntologyChange::isAxiomChange)
                .peek(chg -> {
                    axiomSubjectProvider.getSubject(chg.getAxiomOrThrow())
                    .ifPresent(subject -> {
                        if(subject instanceof IRI) {
                            subjectsBuilder.add((IRI) subject);
                        }
                        else if(subject instanceof HasIRI) {
                            subjectsBuilder.add(((HasIRI) subject).getIRI());
                        }
                    });
                })
                .map(RevisionDetailsExtractor::toChangeDetails)
                .filter(Objects::nonNull)
                .forEach(builder::add);

        return new RevisionDetails(revision.getRevisionNumber().getValueAsInt(),
                                   revision.getTimestamp(),
                                   revision.getUserId(),
                                   revision.getHighLevelDescription(),
                                   subjectsBuilder.build(),
                                   builder.build());
    }


    private static RevisionDetails.ChangeDetails toChangeDetails(@Nonnull OntologyChange change) {
        return change.accept(MAPPING_VISITOR);
    }

    private static final OntologyChangeVisitorEx MAPPING_VISITOR = new OntologyChangeVisitorEx<>() {

        @Override
        public RevisionDetails.ChangeDetails getDefaultReturnValue() {
            return null;
        }

        @Nonnull
        @Override
        public RevisionDetails.ChangeDetails visit(@Nonnull AddAxiomChange change) {
            return new RevisionDetails.ChangeDetails(RevisionDetails.ChangeOperation.ADD, change.getAxiom());
        }

        @Override
        public RevisionDetails.ChangeDetails visit(@Nonnull RemoveAxiomChange change) {
            return new RevisionDetails.ChangeDetails(RevisionDetails.ChangeOperation.REMOVE, change.getAxiom());
        }
    };

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy