com.jd.survey.web.settings.DataSetController.java Source code

Java tutorial

Introduction

Here is the source code for com.jd.survey.web.settings.DataSetController.java

Source

/*Copyright (C) 2014  JD Software, Inc.
    
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
    
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.
    
You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
package com.jd.survey.web.settings;

import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.security.Principal;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.util.UriUtils;
import org.springframework.web.util.WebUtils;

import au.com.bytecode.opencsv.CSVReader;

import com.jd.survey.domain.security.User;
import com.jd.survey.domain.settings.DataSet;
import com.jd.survey.service.security.UserService;
import com.jd.survey.service.settings.SurveySettingsService;

@RequestMapping("/settings/datasets")
@Controller
public class DataSetController {
    private static final Log log = LogFactory.getLog(DataSetController.class);
    private static final String VALUE_FIELD_NAME_MESSAGE = "com.jd.survey.domain.settings.datasetitem.value_label";
    private static final String TEXT_FIELD_NAME_MESSAGE = "com.jd.survey.domain.settings.datasetitem.text_label";

    @Autowired
    private SurveySettingsService surveySettingsService;
    @Autowired
    private UserService userService;
    @Autowired
    private MessageSource messageSource;

    /**
     * exports a sample dataset items a comma delimited file
     * @param dataSetId
     * @param principal
     * @param response
     */

    @RequestMapping(value = "/example", produces = "text/html")
    public void getExampleCsvFile(Principal principal, HttpServletResponse response) {
        try {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(messageSource
                    .getMessage(VALUE_FIELD_NAME_MESSAGE, null, LocaleContextHolder.getLocale()).replace(",", ""));
            stringBuilder.append(",");
            stringBuilder.append(messageSource
                    .getMessage(TEXT_FIELD_NAME_MESSAGE, null, LocaleContextHolder.getLocale()).replace(",", ""));
            stringBuilder.append("\n");
            stringBuilder.append("B,Boston\n");
            stringBuilder.append("N,New York\n");
            //response.setContentType("text/html; charset=utf-8");
            response.setContentType("application/octet-stream");
            // Set standard HTTP/1.1 no-cache headers.
            response.setHeader("Cache-Control", "no-store, no-cache,must-revalidate");
            // Set IE extended HTTP/1.1 no-cache headers (use addHeader).
            response.addHeader("Cache-Control", "post-check=0, pre-check=0");
            // Set standard HTTP/1.0 no-cache header.
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Content-Disposition", "inline;filename=datasetExample.csv");
            ServletOutputStream servletOutputStream = response.getOutputStream();
            servletOutputStream.write(stringBuilder.toString().getBytes("UTF-8"));
            servletOutputStream.flush();

        }

        catch (Exception e) {
            log.error(e.getMessage(), e);
            throw (new RuntimeException(e));
        }

    }

    /**
     * exports a dataset to a comma delimited file
     * @param dataSetId
     * @param principal
     * @param response
     */

    @RequestMapping(value = "/{id}", params = "export", produces = "text/html")
    public void export(@PathVariable("id") Long dataSetId, Principal principal, HttpServletResponse response) {
        try {

            String commaDelimtedString = surveySettingsService.exportDatasetItemsToCommaDelimited(dataSetId);
            //response.setContentType("text/html; charset=utf-8");
            response.setContentType("application/octet-stream");
            // Set standard HTTP/1.1 no-cache headers.
            response.setHeader("Cache-Control", "no-store, no-cache,must-revalidate");
            // Set IE extended HTTP/1.1 no-cache headers (use addHeader).
            response.addHeader("Cache-Control", "post-check=0, pre-check=0");
            // Set standard HTTP/1.0 no-cache header.
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Content-Disposition", "inline;filename=dataSetItems" + dataSetId + ".csv");
            ServletOutputStream servletOutputStream = response.getOutputStream();
            servletOutputStream.write(commaDelimtedString.getBytes("UTF-8"));
            servletOutputStream.flush();

        }

        catch (Exception e) {
            log.error(e.getMessage(), e);
            throw (new RuntimeException(e));
        }
    }

    //renders the page for the survey definition import from json file

    /**
     * prepares the page to import a dataset from a csv file       
     * @param dataSetId
     * @param principal
     * @param uiModel
     * @param httpServletRequest
     * @return
     */
    @Secured({ "ROLE_ADMIN" })
    @RequestMapping(value = "/{id}", params = "import", produces = "text/html")
    public String prepareForImport(@PathVariable("id") Long dataSetId, Principal principal, Model uiModel,
            HttpServletRequest httpServletRequest) {
        try {
            String login = principal.getName();
            User user = userService.user_findByLogin(login);
            if (!user.isAdmin()) {
                log.warn("Unauthorized access to url path " + httpServletRequest.getPathInfo()
                        + " attempted by user login:" + principal.getName() + "from IP:"
                        + httpServletRequest.getLocalAddr());
                return "accessDenied";
            }
            uiModel.addAttribute("dataSet", surveySettingsService.dataSet_findById(dataSetId));
            return "settings/datasets/upload";
        }

        catch (Exception e) {
            log.error(e.getMessage(), e);
            throw (new RuntimeException(e));
        }
    }

    @Secured({ "ROLE_ADMIN", "ROLE_SURVEY_ADMIN" })
    @RequestMapping(value = "/upload", method = RequestMethod.POST, produces = "text/html")
    public String importDatasetItems(@RequestParam("file") MultipartFile file, @RequestParam("id") Long dataSetId,
            @RequestParam("ignoreFirstRow") Boolean ignoreFirstRow,
            @RequestParam(value = "_proceed", required = false) String proceed, Principal principal, Model uiModel,
            HttpServletRequest httpServletRequest) {

        try {
            String login = principal.getName();
            User user = userService.user_findByLogin(login);

            if (!user.isAdmin()) {
                log.warn("Unauthorized access to url path " + httpServletRequest.getPathInfo()
                        + " attempted by user login:" + principal.getName() + "from IP:"
                        + httpServletRequest.getLocalAddr());
                return "accessDenied";
            }
            if (proceed != null) {
                log.info(file.getContentType());
                //if file is empty OR the file type is incorrect the upload page is returned with an error message.
                if (file.isEmpty() || !((file.getContentType().equalsIgnoreCase("text/csv"))
                        || (file.getContentType().equals("application/vnd.ms-excel"))
                        || (file.getContentType().equals("text/plain")))) {
                    uiModel.addAttribute("dataSet", surveySettingsService.dataSet_findById(dataSetId));
                    uiModel.addAttribute("emptyFileError", true);
                    return "settings/datasets/upload";
                }
                try {
                    CSVReader csvReader;
                    csvReader = new CSVReader(new InputStreamReader(file.getInputStream()));
                    surveySettingsService.importDatasetItems(csvReader, dataSetId, ignoreFirstRow);
                    //done Redirect to the set view page
                    return "redirect:/settings/datasets/"
                            + encodeUrlPathSegment(dataSetId.toString(), httpServletRequest) + "?page=1&size=15";
                }

                catch (Exception e) {
                    log.error(e.getMessage(), e);
                    uiModel.addAttribute("dataSet", surveySettingsService.dataSet_findById(dataSetId));
                    uiModel.addAttribute("emptyFileError", true);
                    return "settings/datasets/upload";
                }

            } else {

                return "redirect:/settings/datasets/"
                        + encodeUrlPathSegment(dataSetId.toString(), httpServletRequest);
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw new RuntimeException(e);
        }
    }

    @Secured({ "ROLE_ADMIN" })
    @RequestMapping(params = "create", produces = "text/html")
    public String createDataSet(Principal principal, Model uiModel, HttpServletRequest httpServletRequest) {
        log.info("createForm(): handles param form");
        try {
            User user = userService.user_findByLogin(principal.getName());
            if (!user.isAdmin()) {
                log.warn("Unauthorized access to url path " + httpServletRequest.getPathInfo()
                        + " attempted by user login:" + principal.getName() + "from IP:"
                        + httpServletRequest.getLocalAddr());
                return "accessDenied";
            }
            DataSet dataSet = new DataSet();
            populateEditForm(uiModel, dataSet, user);
            return "settings/datasets/create";
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw (new RuntimeException(e));
        }
    }

    @Secured({ "ROLE_ADMIN" })
    @RequestMapping(method = RequestMethod.POST, produces = "text/html")
    public String createPost(@RequestParam(value = "_proceed", required = false) String proceed,
            @Valid DataSet dataSet, BindingResult bindingResult, Principal principal, Model uiModel,
            HttpServletRequest httpServletRequest) {
        log.info("create(): handles " + RequestMethod.POST.toString());
        try {
            User user = userService.user_findByLogin(principal.getName());
            if (!user.isAdmin()) {
                log.warn("Unauthorized access to url path " + httpServletRequest.getPathInfo()
                        + " attempted by user login:" + principal.getName() + "from IP:"
                        + httpServletRequest.getLocalAddr());
                return "accessDenied";
            }

            if (proceed != null) {
                if (bindingResult.hasErrors()) {
                    populateEditForm(uiModel, dataSet, user);
                    return "settings/datasets/create";
                }

                if (surveySettingsService.dataset_findByName(dataSet.getName()) != null && !surveySettingsService
                        .dataset_findByName(dataSet.getName()).getId().equals(dataSet.getId())) {
                    bindingResult.rejectValue("name", "field_unique");
                    populateEditForm(uiModel, dataSet, user);
                    return "settings/datasets/update";
                }

                uiModel.asMap().clear();
                dataSet = surveySettingsService.dataSet_merge(dataSet);
                return "redirect:/settings/datasets/"
                        + encodeUrlPathSegment(dataSet.getId().toString(), httpServletRequest);
            } else {
                return "redirect:/settings/datasets";
            }

        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw (new RuntimeException(e));
        }

    }

    @Secured({ "ROLE_ADMIN", "ROLE_SURVEY_ADMIN" })
    @RequestMapping(value = "/{id}", produces = "text/html")
    public String show(@PathVariable("id") Long id, @RequestParam(value = "page", required = false) Integer page,
            @RequestParam(value = "size", required = false) Integer size, Principal principal, Model uiModel) {
        log.info("show(): id=" + id);
        try {
            uiModel.addAttribute("itemId", id);
            uiModel.addAttribute("dataSet", surveySettingsService.dataSet_findById(id));

            int sizeNo = size == null ? 10 : size.intValue();
            final int firstResult = page == null ? 0 : (page.intValue() - 1) * sizeNo;
            uiModel.addAttribute("dataSetItems",
                    surveySettingsService.datasetItem_findByDataSetId(id, firstResult, sizeNo));
            float nrOfPages = (float) surveySettingsService.datasetItem_getCount(id) / sizeNo;
            uiModel.addAttribute("maxPages",
                    (int) ((nrOfPages > (int) nrOfPages || nrOfPages == 0.0) ? nrOfPages + 1 : nrOfPages));

            return "settings/datasets/show";
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw (new RuntimeException(e));
        }
    }

    @RequestMapping(produces = "text/html")
    public String list(@RequestParam(value = "page", required = false) Integer page,
            @RequestParam(value = "size", required = false) Integer size, Principal principal, Model uiModel) {
        try {

            if (page != null || size != null) {

                int sizeNo = size == null ? 10 : size.intValue();
                final int firstResult = page == null ? 0 : (page.intValue() - 1) * sizeNo;
                uiModel.addAttribute("dataSets", surveySettingsService.dataSet_findAll(firstResult, sizeNo));
                float nrOfPages = (float) surveySettingsService.dataSet_getCount() / sizeNo;
                uiModel.addAttribute("maxPages",
                        (int) ((nrOfPages > (int) nrOfPages || nrOfPages == 0.0) ? nrOfPages + 1 : nrOfPages));
            } else {

                uiModel.addAttribute("dataSets", surveySettingsService.dataSet_findAll());
            }
            return "settings/datasets/list";
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw (new RuntimeException(e));
        }
    }

    @Secured({ "ROLE_ADMIN" })
    @RequestMapping(method = RequestMethod.PUT, produces = "text/html")
    public String update(@RequestParam(value = "_proceed", required = false) String proceed, @Valid DataSet dataSet,
            BindingResult bindingResult, Principal principal, Model uiModel,
            HttpServletRequest httpServletRequest) {
        log.info("update(): handles PUT");
        try {
            User user = userService.user_findByLogin(principal.getName());

            if (!user.isAdmin()) {
                log.warn("Unauthorized access to url path " + httpServletRequest.getPathInfo()
                        + " attempted by user login:" + principal.getName() + "from IP:"
                        + httpServletRequest.getLocalAddr());
                return "accessDenied";
            }

            if (proceed != null) {
                if (bindingResult.hasErrors()) {
                    populateEditForm(uiModel, dataSet, user);
                    return "settings/datasets/update";
                }

                if (surveySettingsService.dataset_findByName(dataSet.getName()) != null && !surveySettingsService
                        .dataset_findByName(dataSet.getName()).getId().equals(dataSet.getId())) {
                    bindingResult.rejectValue("name", "field_unique");
                    populateEditForm(uiModel, dataSet, user);
                    return "settings/datasets/update";
                }
                uiModel.asMap().clear();
                dataSet = surveySettingsService.dataSet_merge(dataSet);
                return "redirect:/settings/datasets/"
                        + encodeUrlPathSegment(dataSet.getId().toString(), httpServletRequest);
            } else {
                return "redirect:/settings/datasets";
            }

        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw (new RuntimeException(e));
        }
    }

    @Secured({ "ROLE_ADMIN" })
    @RequestMapping(value = "/{id}", params = "form", produces = "text/html")
    public String updateForm(@PathVariable("id") Long id, Principal principal, Model uiModel) {
        log.info("updateForm(): id=" + id);
        try {
            User user = userService.user_findByLogin(principal.getName());
            if (!user.isAdmin()) {
                //log.warn("Unauthorized access to url path " + httpServletRequest.getPathInfo() + " attempted by user login:" + principal.getName() + "from IP:" + httpServletRequest.getLocalAddr());
                return "accessDenied";
            }

            populateEditForm(uiModel, surveySettingsService.dataSet_findById(id), user);
            return "settings/datasets/update";
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw (new RuntimeException(e));
        }
    }

    @Secured({ "ROLE_ADMIN" })
    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE, produces = "text/html")
    public String delete(@PathVariable("id") Long id, Principal principal, Model uiModel,
            HttpServletRequest httpServletRequest) {
        log.info("delete(): id=" + id);
        try {
            User user = userService.user_findByLogin(principal.getName());
            if (!user.isAdmin()) {
                log.warn("Unauthorized access to url path " + httpServletRequest.getPathInfo()
                        + " attempted by user login:" + principal.getName() + "from IP:"
                        + httpServletRequest.getLocalAddr());
                return "accessDenied";

            }
            surveySettingsService.dataSet_remove(id);
            return "redirect:/settings/datasets";
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw (new RuntimeException(e));
        }
    }

    void populateEditForm(Model uiModel, DataSet dataSet, User user) {
        log.info("populateEditForm()");
        try {
            uiModel.addAttribute("dataSet", dataSet);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw (new RuntimeException(e));
        }
    }

    String encodeUrlPathSegment(String pathSegment, HttpServletRequest httpServletRequest) {
        log.info("encodeUrlPathSegment()");
        try {
            String enc = httpServletRequest.getCharacterEncoding();
            if (enc == null) {
                enc = WebUtils.DEFAULT_CHARACTER_ENCODING;
            }
            try {
                pathSegment = UriUtils.encodePathSegment(pathSegment, enc);
            } catch (UnsupportedEncodingException uee) {
                log.error(uee);
            }
            return pathSegment;
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw (new RuntimeException(e));
        }
    }

    @ExceptionHandler(RuntimeException.class)
    public String handleRuntimeException(RuntimeException ex, HttpServletRequest request) {
        log.error(ex);
        log.error("redirect to /uncaughtException");
        return "redirect:/uncaughtException";
    }

}