eu.prestoprime.p4gui.connection.SearchConnection.java Source code

Java tutorial

Introduction

Here is the source code for eu.prestoprime.p4gui.connection.SearchConnection.java

Source

/**
 * SearchConnection.java
 * Author: Francesco Rosso (rosso@eurix.it)
 * Contributors: Philip Kahle (philip.kahle@uibk.ac.at)
 * 
 * This file is part of PrestoPRIME Preservation Platform (P4).
 * 
 * Copyright (C) 2009-2012 EURIX Srl, Torino, Italy
 *  
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package eu.prestoprime.p4gui.connection;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import eu.prestoprime.model.ModelUtils;
import eu.prestoprime.model.ModelUtils.P4JAXBPackage;
import eu.prestoprime.model.search.SearchResults;
import eu.prestoprime.p4gui.model.P4Service;
import eu.prestoprime.p4gui.util.URLUtils;
import eu.prestoprime.search.SearchConstants;

public abstract class SearchConnection {

    private static final Logger logger = LoggerFactory.getLogger(SearchConnection.class);
    private static final String QUICK_URI = "/search/quick";
    private static final String ADVANCED_URI = "/search/advanced";
    private static final String SUGGEST_URI = "/search/suggest";

    public static ArrayList<String> searchByDC(P4Service service, String title, String description, String format,
            String identifier) {
        ArrayList<String> records = new ArrayList<String>();
        try {
            String path = service.getURL() + "/search/?" + "title=" + title + "&description=" + description
                    + "&format=" + format + "&identifier=" + identifier;
            P4HttpClient client = new P4HttpClient(service.getUserID());
            HttpRequestBase request = new HttpGet(path);
            HttpResponse response = client.executeRequest(request);
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                InputStream is = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                String line = null;
                while ((line = reader.readLine()) != null) {
                    records.add(line);
                }
                is.close();
            }
            EntityUtils.consume(entity);
        } catch (Exception e) {
            e.printStackTrace();
        }
        Collections.reverse(records);
        return records;
    }

    public static String searchByOaiPmh(P4Service service, String params) {
        String string = null;
        try {
            params = params.replaceAll("--", "&");
            String path = service.getURL() + "/search/oai?" + params;
            P4HttpClient client = new P4HttpClient(service.getUserID());
            HttpRequestBase request = new HttpGet(path);
            HttpResponse response = client.executeRequest(request);
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                InputStream is1 = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(is1));
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }
                string = sb.toString();
                is1.close();
            }
            EntityUtils.consume(entity);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return string;
    }

    private static SearchResults solrSearch(final P4Service service, final String searchUri, String query,
            final String from, final String resultCount, final String sortField, final String sortAsc,
            final Map<String, String> facetMap) {

        HashMap<String, String> urlParamMap = new HashMap<>();

        urlParamMap.put("queryTerms", query);

        urlParamMap.put("from", from);
        urlParamMap.put("resultCount", resultCount);
        urlParamMap.put("sortAsc", sortAsc);
        urlParamMap.put("sortField", sortField);

        urlParamMap.put("facetFilters", wrapParams(facetMap));

        final String path = service.getURL() + searchUri + URLUtils.buildUrlParamString(urlParamMap);

        SearchResults results = new SearchResults();
        Unmarshaller unmarshaller = null;
        String resultString = null;

        try {
            logger.debug("Query to P4WS:\n" + path);

            P4HttpClient client = new P4HttpClient(service.getUserID());

            client.getParams().setParameter("http.protocol.content-charset", "UTF-8");

            HttpRequestBase request = new HttpGet(path);
            HttpResponse response = client.executeRequest(request);
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                InputStream is = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }
                resultString = sb.toString();
                is.close();
            }
            EntityUtils.consume(entity);

            unmarshaller = ModelUtils.getUnmarshaller(P4JAXBPackage.CONF);
            results = (SearchResults) unmarshaller.unmarshal(new ByteArrayInputStream(resultString.getBytes()));
        } catch (JAXBException | IOException e) {
            String message = e.getMessage() + " - ";
            logger.error(e.getMessage());

            if (e instanceof JAXBException) {
                message += "The returned xml from P4WS was not a valid searchresult.";
            } else {
                message += "P4WS could not be accessed.";
            }
            results.setErrorMessage(message);
        }
        return results;
    }

    /**
     * encode all facet values into a string.
     * 
     * @param facetMap
     * @return
     */
    private static String wrapParams(Map<String, String> facetMap) {
        StringBuilder sb = new StringBuilder();

        for (Entry<String, String> e : facetMap.entrySet()) {
            if (sb.length() > 0) {
                sb.append(SearchConstants.KV_SEP);
            }
            if (e.getValue() != null && !filter(e.getValue()).isEmpty()) {
                sb.append(filter(e.getKey()) + SearchConstants.KV_CON + filter(e.getValue()));
            }
        }
        return sb.toString();
    }

    private static String filter(String s) {
        return s.replace(SearchConstants.KV_CON, "").replace(SearchConstants.KV_SEP, "");
    }

    public static SearchResults simpleSolrSearch(P4Service service, final String query, final String from,
            final String resultCount, final String sortField, final String sortAsc,
            final Map<String, String> facetMap) {

        final SearchResults results = solrSearch(service, QUICK_URI, query, from, resultCount, sortField, sortAsc,
                facetMap);
        return results;
    }

    public static SearchResults advancedSolrSearch(P4Service service, HashMap<String, String> queryMap,
            final String from, final String resultCount, final String sortField, final String sortAsc,
            final Map<String, String> facetMap) {

        String query = wrapParams(queryMap);

        final SearchResults results = solrSearch(service, ADVANCED_URI, query, from, resultCount, sortField,
                sortAsc, facetMap);
        return results;
    }

    public static String solrSuggest(P4Service service, final String term) {
        Writer writer = new StringWriter();

        String results = "";
        try {
            StringBuilder sb = new StringBuilder();
            sb.append(service.getURL());
            sb.append(SUGGEST_URI);
            sb.append("?term=");
            sb.append(term);
            String path = sb.toString();

            logger.debug("Query to P4WS:\n" + path);

            P4HttpClient client = new P4HttpClient(service.getUserID());

            client.getParams().setParameter("http.protocol.content-charset", "UTF-8");

            HttpRequestBase request = new HttpGet(path);
            HttpResponse response = client.executeRequest(request);
            HttpEntity entity = response.getEntity();

            if (entity != null) {
                InputStream is = entity.getContent();
                if (is != null) {
                    char[] buffer = new char[1024];

                    Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                    int n;
                    while ((n = reader.read(buffer)) != -1) {
                        writer.write(buffer, 0, n);
                    }
                    is.close();
                }
            }
            results = writer.toString();
            EntityUtils.consume(entity);
            writer.close();
        } catch (Exception e) {
            logger.error(e.getMessage());
            logger.error("Either the query was invalid or P4WS could not be accessed.");
            results = null;
        }
        return results;
    }

}