/*
* Created on Nov 11, 2004
*
*/
package com.kylietech.oaj.web.mvc.list;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.javalib.util.OARequestUtil;
import net.javalib.util.OAStringUtil;
import net.javalib.util.vl.*;
import org.springframework.beans.*;
import org.springframework.beans.support.PagedListSourceProvider;
import org.springframework.beans.support.RefreshablePagedListHolder;
import org.springframework.validation.BindException;
import org.springframework.web.bind.RequestUtils;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.support.RequestContextUtils;
import org.springframework.web.servlet.view.RedirectView;
import org.springframework.web.util.WebUtils;
import com.kylietech.oaj.common.util.*;
import com.kylietech.oaj.common.util.OADomainUtil;
import com.kylietech.oaj.types.*;
import com.kylietech.oaj.web.mvc.*;
import com.kylietech.oaj.web.mvc.OAFormConsts;
import com.kylietech.oaj.web.mvc.OAFormEdit;
/**
* @author Sherif Omar
*
*
*/
public abstract class OAFormList extends OAFormEdit {
public static String LIST_FORM = "/common/paged_list_form";
private static final String LIST_ATTR = "oa_list_pager";
public OAFormList() {
setFormView(LIST_FORM);
setCommandName(null);
setCommandClass(getDummyBackingObjectClass());
}
protected Object formBackingObject(HttpServletRequest request) throws Exception {
return getNewDummyBackingObject();
}
protected String getSessionAttributeName() {
return LIST_ATTR + getListClass() + getBeanName();
}
protected RefreshablePagedListHolder getListHolder(
HttpServletRequest request) {
RefreshablePagedListHolder listHolder = (RefreshablePagedListHolder) request
.getSession(true).getAttribute(getSessionAttributeName());
if (null == listHolder) {
listHolder = new RefreshablePagedListHolder();
listHolder.setSourceProvider(new ListProvider(this));
listHolder.setFilter(new OAListFilter());
request.getSession(true).setAttribute(getSessionAttributeName(), listHolder);
}
((ListProvider)listHolder.getSourceProvider()).setParent(this);
return listHolder;
}
protected void getModel(Map model, HttpServletRequest request, Object command) throws Exception {
super.getModel(model, request, command);
RefreshablePagedListHolder listHolder = getListHolder(request);
OAListFilter filter = (OAListFilter)listHolder.getFilter();
String sortBy = RequestUtils.getStringParameter(request, "pageSortBy", null);
if (OAStringUtil.hasText(sortBy))
filter.setSortBy(sortBy);
if (WebUtils.hasSubmitParameter(request,"filterSubmit")) {
filter.setFilterValue(RequestUtils.getStringParameter(request, "filterValue", null));
filter.setFilterColumn(RequestUtils.getStringParameter(request, "filterColumn", null));
}
listHolder.setLocale(RequestContextUtils.getLocale(request));
//boolean forceRefresh = request.getParameter("forceRefresh") != null;
boolean forceRefresh = true;
listHolder.refresh(forceRefresh);
int pageSize = RequestUtils.getIntParameter(request, "pageSize", 0);
if (pageSize > 0)
listHolder.setPageSize(pageSize);
int pageNumber = RequestUtils.getIntParameter(request, "pageNumber", -1);
if (pageNumber >= 0)
listHolder.setPage(pageNumber);
model.put("row_data", listHolder);
}
protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception {
String actionName = RequestUtils.getStringParameter(request, "actionName", null);
if (actionName != null) {
setSuccessView(actionName);
ModelAndView mv = new ModelAndView(new RedirectView(getSuccessView()));
mv.addObject(OAFormConsts.GET_RETURN_PAGE, getBeanNameAsAction());
OARequestUtil.putArray(request, mv);
return mv;
} else {
setSuccessView(viewResolver.getListView());
return new ModelAndView(new RedirectView(getSuccessView()));
}
}
public Class getListClass() {
return OAClassUtil.getClass(getViewResolver().getAddEditCommandClass());
}
public void addCustomFilters(ValueListInfo info) {
}
public List getData(ValueListInfo info) {
addCustomFilters(info);
Class listClass = getListClass();
// if the list class is a DomainWrapper, then retreive the actual domain class to list
if (DomainEditWrapper.class.isAssignableFrom(listClass)) {
Object listObject = BeanUtils.instantiateClass(listClass);
listClass = ((DomainEditWrapper)listObject).getDomainClass();
}
return OADomainUtil.getAll(listClass, info);
}
/**
* Does this page allow creating new object of the type it's listing ?
* @return If allows creation
*/
public Boolean hasNew() {
return Boolean.TRUE;
}
/**
* Returns whether the given row is editable or not. Default is true.
* @param row
* @return Given object/row is editable or not
*/
public Boolean hasEdit(Object row) {
return Boolean.TRUE;
}
/**
* Returns whether the given row is viewable or not. Default is if view resolver has view view defined
* @param row
* @return Given object/row is viewable or not.
*/
public Boolean hasView(Object row) {
return new Boolean(getViewResolver(row).getViewView() != null);
}
/**
* Returns whether the given row is deletable or not. Default is if view resolver has delete view defined
* @param row
* @return Given object/row is deletable or not.
*/
public Boolean hasDelete(Object row) {
return new Boolean(getViewResolver(row).getDeleteView() != null);
}
/**
* Returns whether the given row is printable or not. Default is if view resolver has print view defined
* @param row
* @return Given object/row is printable or not.
*/
public Boolean hasPrint(Object row) {
return new Boolean(getViewResolver(row).getPrintView() != null);
}
public Integer getViewId(Object row) {
return OABeanUtil.getId(row);
}
public Integer getEditId(Object row) {
return OABeanUtil.getId(row);
}
public Integer getPrintId(Object row) {
return OABeanUtil.getId(row);
}
public Integer getDeleteId(Object row) {
return OABeanUtil.getId(row);
}
/**
* Returns the proper view resolver for the given row. Return the default view resolver for this list view
* @param row (Domain) Object to return view resolver for
* @return OAViewResolver to resolve edit/delete/view views for given object
*/
public OAViewResolver getViewResolver(Object row) {
return getViewResolver();
}
public Map getActions() {
return new HashMap();
}
public abstract List getColumns();
private class ListProvider implements PagedListSourceProvider, Serializable {
private OAFormList parent;
public ListProvider(OAFormList parent) {
this.parent = parent;
}
public void setParent(OAFormList parent) {
this.parent = parent;
}
public List loadList(Locale loc, Object filter) {
OAListFilter listFilter = (OAListFilter)filter;
ValueListInfo listFilterInfo = listFilter.getValueListInfo();
return parent.getData(listFilterInfo);
}
}
}