package net.techreadiness.ui.tags.taskview;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import net.techreadiness.service.common.DataGridItemProvider;
import net.techreadiness.service.common.ViewDef;
import net.techreadiness.ui.tags.ParentTag;
import net.techreadiness.ui.tags.ToolbarTag;
import net.techreadiness.ui.tags.datagrid.DataGridState;
import net.techreadiness.ui.tags.dataview.DataViewControlTag;
import net.techreadiness.ui.tags.taskflow.TaskNavigationTag;
import net.techreadiness.ui.task.TaskFlowData;
import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
public class TaskViewTag<T> extends ParentTag {
private List<DataViewControlTag> viewControls;
private ViewDef dataGridViewDef;
private ViewDef fieldSetViewDef;
private boolean detailMode = false;
private String value;
private String var;
private String fieldName;
private String nameExpression;
private String listHeader;
private String rowIdentifier;
private DataGridItemProvider<T> itemProvider;
private List<EntityFieldTag> columns;
private List<EntityFieldGroupTag> entityGroups;
private DataGridState<T> state;
private Collection<T> items;
private ToolbarTag toolBar;
private Collection<?> selection;
private String selectionTitle;
private String selectionDisplayExpression;
private boolean hideNameColumnInGrid;
private TaskFlowData taskFlowData;
private TaskNavigationTag navigationTag;
private String groupExpression;
private boolean paging;
private boolean suppressSave;
private boolean selectAllRows;
@Override
public String execute() throws Exception {
viewControls = getChildren(DataViewControlTag.class);
state = (DataGridState<T>) getValueStack().findValue(value);
if (state == null) {
state = new DataGridState<>();
state.setPaging(false);
} else if (state instanceof TaskViewState) {
TaskViewState<T> taskViewState = (TaskViewState<T>) state;
detailMode = taskViewState.isDetailMode();
}
if (state.getItemProvider() != null && itemProvider == null) {
itemProvider = state.getItemProvider();
}
if (detailMode && itemProvider != null) {
try {
items = itemProvider.getPage(state);
} catch (IllegalStateException e) {
items = Collections.emptyList();
}
}
columns = getChildren(EntityFieldTag.class);
int i = 0;
for (EntityFieldTag column : columns) {
column.setPageOrder(Integer.valueOf(i));
column.execute();
i++;
}
Collections.sort(columns);
entityGroups = getChildren(EntityFieldGroupTag.class);
for (EntityFieldGroupTag columnGroup : entityGroups) {
columnGroup.execute();
for (EntityFieldTag field : columnGroup.getFields()) {
field.execute();
}
}
toolBar = Iterables.getOnlyElement(getChildren(ToolbarTag.class), null);
navigationTag = Iterables.getOnlyElement(getChildren(TaskNavigationTag.class), new TaskNavigationTag());
if (taskFlowData != null) {
navigationTag.setTaskFlow(taskFlowData.getTaskFlowState());
}
navigationTag.setDetailMode(isDetailMode());
navigationTag.setAllowModeSwitch(isModeToggleable());
navigationTag.setValue(value);
navigationTag.setSuppressSave(isSuppressSave());
return "/taskView/taskView.jsp";
}
public boolean isRowInError() {
Map<String, List<String>> fieldErrors = Maps.filterKeys(
(Map<String, List<String>>) getValueStack().findValue("fieldErrors"), new FieldErrorFilter());
return !fieldErrors.isEmpty();
}
public boolean isFilterBarDisplayed() {
return viewControls != null && !viewControls.isEmpty();
}
public boolean isSelectable() {
return rowIdentifier != null;
}
public boolean isSelectAllRows() {
return selectAllRows;
}
public void setSelectAllRows(boolean selectAllRows) {
this.selectAllRows = selectAllRows;
}
public boolean isColumnSelectable() {
return dataGridViewDef != null;
}
public boolean isSelectionDisplayed() {
return selectionDisplayExpression != null;
}
public boolean isModeToggleable() {
return state instanceof TaskViewState;
}
public List<DataViewControlTag> getViewControls() {
return viewControls;
}
public boolean isDetailMode() {
return detailMode;
}
public void setDetailMode(boolean detailMode) {
this.detailMode = detailMode;
}
public DataGridItemProvider<T> getItemProvider() {
return itemProvider;
}
public void setItemProvider(DataGridItemProvider<T> itemProvider) {
this.itemProvider = itemProvider;
}
public List<EntityFieldTag> getColumns() {
return columns;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public Iterator<RowInfo<T>> getItems() {
return Iterables.transform(items, new Function<T, RowInfo<T>>() {
@Override
public RowInfo<T> apply(T row) {
RowInfo<T> info = new RowInfo<>(row, getValueStack(), var, fieldName);
return info;
}
}).iterator();
}
public String getVar() {
return var;
}
public void setVar(String var) {
this.var = var;
}
public String getFieldName() {
return fieldName;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
public String getNameExpression() {
return nameExpression;
}
public void setNameExpression(String nameExpression) {
this.nameExpression = nameExpression;
}
public String getListHeader() {
return listHeader;
}
public void setListHeader(String listHeader) {
this.listHeader = listHeader;
}
public ViewDef getDataGridViewDef() {
return dataGridViewDef;
}
public void setDataGridViewDef(ViewDef dataGridViewDef) {
this.dataGridViewDef = dataGridViewDef;
}
public ViewDef getFieldSetViewDef() {
return fieldSetViewDef;
}
public void setFieldSetViewDef(ViewDef fieldSetViewDef) {
this.fieldSetViewDef = fieldSetViewDef;
}
public ToolbarTag getToolBar() {
return toolBar;
}
public String getRowIdentifier() {
return rowIdentifier;
}
public Collection<?> getSelection() {
return selection;
}
public void setSelection(Collection<?> selection) {
this.selection = selection;
}
public String getSelectionTitle() {
return selectionTitle;
}
public void setSelectionTitle(String selectionTitle) {
this.selectionTitle = selectionTitle;
}
public String getSelectionDisplayExpression() {
return selectionDisplayExpression;
}
public void setSelectionDisplayExpression(String selectionDisplayExpression) {
this.selectionDisplayExpression = selectionDisplayExpression;
}
public void setRowIdentifier(String rowIdentifier) {
this.rowIdentifier = rowIdentifier;
}
public List<EntityFieldGroupTag> getEntityGroups() {
return entityGroups;
}
public boolean isHideNameColumnInGrid() {
return hideNameColumnInGrid;
}
public void setHideNameColumnInGrid(boolean hideNameColumnInGrid) {
this.hideNameColumnInGrid = hideNameColumnInGrid;
}
public TaskFlowData getTaskFlowData() {
return taskFlowData;
}
public void setTaskFlow(TaskFlowData taskFlowData) {
this.taskFlowData = taskFlowData;
}
public TaskNavigationTag getNavigationTag() {
return navigationTag;
}
public void setNavigationTag(TaskNavigationTag navigationTag) {
this.navigationTag = navigationTag;
}
public String getGroupExpression() {
return groupExpression;
}
public void setGroupExpression(String groupExpression) {
this.groupExpression = groupExpression;
}
public boolean isPaging() {
return paging;
}
public void setPaging(boolean paging) {
this.paging = paging;
}
public boolean isSuppressSave() {
return suppressSave;
}
public void setSuppressSave(boolean suppressSave) {
this.suppressSave = suppressSave;
}
class FieldErrorFilter implements Predicate<String> {
@Override
public boolean apply(String input) {
return StringUtils.startsWith(input, evaluateOgnl(fieldName));
}
}
}