/*
* Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
*
* Caucho Technology permits redistribution, modification and use
* of this file in source and binary form ("the Software") under the
* Caucho Developer Source License ("the License"). The following
* conditions must be met:
*
* 1. Each copy or derived work of the Software must preserve the copyright
* notice and this notice unmodified.
*
* 2. Redistributions of the Software in source or binary form must include
* an unmodified copy of the License, normally in a plain ASCII text
*
* 3. The names "Resin" or "Caucho" are trademarks of Caucho Technology and
* may not be used to endorse products derived from this software.
* "Resin" or "Caucho" may not appear in the names of products derived
* from this software.
*
* This Software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
*
* CAUCHO TECHNOLOGY AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES
* SUFFERED BY LICENSEE OR ANY THIRD PARTY AS A RESULT OF USING OR
* DISTRIBUTING SOFTWARE. IN NO EVENT WILL CAUCHO OR ITS LICENSORS BE LIABLE
* FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
* CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
* REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
* INABILITY TO USE SOFTWARE, EVEN IF HE HAS BEEN ADVISED OF THE POSSIBILITY
* OF SUCH DAMAGES.
*
* @author Sam
*/
package com.caucho.doc.javadoc;
import com.caucho.log.Log;
import com.caucho.util.CharBuffer;
import com.caucho.util.L10N;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.logging.Logger;
import javax.naming.NamingException;
/**
* A query to be created and used from jsp.
*/
public class Query {
static protected final Logger log = Log.open(Query.class);
static final L10N L = new L10N(Query.class);
private final static int LIMIT_DEFAULT = 15;
private final static int LIMIT_MAX = 250;
private Store _store;
private String _query;
private int _offset;
private int _limit = LIMIT_DEFAULT;
private LinkedList<JavadocItem> _results;
public Query()
throws NamingException
{
_store = Store.getInstance();
}
protected void reset()
{
_results = null;
}
/**
* The store that this Query should use.
*/
public void setStore(Store store)
{
_store = store;
}
/**
* The query string submitted by the user.
*/
public void setQuery(String query)
{
_query = safeString(query);
if (_query != null) {
// turn com/caucho/vfs/Path.html#method() style submissions
// into appropriate ones
CharBuffer cb = new CharBuffer(_query);
// take .html out
int di = cb.indexOf(".html");
if (di > -1)
cb.delete(di,di+5);
// take all (...) out
while ( (di = cb.indexOf('(')) > -1) {
int di2 = cb.indexOf(')',di);
if (di2 > di)
cb.delete(di,di2+1);
}
for (int i = 0; i < cb.length(); i++) {
char ch = cb.charAt(i);
if (i > 0 && ch == '/' || ch == '\\' || ch == '#')
cb.setCharAt(i,'.');
}
_query = cb.toString();
}
reset();
}
/**
* The query string submitted by the user.
*/
public String getQuery()
{
return _query;
}
/**
* An offset into the search results, for previous/next page
* functionality.
*/
public void setOffset(String offset)
{
_offset = safeParseInt(offset,_offset);
reset();
}
/**
* An offset into the search results, for previous/next page
* functionality.
*/
public int getOffset()
{
return _offset;
}
/**
* A limit on the number of search results to return for one page.
*/
public void setLimit(String limit)
{
_limit = safeParseInt(limit,_limit);
if (_limit > LIMIT_MAX)
_limit = LIMIT_MAX;
reset();
}
/**
* A limit on the number of search results to return for one page.
*/
public int getLimit()
{
return _limit;
}
/**
* Do the query and return the results.
*/
public LinkedList<JavadocItem> getResults()
throws SQLException
{
if (_results != null)
return _results;
if (_query == null)
_results = new LinkedList<JavadocItem>();
else
_results = _store.query(_query,_offset,_limit);
return _results;
}
/**
* True if there is a next page.
*/
public boolean getIsNextPage()
{
return _results != null && _results.size() == _limit;
}
/**
* The offset to be used for a link to the next set of results.
*/
public int getNextPageOffset()
{
return _offset + _limit;
}
/**
* True if there is a previous page
*/
public boolean getIsPreviousPage()
{
return _offset > 0;
}
/**
* The offset to be used for a link to the previous set of results, null
* if there is no next page.
*/
public int getPreviousPageOffset()
{
int r = _offset - _limit;
if (r < 0)
r = 0;
return r;
}
public String toString()
{
return _query;
}
private static String safeString(String s, String deflt)
{
if (s == null || s.length() == 0)
return deflt;
else
return s;
}
private static String safeString(String s)
{
return safeString(s,null);
}
private static int safeParseInt(String s, int deflt)
{
if (s == null || s.length() == 0)
return deflt;
else {
try {
return Integer.parseInt(s);
} catch (Exception ex) {
return deflt;
}
}
}
}