package net.techreadiness.ui.action.filters;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import net.techreadiness.service.ConfigService;
import net.techreadiness.service.common.ViewDef;
import net.techreadiness.service.common.ViewDef.ViewDefTypeCode;
import net.techreadiness.service.common.ViewField;
import net.techreadiness.ui.BaseAction;
import net.techreadiness.ui.tags.datagrid.DataGridState;
import net.techreadiness.ui.util.Conversation;
import net.techreadiness.ui.util.ConversationAware;
import ognl.Ognl;
import ognl.OgnlException;
import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import com.opensymphony.xwork2.ActionContext;
@Namespace("/filterList")
public class FilterListControlAction extends BaseAction implements ConversationAware, ApplicationContextAware {
private static final long serialVersionUID = 1L;
ViewDef viewDef;
private List<ViewField> activeFields;
private List<ViewField> inactiveFields;
private List<String> displayedFilters = Lists.newArrayList();
private Map<String, Collection<String>> existingFilters;
private Map<String, String> filters;
private List<Map<String, String>> jsonItems;
private String filterName;
private String filterValue;
private String updateField;
private String dataGridId;
@Inject
ConfigService configService;
private Conversation conversation;
private String viewDefType;
private boolean fullTextShown;
private String search;
private ApplicationContext applicationContext;
private String dataViewFilters;
private String beanName;
private String nameKey;
private String valueKey;
// incoming filter value to save
private String updateDataViewFilter;
// incoming filter value to save
private Map<String, String> dataViewFilterValues;
@Action(value = "show", results = @Result(name = SUCCESS, location = "/filters/filterList/filters.jsp"))
public String show() {
activeFields = Lists.newArrayList();
inactiveFields = Lists.newArrayList();
if (StringUtils.isNotBlank(viewDefType)) {
viewDef = configService.getViewDefinition(getServiceContext(), ViewDefTypeCode.valueOf(viewDefType));
for (ViewField field : viewDef.getFields()) {
if (displayFilter(field)) {
getActiveFields().add(field);
} else {
getInactiveFields().add(field);
getDataGridState().getFilters().removeAll(field.getCode());
}
}
}
existingFilters = getDataGridState().getFilters().asMap();
search = getDataGridState().getSearch();
return SUCCESS;
}
@Action(value = "manage", results = @Result(name = SUCCESS, location = "/filters/filterList/manage.jsp"))
public String manage() {
return show();
}
@Action(value = "updateDisplayed", results = @Result(name = SUCCESS, type = "redirect", location = "show", params = {
"ajax", "true", "dataGridId", "%{dataGridId}", "viewDefType", "%{viewDefType}", "fullTextShown",
"%{fullTextShown}", "dataViewFilters", "%{dataViewFilters}" }))
public String updateDisplayed() {
getDataGridState().setDisplayedFilters(Lists.newArrayList(displayedFilters));
setExpanded(true);
return SUCCESS;
}
@Action(value = "clear", results = @Result(name = SUCCESS, type = "redirect", location = "show", params = { "ajax",
"true", "dataGridId", "%{dataGridId}", "viewDefType", "%{viewDefType}", "fullTextShown", "%{fullTextShown}",
"dataViewFilters", "%{dataViewFilters}" }))
public String clear() {
getDataGridState().getFilters().clear();
getDataGridState().setSearch("");
return SUCCESS;
}
private boolean displayFilter(ViewField viewField) {
if (getDataGridState() == null || getDataGridState().getDisplayedFilters() == null) {
return true;
}
for (String filter : getDataGridState().getDisplayedFilters()) {
if (filter.equals(viewField.getCode())) {
return true;
}
}
return false;
}
@Action(value = "update", results = @Result(name = SUCCESS, type = "redirect", location = "show", params = { "ajax",
"true", "dataGridId", "%{dataGridId}", "viewDefType", "%{viewDefType}", "fullTextShown", "%{fullTextShown}",
"dataViewFilters", "%{dataViewFilters}" }))
public String update() {
if (StringUtils.isNotBlank(updateField)) {
String incomingFilter = getFilters().get(updateField);
if (StringUtils.isNotBlank(incomingFilter)) {
getDataGridState().getFilters().put(updateField, incomingFilter);
}
} else if (StringUtils.isNotBlank(updateDataViewFilter)) {
String incomingFilter = dataViewFilterValues.get(updateDataViewFilter);
if (StringUtils.isNotBlank(incomingFilter) && StringUtils.isNumeric(incomingFilter)) {
getSelectionHandler(updateDataViewFilter).add(Long.valueOf(incomingFilter));
} else {
getSelectionHandler(updateDataViewFilter).clear();
}
}
getDataGridState().setSearch(search);
return SUCCESS;
}
@Action(value = "search", results = @Result(name = SUCCESS, type = "redirect", location = "show", params = { "ajax",
"true", "dataGridId", "%{dataGridId}", "viewDefType", "%{viewDefType}", "fullTextShown", "%{fullTextShown}",
"dataViewFilters", "%{dataViewFilters}" }))
public String search() {
getDataGridState().setSearch(search);
return SUCCESS;
}
@Action(value = "removeFilter", results = @Result(name = SUCCESS, type = "redirect", location = "show", params = {
"ajax", "true", "dataGridId", "%{dataGridId}", "viewDefType", "%{viewDefType}", "fullTextShown",
"%{fullTextShown}", "dataViewFilters", "%{dataViewFilters}" }))
public String removeFilter() {
getDataGridState().getFilters().get(filterName).remove(filterValue);
return SUCCESS;
}
@Action(value = "removeDataViewFilter", results = @Result(name = SUCCESS, type = "redirect", location = "show", params = {
"ajax", "true", "dataGridId", "%{dataGridId}", "viewDefType", "%{viewDefType}", "fullTextShown",
"%{fullTextShown}", "dataViewFilters", "%{dataViewFilters}" }))
public String removeDataViewFilter() {
getSelectionHandler().remove(Long.valueOf(filterValue));
return SUCCESS;
}
@Action(value = "filterOptions", results = { @Result(type = "json", params = { "root", "jsonItems" }) })
public String filterOptions() throws OgnlException {
FilterSelectionHandler<?> selectionHandler = getSelectionHandler();
List<?> items = selectionHandler.getList(ActionContext.getContext().getParameters());
jsonItems = Lists.newArrayList();
for (Object item : items) {
Map<String, String> itemMap = Maps.newHashMap();
itemMap.put("label", (String) Ognl.getValue(nameKey, item, String.class));
itemMap.put("value", (String) Ognl.getValue(valueKey, item, String.class));
jsonItems.add(itemMap);
}
return SUCCESS;
}
public List<?> getSelectedItems(String beanName) {
return getSelectionHandler(beanName).getSelection();
}
@Override
public void setConversation(Conversation conversation) {
this.conversation = conversation;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
private FilterSelectionHandler<?> getSelectionHandler() {
return getSelectionHandler(beanName);
}
private FilterSelectionHandler<?> getSelectionHandler(String beanName) {
FilterSelectionHandler<?> selectionHandler = applicationContext.getBean(beanName, FilterSelectionHandler.class);
if (selectionHandler instanceof ConversationAware) {
((ConversationAware) selectionHandler).setConversation(conversation);
}
if (selectionHandler instanceof DataGridAware) {
((DataGridAware) selectionHandler).setDataGrid(getDataGridState());
}
return selectionHandler;
}
public DataGridState<?> getDataGridState() {
return conversation.get(DataGridState.class, dataGridId);
}
private String getExpandedSessionParam() {
return dataGridId + "filterexpanded";
}
public boolean isExpanded() {
return Boolean.TRUE.equals(getSession().get(getExpandedSessionParam()));
}
public void setExpanded(boolean expanded) {
getSession().put(getExpandedSessionParam(), expanded);
}
public List<?> getDataViewFilterOptions(String beanName) {
List<?> list = getSelectionHandler(beanName).getList(getSession());
return list;
}
public void setViewDef(ViewDef viewDef) {
this.viewDef = viewDef;
}
public ViewDef getViewDef() {
return viewDef;
}
public void setFilters(Map<String, String> filters) {
this.filters = filters;
}
public Map<String, String> getFilters() {
return filters;
}
public Map<String, Collection<String>> getExistingFilters() {
return existingFilters;
}
public void setFilterValue(String filterValue) {
this.filterValue = filterValue;
}
public String getFilterValue() {
return filterValue;
}
public void setFilterName(String filterName) {
this.filterName = filterName;
}
public String getFilterName() {
return filterName;
}
public void setUpdateField(String updateField) {
this.updateField = updateField;
}
public String getUpdateField() {
return updateField;
}
public void setDataGridId(String dataGridId) {
this.dataGridId = dataGridId;
}
public String getDataGridId() {
return dataGridId;
}
public String getViewDefType() {
return viewDefType;
}
public void setViewDefType(String viewDefType) {
this.viewDefType = viewDefType;
}
public List<ViewField> getActiveFields() {
return activeFields;
}
public void setActiveFields(List<ViewField> activeFields) {
this.activeFields = activeFields;
}
public List<ViewField> getInactiveFields() {
return inactiveFields;
}
public void setInactiveFields(List<ViewField> inactiveFields) {
this.inactiveFields = inactiveFields;
}
public List<String> getDisplayedFilters() {
return displayedFilters;
}
public void setDisplayedFilters(List<String> displayedFilters) {
this.displayedFilters = displayedFilters;
}
public String getSearch() {
return search;
}
public void setSearch(String search) {
this.search = search;
}
public boolean isFullTextShown() {
return fullTextShown;
}
public void setFullTextShown(boolean fullTextShown) {
this.fullTextShown = fullTextShown;
}
public List<Map<String, String>> getJsonItems() {
return jsonItems;
}
public void setJsonItems(List<Map<String, String>> jsonItems) {
this.jsonItems = jsonItems;
}
public List<?> getSelectedItems() {
return getSelectionHandler().getSelection();
}
public String getDataViewFilters() {
return dataViewFilters;
}
public void setDataViewFilters(String dataViewFilters) {
this.dataViewFilters = dataViewFilters;
}
public List<Map<String, Object>> getDataViewFiltersAsObject() {
if (StringUtils.isBlank(dataViewFilters)) {
return Collections.emptyList();
}
Gson gson = new GsonBuilder().create();
Type filterType = new TypeToken<List<Map<String, Object>>>() {
// Define a type for JSON parsing
}.getType();
return gson.fromJson(dataViewFilters, filterType);
}
public String getBeanName() {
return beanName;
}
public void setBeanName(String beanName) {
this.beanName = beanName;
}
public String getValueKey() {
return valueKey;
}
public void setValueKey(String valueKey) {
this.valueKey = valueKey;
}
public String getNameKey() {
return nameKey;
}
public void setNameKey(String nameKey) {
this.nameKey = nameKey;
}
public String getUpdateDataViewFilter() {
return updateDataViewFilter;
}
public void setUpdateDataViewFilter(String updateDataViewFilter) {
this.updateDataViewFilter = updateDataViewFilter;
}
public Map<String, String> getDataViewFilterValues() {
return dataViewFilterValues;
}
public void setDataViewFilterValues(Map<String, String> dataViewFilterValues) {
this.dataViewFilterValues = dataViewFilterValues;
}
}