package net.techreadiness.ui.tags.dataview;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Collections;
import java.util.List;
import javax.servlet.jsp.JspException;
import net.techreadiness.service.common.DataGridColumn;
import net.techreadiness.ui.tags.ParentTag;
import net.techreadiness.ui.tags.datagrid.DataGridState;
import net.techreadiness.ui.tags.datagrid.DataGridTag;
import net.techreadiness.ui.task.TaskFlowDefinition;
import net.techreadiness.util.NumericStringComparator;
import org.apache.commons.lang3.StringEscapeUtils;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
public class DataViewTag extends ParentTag {
private List<DataViewControlTag> dataViewControls;
private DataGridState<?> dataGrid;
private ShoppingCartTag shoppingCart;
private DataGridTag<? super Object> dataGridTag;
private String dataGridName;
private String title;
private TaskFlowDefinition taskFlow;
private List<DataGridColumn> displayedFilters;
private List<DataGridColumn> hiddenFilters;
private boolean filterSelectable;
private DataViewFiltersTag dataViewFilters;
public DataViewTag() {
displayedFilters = Lists.newArrayList();
hiddenFilters = Lists.newArrayList();
}
public class SelectedItem implements Comparable<SelectedItem> {
String representation;
String text;
public SelectedItem(String representation, String text) {
this.representation = representation;
this.text = text;
}
public String getRepresentation() {
return representation;
}
public String getText() {
return text;
}
@Override
public int compareTo(SelectedItem o) {
return NumericStringComparator.compareStrings(text, o.getText());
}
}
@Override
public String execute() throws Exception {
dataViewControls = getChildren(DataViewControlTag.class);
shoppingCart = Iterables.getFirst(getChildren(ShoppingCartTag.class), null);
dataViewFilters = Iterables.getFirst(getChildren(DataViewFiltersTag.class), null);
dataGridTag = Iterables.getOnlyElement(getChildren(DataGridTag.class));
dataGrid = (DataGridState<?>) getValueStack().findValue(dataGridTag.getValue());
dataGridName = dataGridTag.getValue();
if (title != null) {
title = evaluateOgnl(title);
}
/*
* Rows are not marked as selected or de-selected until the tag iterates over each row in the grid. Since the
* selected items comes before the grid in the JSP the grid must be executed so the correct state can be rendered.
*/
dataGridTag.execute();
if (dataViewFilters != null) {
dataViewFilters.execute();
}
for (DataGridColumn column : dataGridTag.getAllColumns()) {
if (displayFilter(column)) {
getDisplayedFilters().add(column);
} else {
getHiddenFilters().add(column);
}
}
return "/dataView/dataView.jsp";
}
private boolean displayFilter(DataGridColumn column) {
if (dataGrid == null || dataGrid.getDisplayedFilters() == null) {
return true;
}
for (String filter : dataGrid.getDisplayedFilters()) {
if (filter.equals(column.getCode())) {
return true;
}
}
return false;
}
public boolean isLeftSidebarDisplayed() {
return dataGrid != null || dataViewControls != null;
}
public List<SelectedItem> getSelectedItems() throws JspException, IOException {
List<SelectedItem> selectedItems = Lists.newArrayList();
if (shoppingCart != null) {
for (Object item : dataGrid.getSelectedItems()) {
StringWriter writer = new StringWriter();
try {
getValueStack().push(item);
shoppingCart.writeBody(writer);
} finally {
getValueStack().pop();
}
String repr = dataGridTag.getRowId(item);
selectedItems.add(new SelectedItem(repr, StringEscapeUtils.unescapeHtml4(writer.toString())));
}
Collections.sort(selectedItems);
}
return selectedItems;
}
public boolean isRightSidebarDisplayed() {
return shoppingCart != null;
}
public List<DataViewControlTag> getDataViewControls() {
return dataViewControls;
}
public DataGridState<?> getDataGrid() {
return dataGrid;
}
public ShoppingCartTag getShoppingCart() {
return shoppingCart;
}
public DataGridTag<?> getDataGridTag() {
return dataGridTag;
}
public String getDataGridName() {
return dataGridName;
}
public TaskFlowDefinition getTaskFlow() {
return taskFlow;
}
public void setTaskFlow(TaskFlowDefinition taskFlow) {
this.taskFlow = taskFlow;
}
public List<DataGridColumn> getDisplayedFilters() {
return displayedFilters;
}
public void setDisplayedFilters(List<DataGridColumn> displayedFilters) {
this.displayedFilters = displayedFilters;
}
public List<DataGridColumn> getHiddenFilters() {
return hiddenFilters;
}
public void setHiddenFilters(List<DataGridColumn> hiddenFilters) {
this.hiddenFilters = hiddenFilters;
}
public boolean dataFiltered(String id) {
return dataGrid.getFilters().asMap().containsKey(id);
}
public boolean getFilterSelectable() {
return filterSelectable;
}
public void setFilterSelectable(boolean filterSelectable) {
this.filterSelectable = filterSelectable;
}
public DataViewFiltersTag getDataViewFilters() {
return dataViewFilters;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}