/*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at .
*
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
* language governing rights and limitations under the License.
*
* The Original Code is the Venice Web Communities System.
*
* The Initial Developer of the Original Code is Eric J. Bowersox ,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
*
* Contributor(s):
*/
package com.silverwrist.venice.servlets.format;
import java.io.Writer;
import java.io.IOException;
import java.util.*;
import javax.servlet.*;
import com.silverwrist.util.StringUtil;
import com.silverwrist.venice.ValidationException;
import com.silverwrist.venice.core.*;
public class FindData implements JSPRender, SearchMode
{
/*--------------------------------------------------------------------------------
* Static data members
*--------------------------------------------------------------------------------
*/
// Attribute name for request attribute
protected static final String ATTR_NAME = "com.silverwrist.venice.content.FindData";
// The various display categories
public static final int FD_SIGS = 0;
public static final int FD_USERS = 1;
public static final int FD_CATEGORIES = 2;
// The titles and URLs of the header data
private static Vector header_titles = null;
private static Vector header_urls = null;
/*--------------------------------------------------------------------------------
* Attributes
*--------------------------------------------------------------------------------
*/
private VeniceEngine engine;
private UserContext user;
private int disp;
private int field = -1;
private int mode = -1;
private String term = null;
private int offset = 0;
private CategoryDescriptor cat = null;
private List subcats = null;
private List results = null;
private int find_count = -1;
/*--------------------------------------------------------------------------------
* Constructor
*--------------------------------------------------------------------------------
*/
public FindData(VeniceEngine engine, UserContext user, int disp)
{
this.engine = engine;
this.user = user;
this.disp = disp;
if (header_titles==null)
{ // construct the title and URL vectors
header_titles = new Vector();
header_titles.add("SIGs");
header_titles.add("Users");
header_titles.add("Categories");
header_titles.trimToSize();
header_urls = new Vector();
header_urls.add("find?disp=" + String.valueOf(FD_SIGS));
header_urls.add("find?disp=" + String.valueOf(FD_USERS));
header_urls.add("find?disp=" + String.valueOf(FD_CATEGORIES));
header_urls.trimToSize();
} // end if
} // end constructor
/*--------------------------------------------------------------------------------
* Internal functions
*--------------------------------------------------------------------------------
*/
private static int getParamInt(ServletRequest request, String name, int default_val)
{
String str = request.getParameter(name);
if (str==null)
return -1;
try
{ // parse the integer value
return Integer.parseInt(str);
} // end try
catch (NumberFormatException nfe)
{ // in case of conversion error, return default
return default_val;
} // end catch
} // end getParamInt
private static boolean isImageButtonClicked(ServletRequest request, String name)
{
String val = request.getParameter(name + ".x");
return (val!=null);
} // end isImageButtonClicked
/*--------------------------------------------------------------------------------
* External static functions
*--------------------------------------------------------------------------------
*/
public static int getNumChoices()
{
return FD_CATEGORIES + 1;
} // end getNumChoices
public static FindData retrieve(ServletRequest request)
{
return (FindData)(request.getAttribute(ATTR_NAME));
} // end retrieve
/*--------------------------------------------------------------------------------
* Implementations from interface VeniceContent
*--------------------------------------------------------------------------------
*/
public String getPageTitle(RenderData rdat)
{
return "Find";
} // end getPageTitle
/*--------------------------------------------------------------------------------
* Implementations from interface JSPRender
*--------------------------------------------------------------------------------
*/
public void store(ServletRequest request)
{
request.setAttribute(ATTR_NAME,this);
} // end store
public String getTargetJSPName()
{
return "find.jsp";
} // end getTargetJSPName
/*--------------------------------------------------------------------------------
* External operations
*--------------------------------------------------------------------------------
*/
public void writeHeader(RenderData rdat, Writer out) throws IOException
{
rdat.writeContentSelectorHeader(out,"Find:",header_titles,header_urls,disp);
} // end writeHeader
public int getDisplayOption()
{
return disp;
} // end getDisplayOption
public int getSearchField()
{
return field;
} // end getSearchField
public boolean searchFieldIs(int value)
{
return (value==field);
} // end searchFieldIs
public int getSearchMode()
{
return mode;
} // end getSearchMode
public boolean searchModeIs(int value)
{
return (value==mode);
} // end searchModeIs
public String getSearchTerm()
{
return term;
} // end getSearchTerm
public CategoryDescriptor getCategory()
{
return cat;
} // end getCategory
public List getSubCategoryList()
{
return subcats;
} // end getSubCategoryList
public List getResultsList()
{
return results;
} // end getResultsList
public int getNumResultsDisplayed()
{
return engine.getStdNumSearchResults();
} // end getNumResultsDisplayed
public int getFindCount()
{
return find_count;
} // end getFindCount
public int getOffset()
{
return offset;
} // end getOffset
public void loadGet(int catid) throws DataException
{
if (disp==FD_SIGS)
{ // fill in the list of subcategories and of SIGs in this category
cat = user.getCategoryDescriptor(catid);
subcats = cat.getSubCategories();
if (cat.getCategoryID()>=0)
{ // fill in the SIGs that are in this category
results = user.getSIGsInCategory(cat,offset,getNumResultsDisplayed());
find_count = user.getNumSIGsInCategory(cat);
} // end if
field = FIELD_SIG_NAME;
} // end if
else if (disp==FD_USERS)
field = FIELD_USER_NAME;
mode = SEARCH_PREFIX;
term = "";
} // end loadGet
public void loadPost(ServletRequest request) throws ValidationException, DataException
{
int catid = -1;
// Retrieve all the posted parameters from the form and validate them. First validate the
// category ID (if specified) and the field identifier.
switch (disp)
{
case FD_SIGS:
catid = getParamInt(request,"cat",-1);
if (!engine.isValidCategoryID(catid))
throw new ValidationException("The category ID parameter is not valid.");
field = getParamInt(request,"field",FIELD_SIG_NAME);
if ((field!=FIELD_SIG_NAME) && (field!=FIELD_SIG_SYNOPSIS))
throw new ValidationException("The field search parameter is not valid.");
break;
case FD_USERS:
field = getParamInt(request,"field",FIELD_USER_NAME);
if ( (field!=FIELD_USER_NAME) && (field!=FIELD_USER_DESCRIPTION) && (field!=FIELD_USER_GIVEN_NAME)
&& (field!=FIELD_USER_FAMILY_NAME))
throw new ValidationException("The field search parameter is not valid.");
break;
case FD_CATEGORIES:
// no parameters to set here - there's no "field" for category search
break;
default:
throw new InternalStateError("loadPost failure - invalid display parameter");
} // end switch
// Validate the search mode parameter.
mode = getParamInt(request,"mode",SEARCH_PREFIX);
if ((mode!=SEARCH_PREFIX) && (mode!=SEARCH_SUBSTRING) && (mode!=SEARCH_REGEXP))
throw new ValidationException("The search mode parameter is not valid.");
// Retrieve the search term parameter.
term = request.getParameter("term");
if (term==null)
term = "";
// Retrieve the offset and find count parameters.
offset = getParamInt(request,"ofs",0);
find_count = getParamInt(request,"fcount",-1);
// Adjust the search return offset based on the command button click.
int count = getNumResultsDisplayed();
if (isImageButtonClicked(request,"search"))
offset = 0;
else if (isImageButtonClicked(request,"previous"))
{ // adjust the offset in the reverse direction
offset -= count;
if (offset<0)
offset = 0;
} // end else if
else if (isImageButtonClicked(request,"next"))
offset += count; // go forwards instead
else
throw new ValidationException("Unable to determine what action triggered the form.");
// Run the actual search.
switch (disp)
{
case FD_SIGS:
if (catid>=0)
{ // retrieve the category descriptor and the subcategory list
cat = user.getCategoryDescriptor(catid);
subcats = cat.getSubCategories();
if (cat.getCategoryID()>=0)
{ // fill in the SIGs that are in this category
results = user.getSIGsInCategory(cat,offset,count);
if (find_count<0)
find_count = user.getNumSIGsInCategory(cat);
} // end if
} // end if
else
{ // retrieve the SIG search data
results = user.searchForSIGs(field,mode,term,offset,count);
if (find_count<0)
find_count = user.getSearchSIGCount(field,mode,term);
} // end else
break;
case FD_USERS:
results = engine.searchForUsers(field,mode,term,offset,count);
if (find_count<0)
find_count = engine.getSearchUserCount(field,mode,term);
break;
case FD_CATEGORIES:
results = user.searchForCategories(mode,term,offset,count);
if (find_count<0)
find_count = user.getSearchCategoryCount(mode,term);
break;
} // end switch
} // end loadPost
public static String getCatJumpLink(RenderData rdat, int catid)
{
return rdat.getEncodedServletPath("find?disp=" + String.valueOf(FD_SIGS) + "&cat="
+ String.valueOf(catid));
} // end getCatJumpLink
} // end class FindData