com.ikon.servlet.admin.ListIndexesServlet.java Source code

Java tutorial

Introduction

Here is the source code for com.ikon.servlet.admin.ListIndexesServlet.java

Source

/**
 * openkm, Open Document Management System (http://www.openkm.com)
 * Copyright (c) 2006-2013 Paco Avila & Josep Llort
 * 
 * No bytes were intentionally harmed during the development of this application.
 * 
 * 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 2 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, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

package com.ikon.servlet.admin;

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

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

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Fieldable;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermDocs;
import org.apache.lucene.index.TermEnum;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Query;
import org.apache.lucene.store.Directory;
import org.hibernate.Session;
import org.hibernate.search.FullTextQuery;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.hibernate.search.SearchFactory;
import org.hibernate.search.reader.ReaderProvider;
import org.hibernate.search.store.DirectoryProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ikon.core.Config;
import com.ikon.dao.HibernateUtil;
import com.ikon.dao.SearchDAO;
import com.ikon.dao.bean.NodeBase;
import com.ikon.dao.bean.NodeDocument;
import com.ikon.dao.bean.NodeFolder;
import com.ikon.dao.bean.NodeMail;
import com.ikon.util.WebUtils;

/**
 * Rebuild Lucene indexes
 */
public class ListIndexesServlet extends BaseServlet {
    private static final long serialVersionUID = 1L;
    private static Logger log = LoggerFactory.getLogger(ListIndexesServlet.class);

    @Override
    public void service(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        String method = request.getMethod();

        if (isAdmin(request)) {
            if (method.equals(METHOD_GET)) {
                doGet(request, response);
            } else if (method.equals(METHOD_POST)) {
                doPost(request, response);
            }
        }
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        log.debug("doGet({}, {})", request, response);
        request.setCharacterEncoding("UTF-8");
        String action = WebUtils.getString(request, "action");
        updateSessionManager(request);

        try {
            if (action.equals("search")) {
                searchLuceneDocuments(request, response);
            } else {
                showLuceneDocument(request, response);
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            sendErrorRedirect(request, response, e);
        }
    }

    /**
     * List Lucene indexes
     */
    @SuppressWarnings("unchecked")
    private void showLuceneDocument(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        boolean showTerms = WebUtils.getBoolean(request, "showTerms");
        int id = WebUtils.getInt(request, "id", 0);
        FullTextSession ftSession = null;
        ReaderProvider rProv = null;
        Session session = null;
        IndexReader idx = null;
        List<Map<String, String>> fields = new ArrayList<Map<String, String>>();

        try {
            session = HibernateUtil.getSessionFactory().openSession();
            ftSession = Search.getFullTextSession(session);
            SearchFactory sFactory = ftSession.getSearchFactory();
            rProv = sFactory.getReaderProvider();

            DirectoryProvider<Directory>[] dirProv = sFactory.getDirectoryProviders(NodeDocument.class);
            idx = rProv.openReader(dirProv[0]);

            // Print Lucene documents
            if (!idx.isDeleted(id)) {
                Document doc = idx.document(id);
                String hibClass = null;

                for (Fieldable fld : doc.getFields()) {
                    Map<String, String> field = new HashMap<String, String>();
                    field.put("name", fld.name());
                    field.put("value", fld.stringValue());
                    fields.add(field);

                    if (fld.name().equals("_hibernate_class")) {
                        hibClass = fld.stringValue();
                    }
                }

                /**
                 * 1) Get all the terms using indexReader.terms()
                 * 2) Process the term only if it belongs to the target field.
                 * 3) Get all the docs using indexReader.termDocs(term);
                 * 4) So, we have the term-doc pairs at this point.
                 */
                if (showTerms && NodeDocument.class.getCanonicalName().equals(hibClass)) {
                    List<String> terms = new ArrayList<String>();

                    for (TermEnum te = idx.terms(); te.next();) {
                        Term t = te.term();

                        if ("text".equals(t.field())) {
                            for (TermDocs tds = idx.termDocs(t); tds.next();) {
                                if (id == tds.doc()) {
                                    terms.add(t.text());
                                }
                            }
                        }
                    }

                    Map<String, String> field = new HashMap<String, String>();
                    field.put("name", "terms");
                    field.put("value", terms.toString());
                    fields.add(field);
                }
            }

            ServletContext sc = getServletContext();
            sc.setAttribute("fields", fields);
            sc.setAttribute("id", id);
            sc.setAttribute("max", idx.maxDoc() - 1);
            sc.setAttribute("prev", id > 0);
            sc.setAttribute("next", id < idx.maxDoc() - 1);
            sc.setAttribute("showTerms", showTerms);
            sc.getRequestDispatcher("/admin/list_indexes.jsp").forward(request, response);
        } finally {
            if (rProv != null && idx != null) {
                rProv.closeReader(idx);
            }

            HibernateUtil.close(ftSession);
            HibernateUtil.close(session);
        }
    }

    /**
     * Search Lucene indexes
     */
    @SuppressWarnings("unchecked")
    private void searchLuceneDocuments(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, ParseException {
        String exp = WebUtils.getString(request, "exp");
        FullTextSession ftSession = null;
        Session session = null;
        List<Map<String, String>> results = new ArrayList<Map<String, String>>();

        try {
            session = HibernateUtil.getSessionFactory().openSession();
            ftSession = Search.getFullTextSession(session);

            if (exp != null && !exp.isEmpty()) {
                QueryParser parser = new QueryParser(Config.LUCENE_VERSION, NodeDocument.TEXT_FIELD,
                        SearchDAO.analyzer);
                Query query = parser.parse(exp);
                log.info("Query: {}", query);

                FullTextQuery ftq = ftSession.createFullTextQuery(query, NodeDocument.class, NodeFolder.class,
                        NodeMail.class);
                ftq.setProjection(FullTextQuery.DOCUMENT_ID, FullTextQuery.SCORE, FullTextQuery.THIS);

                for (Iterator<Object[]> it = ftq.iterate(); it.hasNext();) {
                    Object[] qRes = it.next();
                    Integer docId = (Integer) qRes[0];
                    Float score = (Float) qRes[1];
                    NodeBase nBase = (NodeBase) qRes[2];

                    // Add result
                    Map<String, String> res = new HashMap<String, String>();
                    res.put("docId", String.valueOf(docId));
                    res.put("score", String.valueOf(score));
                    res.put("uuid", nBase.getUuid());
                    res.put("name", nBase.getName());

                    if (nBase instanceof NodeDocument) {
                        res.put("type", "Document");
                    } else if (nBase instanceof NodeFolder) {
                        res.put("type", "Folder");
                    } else {
                        log.warn("Unknown");
                    }

                    results.add(res);
                }
            }

            ServletContext sc = getServletContext();
            sc.setAttribute("results", results);
            sc.setAttribute("exp", exp);
            sc.getRequestDispatcher("/admin/search_indexes.jsp").forward(request, response);
        } finally {
            HibernateUtil.close(ftSession);
            HibernateUtil.close(session);
        }
    }
}