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

edu.stanford.protege.webprotege.crud.EntityIriPrefixResolver Maven / Gradle / Ivy

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

import com.google.common.collect.ImmutableList;
import edu.stanford.protege.webprotege.match.HierarchyPositionCriteriaMatchableEntityTypesExtractor;
import edu.stanford.protege.webprotege.match.MatcherFactory;
import org.semanticweb.owlapi.model.EntityType;
import org.semanticweb.owlapi.model.OWLEntity;

import javax.annotation.Nonnull;
import javax.inject.Inject;

/**
 * Matthew Horridge
 * Stanford Center for Biomedical Informatics Research
 * 2020-04-08
 */
public class EntityIriPrefixResolver {

    @Nonnull
    private final MatcherFactory matcherFactory;

    @Nonnull
    private final EntityIriPrefixCriteriaRewriter entityIriPrefixCriteriaRewriter;

    @Nonnull
    private final HierarchyPositionCriteriaMatchableEntityTypesExtractor leafCriteriaTypesExtractor;

    @Inject
    public EntityIriPrefixResolver(@Nonnull MatcherFactory matcherFactory,
                                   @Nonnull EntityIriPrefixCriteriaRewriter entityIriPrefixCriteriaRewriter,
                                   @Nonnull HierarchyPositionCriteriaMatchableEntityTypesExtractor leafCriteriaTypesExtractor) {
        this.matcherFactory = matcherFactory;
        this.entityIriPrefixCriteriaRewriter = entityIriPrefixCriteriaRewriter;
        this.leafCriteriaTypesExtractor = leafCriteriaTypesExtractor;
    }

    /**
     * Gets the IRI prefix for the specified prefix settings and the specified
     * parents.
     * @param prefixSettings The prefix settings.
     * @param entityType The entity type of the entity to be created.
     * @param parentEntities The parent entities.  May be empty.  If the parents is empty
     *                       then the fallback prefix will be returned.
     * @return The resolved prefix.
     */
    @Nonnull
    public String getIriPrefix(@Nonnull EntityCrudKitPrefixSettings prefixSettings,
                               @Nonnull EntityType entityType,
                               @Nonnull ImmutableList parentEntities) {
        if(parentEntities.isEmpty()) {
            return prefixSettings.getIRIPrefix();
        }
        var conditionalPrefixes = prefixSettings.getConditionalIriPrefixes();
        for(var conditionalPrefix : conditionalPrefixes) {
            var leafTypes = leafCriteriaTypesExtractor.getMatchableEntityTypes(conditionalPrefix.getCriteria());
            if (leafTypes.contains(entityType)) {
                if(allEntitiesMatch(parentEntities, conditionalPrefix)) {
                    return conditionalPrefix.getIriPrefix();
                }
            }
        }
        return prefixSettings.getIRIPrefix();
    }

    private boolean allEntitiesMatch(@Nonnull ImmutableList parentEntities,
                                     @Nonnull ConditionalIriPrefix conditionalPrefix) {
        var criteria = conditionalPrefix.getCriteria();
        var rewrittenCriteria = entityIriPrefixCriteriaRewriter.rewriteCriteria(criteria);
        var matcher = matcherFactory.getMatcher(rewrittenCriteria);
        for(var parent : parentEntities) {
            if(!matcher.matches(parent)) {
                return false;
            }
        }
        return true;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy