Package org.dspace.app.webui.servlet

Source Code of org.dspace.app.webui.servlet.ControlledVocabularySearchServlet

/*
* ConceptSearchServlet.java
*
* Version: $Revision: 3705 $
*
* Date: $Date: 2009-04-11 17:02:24 +0000 (Sat, 11 Apr 2009) $
*
* Copyright (c) 2002, Hewlett-Packard Company and Massachusetts Institute of
* Technology. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: -
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer. - Redistributions in binary
* form must reproduce the above copyright notice, this list of conditions and
* the following disclaimer in the documentation and/or other materials provided
* with the distribution. - Neither the name of the Hewlett-Packard Company nor
* the name of the Massachusetts Institute of Technology nor the names of their
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
package org.dspace.app.webui.servlet;

import java.io.IOException;
import java.net.URLEncoder;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

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

import org.apache.log4j.Logger;
import org.dspace.app.webui.util.JSPManager;
import org.dspace.app.webui.util.UIUtil;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.Collection;
import org.dspace.content.Community;
import org.dspace.content.Item;
import org.dspace.core.Constants;
import org.dspace.core.Context;
import org.dspace.core.LogManager;
import org.dspace.handle.HandleManager;
import org.dspace.search.DSQuery;
import org.dspace.search.QueryArgs;
import org.dspace.search.QueryResults;

/**
* Servlet that provides funcionality for searching the repository using a
* controlled vocabulary as a basis for selecting the search keywords.
*
* @author Miguel Ferreira
* @version $Revision: 3705 $
*/
public class ControlledVocabularySearchServlet extends DSpaceServlet
{
    // the log
    private static Logger log = Logger
            .getLogger(ControlledVocabularySearchServlet.class);

    // the jsp that displays the HTML version of controlled-vocabulary
    private static final String SEARCH_JSP = "/controlledvocabulary/search.jsp";

    // the jsp that will show the search results
    private static final String RESULTS_JSP = "/controlledvocabulary/results.jsp";

    /**
     * Handles requests
     */
    protected void doDSGet(Context context, HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException,
            SQLException, AuthorizeException
    {

        String action = request.getParameter("action") == null ? "" : request
                .getParameter("action");

        if (action.equals("search"))
        {
            List keywords = extractKeywords(request);
            String query = join(keywords, " or ");
            doSearch(context, request, query);
            JSPManager.showJSP(request, response, RESULTS_JSP);
        }
        else if (action.equals("filter"))
        {
            String filter = request.getParameter("filter");
            request.getSession().setAttribute("conceptsearch.filter", filter);
            JSPManager.showJSP(request, response, SEARCH_JSP);
        }
        else
        {
            JSPManager.showJSP(request, response, SEARCH_JSP);
        }
    }

    /**
     * Collects the selected terms from the HTML taxonomy displayed on the
     * search form
     *
     * @param request
     *            The HttpServletRequest
     * @return A Vector with the selected terms from the taxonomy.
     */
    private List extractKeywords(HttpServletRequest request)
    {
        List keywords = new Vector();
        Enumeration enumeration = request.getParameterNames();
        while (enumeration.hasMoreElements())
        {
            String element = (String) enumeration.nextElement();
            if (element.startsWith("cb_"))
            {
                keywords.add("\"" + request.getParameter(element) + "\"");
            }
        }
        return keywords;
    }

    /**
     * Searches the repository and and puts the results in the request object
     *
     * @param context
     *            The DSpace context
     * @param request
     *            The request object
     * @param query
     *            The query expression
     * @throws IOException
     * @throws SQLException
     */
    private void doSearch(Context context, HttpServletRequest request,
            String query) throws IOException, SQLException
    {
        // Get the query
        // String query = request.getParameter("query");
        int start = UIUtil.getIntParameter(request, "start");
        String advanced = request.getParameter("advanced");
        String fromAdvanced = request.getParameter("from_advanced");
        String advancedQuery = "";
        HashMap queryHash = new HashMap();

        // can't start earlier than 0 in the results!
        if (start < 0)
        {
            start = 0;
        }

        List itemHandles = new ArrayList();
        List collectionHandles = new ArrayList();
        List communityHandles = new ArrayList();

        Item[] resultsItems;
        Collection[] resultsCollections;
        Community[] resultsCommunities;

        QueryResults qResults = null;
        QueryArgs qArgs = new QueryArgs();

        // if the "advanced" flag is set, build the query string from the
        // multiple query fields
        if (advanced != null)
        {
            query = qArgs.buildQuery(request);
            advancedQuery = qArgs.buildHTTPQuery(request);
        }

        // Ensure the query is non-null
        if (query == null)
        {
            query = "";
        }

        // Get the location parameter, if any
        String location = request.getParameter("location");
        String newURL;

        // Build log information
        String logInfo = "";

        // Get our location
        Community community = UIUtil.getCommunityLocation(request);
        Collection collection = UIUtil.getCollectionLocation(request);

        // get the start of the query results page
        // List resultObjects = null;
        qArgs.setQuery(query);
        qArgs.setStart(start);

        // Perform the search
        if (collection != null)
        {
            logInfo = "collection_id=" + collection.getID() + ",";

            // Values for drop-down box
            request.setAttribute("community", community);
            request.setAttribute("collection", collection);

            qResults = DSQuery.doQuery(context, qArgs, collection);
        }
        else if (community != null)
        {
            logInfo = "community_id=" + community.getID() + ",";

            request.setAttribute("community", community);

            // Get the collections within the community for the dropdown box
            request
                    .setAttribute("collection.array", community
                            .getCollections());

            qResults = DSQuery.doQuery(context, qArgs, community);
        }
        else
        {
            // Get all communities for dropdown box
            Community[] communities = Community.findAll(context);
            request.setAttribute("community.array", communities);

            qResults = DSQuery.doQuery(context, qArgs);
        }

        // now instantiate the results and put them in their buckets
        for (int i = 0; i < qResults.getHitHandles().size(); i++)
        {
            String myHandle = (String) qResults.getHitHandles().get(i);
            Integer myType = (Integer) qResults.getHitTypes().get(i);

            // add the handle to the appropriate lists
            switch (myType.intValue())
            {
            case Constants.ITEM:
                itemHandles.add(myHandle);

                break;

            case Constants.COLLECTION:
                collectionHandles.add(myHandle);

                break;

            case Constants.COMMUNITY:
                communityHandles.add(myHandle);

                break;
            }
        }

        int numCommunities = communityHandles.size();
        int numCollections = collectionHandles.size();
        int numItems = itemHandles.size();

        // Make objects from the handles - make arrays, fill them out
        resultsCommunities = new Community[numCommunities];
        resultsCollections = new Collection[numCollections];
        resultsItems = new Item[numItems];

        for (int i = 0; i < numItems; i++)
        {
            String myhandle = (String) itemHandles.get(i);

            Object o = HandleManager.resolveToObject(context, myhandle);

            resultsItems[i] = (Item) o;

            if (resultsItems[i] == null)
            {
                throw new SQLException("Query \"" + query
                        + "\" returned unresolvable handle: " + myhandle);
            }
        }

        for (int i = 0; i < collectionHandles.size(); i++)
        {
            String myhandle = (String) collectionHandles.get(i);

            Object o = HandleManager.resolveToObject(context, myhandle);

            resultsCollections[i] = (Collection) o;

            if (resultsCollections[i] == null)
            {
                throw new SQLException("Query \"" + query
                        + "\" returned unresolvable handle: " + myhandle);
            }
        }

        for (int i = 0; i < communityHandles.size(); i++)
        {
            String myhandle = (String) communityHandles.get(i);

            Object o = HandleManager.resolveToObject(context, myhandle);

            resultsCommunities[i] = (Community) o;

            if (resultsCommunities[i] == null)
            {
                throw new SQLException("Query \"" + query
                        + "\" returned unresolvable handle: " + myhandle);
            }
        }

        // Log
        log.info(LogManager.getHeader(context, "search", logInfo + "query=\""
                + query + "\",results=(" + resultsCommunities.length + ","
                + resultsCollections.length + "," + resultsItems.length + ")"));

        // Pass in some page qualities
        // total number of pages
        int pageTotal = 1 + ((qResults.getHitCount() - 1) / qResults
                .getPageSize());

        // current page being displayed
        int pageCurrent = 1 + (qResults.getStart() / qResults.getPageSize());

        // pageLast = min(pageCurrent+9,pageTotal)
        int pageLast = ((pageCurrent + 9) > pageTotal) ? pageTotal
                : (pageCurrent + 9);

        // pageFirst = max(1,pageCurrent-9)
        int pageFirst = ((pageCurrent - 9) > 1) ? (pageCurrent - 9) : 1;

        // Pass the results to the display JSP
        request.setAttribute("items", resultsItems);
        request.setAttribute("communities", resultsCommunities);
        request.setAttribute("collections", resultsCollections);

        request.setAttribute("pagetotal", new Integer(pageTotal));
        request.setAttribute("pagecurrent", new Integer(pageCurrent));
        request.setAttribute("pagelast", new Integer(pageLast));
        request.setAttribute("pagefirst", new Integer(pageFirst));

        request.setAttribute("queryresults", qResults);

        // And the original query string
        request.setAttribute("query", query);

    }

    /**
     * Joins each element present in a list with a separator
     *
     * @param list
     *            The list of elements
     * @param separator
     *            The separator that will be used between each element
     * @return A string with all the elements concatened and separated by the
     *         provided connector
     */
    public static String join(List list, String separator)
    {
        String result = "";
        Iterator iterator = list.listIterator();
        while (iterator.hasNext())
        {
            result += iterator.next().toString();
            if (iterator.hasNext())
                result += separator;
        }
        return result;
    }

    /**
     * Handle posts
     */
    protected void doDSPost(Context context, HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException,
            SQLException, AuthorizeException
    {
        doDSGet(context, request, response);
    }

}
TOP

Related Classes of org.dspace.app.webui.servlet.ControlledVocabularySearchServlet

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.