/**
* $Id: SurveyAction.java 4026 2011-03-22 14:58:42Z orangeforjava $
*/
package org.openuap.cms.survey.action.admin.survey;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.openuap.base.util.ControllerHelper;
import org.openuap.base.util.FileUtil;
import org.openuap.base.util.QueryInfo;
import org.openuap.base.util.context.PageBuilder;
import org.openuap.cms.core.action.UserAwareAction;
import org.openuap.cms.survey.manager.QuestionManager;
import org.openuap.cms.survey.manager.SurveyManager;
import org.openuap.cms.survey.model.Question;
import org.openuap.cms.survey.model.QuestionPage;
import org.openuap.cms.survey.model.Survey;
import org.openuap.cms.survey.xml.SurveyXMLService;
import org.openuap.passport.sso.UnauthorizedException;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
/**
* <p>
* Title: SurveyAction
* </p>
*
* <p>
* Description: 调查问卷主控制器.
* </p>
*
* <p>
* Copyright: Copyright (c) 2006
* </p>
*
* <p>
* Company: http://www.openuap.org
* </p>
*
* @author Weiping Ju
* @version 1.0
*/
public class SurveyAction extends UserAwareAction {
//
private SurveyManager surveyManager;
private QuestionManager questionManager;
//
private String defaultViewName;
private String defaultScreensPath;
private String framesetViewName;
private String headerViewName;
private String listViewName;
private String surveyViewName;
private String resultViewName;
private String importViewName;
private SurveyXMLService surveyXMLService;
public void setSurveyXMLService(SurveyXMLService surveyXMLService) {
this.surveyXMLService = surveyXMLService;
}
/**
*
*/
public SurveyAction() {
initDefaultViewName();
}
protected void initDefaultViewName() {
defaultScreensPath = "/plugin/cms/survey/screens/";
defaultViewName = defaultScreensPath + "index.html";
framesetViewName = defaultScreensPath + "survey_frameset.html";
headerViewName = defaultScreensPath + "survey_header.html";
listViewName = defaultScreensPath + "survey_list.html";
surveyViewName = defaultScreensPath + "survey_view.html";
resultViewName = defaultScreensPath + "survey_result.html";
importViewName = defaultScreensPath + "survey_import.html";
}
public ModelAndView perform(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, Map model)
throws Exception {
ModelAndView mv = new ModelAndView(framesetViewName, model);
return mv;
}
public ModelAndView doHeader(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, Map model)
throws Exception {
ModelAndView mv = new ModelAndView(headerViewName, model);
return mv;
}
/**
* 显示调查问卷列表
*
* @param request
* @param response
* @param helper
* @param model
* @return
* @throws Exception
*/
public ModelAndView doList(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, Map model)
throws Exception {
ModelAndView mv = new ModelAndView(listViewName, model);
//
//
//
String column_condition = "";
//
String where = request.getParameter("where");
String page = request.getParameter("page");
String pageNum = request.getParameter("pageNum");
String order = request.getParameter("order");
String order_mode = request.getParameter("order_mode");
String order_name = request.getParameter("order_name");
//
String audit = request.getParameter("audit");
//
String creationDate = request.getParameter("creationDate");
String creationDate2 = request.getParameter("creationDate2");
// get the keyword
String tmp = request.getParameter("keyword");
if (tmp == null) {
tmp = "";
}
//
//
String keyword = tmp;
//
String fields = helper.getString("fields", "");
//
Integer start = new Integer(0);
Integer limit = new Integer(10);
if (where == null) {
where = "";
}
if (order == null) {
order = "";
}
if (order_mode == null) {
order_mode = "";
}
if (order_name == null) {
order_name = "";
}
order_name = order_name.replaceAll("\\^", "");
//
String final_order = "";
if (!order.equals("") && !order_mode.equals("")) {
final_order = order + " " + order_mode;
}
if (pageNum != null) {
limit = new Integer(pageNum);
} else {
pageNum = "10";
}
if (page != null) {
start = new Integer((Integer.parseInt(page) - 1) * limit.intValue());
} else {
page = "1";
}
//
if (fields != null && !fields.equals("")) {
String columns[] = fields.split(",");
if (columns != null) {
for (int i = 0; i < columns.length; i++) {
column_condition += " or e." + columns[i] + " like '%"
+ keyword + "%'";
}
if (!column_condition.equals("")) {
column_condition = column_condition.substring(4);
column_condition = " (" + column_condition + ")";
}
}
}
//
where += column_condition;
// other where condition
// audit
if (audit != null) {
if (!audit.equals("-1")) {
where += " and e.audit=" + audit;
}
} else {
audit = "-1";
}
// creationDate
if (creationDate != null && !creationDate.equals("")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date dd = sdf.parse(creationDate);
where += " and e.surveyCreationDate>=" + dd.getTime() + "";
} else {
creationDate = "";
}
// creationDate2
if (creationDate2 != null && !creationDate2.equals("")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date dd = sdf.parse(creationDate2);
where += " and e.surveyCreationDate<=" + dd.getTime() + "";
} else {
creationDate2 = "";
}
//
where += " and e.deleted=0";
//
PageBuilder pb = new PageBuilder(limit.intValue());
QueryInfo qi = new QueryInfo(where, final_order, limit, start);
//
List surveys = surveyManager.getSurveys(qi, pb);
pb.page(Integer.parseInt(page));
model.put("surveys", surveys);
model.put("pb", pb);
model.put("page", page);
model.put("pageNum", pageNum);
model.put("order", order);
model.put("order_mode", order_mode);
model.put("order_name", order_name);
model.put("where", where);
model.put("action", this);
// add some search parameter
model.put("keyword", keyword);
model.put("audit", audit);
//
model.put("creationDate", creationDate);
model.put("creationDate2", creationDate2);
//
//
return mv;
}
public ModelAndView doAudit(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, Map model)
throws IOException, UnauthorizedException {
boolean success = true;
PrintWriter writer = response.getWriter();
try {
Long id = helper.getLong("id", 0L);
if (id != 0) {
surveyManager.auditSurvey(id);
}
} catch (Exception e) {
success = false;
e.printStackTrace();
}
if (success) {
writer.print("0");
} else {
writer.print("-1");
}
writer.flush();
writer.close();
//
return null;
}
public ModelAndView doUnAudit(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, Map model)
throws IOException, UnauthorizedException {
boolean success = true;
PrintWriter writer = response.getWriter();
try {
Long id = helper.getLong("id", 0L);
if (id != 0) {
surveyManager.unAuditSurvey(id);
}
} catch (Exception e) {
success = false;
e.printStackTrace();
}
if (success) {
writer.print("0");
} else {
writer.print("-1");
}
writer.flush();
writer.close();
//
return null;
}
public ModelAndView doDelete(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, Map model)
throws IOException, UnauthorizedException {
boolean success = true;
PrintWriter writer = response.getWriter();
try {
Long id = helper.getLong("id", 0L);
if (id != 0) {
surveyManager.recycleSurvey(id);
}
} catch (Exception e) {
success = false;
e.printStackTrace();
}
if (success) {
writer.print("0");
} else {
writer.print("-1");
}
writer.flush();
writer.close();
//
return null;
}
public ModelAndView doUnDelete(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, Map model)
throws IOException, UnauthorizedException {
boolean success = true;
PrintWriter writer = response.getWriter();
try {
Long id = helper.getLong("id", 0L);
if (id != 0) {
surveyManager.unRecycleSurvey(id);
}
} catch (Exception e) {
success = false;
e.printStackTrace();
}
if (success) {
writer.print("0");
} else {
writer.print("-1");
}
writer.flush();
writer.close();
//
return null;
}
/**
* 预览调查问卷
*
* @param request
*
* @param response
*
* @param helper
*
* @param model
*
* @return
* @throws
*/
public ModelAndView doPreviewSurvey(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, Map model)
throws Exception {
String pageId = request.getParameter("pageId");
String sid = request.getParameter("sid");
if (sid != null) {
//
Long surveyId = new Long(sid);
List pages = questionManager.getPages(surveyId);
Long pid = null;
if (pageId == null) {
pid = (Long) pages.get(0);
pageId = String.valueOf(pid);
} else {
pid = new Long(pageId);
}
ModelAndView mv = new ModelAndView(surveyViewName, model);
QuestionPage qp = questionManager.getQuestionPage(surveyId, pid);
Survey survey = surveyManager.getSurveyById(surveyId);
model.put("survey", survey);
model.put("questionPage", qp);
model.put("pageId", new Long(pageId));
model.put("pages", pages);
return mv;
}
return null;
}
/**
* 重置调查问卷,把用户投票结果清零
*
* @param request
*
* @param response
*
* @param helper
*
* @param model
* Map
* @return ModelAndView
* @throws Exception
*/
public ModelAndView doResetSurvey(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, Map model)
throws Exception {
String sid = request.getParameter("sid");
String rid = request.getParameter("rid");
if (sid != null) {
Long surveId = new Long(sid);
Long surveyRecordId = new Long(rid);
QueryInfo qi = new QueryInfo();
PageBuilder pb = new PageBuilder();
List questions = questionManager.getQuestionList(surveId, qi, pb);
if (questions != null) {
for (int i = 0; i < questions.size(); i++) {
//
Question q = (Question) questions.get(i);
String hql = "update QuestionItem qi set qi.questionItemPolledTimes=0 where qi.question.questionId="
+ q.getQuestionId();
questionManager.executeHql(hql, null);
}
}
}
return doList(request, response, helper, model);
}
/**
*
* @param request
* @param response
* @param helper
* @param model
* @return
* @throws Exception
*/
public ModelAndView doExportSurvey(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, Map model)
throws Exception {
Long id = helper.getLong("sid", 0L);
if (id != 0) {
try {
Survey survey = surveyManager.getSurveyById(id);
String rs = surveyXMLService.exportSurvey(survey);
response.setCharacterEncoding("UTF-8");
response.setContentType("text/xml");
setNoCacheHeader(response);
PrintWriter writer = response.getWriter();
writer.print(rs);
writer.flush();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
/**
*
* @param request
* @param response
* @param helper
* @param model
* @return
* @throws Exception
*/
public ModelAndView doDownloadSurvey(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, Map model)
throws Exception {
Long id = helper.getLong("sid", 0L);
if (id != 0) {
try {
Survey survey = surveyManager.getSurveyById(id);
//
String attName = new String((survey.getSurveyName() + ".xml")
.getBytes(), "iso8859-1");
response.setContentType("application/x-msdownload");
String header = "attachment; filename=" + attName;
response.setHeader("Content-Disposition", header);
surveyXMLService.saveSurveyXMLFile(survey);
File file = surveyXMLService.getSurveyXMLFile(survey);
InputStream dbInput = new FileInputStream(file);
response.setContentLength(dbInput.available());
ServletOutputStream os = response.getOutputStream();
byte buf[] = new byte[4096];
BufferedInputStream bis = new BufferedInputStream(dbInput);
int j;
while ((j = bis.read(buf, 0, 4096)) != -1) {
os.write(buf, 0, j);
}
bis.close();
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
public ModelAndView doImportSurvey(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, Map model) {
ModelAndView mv = new ModelAndView(importViewName);
return mv;
}
/**
*
* @param request
* @param response
* @param helper
* @param model
* @return
*/
public ModelAndView doUploadFile(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, Map model) {
ModelAndView mv = new ModelAndView(resultViewName);
String op = "import";
model.put("op", op);
try {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
MultipartFile multipartFile = multipartRequest
.getFile("uploadFile");
String contentType = FileUtil.getExtension(multipartFile
.getOriginalFilename());
if (!isValidFileType("xml", contentType)) {
String rs = "failed";
String msgs = "请选择正确的文件类型-(" + getAcceptFileType("xml") + ")";
model.put("rs", rs);
model.put("msgs", msgs);
return mv;
}
// 上传文件
File dir = surveyXMLService.getSurveyUploadDir();
String fileName = multipartFile.getOriginalFilename() + "-"
+ System.currentTimeMillis();
// System.out.println("fileName="+fileName);
File xmlFile = new File(dir, fileName);
multipartFile.transferTo(xmlFile);
//
String validationRs = surveyXMLService.validateSurvey(xmlFile);
if (!validationRs.equals("success")) {
String rs = "failed";
String msgs = "XML校验失败:<br/><textarea name='xml' cols='60' rows=5'>" + validationRs+"</textarea>";
model.put("rs", rs);
model.put("msgs", msgs);
} else {
//
surveyXMLService.importSurvey(xmlFile);
//
String rs = "success";
model.put("rs", rs);
}
return mv;
} catch (Exception e) {
String rs = "failed";
String msgs = "出现意外错误-(" + e.getMessage() + ")";
model.put("rs", rs);
model.put("msgs", msgs);
e.printStackTrace();
}
//
return mv;
}
public void setSurveyManager(SurveyManager surveyManager) {
this.surveyManager = surveyManager;
}
public void setListViewName(String listViewName) {
this.listViewName = listViewName;
}
public void setHeaderViewName(String headerViewName) {
this.headerViewName = headerViewName;
}
public void setFramesetViewName(String framesetViewName) {
this.framesetViewName = framesetViewName;
}
public void setDefaultViewName(String defaultViewName) {
this.defaultViewName = defaultViewName;
}
public void setDefaultScreensPath(String defaultScreensPath) {
this.defaultScreensPath = defaultScreensPath;
}
public void setSurveyViewName(String surveyViewName) {
this.surveyViewName = surveyViewName;
}
public void setQuestionManager(QuestionManager questionManager) {
this.questionManager = questionManager;
}
/**
*
* @param type
* String
* @param contentType
* String
* @return boolean
*/
protected boolean isValidFileType(String type, String contentType) {
//
String acceptTypes = getAcceptFileType(type);
if (acceptTypes != null) {
StringTokenizer tk = new StringTokenizer(acceptTypes, "|");
while (tk.hasMoreTokens()) {
String acType = tk.nextToken();
if (contentType.indexOf(acType) > -1) {
return true;
}
}
return false;
}
return false;
}
protected String getAcceptFileType(String type) {
if (type != null) {
if (type.equals("xml")) {
String acceptTypes = "xml";
return acceptTypes;
}
}
return null;
}
}