org.mindswap.swoop.renderer.ontology.SwoopSpeciesValidationRenderer.java Source code

Java tutorial

Introduction

Here is the source code for org.mindswap.swoop.renderer.ontology.SwoopSpeciesValidationRenderer.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.ontology;

import java.awt.Component;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;

import org.apache.commons.lang.StringEscapeUtils;
import org.mindswap.swoop.OntologyDisplay;
import org.mindswap.swoop.SwoopDisplayPanel;
import org.mindswap.swoop.SwoopModel;
import org.mindswap.swoop.renderer.SwoopOntologyRenderer;
import org.semanticweb.owl.io.RendererException;
import org.semanticweb.owl.model.OWLException;
import org.semanticweb.owl.model.OWLOntology;
import org.semanticweb.owl.model.helper.OntologyHelper;
import org.semanticweb.owl.validation.SpeciesValidator;
import org.semanticweb.owl.validation.SpeciesValidatorReporter;

/**
 * @author unknown
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class SwoopSpeciesValidationRenderer extends BaseOntologyRenderer implements SwoopOntologyRenderer {

    private static final String VALIDATOR_CONTENT_TYPE = "text/html";
    private static final String VALIDATOR_NAME = "Species Validation";

    private static final String[] POPULAR_SCHEME_NAMES = { "http://" };//, "ftp://", "gopher://", "https://", "tftp://" };
    private static final String SPACE = " ";
    private static final String LT = "<";
    private static final String GT = ">";
    private SwoopModel myModel = null;

    // inherited methods from interface SwoopOntologyRenderer

    public String getContentType() {
        return VALIDATOR_CONTENT_TYPE;
    }

    public String getName() {
        return VALIDATOR_NAME;
    }

    public void render(OWLOntology ontology, SwoopModel swoopModel, Writer writer) throws RendererException {

        myModel = swoopModel;

        PrintWriter out = new PrintWriter(writer);

        SpeciesValidator sv = null;
        try {
            sv = new SwoopSpeciesValidator(swoopModel);

        } catch (OWLException e1) {
            throw new RendererException(e1.getMessage());
        }
        StringWriter lw = new StringWriter();
        StringWriter dw = new StringWriter();
        StringWriter fw = new StringWriter();
        StringWriter rw = new StringWriter();
        StringWriter mw = new StringWriter();
        final PrintWriter lpw = new PrintWriter(lw);
        final PrintWriter dpw = new PrintWriter(dw);
        final PrintWriter fpw = new PrintWriter(fw);
        final PrintWriter mpw = new PrintWriter(mw);

        final StringBuffer level = new StringBuffer();

        sv.setReporter(new SpeciesValidatorReporter() {
            public void ontology(OWLOntology onto) {
            }

            public void done(String str) {
                level.setLength(0);
                level.append(str);
            }

            public void message(String str) {
                mpw.println("<li>" + str + "</li>");
            }

            public void explain(int l, int code, String str) {
                str = hyperlinkizeCode(str);
                switch (l) {
                case SwoopSpeciesValidator.LITE:
                    lpw.println("<li>" + reformatInHTML(str) + "</li>");
                    break;
                case SwoopSpeciesValidator.DL:
                    dpw.println("<li>" + reformatInHTML(str) + "</li>");
                    break;
                case SwoopSpeciesValidator.FULL:
                    fpw.println("<li>" + reformatInHTML(str) + "</li>");
                    break;
                }
            }
        });

        try {
            //int l = SwoopSpeciesValidator.LITE;
            // check for OWL lite so we get all the messages
            sv.isOWLLite(ontology);
            out.println("<html><body style='background-color: white; color: black'>");
            out.println("<FONT FACE=\"" + swoopModel.getFontFace() + "\" SIZE=" + swoopModel.getFontSize() + ">");
            //         out.println("<b>DL Expressivity:</b> " + swoopModel.getReasoner().getExpressivity()+"<br>");
            out.println("<h1>Level: " + level + "<h1>");

            //out.println( "<li>"+"asdf adfd "+ encodeHLink("http://www.google.com", "http://www.google.com") + "</li>"); 

            if (!lw.toString().equals("")) {
                out.println("<p><strong>OWL-Lite features:</strong></p>");
                out.println("<ul>");
                out.println(lw.toString());
                out.println("</ul>");
            } // end of if ()
            if (!dw.toString().equals("")) {
                out.println("<p><strong>OWL-DL features:</strong></p>");
                out.println("<ul>");
                out.println(dw.toString());
                out.println("</ul>");
            } // end of if ()
            if (!fw.toString().equals("")) {
                out.println("<p><strong>OWL-Full features:</strong></p>");
                out.println("<ul>");
                out.println(fw.toString());
                out.println("</ul>");
            } // end of if ()
            if (!mw.toString().equals("")) {
                out.println("<p><b>Additional Messages</b></p>");
                out.println("<ul>");
                out.println(mw.toString());
                out.println("</ul>");
            } // end of if ()

            out.println("</FONT>");
            out.println("</body></html>");
        } catch (Exception e) {
            out.println("Exception: " + e.getMessage());
            e.printStackTrace();
        } // end of try-catch

    }

    public void setOptions(Map options) {
    }

    /**
     * Search all the URIs in the current ontology for a word occuring
     * at the end of the uri. Return uri if match found
     * @param word 
     * @return
     * @throws OWLException
     */
    private String findURI(String word) throws OWLException {
        OWLOntology onto = myModel.getSelectedOntology();
        Set ontologies = OntologyHelper.importClosure(onto);
        String uriLink = "";

        for (Iterator iter = ontologies.iterator(); iter.hasNext();) {
            OWLOntology ont = (OWLOntology) iter.next();
            Set allURIs = OntologyHelper.allURIs(ont);
            for (Iterator iter2 = allURIs.iterator(); iter2.hasNext();) {
                String uri = iter2.next().toString();
                if (uri.endsWith("#" + word) || uri.endsWith("/" + word)) {
                    uriLink = uri;
                    break;
                }
            }
        }
        return uriLink;
    }

    /**
     * Go through the species validation explanation string
     * Check for expressions of the form ":XX" and replace
     * XX with the corresponding URI from the ontology, if possible
     * @param str
     * @return
     */
    private String hyperlinkizeCode(String str) {
        try {
            int pos = 0;
            do {
                int index = str.indexOf(":", pos);
                pos = index + 1;
                if (index != -1 && !str.substring(index + 1, index + 2).equals(" ")) {
                    int endpos = str.indexOf(" ", index + 1);
                    int endpos2 = str.indexOf(")", index + 1);
                    if (endpos == -1)
                        endpos = endpos2;
                    else if (endpos > endpos2 && endpos2 != -1)
                        endpos = endpos2;
                    if (endpos == -1)
                        continue;
                    String word = str.substring(index + 1, endpos);
                    String uri = this.findURI(word);
                    if (!uri.equals("")) {
                        // add hyperlink to word
                        String hLink = this.encodeHLink(uri, word);
                        String chr = str.substring(index - 1, index + 1);
                        str = str.replaceAll(chr + word, hLink);
                    }
                }
            } while (pos != 0);

        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return str;
    }

    public Map getOptions() {
        return null;
    }

    /*
     *  SwoopRenderer method
     * 
     */
    public Component getDisplayComponent(SwoopDisplayPanel panel) {
        if (!(panel instanceof OntologyDisplay))
            throw new IllegalArgumentException();
        return super.getEditorPane(this.getContentType(), (OntologyDisplay) panel);
    }

    private String reformatInHTML(String source) {
        // if the following is true, then we assume that the String source
        // is already properly formatted with HLinks
        if (source.indexOf("<a href=") != -1) {

            // replace <http with &lt;http to escape <
            // so < will be displayed in the species validation
            // pane rather than being treated as a tag.
            source = source.replaceAll("<http", "&lt;http");
            return source;

        }
        //System.out.println(source);
        source = source.replaceAll(SPACE, " ");
        try {
            StringTokenizer tokens = new StringTokenizer(source);
            String result = "";
            while (tokens.hasMoreTokens()) {
                String token = tokens.nextToken();
                String temp = "";
                for (int i = 0; i < POPULAR_SCHEME_NAMES.length; i++) {
                    int index = -1;
                    if ((index = token.indexOf(POPULAR_SCHEME_NAMES[i])) != -1) {
                        String head = token.substring(0, index);
                        String tail = token.substring(index);
                        String tip = "";

                        int x = 0;
                        int y = 0;
                        int z = 0;
                        int w = 0;
                        int ind = Integer.MAX_VALUE;
                        if ((x = tail.indexOf("<")) != -1)
                            ind = Math.min(ind, x);
                        if ((y = tail.indexOf(">")) != -1)
                            ind = Math.min(ind, y);
                        if ((z = tail.indexOf("(")) != -1)
                            ind = Math.min(ind, z);
                        if ((w = tail.indexOf(")")) != -1)
                            ind = Math.min(ind, w);

                        if (ind != Integer.MAX_VALUE) {
                            tip = tail.substring(ind);
                            tail = tail.substring(0, ind);
                        }
                        temp = head + encodeHLink(tail, myModel.shortForm(new URI(tail))) + tip;
                        break;
                    }
                    temp = token;
                }
                result = result + SPACE + temp;
            }

            // replace <http with &lt;http to escape <
            // so < will be displayed in the species validation
            // pane rather than being treated as a tag.
            result = result.replaceAll("<http", "&lt;http");
            return result;
        } catch (URISyntaxException ex) {
            ex.printStackTrace();
        }

        // replace <http with &lt;http to escape <
        // so < will be displayed in the species validation
        // pane rather than being treated as a tag.
        source = source.replaceAll("<http", "&lt;http");
        return source; // exception has occurred.  No 'pretty printing' is returned
    }

    private String encodeHLink(String uri_string, String name) throws URISyntaxException {
        //System.out.println("linking: >>"+uri_string);
        URI uri = new URI(uri_string);

        // make the uri sensitive to QName toggling.
        return ("<a href=" + StringEscapeUtils.escapeHtml(uri_string) + ">"
                + StringEscapeUtils.escapeHtml(myModel.shortForm(uri)) + "</a>");
        //return "<a href="+uri+">"+name+"</a>";
    }

}