001    // This file is part of the Attempto Java Packages.
002    // Copyright 2008, Attempto Group, University of Zurich (see http://attempto.ifi.uzh.ch).
003    //
004    // The Attempto Java Packages is free software: you can redistribute it and/or modify it under the
005    // terms of the GNU Lesser General Public License as published by the Free Software Foundation,
006    // either version 3 of the License, or (at your option) any later version.
007    //
008    // The Attempto Java Packages is distributed in the hope that it will be useful, but WITHOUT ANY
009    // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
010    // PURPOSE. See the GNU Lesser General Public License for more details.
011    //
012    // You should have received a copy of the GNU Lesser General Public License along with the Attempto
013    // Java Packages. If not, see http://www.gnu.org/licenses/.
014    
015    package ch.uzh.ifi.attempto.owl;
016    
017    import org.apache.commons.httpclient.HttpClient;
018    import org.apache.commons.httpclient.HttpStatus;
019    import org.apache.commons.httpclient.NameValuePair;
020    import org.apache.commons.httpclient.methods.PostMethod;
021    
022    /**
023     * This is a simple interface to the OWL verbalizer.
024     * OWL verbalizer is a tool that translates an OWL 2 ontology into an ACE text.
025     * It expects the ontology to be represented in the OWL 2 XML serialization syntax.
026     * The version of the OWL 2 XML syntax that the OWL verbalizer supports is described in
027     * 
028     * <blockquote>
029     * <a href="http://www.w3.org/TR/2008/WD-owl2-xml-serialization-20080411/">http://www.w3.org/TR/2008/WD-owl2-xml-serialization-20080411/</a>
030     * </blockquote>
031     * 
032     * The OWL verbalizer accepts one parameter, <code>xml</code>, the value of which
033     * is the complete ontology as string.
034     * The OWL verbalizer returns the ACE representation of the ontology as plain text (string).
035     * In case the verbalizer fails to process an OWL axiom in the ontology,
036     * an error message is returned between ACE comment symbols.
037     * 
038     * Note that future versions of the OWL verbalizer (and as a result this interface)
039     * will expect a different input format (because the OWL 2 XML specification will be updated)
040     * and probably produce a different output format (a more structured one, where e.g. error
041     * messages are represented differently).
042     * 
043     * @author Kaarel Kaljurand
044     *
045     */
046    public class VerbalizerWebservice {
047    
048            private HttpClient client = new HttpClient();
049            private String url = null;
050    
051            /**
052             * Constructs a new <code>VerbalizerWebservice</code> object
053             * on the basis of the URL of the OWL verbalizer webservice.
054             * 
055             * @param url The URL of the OWL verbalizer webservice.
056             */
057            public VerbalizerWebservice(String url) {
058                    this.url = url;
059            }
060    
061            /**
062             * Calls the OWL verbalizer webservice by giving the string representation of
063             * an XML-formatted ontology as input. Returns the corresponding ACE text
064             * with possible error messages as comments.
065             * 
066             * @param xml XML-representation of an OWL ontology.
067             * @return ACE text that corresponds to the ontology.
068             */
069            public String call(String xml) {
070                    String acetextAsString = null;
071    
072                    PostMethod method = new PostMethod(url);
073    
074                    method.setRequestBody(new NameValuePair[] {
075                                    new NameValuePair("xml", xml)
076                    });
077    
078                    try {
079                            int statusCode = client.executeMethod(method);
080    
081                            if (statusCode == HttpStatus.SC_OK) {
082                                    acetextAsString = method.getResponseBodyAsString();
083                            }
084                            else {
085                                    throw new RuntimeException("HTTP request failed: " + method.getStatusLine());
086                            }
087                    } catch (Exception e) {
088                            throw new RuntimeException("Error accessing OWL->ACE webservice: " + e.getMessage());
089                    } finally {
090                            method.releaseConnection();
091                    }
092    
093                    return acetextAsString;
094            }
095    }