org.mindswap.swoop.renderer.BaseEntityRenderer.java Source code

Java tutorial

Introduction

Here is the source code for org.mindswap.swoop.renderer.BaseEntityRenderer.java

Source

//The MIT License
//
// Copyright (c) 2004 Mindswap Research Group, University of Maryland, College Park
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.

package org.mindswap.swoop.renderer;

import java.io.PrintWriter;
import java.io.Writer;
import java.net.URI;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;

import javax.swing.JEditorPane;

import org.apache.commons.lang.StringEscapeUtils;
import org.mindswap.swoop.SwoopModel;
import org.mindswap.swoop.TermsDisplay;
import org.mindswap.swoop.reasoner.SwoopReasoner;
import org.semanticweb.owl.io.RendererException;
import org.semanticweb.owl.io.ShortFormProvider;
import org.semanticweb.owl.model.OWLAnnotationProperty;
import org.semanticweb.owl.model.OWLClass;
import org.semanticweb.owl.model.OWLDataProperty;
import org.semanticweb.owl.model.OWLDataType;
import org.semanticweb.owl.model.OWLDescription;
import org.semanticweb.owl.model.OWLEntity;
import org.semanticweb.owl.model.OWLException;
import org.semanticweb.owl.model.OWLIndividual;
import org.semanticweb.owl.model.OWLObject;
import org.semanticweb.owl.model.OWLObjectProperty;
import org.semanticweb.owl.model.OWLOr;
import org.semanticweb.owl.model.OWLProperty;

/**
 * @author Evren Sirin
 */
public abstract class BaseEntityRenderer implements ShortFormProvider {
    protected SwoopModel swoopModel;

    protected SwoopReasoner reasoner;
    protected OWLEntity entity;
    protected Writer writer;

    protected PrintWriter pw;

    public SwoopRenderingVisitor visitor;
    protected String fontSize;

    protected boolean editorEnabled, showInherited, showDivisions, showImports;

    /*
     * Constructor
     */
    public BaseEntityRenderer() {
        //      this.swoopModel = new SwoopModel();
    }

    public abstract SwoopRenderingVisitor createVisitor();

    /*
     * Utility method to set model so one can use visitor without using the render method
     *   Without setting swoopModel, every call to shortForm will fail (NullPointerException) 
     */
    public void setSwoopModel(SwoopModel model) {
        this.swoopModel = model;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.mindswap.swoop.SwoopEntityRenderer#render(org.semanticweb.owl.model.OWLEntity,
     *      org.mindswap.swoop.SwoopReasoner, java.io.Writer)
     */
    public void render(OWLEntity entity, SwoopModel swoopModel, Writer writer) throws RendererException {
        try {
            this.swoopModel = swoopModel;
            this.reasoner = swoopModel.getReasoner();
            this.entity = entity;
            this.writer = writer;
            this.pw = new PrintWriter(writer);

            this.editorEnabled = swoopModel.getEditorEnabled();
            this.showInherited = swoopModel.getShowInherited();
            this.showDivisions = swoopModel.getShowDivisions();
            this.showImports = swoopModel.getShowImports();

            visitor = createVisitor();
            fontSize = swoopModel.getFontSize();

            renderEntity();
        } catch (OWLException e) {
            throw new RendererException(e.getMessage());
        }
    }

    /**
     * renderEntity
     * 
     * 
     */
    protected void renderEntity() throws OWLException {
        //*********************************************
        //Changed For Econnections
        //********************************************

        if (entity instanceof OWLClass)
            if (!swoopModel.getSelectedOntology().getForeignEntities().containsKey(entity))
                renderClass((OWLClass) entity);
            else
                renderForeignEntity(entity);
        else if (entity instanceof OWLObjectProperty)
            if (!swoopModel.getSelectedOntology().getForeignEntities().containsKey(entity))
                renderObjectProperty((OWLObjectProperty) entity);
            else
                renderForeignEntity(entity);
        else if (entity instanceof OWLDataProperty)
            if (!swoopModel.getSelectedOntology().getForeignEntities().containsKey(entity))
                renderDataProperty((OWLDataProperty) entity);
            else
                renderForeignEntity(entity);
        else if (entity instanceof OWLIndividual)
            if (!swoopModel.getSelectedOntology().getForeignEntities().containsKey(entity))
                renderIndividual((OWLIndividual) entity);
            else
                renderForeignEntity(entity);
        else if (entity instanceof OWLAnnotationProperty)
            renderAnnotationProperty((OWLAnnotationProperty) entity);
        else {
            System.out.println("BaseEntityRenderer: entity is of type = " + entity.getClass().getName());
            throw new RuntimeException("This is not possible!");
        }
    }

