uk.ac.ebi.fg.annotare2.magetabcheck.efo.EfoLoader.java Source code

Java tutorial

Introduction

Here is the source code for uk.ac.ebi.fg.annotare2.magetabcheck.efo.EfoLoader.java

Source

/*
 * Copyright 2012 EMBL - European Bioinformatics Institute
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package uk.ac.ebi.fg.annotare2.magetabcheck.efo;

import com.google.common.io.Files;
import com.google.common.io.Resources;
import org.semanticweb.HermiT.Reasoner;
import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
import org.semanticweb.owlapi.model.OWLOntologyManager;
import org.semanticweb.owlapi.reasoner.InferenceType;
import org.semanticweb.owlapi.reasoner.OWLReasoner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import static com.google.common.io.Closeables.close;

/**
 * @author Olga Melnichuk
 */
public class EfoLoader {

    private static final Logger log = LoggerFactory.getLogger(EfoLoader.class);

    private File cacheDir;
    private final URL defaultEfoUrl;
    private final int entityExpansionLimit;

    public EfoLoader(EfoServiceProperties properties) {
        if (properties == null) {
            throw new IllegalArgumentException("EfoServiceProperties == null");
        }

        defaultEfoUrl = properties.getEfoUrl();
        entityExpansionLimit = properties.getOwlEntityExpansionLimit();
        cacheDir = properties.getCacheDir();
        cacheDir = (cacheDir == null) ? Files.createTempDir() : cacheDir;
        log.debug("EFO cache dir used {}", cacheDir);
    }

    public EfoDag load() throws IOException, OWLOntologyCreationException {
        return load(defaultEfoUrl);
    }

    public EfoDag load(final URL url) throws IOException, OWLOntologyCreationException {
        if (url == null) {
            log.error("Given EFO url is null; please use the config file to specify the proper one");
            return null;
        }

        File cacheFile = getCacheFile(url);
        if (!cacheFile.exists()) {
            log.debug("The cache file doesn't exist; creating one [file={}]", cacheFile);
            if (!cacheDir.exists() && !cacheDir.mkdirs()) {
                throw new IOException("Can't create EFO cache directory: " + cacheDir.getAbsolutePath());
            }

            log.debug("Downloading EFO file [url={}]", url);
            Resources.asByteSource(url).copyTo(Files.asByteSink(cacheFile));
            log.debug("EFO file download successfully completed.");
        } else {
            log.debug("Loading EFO graph from cache [file={}]", cacheFile);
        }
        return load(cacheFile);
    }

    private File getCacheFile(URL url) {
        String fileName = url.toString().replaceAll("[^\\p{L}\\p{N}]", "");
        fileName = fileName.replaceAll("http|www", "");
        fileName = fileName.substring(0, Math.min(30, fileName.length()));
        return new File(cacheDir, fileName + ".cache");
    }

    public EfoDag load(File file) throws IOException, OWLOntologyCreationException {
        InputStream in = null;
        try {
            in = new FileInputStream(file);
            return load(in);
        } finally {
            close(in, true);
        }
    }

    public EfoDag load(InputStream in) throws OWLOntologyCreationException {
        OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
        OWLReasoner reasoner = null;

        try {
            // The default entityExpansionLimit=64000 defined in RDFXMLParser
            // is not enough to load EFO
            System.setProperty("entityExpansionLimit", Integer.toString(entityExpansionLimit));

            log.debug("Reading the ontology...");
            OWLOntology ontology = manager.loadOntologyFromOntologyDocument(in);
            reasoner = new Reasoner.ReasonerFactory().createReasoner(ontology);
            reasoner.precomputeInferences(InferenceType.CLASS_HIERARCHY);
            reasoner.isConsistent();
            return EfoDag.build(ontology, reasoner);
        } finally {
            if (reasoner != null) {
                reasoner.dispose();
            }
        }
    }
}