edu.cornell.mannlib.vitro.webapp.modelaccess.impl.ContextModelAccessImpl.java Source code

Java tutorial

Introduction

Here is the source code for edu.cornell.mannlib.vitro.webapp.modelaccess.impl.ContextModelAccessImpl.java

Source

/* $This file is distributed under the terms of the license in /doc/license.txt$ */

package edu.cornell.mannlib.vitro.webapp.modelaccess.impl;

import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ReasoningOption.ASSERTIONS_AND_INFERENCES;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ReasoningOption.ASSERTIONS_ONLY;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ReasoningOption.INFERENCES_ONLY;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService.CONFIGURATION;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService.CONTENT;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.ABOX_ASSERTIONS;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.ABOX_INFERENCES;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.ABOX_UNION;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.APPLICATION_METADATA;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.DISPLAY;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.FULL_ASSERTIONS;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.FULL_INFERENCES;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.FULL_UNION;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_ASSERTIONS;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_INFERENCES;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_UNION;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.USER_ACCOUNTS;

import java.util.Collections;
import java.util.EnumMap;
import java.util.Map;

import javax.servlet.ServletContext;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.rdf.model.ModelMaker;

import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryConfig;
import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector;
import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelectorImpl;
import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactorySDB;
import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactorySDB.SDBDatasetMode;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ContextModelAccess;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ReasoningOption;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.OntModelCache;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
import edu.cornell.mannlib.vitro.webapp.triplesource.CombinedTripleSource;
import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;

/**
 * The context-based model access is simpler than the request-based model
 * access.
 * 
 * There is no "current user", so there can be no preferred language or
 * policy-based filtering.
 * 
 * We are confident that each of these structures will be used at some point, so
 * there is no need for lazy initialization.
 */
public class ContextModelAccessImpl implements ContextModelAccess {
    private static final Log log = LogFactory.getLog(ContextModelAccessImpl.class);

    private static final String VITRO_DEFAULT_NAMESPACE = "Vitro.defaultNamespace";

    private final ConfigurationProperties props;

    private final CombinedTripleSource factory;

    private final Map<WhichService, RDFService> rdfServiceMap;
    private final Map<WhichService, Dataset> datasetMap;
    private final Map<WhichService, ModelMaker> modelMakerMap;
    private final OntModelCache ontModelCache;
    private final Map<ReasoningOption, OntModelSelector> omsMap;
    private final Map<ReasoningOption, WebappDaoFactory> wadfMap;

    /**
     * Pull all of the items into maps, instead of fetching them from the
     * factory on demand. We don't know that the factory wouldn't create fresh
     * ones.
     * 
     * The exception is the OntModels, for two reasons: first, because the
     * OntModelCache assures us that it won't create fresh copies, and second
     * because we may not know the names of all of the models that will be
     * requested.
     */
    public ContextModelAccessImpl(ServletContext ctx, CombinedTripleSource factory) {
        this.props = ConfigurationProperties.getBean(ctx);
        this.factory = factory;

        this.ontModelCache = factory.getOntModelCache();
        this.rdfServiceMap = populateRdfServiceMap();
        this.datasetMap = populateDatasetMap();
        this.modelMakerMap = populateModelMakerMap();
        this.omsMap = populateOmsMap();
        this.wadfMap = populateWadfMap();
    }

    @Override
    public String toString() {
        return "ContextModelAccessImpl[" + ToString.hashHex(this) + ", factory=" + factory + "]";
    }

    // ----------------------------------------------------------------------
    // RDFServices
    // ----------------------------------------------------------------------

    private Map<WhichService, RDFService> populateRdfServiceMap() {
        Map<WhichService, RDFService> map = new EnumMap<>(WhichService.class);
        map.put(CONTENT, factory.getRDFService(CONTENT));
        map.put(CONFIGURATION, factory.getRDFService(CONFIGURATION));
        log.debug("RdfServiceMap: " + map);
        return Collections.unmodifiableMap(map);
    }

    @Override
    public RDFService getRDFService() {
        return getRDFService(CONTENT);
    }

    @Override
    public RDFService getRDFService(WhichService which) {
        RDFService rdfService = rdfServiceMap.get(which);
        log.debug("getRDFService " + which + ": " + rdfService);
        return rdfService;
    }

    // ----------------------------------------------------------------------
    // Datasets
    // ----------------------------------------------------------------------

    private Map<WhichService, Dataset> populateDatasetMap() {
        Map<WhichService, Dataset> map = new EnumMap<>(WhichService.class);
        map.put(CONTENT, factory.getDataset(CONTENT));
        map.put(CONFIGURATION, factory.getDataset(CONFIGURATION));
        log.debug("DatasetMap: " + map);
        return Collections.unmodifiableMap(map);
    }

    @Override
    public Dataset getDataset() {
        return getDataset(CONTENT);
    }

    @Override
    public Dataset getDataset(WhichService which) {
        Dataset dataset = datasetMap.get(which);
        log.debug("getDataset " + which + ": " + dataset);
        return dataset;
    }