    protected Set getPropertiesWithDomain(OWLClass c, boolean inherited) throws OWLException {
        Set set = new HashSet();
        Iterator i = reasoner.getProperties().iterator();
        while (i.hasNext()) {
            OWLProperty p = (OWLProperty) i.next();

            // skip owl:AnnotationProperties
            if (p instanceof OWLAnnotationProperty)
                continue;

            Set domSet = reasoner.domainsOf(p);

            // consider all properties with no domain (of OWL:Thing)
            //         if (inherited && domSet.size()==0) set.add(p);

            if (domSet.size() > 0) {
                Object obj = null;
                // check if domSet contains union
                if ((obj = domSet.iterator().next()) instanceof OWLOr) {
                    OWLOr unionSet = (OWLOr) obj;
                    if (unionSet.getOperands().contains(c))
                        set.add(p);
                } else {
                    if (domSet.contains(c))
                        set.add(p);
                }
            }
        }

        if (inherited) {

            // also consider properties of subclasses of c
            Set allSubCSet = reasoner.descendantClassesOf(c);
            Iterator supCIter = allSubCSet.iterator();
            while (supCIter.hasNext()) {
                Set supCSet = (HashSet) supCIter.next();
                OWLDescription supC = (OWLDescription) supCSet.iterator().next();
                if (supC instanceof OWLClass) {
                    set.addAll(getPropertiesWithDomain((OWLClass) supC, false));
                }
            }
        }
        return set;
    }

    protected Set getPropertiesWithRange(OWLClass c, boolean inherited) throws OWLException {
        Set set = new HashSet();
        Iterator i = reasoner.getProperties().iterator();
        while (i.hasNext()) {
            OWLProperty p = (OWLProperty) i.next();

            // skip owl:AnnotationProperties
            if (p instanceof OWLAnnotationProperty)
                continue;

            if (reasoner.rangesOf(p).contains(c))
                set.add(p);
        }

        if (inherited) {
            // also consider properties of subclasses of c
            Set allSubCSet = reasoner.descendantClassesOf(c);
            Iterator supCIter = allSubCSet.iterator();
            while (supCIter.hasNext()) {
                Set supCSet = (HashSet) supCIter.next();
                OWLDescription supC = (OWLDescription) supCSet.iterator().next();
                if (supC instanceof OWLClass) {
                    set.addAll(getPropertiesWithRange((OWLClass) supC, false));
                }
            }
        }

        return set;
    }

    /**
     * Create a JEditorPane given the contentType (text/plain or text/html)
     * and make other default settings (add hyperlink listener, editable false)
     * @param contentType
     * @return
     */
    public static JEditorPane getEditorPane(String contentType, TermsDisplay TD) {
        JEditorPane editorPane = null;
        if (contentType.equals("text/plain"))
            editorPane = new JEditorPane();
        else if (contentType.equals("text/html")) {
            editorPane = new JEditorPane();
            editorPane.addHyperlinkListener(TD);
        } else if (contentType.equals("text/xml"))
            editorPane = new JEditorPane();
        else
            throw new RuntimeException("Cannot create an editor pane for content type " + contentType);

        editorPane.setEditable(false);
        editorPane.setContentType(contentType);

        // adding to UI listeners of TermsDisplay
        //editorPane.getDocument().addDocumentListener(TD);
        editorPane.addMouseListener(TD);
        editorPane.addKeyListener(TD);

        return editorPane;
    }

    abstract protected void renderAnnotationProperty(OWLAnnotationProperty prop) throws OWLException;

    abstract protected void renderClass(OWLClass clazz) throws OWLException;

    abstract protected void renderDataProperty(OWLDataProperty prop) throws OWLException;

    abstract protected void renderDataType(OWLDataType datatype) throws OWLException;

    abstract protected void renderIndividual(OWLIndividual ind) throws OWLException;

    abstract protected void renderObjectProperty(OWLObjectProperty prop) throws OWLException;

    //************************************************
    //Added for Econnections
    //**********************************************
    abstract protected void renderForeignEntity(OWLEntity ent) throws OWLException;

    //**********************************************************
    public String shortForm(URI uri) {
        return swoopModel.shortForm(uri);
    }

    /* Return a collection, ordered by the URIs. */
    protected SortedSet orderedEntities(Set entities) {
        SortedSet ss = new TreeSet(new Comparator() {
            public int compare(Object o1, Object o2) {
                try {
                    return ((OWLEntity) o1).getURI().toString().compareTo(((OWLEntity) o2).getURI().toString());
                } catch (Exception ex) {
                    return o1.toString().compareTo(o2.toString());
                }
            }
        });
        ss.addAll(entities);
        return ss;
    }

    /**
     * HTML-escape an object
     * @param o
     * @return
     */
    protected static String escape(Object o) {
        return StringEscapeUtils.escapeHtml(o.toString());
    }

    public void printObject(OWLObject obj) throws OWLException {
        visitor.reset();
        obj.accept(visitor);
        print(visitor.result());
    }

    protected void print(String str) {
        pw.print(str);
    }

    protected void println(String str) {
        print(str);
        println();
    }

    protected void println() {
        println();
    }

    /**
     * Used to render a single OWLObject alone in its Concise Format form
     * @param obj - OWLObject to be rendered
     * @param swoopModel
     * @param writer - results get written to this stream
     * @throws RendererException
     */
    public void renderObject(OWLObject obj, SwoopModel swoopModel, Writer writer) throws RendererException {
        try {
            this.swoopModel = swoopModel;
            this.reasoner = swoopModel.getReasoner();
            this.writer = writer;
            this.pw = new PrintWriter(writer);

            visitor = createVisitor();
            fontSize = swoopModel.getFontSize();

            printObject(obj);
        } catch (OWLException e) {
            throw new RendererException(e.getMessage());
        }
    }

} // Renderer