/*
* Copyright 2002-2006 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openuap.cms.survey.action.poll;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.openuap.base.util.ControllerHelper;
import org.openuap.cms.CmsPlugin;
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.Answer;
import org.openuap.cms.survey.model.AnswerItem;
import org.openuap.cms.survey.model.SurveyAnswer;
import org.openuap.cms.survey.model.Voter;
import org.openuap.cms.user.model.IUser;
import org.openuap.runtime.util.ObjectLocator;
import org.springframework.web.servlet.ModelAndView;
/**
* 单页面调查控制器
*
* <p>
* $Id: SimpleOnePagePollAction.java 4026 2011-03-22 14:58:42Z orangeforjava $
* </p>
*
* @author Joseph
* @ersion4.0
*/
public class SimpleOnePagePollAction extends UserAwareAction {
public static final String SESSION_VOTER = "uap.voter";
public static final String SURVEY_ANSWER = "surveyAnswer";
public static final String QUESTION_IDS = "questionIds";
public static final String SURVEY_ID = "sid";
protected QuestionManager questionManager;
protected SurveyManager surveyManager;
protected String resultViewName;
protected String defaultScreensPath;
public SimpleOnePagePollAction() {
initDefaultProperty();
}
protected void initDefaultProperty() {
defaultScreensPath = "/plugin/cms/survey/screens/poll/";
resultViewName = defaultScreensPath + "poll_result.html";
}
@Override
public ModelAndView perform(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, Map model)
throws Exception {
//
ModelAndView mv = new ModelAndView(resultViewName, model);
HttpSession session = request.getSession(true);
//更新答案
upateAnswer(request, session);
Object obj = session.getAttribute(SURVEY_ANSWER);
String surveyId = request.getParameter("sid");
String recordId = request.getParameter("rid");
//
Voter voter = this.getVoter(request);
SurveyAnswer surveyAnswer = (SurveyAnswer) obj;
surveyAnswer.setVoter(voter);
//
Long voterId = null;
if (obj != null && surveyId != null) {
try {
Long sid = new Long(surveyId);
Long rid = new Long(recordId);
voter.setVoterPollDate(new Long(System.currentTimeMillis()));
voterId = this.getQuestionManager().addVoter(voter);
// 保存答案
Map questionAnswers = surveyAnswer.getQuestionAnswers();
Set qkey = questionAnswers.keySet();
Iterator qiterator = qkey.iterator();
while (qiterator.hasNext()) {
Long questionId = (Long) qiterator.next();
Answer voterAnswer = (Answer) questionAnswers
.get(questionId);
voterAnswer.setSurveyId(sid);
voterAnswer.setVoterId(voterId);
voterAnswer.setSurveyRecordId(rid);
this.getQuestionManager().addAnswer(voterAnswer);
// 更新选项选择次数
String answer = voterAnswer.getAnswer();
if (answer != null && !answer.equals("")) {
//
this.getSurveyManager()
.updateQuestionItems(rid, answer);
}
}
// 保存答案选项值
Map questionAnswerItems = surveyAnswer.getQuestionItemAnswers();
Set qikey = questionAnswerItems.keySet();
Iterator qiIterator = qikey.iterator();
while (qiIterator.hasNext()) {
Long itemId = (Long) qiIterator.next();
AnswerItem voterAnswerItem = (AnswerItem) questionAnswerItems
.get(itemId);
voterAnswerItem.setSurveyId(sid);
voterAnswerItem.setVoterId(voterId);
voterAnswerItem.setSurveyRecordId(rid);
this.getQuestionManager().addAnswerItem(voterAnswerItem);
}
// 更新投票者状态
session.setAttribute(SESSION_VOTER, voter);
session.removeAttribute(SURVEY_ANSWER);
model.put("rs", "success");
model.put("sid", surveyId);
model.put("rid", recordId);
} catch (Exception e) {
e.printStackTrace();
model.put("rs", "failed");
model.put("msgs", e);
session.removeAttribute(SURVEY_ANSWER);
if (voterId != null) {
this.getQuestionManager().deleteAnswerByVoter(voterId);
this.getQuestionManager().deleteAnswerItemByVoter(voterId);
//
voter.setVoterId(voterId);
this.getQuestionManager().deleteVoter(voter);
}
}
}
model.put("sid", surveyId);
return mv;
}
/**
* 更新答案
* @param request
* @param session
* @return
*/
protected String upateAnswer(HttpServletRequest request, HttpSession session) {
String questionIds = request.getParameter(QUESTION_IDS);
String surveyId = request.getParameter(SURVEY_ID);
String surveyRecordId = request.getParameter("rid");
if (surveyId == null) {
surveyId = "-1";
}
if (questionIds != null) {
//通过Session来保存由于换页导致的调查结果持久问题
SurveyAnswer surveyAnswer = null;
Object obj = session.getAttribute(SURVEY_ANSWER);
if (obj != null) {
surveyAnswer = (SurveyAnswer) obj;
}
if (surveyAnswer == null) {
surveyAnswer = new SurveyAnswer();
}
// 获得题号
String[] questionIdArray = questionIds.split(",");
for (int i = 0; i < questionIdArray.length; i++) {
String questionId = questionIdArray[i];
//获得题目附加输入
String question_input = request.getParameter(questionId
+ "_q_input");
//获得题目中选项ID数组
String[] itemIds = request.getParameterValues(questionId);
String items = "";
if (itemIds != null) {
for (int j = 0; j < itemIds.length; j++) {
String itemId = itemIds[j];
if (!itemId.equals("")) {
//检查每个选项的输入
String item_input = request.getParameter(itemId
+ "_i_input");
Long litemId = new Long(itemId);
AnswerItem vai = new AnswerItem();
vai.setQuestionId(new Long(questionId));
vai.setQuestionItemId(litemId);
vai.setSurveyId(new Long(surveyId));
vai.setSurveyRecordId(new Long(surveyRecordId));
if (item_input != null) {
//
vai.setAnswerItemInputText(item_input);
surveyAnswer.getQuestionItemAnswers().put(
litemId, vai);
}
//
items += itemId + ",";
}
}
if (!items.equals("")) {
items = items.substring(0, items.length() - 1);
}
}
//
//题目答案
Answer va = new Answer();
va.setAnswer(items);
va.setAnswerInputText(question_input);
va.setQuestionId(new Long(questionId));
va.setSurveyId(new Long(surveyId));
va.setSurveyRecordId(new Long(surveyRecordId));
//
surveyAnswer.getQuestionAnswers().put(new Long(questionId), va);
}
//更新Session内答案对象
session.setAttribute(SURVEY_ANSWER, surveyAnswer);
}
return "";
}
/**
* 从请求中获取用户信息
* @param request
* @return
*/
protected Voter getVoter(HttpServletRequest request) {
String sid = request.getParameter("sid");
String rid = request.getParameter("rid");
Voter voter = new Voter();
IUser user = getUser();
// System.out.println("member="+member);
if (user != null&&isLogin()) {
voter.setVoterCompany("");
voter.setVoterContact(user.getTitle());
voter.setVoterDepartment("");
voter.setVoterEmail(user.getEmail());
voter.setVoterFax("");
voter.setVoterMobile("");
voter.setVoterName(user.getName());
voter.setVoterTel("");
voter.setVoterUserId(new Long(user.getUserId().intValue()));
} else {
voter.setVoterName("匿名");
voter.setVoterUserId(new Long(0));
}
voter.setSurveyRecordId(new Long(rid));
voter.setVoterIpaddress(request.getRemoteAddr());
if (sid != null) {
voter.setVoterSurveyId(new Long(sid));
}
return voter;
}
public QuestionManager getQuestionManager() {
if (questionManager == null) {
questionManager = (QuestionManager) ObjectLocator.lookup(
"questionManager", CmsPlugin.PLUGIN_ID);
//
}
return questionManager;
}
public SurveyManager getSurveyManager() {
if (surveyManager == null) {
surveyManager = (SurveyManager) ObjectLocator.lookup(
"surveyManager", CmsPlugin.PLUGIN_ID);
//
}
return surveyManager;
}
public void setQuestionManager(QuestionManager questionManager) {
this.questionManager = questionManager;
}
public void setSurveyManager(SurveyManager surveyManager) {
this.surveyManager = surveyManager;
}
public void setResultViewName(String resultViewName) {
this.resultViewName = resultViewName;
}
public void setDefaultScreensPath(String defaultScreensPath) {
this.defaultScreensPath = defaultScreensPath;
}
}