/*
* Copyright 2000-2001,2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jetspeed.portal.portlets.browser;
import org.apache.jetspeed.portal.portlets.browser.BrowserIterator;
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
import java.util.List;
import java.util.Collections;
import java.sql.Types;
/**
* A class for iterating over the window. The window constitutes the selection
* of rows being displayed to the user from the List storing all the ResultSet.
*
* @author <a href="mailto:taylor@apache.org">David Sean Taylor</a>
* @version $Id: DatabaseBrowserIterator.java,v 1.11 2004/02/23 03:26:43 jford Exp $
*
*/
public class DatabaseBrowserIterator implements BrowserIterator
{
/**
* Static initialization of the logger for this class
*/
private static final JetspeedLogger logger = JetspeedLogFactoryService.getLogger(DatabaseBrowserIterator.class.getName());
private static final String VELOCITY_NULL_ENTRY = "-";
int top = 0;
int index = 0;
int bottom = -1;
int windowSize = -1;
int rsListSize = -1;
boolean ascendingOrder = true;
String sortColumnName = null;
List rsList;
List rsTitleList;
List rsTypeList;
/**
* Constructor for the database browser iterator
*
* @param result The List containg all the rows from the resultSet.
* @param columnTitles The List containg all the columnLabels from a resultSet.
* @param pageSize The number of rows to be displayed in a window configured by the user.
*/
public DatabaseBrowserIterator(List result, List columnTitles,
List columnTypes, int pageSize)
{
this.rsList = result;
this.rsTitleList= columnTitles;
this.rsTypeList = columnTypes;
this.windowSize = pageSize;
this.rsListSize = result.size();
setBottom();
}
/**
* This method returns the result set.
*
*/
public List getResultSet()
{
return rsList;
}
/**
* This method returns the number of rows in the result set.
*
*/
public int getResultSetSize()
{
return rsListSize;
}
/**
* This method returns the List containg the column labels of the result set.
*
*/
public List getResultSetTitleList()
{
return rsTitleList;
}
/**
* This method returns the List containg the column type names of the result set.
*
*@see java.sql.Types
*/
public List getResultSetTypesList()
{
return rsTypeList;
}
/**
* This method returns the index of the row to which the cursor is pointing at.
*
*/
public int getTop()
{
return top;
}
/**
* This method points the cursor to the index provided.
*
* @param start Index to which cursor should point to
*/
public void setTop(int start)
{
top = start;
index = top;
setBottom();
}
/**
* This method returns the last index of the row in the window displayed.
*
*/
public int getBottom()
{
return bottom;
}
/**
* This method returns the window size.
*
*/
public int getWindowSize()
{
return windowSize;
}
/**
* This method sets the bottom based on which index the cursor points to and
* the size of the result set.
*
*/
private void setBottom()
{
bottom = top + windowSize;
if( bottom > rsListSize )
{
bottom = rsListSize;
}
}
/**
* Returns true if the iteration has more elements
*/
public boolean hasNext()
{
if(index <= rsListSize && index < bottom)
{
return true;
}
return false;
}
/**
* Returns the next element in the iteration
*/
public Object next()
{
index = index + 1;
return rsList.get(index - 1);
}
/**
* Logs as info - since remove operation is not supported
* by this Iterator.
*/
public void remove()
{
logger.info("The remove operation is not supported.");
}
/**
* This method sorts the result set according to the value of the column as
* specified by the parameter column name.
* Changes the order of the result set vector.
*
*@param String sortColumnName
*/
public void sort(String columnName)
{
//System.out.println("current columnName="+columnName);
//System.out.println("old columnName="+sortColumnName);
if( columnName != null )
{
if( sortColumnName != null && sortColumnName.equals(columnName) )
{
ascendingOrder = !ascendingOrder;
}
else
{
ascendingOrder= true;
sortColumnName = columnName;
}
Collections.sort( rsList, this);
}
}
/*
* Compares its two arguments for order.
*
*/
public int compare(Object obj1, Object obj2)
{
int idx = rsTitleList.indexOf(sortColumnName);
int order = 0;
if( idx != -1 )
{
Object col1 = ((List)obj1).get(idx);
Object col2 = ((List)obj2).get(idx);
if( (col1).equals(VELOCITY_NULL_ENTRY) )
{
if( (col2).equals(VELOCITY_NULL_ENTRY))
{
order = 0;
}
else
{
order = -1;
}
}
else if( (col2).equals(VELOCITY_NULL_ENTRY) )
{
order = 1;
}
else
{
int type = Integer.parseInt((String)rsTypeList.get(idx));
switch (type)
{
case Types.NUMERIC:
order = ( ((java.math.BigDecimal)col1).compareTo((java.math.BigDecimal)col2) );
break;
case Types.DECIMAL:
order = ( ((java.math.BigDecimal)col1).compareTo((java.math.BigDecimal)col2) );
break;
case Types.TINYINT:
order = ( ((Byte)col1).compareTo((Byte)col2) );
break;
case Types.SMALLINT:
order = ( ((Short)col1).compareTo((Short)col2) );
break;
case Types.INTEGER:
order = ( ((Integer)col1).compareTo((Integer)col2) );
break;
case Types.BIGINT:
order = ( ((Long)col1).compareTo((Long)col2) );
break;
case Types.REAL:
order = ( ((Float)col1).compareTo((Float)col2) );
break;
case Types.FLOAT:
order = ( ((Double)col1).compareTo((Double)col2) );
break;
case Types.DOUBLE:
order = ( ((Double)col1).compareTo((Double)col2) );
break;
case Types.DATE:
order = ( ((java.sql.Date)col1).compareTo((java.sql.Date)col2) );
break;
case Types.TIME:
order = ( ((java.sql.Time)col1).compareTo((java.sql.Time)col2) );
break;
case Types.TIMESTAMP:
order = ( ((java.sql.Timestamp)col1).compareTo((java.sql.Timestamp)col2) );
break;
case Types.CHAR:
order = ( ((String)col1).compareTo((String)col2) );
break;
case Types.VARCHAR:
order = ( ((String)col1).compareTo((String)col2) );
break;
case Types.LONGVARCHAR:
order = ( ((String)col1).compareTo((String)col2) );
break;
default:
logger.info("DatabaseBrowserIterator.compare DataType mapping not found"+
" in DatabaseBrowserIterator. "+
"Hence cannot sort based on provided column.");
break;
}
}
}
//System.out.println("index of type= "+idx +", order= "+order+", ascending= "+ascendingOrder);
if(!ascendingOrder)
{
order = 0-order;
}
return order;
}
}