view OPPL/Tool.java @ 6:3740505b579c

Added reasoner option: Pellet or HermiT
author Mikel Egaña Aranguren <mikel-egana-aranguren@toolshed.g2.bx.psu.edu>
date Sun, 18 Sep 2011 12:35:18 +0200
parents 68935f90c2db
children 756f1f5798bf
line wrap: on
line source

/**
 * Copyright (C) 2011, Mikel Egaña Aranguren
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package es.upm.fi.dia.oeg.oppl.galaxy;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.coode.oppl.ChangeExtractor;
import org.coode.oppl.OPPLParser;
import org.coode.oppl.OPPLScript;
import org.coode.oppl.ParserFactory;
import org.coode.oppl.exceptions.QuickFailRuntimeExceptionHandler;
import org.coode.oppl.log.Logging;
import org.coode.owlapi.obo.parser.OBOOntologyFormat;
import org.coode.parsers.ErrorListener;
import org.coode.parsers.LoggerErrorListener;
import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.io.RDFXMLOntologyFormat;
import org.semanticweb.owlapi.io.SystemOutDocumentTarget;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLAxiom;
import org.semanticweb.owlapi.model.OWLAxiomChange;
import org.semanticweb.owlapi.model.OWLDataFactory;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
import org.semanticweb.owlapi.model.OWLOntologyIRIMapper;
import org.semanticweb.owlapi.model.OWLOntologyManager;
import org.semanticweb.owlapi.model.OWLOntologyStorageException;
import org.semanticweb.owlapi.reasoner.InferenceType;
import org.semanticweb.owlapi.reasoner.OWLReasoner;
import org.semanticweb.owlapi.reasoner.OWLReasonerFactory;
import org.semanticweb.owlapi.util.InferredAxiomGenerator;
import org.semanticweb.owlapi.util.InferredOntologyGenerator;
import org.semanticweb.owlapi.util.InferredSubClassAxiomGenerator;
import org.semanticweb.owlapi.util.SimpleIRIMapper;

import com.clarkparsia.pellet.owlapiv3.PelletReasonerFactory;

import org.semanticweb.HermiT.Reasoner;

/**
 * @author Mikel Egaña Aranguren
 */
public class Tool {

	/**
	 * @throws FileNotFoundException 
	 * @throws OWLOntologyCreationException 
	 * @throws OWLOntologyStorageException 
	 */
	public static void main(String[] args) throws FileNotFoundException, OWLOntologyCreationException, OWLOntologyStorageException {		
		// Get the arguments from command-line
		String OWLFilePath = args [0]; 
		String OPPL_script_file = args [1];
		String Output_format = args [2]; // OWL|OBO
		String Add_inferred = args [3]; // Add_inferred|Whatever
		String imports_file_path = args [4]; // Flat tab delimited file: URI	Document URI
		String reasoner_type = args [5]; // Pellet|HermiT
		
		// Load the main ontology		
		File owl_file = new File(OWLFilePath);
		OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); 
		
		// Load the imports if any
		if(!imports_file_path.equals("NoImports")){
			File imports_file = new File(imports_file_path);
			Scanner imports_input = new Scanner(imports_file);
			while(imports_input.hasNext()){
			    String nextLine = imports_input.nextLine();
			    if(!nextLine.startsWith("#")){
				    String [] URI_documentURI = nextLine.split("\t");	
				    IRI ontology_IRI = IRI.create(URI_documentURI[0]);
					IRI document_IRI = IRI.create("file://" + URI_documentURI[1]);	
					OWLOntologyIRIMapper iriMapper = new SimpleIRIMapper(ontology_IRI,document_IRI);
					manager.addIRIMapper(iriMapper);
				}
			}
			imports_input.close();
		}
		OWLDataFactory factory = manager.getOWLDataFactory();
		OWLOntology OWL_ontology = manager.loadOntologyFromOntologyDocument(owl_file);
		
		// Reasoner
		OWLReasonerFactory reasonerFactory = null;
		OWLReasoner reasoner = null;
		if(reasoner_type.equals("Pellet")){
			reasonerFactory = new PelletReasonerFactory(); 
			reasoner = reasonerFactory.createReasoner(OWL_ontology);
		}
		else{
			reasonerFactory = new Reasoner.ReasonerFactory();
			reasoner = reasonerFactory.createReasoner(OWL_ontology);
		}
		
		// Load the flat file with script in memory
		String OPPL_script_source = "";
		File file = new File(OPPL_script_file);
		Scanner input = new Scanner(file);
		while(input.hasNext()) {
		    String nextToken = input.next();
		    OPPL_script_source = OPPL_script_source + " " + nextToken;
		}
		input.close();
	
		// Parse the OPPL script
		ParserFactory parserFactory = new ParserFactory(manager, OWL_ontology, reasoner); 
		Logger logger = Logger.getLogger(Tool.class.getName());
		Logging.getQueryLogger().setLevel(Level.OFF); // The normal messages are errors for galaxy (Fixed in Galaxy by 2 > /dev/null)
		ErrorListener errorListener = (ErrorListener)new LoggerErrorListener(logger);
		OPPLParser opplparser = parserFactory.build(errorListener);
		OPPLScript OPPLscript = opplparser.parse(OPPL_script_source);
			
		// Execute the script
		ChangeExtractor extractor = new ChangeExtractor(new QuickFailRuntimeExceptionHandler(), true);
		List<OWLAxiomChange> changes = extractor.visit(OPPLscript);
		manager.applyChanges(changes);
		
		// Add the inferred axioms as asserted axioms to the original ontology
		if(Add_inferred.equals("Add_inferred")){
			reasoner.precomputeInferences(InferenceType.CLASS_HIERARCHY);
			List<InferredAxiomGenerator<? extends OWLAxiom>> gens = new ArrayList<InferredAxiomGenerator<? extends OWLAxiom>>();
			gens.add(new InferredSubClassAxiomGenerator());
			InferredOntologyGenerator iog = new InferredOntologyGenerator(reasoner, gens);
			iog.fillOntology(manager, OWL_ontology);	
		}

		// Print the ontology to the standard output so other galaxy tools can operate on the output	
		if(Output_format.equals("OBO")){
			manager.saveOntology(OWL_ontology, new OBOOntologyFormat(), new SystemOutDocumentTarget());
		}
		else{
			manager.saveOntology(OWL_ontology, new RDFXMLOntologyFormat(), new SystemOutDocumentTarget());
		}
	}
}