/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package util.datatable;
import com.google.common.collect.Maps;
import org.apache.commons.lang.StringUtils;
import play.mvc.Router;
import java.util.*;
public abstract class DataTable {
/** The columns for this table. */
private List<DataTableColumn> columns = new ArrayList<DataTableColumn>();
/** The mapping of columns by name. */
private Map<String, DataTableColumn> columnMap = new HashMap<String, DataTableColumn>();
/** The mapping of column names to field names. */
private Map<String, String> fieldNames = new HashMap<String, String>();
/** The default sort field. */
private String defaultSortField;
/** The default sort order. */
private String defaultSortOrder = "asc";
/** Flag indicating whether this should use server side processing (defaults to false). */
private boolean serverSide = false;
/** Callback function for each row. */
private String rowCallback;
public DataTable() {
}
public List<DataTableColumn> getColumns() {
return columns;
}
public Map<String, DataTableColumn> getColumnMap() {
return columnMap;
}
public int getColumnIndex(String name) {
for (int i = 0; i < columns.size(); i++) {
if (name.equals(columns.get(i).getName())) {
return i;
}
}
return -1;
}
public void setDefaultSort(String field, String order) {
setDefaultSortField(field);
setDefaultSortOrder(order);
}
public String getDefaultSortField() {
return defaultSortField;
}
public void setDefaultSortField(String defaultSortField) {
this.defaultSortField = defaultSortField;
}
public String getDefaultSortOrder() {
return defaultSortOrder;
}
public void setDefaultSortOrder(String defaultSortOrder) {
this.defaultSortOrder = defaultSortOrder;
}
public boolean isServerSide() {
return serverSide;
}
public void setServerSide(boolean serverSide) {
this.serverSide = serverSide;
}
public String getRowCallback() {
return rowCallback;
}
public void setRowCallback(String rowCallback) {
this.rowCallback = rowCallback;
}
public int getDefaultSortIndex() {
if (StringUtils.isNotBlank(defaultSortField)) {
return getColumnIndex(defaultSortField);
}
// Default to find the first sortable column
for (int i = 0; i < columns.size(); i++) {
if (columns.get(i).isSortable()) {
return i;
}
}
return -1;
}
public DataTableColumnConfiguration addColumn(String name) {
DataTableColumn column = new DataTableColumn(name);
return addColumn(column);
}
public DataTableColumnConfiguration addColumn(int index, DataTableColumn column) {
columns.add(index, column);
columnMap.put(column.getName(), column);
return new DataTableColumnConfiguration(column);
}
public DataTableColumnConfiguration addColumn(DataTableColumn column) {
columns.add(column);
columnMap.put(column.getName(), column);
return new DataTableColumnConfiguration(column);
}
public DataTableColumnConfiguration addColumn(String name, String fieldName) {
setFieldName(name, fieldName);
return addColumn(name);
}
public DataTableColumnConfiguration addColumns(String... names) {
for (String name : names) {
addColumn(name);
}
return alterColumns(names);
}
protected void setHidden(String... names) {
alterColumns(names).hidden();
}
protected void setSortable(String... names) {
alterColumns(names).setSortable(true);
}
protected void sortAll() {
new DataTableColumnConfiguration(columns).setSortable(true);
}
protected void sortAllExcept(String... names) {
Set<String> exclude = new HashSet<String>(Arrays.asList(names));
List<DataTableColumn> sortColumns = new ArrayList<DataTableColumn>();
for (DataTableColumn column : columns) {
if (!exclude.contains(column.getName())) {
sortColumns.add(column);
}
}
new DataTableColumnConfiguration(sortColumns).setSortable(true);
}
protected Map<String, String> getFieldNames() {
return this.fieldNames;
}
protected void setFieldName(String name, String sortField) {
fieldNames.put(name, sortField);
}
public DataTableColumnConfiguration alterColumn(String name) {
DataTableColumn column = columnMap.get(name);
if (column == null) {
throw new IllegalArgumentException("No such column '" + name + "'");
}
return new DataTableColumnConfiguration(column);
}
public DataTableColumnConfiguration alterColumns(String... names) {
List<DataTableColumn> toAlter = new ArrayList<DataTableColumn>();
for (String name : names) {
DataTableColumn column = columnMap.get(name);
if (column == null) {
throw new IllegalArgumentException("No such column '" + name + "'");
}
toAlter.add(column);
}
return new DataTableColumnConfiguration(toAlter);
}
protected static String createLink(Class<?> controller, String action, String name, Object value) {
return createLink(controller.getName() + "." + action, name, value);
}
protected static String createLink(String action, String name, Object value) {
Map<String, Object> args = Maps.newHashMap();
args.put(name, value);
return Router.reverse(action, args).url;
}
}