001 // Copyright 2004, 2005 The Apache Software Foundation
002 //
003 // Licensed under the Apache License, Version 2.0 (the "License");
004 // you may not use this file except in compliance with the License.
005 // You may obtain a copy of the License at
006 //
007 // http://www.apache.org/licenses/LICENSE-2.0
008 //
009 // Unless required by applicable law or agreed to in writing, software
010 // distributed under the License is distributed on an "AS IS" BASIS,
011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 // See the License for the specific language governing permissions and
013 // limitations under the License.
014
015 package org.apache.tapestry.contrib.table.model.sql;
016
017 import java.sql.ResultSet;
018 import java.sql.SQLException;
019 import java.util.Iterator;
020
021 import org.apache.commons.logging.Log;
022 import org.apache.commons.logging.LogFactory;
023 import org.apache.tapestry.contrib.table.model.ITableColumnModel;
024 import org.apache.tapestry.contrib.table.model.common.AbstractTableModel;
025 import org.apache.tapestry.contrib.table.model.simple.SimpleTableState;
026
027 /**
028 * An implementation of ITableModel that obtains its data through SQL queries.
029 * This is a very efficient model, since it uses SQL to perform
030 * the data sorting (through ORDER BY) and obtains only the data
031 * on the current page (through LIMIT/OFFSET).
032 * <p>
033 * This object is typically created in the following manner:
034 * <pre>
035 * ISqlConnectionSource objConnSrc =
036 * new SimpleSqlConnectionSource("jdbc:postgresql://localhost/testdb", "testdb", "testdb");
037 *
038 * ISqlTableDataSource objDataSrc =
039 * new SimpleSqlTableDataSource(objConnSrc, "test_table");
040 *
041 * SqlTableColumnModel objColumnModel =
042 * new SqlTableColumnModel(new SqlTableColumn[] {
043 * new SqlTableColumn("language", "Language", true),
044 * new SqlTableColumn("country", "Country", true),
045 * new SqlTableColumn("variant", "Variant", true),
046 * new SqlTableColumn("intvalue", "Integer", true),
047 * new SqlTableColumn("floatvalue", "Float", true)
048 * });
049 *
050 * ITableModel objTableModel = new SqlTableModel(objDataSrc, objColumnModel);
051 *
052 * return objTableModel;
053 * </pre>
054 *
055 * @author mindbridge
056 */
057 public class SqlTableModel extends AbstractTableModel
058 {
059 private static final long serialVersionUID = 1L;
060 private static final Log LOG = LogFactory.getLog(SqlTableModel.class);
061
062 private ISqlTableDataSource m_objDataSource;
063 private SqlTableColumnModel m_objColumnModel;
064
065 {
066 try {
067 Class.forName ( "org.hsqldb.jdbcDriver" );
068 } catch (Exception e) {
069 System.out.println("ERROR: failed to load HSQLDB JDBC driver.");
070 e.printStackTrace();
071 }
072 }
073
074 public SqlTableModel(
075 ISqlTableDataSource objDataSource,
076 SqlTableColumnModel objColumnModel)
077 {
078 this(objDataSource, objColumnModel, new SimpleTableState());
079 }
080
081 public SqlTableModel(
082 ISqlTableDataSource objDataSource,
083 SqlTableColumnModel objColumnModel,
084 SimpleTableState objState)
085 {
086 super(objState);
087 m_objDataSource = objDataSource;
088 m_objColumnModel = objColumnModel;
089 }
090
091 /**
092 * @see org.apache.tapestry.contrib.table.model.ITableModel#getColumnModel()
093 */
094 public ITableColumnModel getColumnModel()
095 {
096 return m_objColumnModel;
097 }
098
099 public SqlTableColumnModel getSqlColumnModel()
100 {
101 return m_objColumnModel;
102 }
103
104 /**
105 * @see org.apache.tapestry.contrib.table.model.ITableModel#getCurrentPageRows()
106 */
107 public Iterator getCurrentPageRows()
108 {
109 try
110 {
111 ResultSet objResultSet =
112 getSqlDataSource().getCurrentRows(
113 getSqlColumnModel(),
114 getState());
115
116 return new ResultSetIterator(objResultSet)
117 {
118 protected void notifyEnd()
119 {
120 getSqlDataSource().closeResultSet(getResultSet());
121 }
122 };
123 }
124 catch (SQLException e)
125 {
126 LOG.error("Cannot get current page rows", e);
127 return new ResultSetIterator(null);
128 }
129 }
130
131 /**
132 * Returns the dataSource.
133 * @return ISqlTableDataSource
134 */
135 public ISqlTableDataSource getSqlDataSource()
136 {
137 return m_objDataSource;
138 }
139
140 /**
141 * @see org.apache.tapestry.contrib.table.model.common.AbstractTableModel#getRowCount()
142 */
143 protected int getRowCount()
144 {
145 try
146 {
147 return m_objDataSource.getRowCount();
148 }
149 catch (SQLException e)
150 {
151 LOG.error("Cannot get row count", e);
152 return 1;
153 }
154 }
155
156 }