/*
* Created on Apr 21, 2005
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package org.mindswap.swoop.renderer.entity;
import java.awt.Component;
import java.io.IOException;
import java.io.Writer;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Iterator;
import javax.swing.JEditorPane;
import org.mindswap.swoop.SwoopDisplayPanel;
import org.mindswap.swoop.SwoopModel;
import org.mindswap.swoop.TermsDisplay;
import org.mindswap.swoop.renderer.BaseEntityRenderer;
import org.mindswap.swoop.renderer.SwoopEditableRenderer;
import org.mindswap.swoop.renderer.SwoopEntityRenderer;
import org.mindswap.swoop.utils.owlapi.QNameShortFormProvider;
import org.mindswap.swoop.utils.rdfapi.EConnTripleVisitor;
import org.mindswap.swoop.utils.rdfapi.HyperXMLWriter;
import org.mindswap.swoop.utils.rdfapi.NodeProvider;
import org.mindswap.swoop.utils.rdfapi.PrettyXMLWriter;
import org.mindswap.swoop.utils.rdfapi.RDFWriter;
import org.mindswap.swoop.utils.rdfapi.SkolemizingNodeProvider;
import org.mindswap.swoop.utils.rdfapi.SwoopResource;
import org.mindswap.swoop.utils.rdfapi.TripleVisitor;
import org.mindswap.swoop.utils.rdfapi.XMLWriter;
import org.semanticweb.owl.io.RendererException;
import org.semanticweb.owl.model.OWLDifferentIndividualsAxiom;
import org.semanticweb.owl.model.OWLEntity;
import org.semanticweb.owl.model.OWLException;
import org.semanticweb.owl.model.OWLIndividualAxiom;
import org.semanticweb.owl.model.OWLOntology;
import org.xngr.browser.editor.XmlEditorPane;
import edu.unika.aifb.rdf.api.model.ModelException;
/**
* @author ronwalf
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class RDFXMLEntityRenderer implements SwoopEntityRenderer, SwoopEditableRenderer {
protected boolean editorEnabled;
protected JEditorPane pane;
protected String getContentType() {
if (isEditableText()) {
return "text/plain";
} else {
return "text/html";
}
}
/* (non-Javadoc)
* @see org.mindswap.swoop.renderer.SwoopRenderer#getDisplayComponent(org.mindswap.swoop.SwoopDisplayPanel)
*/
public Component getDisplayComponent(SwoopDisplayPanel panel) {
if (!(panel instanceof TermsDisplay ))
throw new IllegalArgumentException();
if (!editorEnabled) {
// return standard JEditorPane
pane = BaseEntityRenderer.getEditorPane( this.getContentType(), (TermsDisplay)panel );
}
else
{
// XMLPane construction
pane = new XmlEditorPane();
pane.addKeyListener((TermsDisplay) panel);
//pane.getDocument().addDocumentListener((TermsDisplay) panel);
}
return pane;
}
/* (non-Javadoc)
* @see org.mindswap.swoop.renderer.SwoopRenderer#getName()
*/
public String getName() {
return "RDF/XML";
}
/* (non-Javadoc)
* @see org.mindswap.swoop.renderer.SwoopEditableRenderer#isEditableText()
*/
public boolean isEditableText() {
return editorEnabled;
}
/* (non-Javadoc)
* @see org.mindswap.swoop.renderer.SwoopEntityRenderer#render(org.semanticweb.owl.model.OWLEntity, org.mindswap.swoop.SwoopModel, java.io.Writer)
*/
public void render(OWLEntity entity, SwoopModel swoopModel, Writer writer) throws RendererException {
try {
int fontSize = swoopModel.getFontPt();
//XMLEditorPane does not properly work with setFont...
//Font font = new Font(swoopModel.getFontFace(), Font.PLAIN, fontSize);
//pane.setFont(font);
if (swoopModel.getEditorEnabled() && !entity.getOntologies().contains(swoopModel.getSelectedOntology())) {
// entity is imported..cannot edit here
writer.write("Cannot edit Imported Entity directly here.");
return;
}
if (!isEditableText()) {
writer.write("<html><body style=\"font-face:"+swoopModel.getFontFace()+"; background-color: white; color: black; font-size:"+fontSize+"\">");
}
OWLOntology ontology = swoopModel.getSelectedOntology();
NodeProvider nodeProvider = new SkolemizingNodeProvider();
TripleVisitor visitor = new EConnTripleVisitor(ontology, nodeProvider);
entity.accept(visitor);
XMLWriter xml;
if (isEditableText()) {
xml = new PrettyXMLWriter(writer);
} else {
xml = new HyperXMLWriter(writer);
}
// Add entity for ontology
QNameShortFormProvider qnames = new QNameShortFormProvider();
String prefix = qnames.findPrefix(ontology.getURI().resolve("#none"));
if (prefix != null)
xml.addEntity(prefix, ontology.getURI().toString());
//visitor.serialize(xml, entity);
RDFWriter rdf = new RDFWriter(xml, visitor.getModel(), qnames);
rdf.setMaxLevel(10);
rdf.setBase(ontology.getURI());
rdf.startDocument();
if (nodeProvider.getNode(entity) instanceof SwoopResource) {
SwoopResource resource = (SwoopResource) nodeProvider.getNode(entity);
rdf.serializeSubject(resource);
for (Iterator iter = ontology.getIndividualAxioms().iterator(); iter.hasNext(); ) {
OWLIndividualAxiom axiom = (OWLIndividualAxiom) iter.next();
if (axiom instanceof OWLDifferentIndividualsAxiom) {
if (axiom.getIndividuals().contains(entity)) {
SwoopResource axiomResource = (SwoopResource) nodeProvider.getNode(axiom);
rdf.serializeSubject(axiomResource);
}
}
}
}
rdf.serializeAll();
rdf.endDocument();
if (!isEditableText()) {
writer.write("</FONT></body></html>");
}
} catch (IOException e) {
e.printStackTrace();
} catch (OWLException e) {
e.printStackTrace();
}
}
/* (non-Javadoc)
* @see org.mindswap.swoop.renderer.SwoopEditableRenderer#setEditorEnabled(boolean)
*/
public void setEditorEnabled(boolean mode) {
editorEnabled = mode;
}
}