com.markwatson.linkeddata.DBpediaLookupClient.java Source code

Java tutorial

Introduction

Here is the source code for com.markwatson.linkeddata.DBpediaLookupClient.java

Source

package com.markwatson.linkeddata;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.methods.GetMethod;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;

/**
 * Copyright Mark Watson 2015. All Rights Reserved.
 * License: Apache 2
 */

/**
 * Searches return results that contain any of the search terms. I am going to filter
 * the results to ignore results that do not contain all search terms.
 * An example search term might be "Bill Clinton" or "London UK"
 */
public class DBpediaLookupClient extends DefaultHandler {
    public DBpediaLookupClient(String query) throws Exception {
        this.query = query;
        HttpClient client = new HttpClient();

        String query2 = query.replaceAll(" ", "+");
        HttpMethod method = new GetMethod(
                "http://lookup.dbpedia.org/api/search.asmx/KeywordSearch?QueryString=" + query2);
        try {
            client.executeMethod(method);
            InputStream ins = method.getResponseBodyAsStream();
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser sax = factory.newSAXParser();
            sax.parse(ins, this);
        } catch (HttpException he) {
            System.err.println("Http error connecting to lookup.dbpedia.org");
        } catch (IOException ioe) {
            System.err.println("Unable to connect to lookup.dbpedia.org");
        }
        method.releaseConnection();
    }

    public void printResults(List<Map<String, String>> results) {
        for (Map<String, String> result : results) {
            System.out.println("\nNext result:\n");
            for (String key : result.keySet()) {
                System.out.println("  " + key + "\t:\t" + result.get(key));
            }
        }
    }

    private List<Map<String, String>> variableBindings = new ArrayList<Map<String, String>>();
    private Map<String, String> tempBinding = null;
    private String lastElementName = null;

    public void startElement(String uri, String localName, String qName, Attributes attributes)
            throws SAXException {
        //System.out.println("startElement " + qName);
        if (qName.equalsIgnoreCase("result")) {
            tempBinding = new HashMap<String, String>();
        }
        lastElementName = qName;
    }

    public void endElement(String uri, String localName, String qName) throws SAXException {
        //System.out.println("endElement " + qName);
        if (qName.equalsIgnoreCase("result")) {
            if (!variableBindings.contains(tempBinding) && containsSearchTerms(tempBinding))
                variableBindings.add(tempBinding);
        }
    }

    public void characters(char[] ch, int start, int length) throws SAXException {
        String s = new String(ch, start, length).trim();
        //System.out.println("characters (lastElementName='" + lastElementName + "'): " + s);
        if (s.length() > 0) {
            if ("Description".equals(lastElementName)) {
                if (tempBinding.get("Description") == null) {
                    tempBinding.put("Description", s);
                }
                tempBinding.put("Description", "" + tempBinding.get("Description") + " " + s);
            }
            //if ("URI".equals(lastElementName)) tempBinding.put("URI", s);
            if ("URI".equals(lastElementName) && s.indexOf("Category") == -1 && tempBinding.get("URI") == null) {
                tempBinding.put("URI", s);
            }
            if ("Label".equals(lastElementName))
                tempBinding.put("Label", s);
        }
    }

    public List<Map<String, String>> variableBindings() {
        return variableBindings;
    }

    private boolean containsSearchTerms(Map<String, String> bindings) {
        StringBuilder sb = new StringBuilder();
        for (String value : bindings.values())
            sb.append(value); // do not need white space
        String text = sb.toString().toLowerCase();
        StringTokenizer st = new StringTokenizer(this.query);
        while (st.hasMoreTokens()) {
            if (text.indexOf(st.nextToken().toLowerCase()) == -1) {
                return false;
            }
        }
        return true;
    }

    private String query = "";
}