package org.obolibrary.obo2owl;
import static org.semanticweb.owlapi.util.OWLAPIStreamUtils.asList;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Collection;
import java.util.Collections;
import javax.annotation.Nullable;
import org.obolibrary.oboformat.parser.OBOFormatException;
import org.semanticweb.owlapi.formats.FunctionalSyntaxDocumentFormat;
import org.semanticweb.owlapi.functional.parser.OWLFunctionalSyntaxOWLParser;
import org.semanticweb.owlapi.functional.renderer.FunctionalSyntaxStorer;
import org.semanticweb.owlapi.io.OWLOntologyDocumentSource;
import org.semanticweb.owlapi.io.OWLParserException;
import org.semanticweb.owlapi.io.OWLStorerParameters;
import org.semanticweb.owlapi.io.StringDocumentSource;
import org.semanticweb.owlapi.model.OWLAxiom;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
import org.semanticweb.owlapi.model.OWLOntologyManager;
import org.semanticweb.owlapi.model.OWLOntologyStorageException;
import org.semanticweb.owlapi.model.OWLRuntimeException;
import org.semanticweb.owlapi.model.UnloadableImportException;
/**
* Tools to read and write a set of owl axioms to/from a string. Used to preserve untranslatable
* axioms in an owl2obo conversion.
*/
public class OwlStringTools {
private OwlStringTools() {}
/**
* Create a string for the given set of axioms. Return null for empty sets or if the set is
* null.
*
* @param axioms axioms
* @param translationManager translationManager
* @param storerParameters storer parameters
* @return string or null
* @see #translate(String, OWLOntologyManager)
*/
public static String translate(Collection<OWLAxiom> axioms,
OWLOntologyManager translationManager, OWLStorerParameters storerParameters) {
if (axioms.isEmpty()) {
return "";
}
try {
OWLOntology ontology = translationManager.createOntology();
ontology.add(axioms);
FunctionalSyntaxStorer r = new FunctionalSyntaxStorer();
Writer writer = new StringWriter();
PrintWriter w = new PrintWriter(writer);
r.storeOntology(ontology, w, new FunctionalSyntaxDocumentFormat(), storerParameters);
w.flush();
return writer.toString();
} catch (OWLOntologyStorageException | OWLOntologyCreationException
| OWLRuntimeException e) {
throw new OBOFormatException(e);
}
}
/**
* Parse the axioms from the given axiom string. Returns null for empty and null strings.
*
* @param axioms axioms
* @param translationManager translationManager
* @return set of axioms or null
*/
public static Collection<OWLAxiom> translate(@Nullable String axioms,
OWLOntologyManager translationManager) {
if (axioms == null || axioms.isEmpty()) {
return Collections.emptySet();
}
try {
OWLFunctionalSyntaxOWLParser p = new OWLFunctionalSyntaxOWLParser();
OWLOntologyDocumentSource documentSource =
new StringDocumentSource(axioms, new FunctionalSyntaxDocumentFormat());
OWLOntology ontology = translationManager.createOntology();
documentSource.acceptParser(p, ontology, translationManager.getOntologyConfigurator());
return asList(ontology.axioms());
} catch (UnloadableImportException | OWLOntologyCreationException | OWLParserException e) {
throw new OWLRuntimeException(e);
}
}
}