blob: 224a6b2435c57e4739abdad6e3155a354817fdef [file] [log] [blame]
// Copyright 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.tapestry.contrib.table.model.sql;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.tapestry.contrib.table.model.ITablePagingState;
import org.apache.tapestry.contrib.table.model.ITableSortingState;
import org.apache.tapestry.contrib.table.model.simple.SimpleTableState;
/**
*
* @version $Id$
* @author mindbridge
*/
public class SimpleSqlTableDataSource implements ISqlTableDataSource
{
private static final Log LOG =
LogFactory.getLog(SimpleSqlTableDataSource.class);
private ISqlConnectionSource m_objConnSource;
private String m_strTableName;
private String m_strWhereClause;
public SimpleSqlTableDataSource(
ISqlConnectionSource objConnSource,
String strTableName)
{
this(objConnSource, strTableName, null);
}
public SimpleSqlTableDataSource(
ISqlConnectionSource objConnSource,
String strTableName,
String strWhereClause)
{
setConnSource(objConnSource);
setTableName(strTableName);
setWhereClause(strWhereClause);
}
/**
* @see org.apache.tapestry.contrib.table.model.sql.ISqlTableDataSource#getRowCount()
*/
public int getRowCount() throws SQLException
{
String strQuery = generateCountQuery();
LOG.trace("Invoking query to count rows: " + strQuery);
Connection objConn = getConnSource().obtainConnection();
try
{
Statement objStmt = objConn.createStatement();
try
{
ResultSet objRS = objStmt.executeQuery(strQuery);
objRS.next();
return objRS.getInt(1);
}
finally
{
objStmt.close();
}
}
finally
{
getConnSource().returnConnection(objConn);
}
}
/**
* @see org.apache.tapestry.contrib.table.model.sql.ISqlTableDataSource#getCurrentRows(SqlTableColumnModel, SimpleTableState)
*/
public ResultSet getCurrentRows(
SqlTableColumnModel objColumnModel,
SimpleTableState objState)
throws SQLException
{
String strQuery = generateDataQuery(objColumnModel, objState);
LOG.trace("Invoking query to load current rows: " + strQuery);
Connection objConn = getConnSource().obtainConnection();
Statement objStmt = objConn.createStatement();
return objStmt.executeQuery(strQuery);
}
/**
* @see org.apache.tapestry.contrib.table.model.sql.ISqlTableDataSource#closeResultSet(ResultSet)
*/
public void closeResultSet(ResultSet objResultSet)
{
try
{
Statement objStmt = objResultSet.getStatement();
Connection objConn = objStmt.getConnection();
try
{
objResultSet.close();
objStmt.close();
}
catch (SQLException e)
{
// ignore
}
getConnSource().returnConnection(objConn);
}
catch (SQLException e)
{
LOG.warn("Error while closing the result set", e);
}
}
protected String quoteObjectName(String strObject)
{
return strObject;
}
/**
* Returns the tableName.
* @return String
*/
public String getTableName()
{
return m_strTableName;
}
/**
* Sets the tableName.
* @param tableName The tableName to set
*/
public void setTableName(String tableName)
{
m_strTableName = tableName;
}
/**
* Returns the connSource.
* @return ISqlConnectionSource
*/
public ISqlConnectionSource getConnSource()
{
return m_objConnSource;
}
/**
* Sets the connSource.
* @param connSource The connSource to set
*/
public void setConnSource(ISqlConnectionSource connSource)
{
m_objConnSource = connSource;
}
/**
* Returns the whereClause.
* @return String
*/
public String getWhereClause()
{
return m_strWhereClause;
}
/**
* Sets the whereClause.
* @param whereClause The whereClause to set
*/
public void setWhereClause(String whereClause)
{
m_strWhereClause = whereClause;
}
protected String generateColumnList(SqlTableColumnModel objColumnModel)
{
// build the column selection
StringBuffer objColumnBuf = new StringBuffer();
for (int i = 0; i < objColumnModel.getColumnCount(); i++)
{
SqlTableColumn objColumn = objColumnModel.getSqlColumn(i);
if (i > 0)
objColumnBuf.append(", ");
objColumnBuf.append(quoteObjectName(objColumn.getColumnName()));
}
return objColumnBuf.toString();
}
protected String generateWhereClause()
{
String strWhereClause = getWhereClause();
if (strWhereClause == null || strWhereClause.equals(""))
return "";
return "WHERE " + strWhereClause + " ";
}
protected String generateOrderByClause(ITableSortingState objSortingState)
{
// build the sorting clause
StringBuffer objSortingBuf = new StringBuffer();
if (objSortingState.getSortColumn() != null)
{
objSortingBuf.append("ORDER BY ");
objSortingBuf.append(objSortingState.getSortColumn());
if (objSortingState.getSortOrder()
== ITableSortingState.SORT_ASCENDING)
objSortingBuf.append(" ASC ");
else
objSortingBuf.append(" DESC ");
}
return objSortingBuf.toString();
}
protected String generateLimitClause(ITablePagingState objPagingState)
{
int nPageSize = objPagingState.getPageSize();
int nStart = objPagingState.getCurrentPage() * nPageSize;
String strPagingBuf = "LIMIT " + nPageSize + " OFFSET " + nStart + " ";
return strPagingBuf;
}
protected String generateDataQuery(
SqlTableColumnModel objColumnModel,
SimpleTableState objState)
{
String strQuery =
"SELECT "
+ generateColumnList(objColumnModel)
+ " FROM "
+ getTableName()
+ " "
+ generateWhereClause()
+ generateOrderByClause(objState.getSortingState())
+ generateLimitClause(objState.getPagingState());
return strQuery;
}
protected String generateCountQuery()
{
String strQuery =
"SELECT COUNT(*) FROM "
+ getTableName()
+ " "
+ generateWhereClause();
return strQuery;
}
}