    // ----------------------------------------------------------------------
    // ModelMakers
    // ----------------------------------------------------------------------

    private Map<WhichService, ModelMaker> populateModelMakerMap() {
        Map<WhichService, ModelMaker> map = new EnumMap<>(WhichService.class);
        map.put(CONTENT, factory.getModelMaker(CONTENT));
        map.put(CONFIGURATION, factory.getModelMaker(CONFIGURATION));
        log.debug("ModelMakerMap: " + map);
        return Collections.unmodifiableMap(map);
    }

    @Override
    public ModelMaker getModelMaker() {
        return getModelMaker(CONTENT);
    }

    @Override
    public ModelMaker getModelMaker(WhichService which) {
        ModelMaker modelMaker = modelMakerMap.get(which);
        log.debug("getModelMaker " + which + ": " + modelMaker);
        return modelMaker;
    }

    // ----------------------------------------------------------------------
    // OntModels
    // ----------------------------------------------------------------------

    @Override
    public OntModel getOntModel() {
        return getOntModel(FULL_UNION);
    }

    @Override
    public OntModel getOntModel(String name) {
        OntModel ontModel = ontModelCache.getOntModel(name);
        log.debug("getOntModel: " + ontModel);
        return ontModel;
    }

    // ----------------------------------------------------------------------
    // OntModelSelectors
    // ----------------------------------------------------------------------

    private Map<ReasoningOption, OntModelSelector> populateOmsMap() {
        Map<ReasoningOption, OntModelSelector> map = new EnumMap<>(ReasoningOption.class);
        map.put(ASSERTIONS_ONLY, createOntModelSelector(ABOX_ASSERTIONS, TBOX_ASSERTIONS, FULL_ASSERTIONS));
        map.put(INFERENCES_ONLY, createOntModelSelector(ABOX_INFERENCES, TBOX_INFERENCES, FULL_INFERENCES));
        map.put(ASSERTIONS_AND_INFERENCES, createOntModelSelector(ABOX_UNION, TBOX_UNION, FULL_UNION));
        log.debug("OntModelSelectorMap: " + map);
        return Collections.unmodifiableMap(map);
    }

    private OntModelSelector createOntModelSelector(String aboxName, String tboxName, String fullName) {
        OntModelSelectorImpl oms = new OntModelSelectorImpl();
        oms.setABoxModel(getOntModel(aboxName));
        oms.setTBoxModel(getOntModel(tboxName));
        oms.setFullModel(getOntModel(fullName));
        oms.setApplicationMetadataModel(getOntModel(APPLICATION_METADATA));
        oms.setDisplayModel(getOntModel(DISPLAY));
        oms.setUserAccountsModel(getOntModel(USER_ACCOUNTS));
        return oms;
    }

    @Override
    public OntModelSelector getOntModelSelector() {
        return getOntModelSelector(ASSERTIONS_AND_INFERENCES);
    }

    @Override
    public OntModelSelector getOntModelSelector(ReasoningOption option) {
        OntModelSelector ontModelSelector = omsMap.get(option);
        log.debug("getOntModelSelector: " + ontModelSelector);
        return ontModelSelector;
    }

    // ----------------------------------------------------------------------
    // WebappDaoFactories
    // ----------------------------------------------------------------------

    private Map<ReasoningOption, WebappDaoFactory> populateWadfMap() {
        WebappDaoFactoryConfig config = new WebappDaoFactoryConfig();
        config.setDefaultNamespace(getDefaultNamespace());

        RDFService rdfService = getRDFService(CONTENT);

        Map<ReasoningOption, WebappDaoFactory> map = new EnumMap<>(ReasoningOption.class);
        map.put(ASSERTIONS_ONLY, new WebappDaoFactorySDB(rdfService, getOntModelSelector(ASSERTIONS_ONLY), config,
                SDBDatasetMode.ASSERTIONS_ONLY));
        map.put(INFERENCES_ONLY, new WebappDaoFactorySDB(rdfService, getOntModelSelector(INFERENCES_ONLY), config,
                SDBDatasetMode.INFERENCES_ONLY));
        map.put(ASSERTIONS_AND_INFERENCES, new WebappDaoFactorySDB(rdfService,
                getOntModelSelector(ASSERTIONS_AND_INFERENCES), config, SDBDatasetMode.ASSERTIONS_AND_INFERENCES));
        log.debug("WebappdaoFactoryMap: " + map);
        return Collections.unmodifiableMap(map);
    }

    private String getDefaultNamespace() {
        return props.getProperty(VITRO_DEFAULT_NAMESPACE);
    }

    @Override
    public WebappDaoFactory getWebappDaoFactory() {
        return getWebappDaoFactory(ASSERTIONS_AND_INFERENCES);
    }

    @Override
    public WebappDaoFactory getWebappDaoFactory(ReasoningOption option) {
        WebappDaoFactory wadf = wadfMap.get(option);
        log.debug("getWebappDaoFactory: " + wadf);
        return wadf;
    }

}