edu.cornell.mannlib.vitro.webapp.controller.grefine.GrefineMqlreadServlet.java Source code

Java tutorial

Introduction

Here is the source code for edu.cornell.mannlib.vitro.webapp.controller.grefine.GrefineMqlreadServlet.java

Source

/* $This file is distributed under the terms of the license in /doc/license.txt$ */

package edu.cornell.mannlib.vitro.webapp.controller.grefine;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
import edu.cornell.mannlib.vitro.webapp.controller.VitroHttpServlet;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.dao.DataPropertyStatementDao;

import com.hp.hpl.jena.rdf.model.Literal;

/**
 * This servlet is for servicing Google Refine's
 * "Add columns from VIVO"'s search for individual properties.
 * e.g. search for Joe Smith's email in VIVO and download to Google Refine under a new email column.
 * 
 * @author Eliza Chan (elc2013@med.cornell.edu)
 * 
 */
public class GrefineMqlreadServlet extends VitroHttpServlet {

    private static final long serialVersionUID = 1L;
    private static final Log log = LogFactory.getLog(GrefineMqlreadServlet.class.getName());

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //resp.setContentType("application/json");
        super.doPost(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
        resp.setContentType("application/json");
        VitroRequest vreq = new VitroRequest(req);
        try {
            if (vreq.getParameter("query") != null) {

                JSONObject qJson = getResult(vreq, req, resp);
                log.debug("result: " + qJson.toString());
                String responseStr = (vreq.getParameter("callback") == null) ? qJson.toString()
                        : vreq.getParameter("callback") + "(" + qJson.toString() + ")";
                // System.out.println(responseStr);
                ServletOutputStream out = resp.getOutputStream();
                out.print(responseStr);
            }

        } catch (Exception ex) {
            log.warn(ex, ex);
        }
    }

    private JSONObject getResult(VitroRequest vreq, HttpServletRequest req, HttpServletResponse resp)
            throws ServletException {

        JSONObject resultAllJson = new JSONObject();

        try {
            // parse query
            ArrayList<String> subjectUriList = new ArrayList<String>();
            Map<String, JSONArray> propertyUriMap = new HashMap<String, JSONArray>();
            String query = vreq.getParameter("query");
            parseQuery(query, subjectUriList, propertyUriMap);

            // run SPARQL query to get the results
            JSONArray resultAllJsonArr = new JSONArray();
            DataPropertyStatementDao dpsDao = vreq.getUnfilteredWebappDaoFactory().getDataPropertyStatementDao();
            for (String subjectUri : subjectUriList) {
                JSONObject subjectPropertyResultJson = new JSONObject();
                subjectPropertyResultJson.put("id", subjectUri);
                for (Map.Entry<String, JSONArray> entry : propertyUriMap.entrySet()) {
                    int limit = 200; // default
                    String propertyUri = entry.getKey();
                    JSONArray propertyUriOptions = entry.getValue();
                    for (int i = 0; i < propertyUriOptions.length(); i++) {
                        JSONObject propertyUriOption = (JSONObject) propertyUriOptions.get(i);
                        limit = ((Integer) propertyUriOption.get("limit")).intValue();
                    }
                    List<Literal> literals = dpsDao.getDataPropertyValuesForIndividualByProperty(subjectUri,
                            propertyUri);
                    // Make sure the subject has a value for this property 
                    if (literals.size() > 0) {
                        int counter = 0;
                        JSONArray valueJsonArr = new JSONArray();
                        for (Literal literal : literals) {
                            if (counter <= limit) {
                                String value = literal.getLexicalForm();
                                valueJsonArr.put(value);
                            }
                            counter++;
                        }
                        subjectPropertyResultJson.put(propertyUri, valueJsonArr);
                    }
                }
                resultAllJsonArr.put(subjectPropertyResultJson);
            }
            resultAllJson.put("result", resultAllJsonArr);

        } catch (JSONException e) {
            log.error("GrefineMqlreadServlet getResult JSONException: " + e);
        }

        // System.out.println(resultAllJson);
        return resultAllJson;
    }

    /**
     * Construct json from query String
     * @param query
     * @param subjectUriList
     * @param propertyUriMap
     */
    private void parseQuery(String query, ArrayList<String> subjectUriList, Map<String, JSONArray> propertyUriMap) {
        try {
            JSONObject rawJson = new JSONObject(query);
            JSONArray qJsonArr = rawJson.getJSONArray("query");
            for (int i = 0; i < qJsonArr.length(); i++) {
                Object obj = qJsonArr.get(i);

                if (obj instanceof JSONObject) {
                    JSONObject jsonObj = (JSONObject) obj;
                    JSONArray jsonObjNames = jsonObj.names();
                    for (int j = 0; j < jsonObjNames.length(); j++) {
                        String objName = (String) jsonObjNames.get(j);
                        if (objName.contains("http://")) { // most likely this is a propertyUri
                            // e.g. http://weill.cornell.edu/vivo/ontology/wcmc#cwid
                            Object propertyUriObj = jsonObj.get(objName);
                            if (propertyUriObj instanceof JSONArray) {
                                propertyUriMap.put(objName, (JSONArray) propertyUriObj);
                            }
                        } else if ("id".equals(objName)) { // id
                            Object idObj = jsonObj.get(objName); // TODO: This is a String object but not sure what it is for
                        } else if ("id|=".equals(objName)) { // list of subject uri
                            Object subjectUriObj = jsonObj.get(objName);
                            if (subjectUriObj instanceof JSONArray) {
                                JSONArray subjectUriUriArr = (JSONArray) subjectUriObj;
                                for (int k = 0; k < subjectUriUriArr.length(); k++) {
                                    // e.g. http://vivo.med.cornell.edu/individual/cwid-jsd2002
                                    Object subjectUriUriObj = subjectUriUriArr.get(k);
                                    if (subjectUriUriObj instanceof String) {
                                        subjectUriList.add((String) subjectUriUriObj);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        } catch (JSONException e) {
            log.error("GrefineMqlreadServlet parseQuery JSONException: " + e);
        }
    }

}