/*
* Copyright 2004 original author or authors.
*
* 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.extremecomponents.table.core;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.extremecomponents.table.bean.Column;
import org.extremecomponents.table.bean.Export;
import org.extremecomponents.table.bean.Row;
import org.extremecomponents.table.bean.Table;
import org.extremecomponents.table.context.Context;
import org.extremecomponents.table.handler.ColumnHandler;
import org.extremecomponents.table.handler.ExportHandler;
import org.extremecomponents.table.handler.RowHandler;
import org.extremecomponents.table.handler.TableHandler;
import org.extremecomponents.table.handler.ViewHandler;
import org.extremecomponents.table.limit.Limit;
import org.extremecomponents.table.limit.LimitFactory;
import org.extremecomponents.table.limit.ModelLimitFactory;
import org.extremecomponents.table.limit.TableLimit;
/**
* @author Jeff Johnston
*/
public final class TableModelImpl implements TableModel {
private static Log logger = LogFactory.getLog(TableModel.class);
// model interfaces
private Context context;
private Preferences preferences;
private Messages messages;
private Registry registry;
// model handlers
private TableHandler tableHandler = new TableHandler(this);
private RowHandler rowHandler = new RowHandler(this);
private ColumnHandler columnHandler = new ColumnHandler(this);
private ViewHandler viewHandler = new ViewHandler(this);
private ExportHandler exportHandler = new ExportHandler(this);
// model objects
private Object currentRowBean;
private Collection collectionOfBeans;
private Limit limit;
private Locale locale;
public TableModelImpl(Context context) {
this(context, null);
}
public TableModelImpl(Context context, String locale) {
this.context = context;
this.preferences = TableProperties.getInstance(context, TableModelUtils.getPreferencesLocation(context));
this.locale = TableModelUtils.getLocale(context, preferences, locale);
Messages messages = TableModelUtils.getMessages(this);
messages.init(context, this.locale);
this.messages = messages;
}
public Context getContext() {
return context;
}
public Preferences getPreferences() {
return preferences;
}
public Messages getMessages() {
return messages;
}
public Registry getRegistry() {
return registry;
}
public void addTable(Table table) {
tableHandler.addTable(table);
// now set the registry
this.registry = new TableRegistry(this);
//then set the limit
LimitFactory limitFactory = new ModelLimitFactory(this);
this.limit = new TableLimit(limitFactory);
}
public void addExport(Export export) {
exportHandler.addExport(export);
}
public void addRow(Row row) {
rowHandler.addRow(row);
}
public void addColumns(String autoGenerateColumns) {
autoGenerateColumns = TableModelUtils.getAutoGenerateColumnsPreference(this, autoGenerateColumns);
TableCache.getInstance().getAutoGenerateColumns(autoGenerateColumns).addColumns(this);
}
/**
* The parameter value can be null, String, String[], or a List. The
* parameter value will be converted to a String[] internally.
*
* @param name The parameter name
* @param value The parameter value
*/
public void addParameter(String name, Object value) {
registry.addParameter(name, value);
}
public TableHandler getTableHandler() {
return tableHandler;
}
public RowHandler getRowHandler() {
return rowHandler;
}
public ColumnHandler getColumnHandler() {
return columnHandler;
}
public ViewHandler getViewHandler() {
return viewHandler;
}
public ExportHandler getExportHandler() {
return exportHandler;
}
public Object getCurrentRowBean() {
return currentRowBean;
}
public void setCurrentRowBean(Object bean) {
int rowcount = rowHandler.increaseRowCount();
this.currentRowBean = bean;
context.setPageAttribute(TableConstants.ROWCOUNT, String.valueOf(rowcount));
context.setPageAttribute(tableHandler.getTable().getVar(), bean);
}
public Collection getCollectionOfBeans() {
return collectionOfBeans;
}
public Limit getLimit() {
return limit;
}
public Locale getLocale() {
return locale;
}
public Collection execute() throws Exception {
int totalRows = getTableHandler().getTotalRows();
int defaultRowsDisplayed = getTableHandler().getTable().getRowsDisplayed();
limit.setRowAttributes(totalRows, defaultRowsDisplayed);
if (logger.isDebugEnabled()) {
logger.debug(limit.toString());
}
Collection rows = getTableHandler().getData();
this.collectionOfBeans = TableModelUtils.retrieveRows(this,rows);
return this.collectionOfBeans;
}
public void setColumnValues() throws Exception {
List columns = columnHandler.getColumns();
Iterator iter = columns.iterator();
while (iter.hasNext()) {
Column column = (Column) iter.next();
if ("true".equals(column.getAttribute(TableConstants.IS_AUTO_GENERATE_COLUMN))) {
String property = column.getProperty();
Object propertyValue = TableModelUtils.getColumnPropertyValue(currentRowBean, property);
column.setValue(propertyValue);
column.setPropertyValue(propertyValue);
columnHandler.modifyColumnAttributes(column);
viewHandler.addColumnValueToView(column);
}
}
}
public Object getViewData() throws Exception {
Object viewData = viewHandler.getView().afterBody(this);
if (limit.isExported()) {
context.setRequestAttribute(TableConstants.VIEW_DATA, viewData);
context.setRequestAttribute(TableConstants.VIEW_RESOLVER, exportHandler.getCurrentExport().getViewResolver());
context.setRequestAttribute(TableConstants.EXPORT_FILE_NAME, exportHandler.getCurrentExport().getFileName());
return "";
}
return viewData;
}
/**
* Will execute the model and interate over the rows. Very useful for
* assembling a table using java code.
*/
public Object assemble() throws Exception {
Iterator iterator = execute().iterator();
for (Iterator iter = iterator; iter.hasNext();) {
Object bean = iterator.next();
setCurrentRowBean(bean);
// call to modify attributes
getRowHandler().modifyRowAttributes();
// call columns to set values
setColumnValues();
}
return getViewData();
}
}