package org.isatools.isacreator.ontologymanager.bioportal.io;
import org.isatools.isacreator.configuration.Ontology;
import org.isatools.isacreator.ontologymanager.BioPortal4Client;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Comment;
import uk.ac.ebi.utils.xml.XPathReader;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPathConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.*;
/**
* Loads a file defining allowed BioPortal ontologies into a file.
*
* @author Eamonn Maguire (eamonnmag@gmail.com)
* Date: 02/05/2012
* Time: 11:01
*/
public class AcceptedOntologiesLoader {
private static final String FILE = "ProgramData/cache/bioportal-ontology-detail.cache";
public static void populateAcceptedOntologies() {
System.out.println("_____populateAcceptedOntologies()____");
BioPortal4Client client = new BioPortal4Client();
Collection<Ontology> ontologies = client.getAllOntologies();
System.out.println("Found " + ontologies.size() + " ontologies \n");
try {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
// root elements
Document doc = docBuilder.newDocument();
Comment comment = doc.createComment("Defines the accepted ontologies for BioPortal");
doc.appendChild(comment);
Element rootElement = doc.createElement("acceptedOntologies");
doc.appendChild(rootElement);
//<acceptedOntology abbreviation="OBI" id="1123"/>
for (Ontology ontology : ontologies) {
Element acceptedOntologyElement = doc.createElement("acceptedOntology");
Attr abbreviation = doc.createAttribute("abbreviation");
abbreviation.setValue(ontology.getOntologyAbbreviation());
acceptedOntologyElement.setAttributeNode(abbreviation);
Attr name = doc.createAttribute("name");
name.setValue(ontology.getOntologyDisplayLabel());
acceptedOntologyElement.setAttributeNode(name);
Attr version = doc.createAttribute("version");
version.setValue(ontology.getSubmissionId());
acceptedOntologyElement.setAttributeNode(version);
Attr uri = doc.createAttribute("uri");
uri.setValue(ontology.getHomepage());
acceptedOntologyElement.setAttributeNode(uri);
Attr id = doc.createAttribute("id");
id.setValue(ontology.getOntologyID());
acceptedOntologyElement.setAttributeNode(id);
rootElement.appendChild(acceptedOntologyElement);
}
// write the content into xml file
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
String fullPath = FILE;
File outputFile = new File(fullPath);
StreamResult result = new StreamResult(outputFile.getAbsolutePath());
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
transformer.transform(source, result);
} catch (ParserConfigurationException pce) {
pce.printStackTrace();
} catch (TransformerException tfe) {
tfe.printStackTrace();
}
}
public static Map<String, Ontology> getAcceptedOntologies() {
Map<String, Ontology> acceptedOntologies = new HashMap<String, Ontology>();
if(!new File(FILE).exists()) {
// then create it
new File(FILE).getParentFile().mkdirs();
populateAcceptedOntologies();
}
try {
XPathReader reader = new XPathReader(new FileInputStream(FILE));
NodeList sections = (NodeList) reader.read("/acceptedOntologies/acceptedOntology", XPathConstants.NODESET);
if (sections.getLength() > 0) {
for (int sectionIndex = 0; sectionIndex <= sections.getLength(); sectionIndex++) {
String id = (String) reader.read("/acceptedOntologies/acceptedOntology[" + sectionIndex + "]/@id", XPathConstants.STRING);
String abbreviation = (String) reader.read("/acceptedOntologies/acceptedOntology[" + sectionIndex + "]/@abbreviation", XPathConstants.STRING);
String name = (String) reader.read("/acceptedOntologies/acceptedOntology[" + sectionIndex + "]/@name", XPathConstants.STRING);
String version = (String) reader.read("/acceptedOntologies/acceptedOntology[" + sectionIndex + "]/@version", XPathConstants.STRING);
String homepage = (String) reader.read("/acceptedOntologies/acceptedOntology[" + sectionIndex + "]/@uri", XPathConstants.STRING);
Ontology ontology = new Ontology(id, version, abbreviation, name);
ontology.setHomePage(homepage);
acceptedOntologies.put(id, ontology);
}
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
return acceptedOntologies;
}
public static void main(String[] args) {
//getAcceptedOntologies();
populateAcceptedOntologies();
}
}