edu.cornell.mannlib.vitro.webapp.search.controller.UpdateUrisInIndex.java Source code

Java tutorial

Introduction

Here is the source code for edu.cornell.mannlib.vitro.webapp.search.controller.UpdateUrisInIndex.java

Source

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

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

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.regex.Pattern;

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

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.modules.searchIndexer.SearchIndexer;

/**
 * Class that performs the update of the uris in the search index for the
 * SearchService.
 */

public class UpdateUrisInIndex {
    private static final Log log = LogFactory.getLog(UpdateUrisInIndex.class);

    /** Pattern to split URIs on whitespace and commas. */
    public static final Pattern DELIMITER = Pattern.compile("[,\\s]+");

    /**
     * Web service for update in search index of a list of URIs.
     * 
     * @throws IOException
     */
    protected int doUpdateUris(HttpServletRequest req, SearchIndexer indexer) throws ServletException, IOException {
        Map<String, List<FileItem>> map = new VitroRequest(req).getFiles();
        if (map == null) {
            throw new ServletException("Expected Multipart Content");
        }

        Charset enc = getEncoding(req);

        int uriCount = 0;
        for (String name : map.keySet()) {
            for (FileItem item : map.get(name)) {
                log.debug("Found " + item.getSize() + " byte file for '" + name + "'");
                uriCount += processFileItem(indexer, item, enc);
            }
        }
        return uriCount;
    }

    private int processFileItem(SearchIndexer indexer, FileItem item, Charset enc) throws IOException {
        List<String> uris = new ArrayList<>();
        Reader reader = new InputStreamReader(item.getInputStream(), enc.name());
        try (Scanner scanner = createScanner(reader)) {
            while (scanner.hasNext()) {
                String uri = scanner.next();
                log.debug("Request to index uri '" + uri + "'");
                uris.add(uri);
            }
        }
        indexer.scheduleUpdatesForUris(uris);
        return uris.size();
    }

    @SuppressWarnings("resource")
    protected Scanner createScanner(Reader in) {
        return new Scanner(in).useDelimiter(DELIMITER);
    }

    /**
     * Get the encoding of the request, default to UTF-8 since that is in the
     * vitro install instructions to put on the connector.
     */
    private Charset getEncoding(HttpServletRequest req) {
        String enc = req.getCharacterEncoding();
        if (StringUtils.isBlank(enc)) {
            log.debug("No encoding on POST request, That is acceptable.");
            enc = "UTF-8";
        } else if (enc.length() > 30) {
            log.debug("Ignoring odd encoding of '" + enc + "'");
            enc = "UTF-8";
        } else {
            log.debug("Encoding set on POST request: " + enc);
        }
        log.debug("Reading POSTed URIs with encoding " + enc);
        return Charset.forName(enc);
    }

}