package org.akaza.openclinica.control;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.akaza.openclinica.i18n.core.LocaleResolver;
import org.jmesa.facade.TableFacade;
import org.jmesa.facade.TableFacadeImpl;
import org.jmesa.limit.ExportType;
import org.jmesa.limit.Limit;
import org.jmesa.limit.LimitImpl;
import org.jmesa.limit.RowSelect;
import org.jmesa.limit.RowSelectImpl;
import org.jmesa.view.component.Column;
import org.jmesa.view.editor.CellEditor;
import org.jmesa.view.editor.FilterEditor;
import org.jmesa.view.html.component.HtmlColumn;
import org.jmesa.view.html.component.HtmlTable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public abstract class AbstractTableFactory {
protected Locale locale;
protected HttpSession session;
protected Logger logger = LoggerFactory.getLogger(getClass().getName());
protected abstract String getTableName();
protected String getCaptionName() {
return "";
}
protected abstract void configureColumns(TableFacade tableFacade, Locale locale);
protected void configureExportColumns(TableFacade tableFacade, Locale locale) {
configureColumns(tableFacade, locale);
}
public TableFacade getTableFacadeImpl(HttpServletRequest request, HttpServletResponse response) {
return new TableFacadeImpl(getTableName(), request);
}
public abstract void setDataAndLimitVariables(TableFacade tableFacade);
public TableFacade createTable(HttpServletRequest request, HttpServletResponse response) {
locale = LocaleResolver.getLocale(request);
session = request.getSession();
TableFacade tableFacade = getTableFacadeImpl(request, response);
setStateAttr(tableFacade);
setDataAndLimitVariables(tableFacade);
configureTableFacade(response, tableFacade);
if (!tableFacade.getLimit().isExported()) {
configureColumns(tableFacade, locale);
tableFacade.setMaxRowsIncrements(getMaxRowIncrements());
configureTableFacadePostColumnConfiguration(tableFacade);
configureTableFacadeCustomView(tableFacade);
configureUnexportedTable(tableFacade, locale);
} else {
configureExportColumns(tableFacade, locale);
}
return tableFacade;
}
/**
* Use this method to export all data from table. 1. filters/sorts will be ignored 2. Whole table will be exported
* page by page 3. Configure getSize(Limit limit)
*
* @param request
* @param response
* @see getSize(Limit limit), createLimits()
* @see filter & sort methods in implementations
*/
public void exportCSVTable(HttpServletRequest request, HttpServletResponse response, String path) {
locale = LocaleResolver.getLocale(request);
String DATE_FORMAT = "yyyyMMddHHmmss";
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
String fileName = getTableName() + "_" + sdf.format(new Date());
for (Limit limit : createLimits()) {
TableFacade tableFacade = new OCTableFacadeImpl(getTableName(), request, response, path + File.separator + fileName);
tableFacade.setStateAttr("restore");
tableFacade.setLimit(limit);
tableFacade.autoFilterAndSort(false);
setDataAndLimitVariables(tableFacade);
configureTableFacade(response, tableFacade);
configureExportColumns(tableFacade, locale);
tableFacade.render();
}
}
private ArrayList<Limit> createLimits() {
Limit limit = new LimitImpl(getTableName());
ArrayList<Limit> limits = new ArrayList<Limit>();
int size = getSize(limit);
for (RowSelect rowSelect : getRowSelects(size)) {
Limit theLimit = new LimitImpl(getTableName());
theLimit.setRowSelect(rowSelect);
theLimit.setExportType(ExportType.CSV);
limits.add(theLimit);
}
return limits;
}
private ArrayList<RowSelect> getRowSelects(int size) {
ArrayList<RowSelect> rowSelects = new ArrayList<RowSelect>();
int i = 0;
for (i = 0; i < size / 50; i++) {
RowSelect rowSelect = new RowSelectImpl(i + 1, 50, size);
rowSelects.add(rowSelect);
}
if (size % 50 > 0) {
RowSelect rowSelect = new RowSelectImpl(i + 1, size % 50, size);
rowSelects.add(rowSelect);
}
return rowSelects;
}
public int getSize(Limit limit) {
return 0;
}
public void configureTableFacade(HttpServletResponse response, TableFacade tableFacade) {
tableFacade.setExportTypes(response, getExportTypes());
}
public int[] getMaxRowIncrements() {
return new int[] { 15, 25, 50 };
}
/**
* By Default we configure a default toolbar. Overwrite this method if you need to provide a custom toolbar and
* configure other options.
*
* @param tableFacade
*/
public void configureTableFacadePostColumnConfiguration(TableFacade tableFacade) {
tableFacade.setToolbar(new DefaultToolbar());
}
/**
* By Default we configure a default view. Overwrite this method if you need to provide a custom view.
*
* @param tableFacade
* @see http://code.google.com/p/jmesa/wiki/CustomViewTotalsTutorial
*/
public void configureTableFacadeCustomView(TableFacade tableFacade) {
tableFacade.setView(new DefaultView(locale));
}
protected void configureUnexportedTable(TableFacade tableFacade, Locale locale) {
HtmlTable table = (HtmlTable) tableFacade.getTable();
table.setCaption(getCaptionName());
}
protected ExportType[] getExportTypes() {
return null;
}
public Locale getLocale() {
return locale;
}
protected void configureColumn(Column column, String title, CellEditor editor, FilterEditor filterEditor) {
configureColumn(column, title, editor, filterEditor, true, true);
}
protected void configureColumn(Column column, String title, CellEditor editor, FilterEditor filterEditor, boolean filterable, boolean sortable) {
column.setTitle(title);
if (editor != null) {
column.getCellRenderer().setCellEditor(editor);
}
if (column instanceof HtmlColumn) {
HtmlColumn htmlColumn = (HtmlColumn) column;
htmlColumn.setFilterable(filterable);
htmlColumn.setSortable(sortable);
if (filterEditor != null) {
htmlColumn.getFilterRenderer().setFilterEditor(filterEditor);
}
}
}
public static String getDNFlagIconName(int dnResolutionStatusId) {
String name = "";
switch (dnResolutionStatusId) {
case 0:
name = "icon_noNote";
break;
case 1:
name = "icon_Note";
break;
case 2:
name = "icon_flagYellow";
break;
case 3:
name = "icon_flagGreen";
break;
case 4:
name = "icon_flagBlack";
break;
case 5:
name = "icon_flagWhite";
break;
default:
name = "icon_noNote";
break;
}
return name;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public List paginateData(List list, int rowStart, int rowEnd) {
ArrayList mainList = new ArrayList();
if (rowStart > 0) {
rowStart = rowStart + 1;
}
for (int i = rowStart; i <= rowEnd; i++) {
if (i < list.size()) {
mainList.add(list.get(i));
} else {
break;
}
}
return mainList;
}
public void setStateAttr(TableFacade tableFacade) {
if (getTableName() != null) {
tableFacade.setStateAttr(getTableName() + "_restore");
} else {
tableFacade.setStateAttr("restore");
logger.debug("getTableName() returned null, so tableFacade.setStateAttr = restore");
}
}
}