package org.springframework.samples.countries.web;
import java.util.List;
import java.util.Locale;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.support.PagedListSourceProvider;
import org.springframework.beans.support.RefreshablePagedListHolder;
import org.springframework.samples.countries.Country;
import org.springframework.samples.countries.CountryService;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
import org.springframework.web.servlet.support.RequestContextUtils;
/**
* @author Jean-Pierre Pawlak
* @author Juergen Hoeller
*/
public class CountriesController extends MultiActionController {
private static final String COUNTRIES_ATTR = "countries";
private static final String HOME_VIEW = "homeView";
private static final String CONFIG_VIEW = "configView";
private static final String MAIN_VIEW = "countries_mainView";
private static final String DETAIL_VIEW = "countries_detailView";
private static final String EXCEL_VIEW = "countries_excelView";
private static final String PDF_VIEW = "countries_pdfView";
private CountryService countryService;
private String homeView = HOME_VIEW;
private String configView = CONFIG_VIEW;
private String mainView = MAIN_VIEW;
private String detailView = DETAIL_VIEW;
private String excelView = EXCEL_VIEW;
private String pdfView = PDF_VIEW;
public void setCountryService(CountryService countryService) {
this.countryService = countryService;
}
public void setConfigView(String view) {
this.configView = view;
}
public void setDetailView(String view) {
this.detailView = view;
}
public void setExcelView(String view) {
this.excelView = view;
}
public void setHomeView(String view) {
this.homeView = view;
}
public void setMainView(String view) {
this.mainView = view;
}
public void setPdfView(String view) {
this.pdfView = view;
}
/**
* Custom handler for home.
* @param request current HTTP request
* @param response current HTTP response
* @return a ModelAndView to render the response
*/
public ModelAndView handleHome(HttpServletRequest request, HttpServletResponse response) throws ServletException {
return new ModelAndView(homeView);
}
/**
* Custom handler for config.
* @param request current HTTP request
* @param response current HTTP response
* @return a ModelAndView to render the response
*/
public ModelAndView handleConfig(HttpServletRequest request, HttpServletResponse response) throws ServletException {
return new ModelAndView(configView);
}
/**
* Custom handler for countries main paged list.
* @param request current HTTP request
* @param response current HTTP response
* @return a ModelAndView to render the response
*/
public ModelAndView handleMain(HttpServletRequest request, HttpServletResponse response) throws ServletException {
RefreshablePagedListHolder listHolder =
(RefreshablePagedListHolder) request.getSession(true).getAttribute(COUNTRIES_ATTR);
if (listHolder == null) {
listHolder = new RefreshablePagedListHolder();
listHolder.setSourceProvider(new CountriesProvider());
listHolder.setFilter(new CountriesFilter());
request.getSession(true).setAttribute(COUNTRIES_ATTR, listHolder);
}
ServletRequestDataBinder binder = new ServletRequestDataBinder(listHolder, "countries");
binder.bind(request);
listHolder.setLocale(RequestContextUtils.getLocale(request));
boolean forceRefresh = request.getParameter("forceRefresh") != null;
listHolder.refresh(forceRefresh);
return new ModelAndView(this.mainView, binder.getBindingResult().getModel());
}
/**
* Custom handler for countries detail page.
* @param request current HTTP request
* @param response current HTTP response
* @return a ModelAndView to render the response
*/
public ModelAndView handleDetail(HttpServletRequest request, HttpServletResponse response) throws ServletException {
Locale locale = RequestContextUtils.getLocale(request);
Country country = this.countryService.getCountry(request.getParameter("code"), locale);
return new ModelAndView(this.detailView, "country", country);
}
/**
* Custom handler for countries Excel document.
* @param request current HTTP request
* @param response current HTTP response
* @return a ModelAndView to render the response
*/
public ModelAndView handleExcel(HttpServletRequest request, HttpServletResponse response) throws ServletException {
RefreshablePagedListHolder listHolder =
(RefreshablePagedListHolder) request.getSession(true).getAttribute(COUNTRIES_ATTR);
if (listHolder == null) {
throw new ServletException("No countries list found in session");
}
return new ModelAndView(this.excelView, "countries", listHolder);
}
/**
* Custom handler for countries PDF document.
* @param request current HTTP request
* @param response current HTTP response
* @return a ModelAndView to render the response
*/
public ModelAndView handlePdf(HttpServletRequest request, HttpServletResponse response) throws ServletException {
RefreshablePagedListHolder listHolder =
(RefreshablePagedListHolder) request.getSession(true).getAttribute(COUNTRIES_ATTR);
if (listHolder == null) {
throw new ServletException("No countries list found in session");
}
return new ModelAndView(this.pdfView, "countries", listHolder);
}
private class CountriesProvider implements PagedListSourceProvider {
public List loadList(Locale loc, Object filter) {
CountriesFilter cf = (CountriesFilter) filter;
return countryService.getFilteredCountries(cf.getName(), cf.getCode(), loc);
}
}
}