/**
* $Id: Dom4jSurveyXMLService.java 4017 2011-03-13 13:55:50Z orangeforjava $
*/
package org.openuap.cms.survey.xml.impl;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import org.apache.commons.io.IOUtils;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.dom4j.util.XMLErrorHandler;
import org.openuap.base.util.QueryInfo;
import org.openuap.base.util.context.PageBuilder;
import org.openuap.cms.CmsPlugin;
import org.openuap.cms.survey.bean.QuestionItemResultBean;
import org.openuap.cms.survey.bean.QuestionResultBean;
import org.openuap.cms.survey.event.SurveyEvent;
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.Question;
import org.openuap.cms.survey.model.QuestionItem;
import org.openuap.cms.survey.model.QuestionItemRecord;
import org.openuap.cms.survey.model.Survey;
import org.openuap.cms.survey.model.SurveyRecord;
import org.openuap.cms.survey.xml.SurveyXMLService;
import org.openuap.cms.user.model.IUser;
import org.openuap.cms.user.security.SecurityUtil;
import org.openuap.runtime.plugin.WebApplicationPlugin;
import org.openuap.runtime.plugin.WebPluginManagerUtils;
import org.openuap.runtime.util.ObjectLocator;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
/**
* @author Joseph
*
*/
public class Dom4jSurveyXMLService implements SurveyXMLService,
ApplicationListener {
public String exportSurvey(Survey survey) {
Document document = DocumentHelper.createDocument();
Element surveyElement = document.addElement("survey");
surveyElement.addAttribute("id", survey.getSurveyId().toString());
Element surveyNameElement = surveyElement.addElement("name");
surveyNameElement.addCDATA(survey.getSurveyName());
//
Element surveyDescElement = surveyElement.addElement("description");
surveyDescElement.addCDATA(survey.getSurveyDescription());
//
Element surveyCreationDateElement = surveyElement
.addElement("creationDate");
String dateFormat = "yyyy-MM-dd'T'HH:mm:ss";
//
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, Locale.US);
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(survey.getSurveyCreationDate());
String creationDate = sdf.format(cal.getTime());
surveyCreationDateElement.addText(creationDate);
//
Element surveyTypeElement = surveyElement.addElement("type");
surveyTypeElement.setText(survey.getSurveyType().toString());
//
Element surveyStatusElement = surveyElement.addElement("status");
surveyStatusElement.setText(survey.getSurveyStatus().toString());
//
Element surveyGuidElement = surveyElement.addElement("guid");
surveyGuidElement.setText(survey.getSurveyGuid());
//
Element creationUserIdElement = surveyElement.addElement("userId");
creationUserIdElement.setText(survey.getCreationUserId().toString());
//
Element creationUserNameElement = surveyElement.addElement("userName");
creationUserNameElement.addCDATA(survey.getCreationUserName());
//
Element questionsElement = surveyElement.addElement("questions");
Set questions = survey.getQuestions();
if (questions != null) {
Iterator itQuestions = survey.getQuestions().iterator();
while (itQuestions.hasNext()) {
Question question = (Question) itQuestions.next();
Element questionElement = questionsElement
.addElement("question");
questionElement.addAttribute("id", question.getQuestionId()
.toString());
questionElement.addElement("title").addCDATA(
question.getQuestionTitle());
questionElement.addElement("guid").setText(
question.getQuestionGuid());
questionElement.addElement("status").setText(
question.getQuestionStatus().toString());
questionElement.addElement("type").setText(
question.getQuestionType().toString());
questionElement.addElement("filter").setText(
question.getQuestionInputFilter().toString());
//
cal.setTimeInMillis(question.getQuestionCreationDate());
questionElement.addElement("creationDate").setText(
sdf.format(cal.getTime()));
//
questionElement.addElement("userId").setText(
question.getCreationUserId().toString());
//
questionElement.addElement("userName").setText(
question.getCreationUserName());
questionElement.addElement("pos").setText(
question.getQuestionPos().toString());
questionElement.addElement("groupId").setText(
question.getGroupId().toString());
questionElement.addElement("groupTitle").addCDATA(
question.getGroupTitle());
questionElement.addElement("pageId").setText(
question.getPageId().toString());
Set items = question.getQuestionItems();
if (items != null) {
Element itemsElement = questionElement.addElement("items");
Iterator itItems = items.iterator();
while (itItems.hasNext()) {
QuestionItem item = (QuestionItem) itItems.next();
Element itemElement = itemsElement.addElement("item");
itemElement.addAttribute("id", item.getQuestionItemId()
.toString());
itemElement.addElement("type").setText(
item.getQuestionItemType().toString());
itemElement.addElement("text").addCDATA(
item.getQuestionItemText());
itemElement.addElement("pos").setText(
item.getQuestionItemSort().toString());
}
}
}
}
//
StringWriter rs = new StringWriter();
try {
/** 格式化输出,类型IE浏览一样 */
OutputFormat format = OutputFormat.createPrettyPrint();
/** 指定XML编码 */
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(rs, format);
writer.write(document);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
return rs.toString();
}
public Survey importSurvey(String xml) {
return null;
}
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof SurveyEvent) {
SurveyEvent surveyEvent = (SurveyEvent) event;
int type = surveyEvent.getEventType();
if (type == SurveyEvent.SUVEY_CREATED
|| type == SurveyEvent.SUVEY_UPDATED) {
Survey survey = surveyEvent.getSurvey();
if (survey != null) {
saveSurveyXMLFile(survey);
}
}
}
}
public File getSurveyXMLFile(Survey survey) {
String homePath = getPluginHomePath();
String fullPath = homePath;
if (fullPath != null) {
fullPath += "/data";
File dir = new File(fullPath);
dir.mkdirs();
String fileName = survey.getSurveyName() + "-"
+ survey.getSurveyId() + ".xml";
File file = new File(dir, fileName);
return file;
}
return null;
}
public void saveSurveyXMLFile(Survey survey) {
String xml = this.exportSurvey(survey);
String homePath = getPluginHomePath();
String fullPath = homePath;
if (fullPath != null) {
fullPath += "/data";
File dir = new File(fullPath);
dir.mkdirs();
String fileName = survey.getSurveyName() + "-"
+ survey.getSurveyId() + ".xml";
File file = new File(dir, fileName);
try {
// 以UTF-8编码写入到文件
IOUtils.write(xml, new FileOutputStream(file), "UTF-8");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private String getPluginHomePath() {
WebApplicationPlugin surveyPlugin = (WebApplicationPlugin) WebPluginManagerUtils
.getPlugin("base", CmsPlugin.PLUGIN_ID);
String homePath = surveyPlugin.getPluginHomePath();
return homePath;
}
public File getSurveyUploadDir() {
String homePath = getPluginHomePath();
String fullPath = homePath;
if (fullPath != null) {
fullPath += "/upload";
File dir = new File(fullPath);
dir.mkdirs();
return dir;
}
return null;
}
public String validateSurvey(File xmlFile) throws Exception {
SAXReader saxReader = new SAXReader();
saxReader.setValidation(true);
saxReader.setFeature("http://xml.org/sax/features/validation", true);
saxReader.setFeature(
"http://apache.org/xml/features/validation/schema", true);
//
saxReader
.setProperty(
"http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation",
"survey.xsd");
XMLErrorHandler errorHandler = new XMLErrorHandler();
saxReader.setErrorHandler(errorHandler);
Document document = saxReader.read(xmlFile);
if (errorHandler.getErrors().hasContent()) {
return errorHandler.getErrors().asXML();
} else {
return "success";
}
}
public Survey importSurvey(File xmlFile) throws Exception {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(xmlFile);
Survey survey = null;
try {
//
String dateFormat = "yyyy-MM-dd'T'HH:mm:ss";
//
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, Locale.US);
//
Element surveyElement = document.getRootElement();
//
survey = new Survey();
//
String surveyId = surveyElement.attributeValue("id");
Element nameElement = surveyElement.element("name");
if (nameElement != null) {
String surveyName = nameElement.getText();
survey.setSurveyName(surveyName);
}
Element descriptionElement = surveyElement.element("description");
if (descriptionElement != null) {
String surveyDescription = descriptionElement.getText();
survey.setSurveyDescription(surveyDescription);
}
Element typeElement = surveyElement.element("type");
String surveyType = typeElement.getText();
survey.setSurveyType(new Integer(surveyType));
//
Element statusElement = surveyElement.element("status");
String surveyStatus = statusElement.getText();
survey.setSurveyStatus(new Integer(surveyStatus));
//
Element guidElement = surveyElement.element("guid");
if (guidElement != null) {
String surveyGuid = guidElement.getText();
survey.setSurveyGuid(surveyGuid);
}
// 获得当前用户对象
IUser user = SecurityUtil.getUser();
// 用户信息可以为空
Element userIdElement = surveyElement.element("userId");
if (userIdElement != null) {
String userId = userIdElement.getText();
survey.setCreationUserId(new Long(userId));
} else {
survey.setCreationUserId(user.getUserId());
}
//
Element userNameElement = surveyElement.element("userName");
if (userNameElement != null) {
String userName = userNameElement.getText();
survey.setCreationUserName(userName);
} else {
survey.setCreationUserName(user.getName());
}
//
Element creationDateElement = surveyElement.element("creationDate");
if (creationDateElement != null) {
String creationDate = creationDateElement.getText();
try {
survey.setSurveyCreationDate(sdf.parse(creationDate)
.getTime());
} catch (ParseException e) {
e.printStackTrace();
}
} else {
survey.setSurveyCreationDate(System.currentTimeMillis());
}
//
survey.setDeleted(0);
Long sid = getSurveyManager().addSurvey(survey);
survey.setSurveyId(sid);
// questions
Element questionsElement = surveyElement.element("questions");
List questionList = new ArrayList();
if (questionsElement != null) {
Iterator questionIterator = questionsElement
.elementIterator("question");
if (questionIterator != null) {
while (questionIterator.hasNext()) {
//
Question question = new Question();
//
Element questionElement = (Element) questionIterator
.next();
Attribute idAttribute = questionElement.attribute("id");
if (idAttribute != null) {
String qid = idAttribute.getStringValue();
}
String qTitle = questionElement.element("title")
.getText();
question.setQuestionTitle(qTitle);
//
Element qGuidElement = questionElement.element("guid");
if (qGuidElement != null) {
String qGuid = qGuidElement.getText();
question.setQuestionGuid(qGuid);
}
Element qStatusElement = questionElement
.element("status");
if (qStatusElement != null) {
String qStatus = qStatusElement.getText();
question.setQuestionStatus(new Integer(qStatus));
}
Element qTypeElement = questionElement.element("type");
if (qTypeElement != null) {
String qType = qTypeElement.getText();
question.setQuestionType(new Integer(qType));
}
Element qFilterElement = questionElement
.element("filter");
if (qFilterElement != null) {
String qFilter = qFilterElement.getText();
question
.setQuestionInputFilter(new Integer(qFilter));
}
Element qCreationDateElement = questionElement
.element("creationDate");
if (qCreationDateElement != null) {
String qCreationDate = qCreationDateElement
.getText();
try {
question.setQuestionCreationDate(sdf.parse(
qCreationDate).getTime());
} catch (ParseException e) {
e.printStackTrace();
}
} else {
question.setQuestionCreationDate(System
.currentTimeMillis());
}
//
Element qUserIdElement = questionElement
.element("userId");
if (qUserIdElement != null) {
String qUserId = qUserIdElement.getText();
question.setCreationUserId(new Long(qUserId));
} else {
question.setCreationUserId(user.getUserId());
}
//
Element qUserNameElement = questionElement
.element("userName");
if (qUserNameElement != null) {
String qUserName = qUserNameElement.getText();
question.setCreationUserName(qUserName);
} else {
question.setCreationUserName(user.getName());
}
//
Element qPosElement = questionElement.element("pos");
if (qPosElement != null) {
String qPos = qPosElement.getText();
question.setQuestionPos(new Long(qPos));
}
Element qGroupIdElement = questionElement
.element("groupId");
if (qGroupIdElement != null) {
String qGroupId = qGroupIdElement.getText();
question.setGroupId(new Long(qGroupId));
}
Element qGroupTitleElement = questionElement
.element("groupTitle");
if (qGroupTitleElement != null) {
String qGroupTitle = qGroupTitleElement.getText();
question.setGroupTitle(qGroupTitle);
}
//
Element qPageIdElement = questionElement
.element("pageId");
if (qPageIdElement != null) {
String qPageId = qPageIdElement.getText();
question.setPageId(new Long(qPageId));
}
//
question.setSurveyId(sid);
Long qid = getQuestionManager().addQuestion(question);
question.setQuestionId(qid);
//
Element qItemsElement = questionElement
.element("items");
Set items = null;
if (qItemsElement != null) {
Iterator itemIterator = qItemsElement
.elementIterator("item");
List itemList = new ArrayList();
if (itemIterator != null) {
while (itemIterator.hasNext()) {
//
//
QuestionItem questionItem = new QuestionItem();
Element itemElement = (Element) itemIterator
.next();
Attribute iIdAttribute = itemElement
.attribute("id");
if (iIdAttribute != null) {
String iId = iIdAttribute.getText();
}
Element iTypeElement = itemElement
.element("type");
if (iTypeElement != null) {
String iType = iTypeElement.getText();
questionItem
.setQuestionItemType(new Integer(
iType));
}
Element iPosElement = itemElement
.element("pos");
if (iPosElement != null) {
String iPos = iPosElement.getText();
questionItem
.setQuestionItemSort(new Integer(
iPos));
}
//
Element iTextElement = itemElement
.element("text");
if (iTextElement != null) {
String iText = iTextElement.getText();
questionItem.setQuestionItemText(iText);
}
questionItem.setQuestionItemPolledTimes(0);
questionItem.setQuestion(question);
getQuestionManager().addQuestionItem(
questionItem);
}
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
throw e;
}
return getSurveyManager().getSurveyById(survey.getSurveyId());
}
public SurveyManager getSurveyManager() {
SurveyManager surveyManager = (SurveyManager) ObjectLocator.lookup(
"surveyManager", CmsPlugin.PLUGIN_ID);
return surveyManager;
}
public QuestionManager getQuestionManager() {
QuestionManager questionManager = (QuestionManager) ObjectLocator
.lookup("questionManager", CmsPlugin.PLUGIN_ID);
return questionManager;
}
public String exportSurveyStatics(Long surveyRecordId, Long surveyId) {
Survey survey = getSurveyManager().getSurveyById(surveyId);
SurveyRecord surveyRecord = getSurveyManager().getSurveyRecordById(
surveyRecordId);
QueryInfo qi = new QueryInfo();
PageBuilder pb = new PageBuilder();
List questions = getQuestionManager().getQuestionList(surveyId, qi, pb);
List<QuestionResultBean> questionResultList = new ArrayList<QuestionResultBean>();
if (questions != null) {
int size = questions.size();
for (int i = 0; i < size; i++) {
Question q = (Question) questions.get(i);
// 获得统计结果
QuestionResultBean qrs = this.getQuestionResult(surveyRecordId,
q);
questionResultList.add(qrs);
}
}
Document document = DocumentHelper.createDocument();
Element staticsElement = document.addElement("statics");
Element titleElement = staticsElement.addElement("title");
if (surveyRecord.getRecordTitle() != null) {
titleElement.addCDATA(surveyRecord.getRecordTitle());
} else {
titleElement.addCDATA(survey.getSurveyName());
}
Element descriptionElement = staticsElement.addElement("description");
if (surveyRecord.getRecordDesc() != null) {
descriptionElement.addCDATA(surveyRecord.getRecordDesc());
} else {
descriptionElement.addCDATA(survey.getSurveyDescription());
}
//
String dateFormat = "EEE, d MMM yyyy HH:mm:ss Z";
//
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, Locale.US);
Calendar cal = Calendar.getInstance();
Element startDateElement = staticsElement.addElement("startDate");
cal.setTimeInMillis(surveyRecord.getStartDate());
String startDate = sdf.format(cal.getTime());
startDateElement.setText(startDate);
Element endDateElement = staticsElement.addElement("endDate");
cal.setTimeInMillis(surveyRecord.getEndDate());
String endDate = sdf.format(cal.getTime());
endDateElement.setText(endDate);
//
Element answersElement = staticsElement.addElement("answers");
for (QuestionResultBean questionResultBean : questionResultList) {
Element answerElement = answersElement.addElement("answer");
Element questionElement = answerElement.addElement("question");
Question question = questionResultBean.getQuestion();
questionElement.addCDATA(question.getQuestionTitle());
Integer type = question.getQuestionType();
questionElement.addAttribute("type", type.toString());
Element totalCountElement = answerElement.addElement("totalCount");
totalCountElement.setText(new Integer(questionResultBean
.getQuestionItemsCount()).toString());
if (type == 3) {
List<Answer> answerList = questionResultBean
.getQuestionAnswers();
Element itemsElement = answerElement.addElement("items");
for (Answer answer : answerList) {
Element itemElement = itemsElement.addElement("item");
Element itemTitleElement = itemElement.addElement("title");
itemTitleElement.addCDATA(question.getQuestionTitle());
Element resultElement = itemElement.addElement("result");
resultElement.addCDATA(answer.getAnswerInputText());
}
} else {
Collection<QuestionItemResultBean> qiResults = questionResultBean
.getQuestionItemResultList();
Element itemsElement = answerElement.addElement("items");
for (QuestionItemResultBean qiResult : qiResults) {
Element itemElement = itemsElement.addElement("item");
Element itemTitleElement = itemElement.addElement("title");
itemTitleElement.addCDATA(qiResult.getQuestionItemText());
Element resultElement = itemElement.addElement("result");
resultElement
.setText(new Integer(qiResult.getPolledTimes())
.toString());
}
}
}
StringWriter rs = new StringWriter();
try {
/** 格式化输出,类型IE浏览一样 */
OutputFormat format = OutputFormat.createPrettyPrint();
/** 指定XML编码 */
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(rs, format);
writer.write(document);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
return rs.toString();
}
/**
* 从问题中获得结果
*
* @param q
* @return
*/
private QuestionResultBean getQuestionResult(Long rid, Question q) {
QuestionResultBean questionResultBean = new QuestionResultBean();
//
questionResultBean.setQuestion(q);
int type = q.getQuestionType();
Set items = q.getQuestionItems();
int questionItemsTotalCount = 0;
List rs = new ArrayList();
if (type == 3) {
questionItemsTotalCount = getSurveyManager()
.getQuestionAnswerTotalCount(rid, q.getQuestionId());
QueryInfo qi = new QueryInfo();
PageBuilder pb = new PageBuilder();
List answers = getQuestionManager().getAnswerByQuestion(
q.getQuestionId(), rid, qi, pb);
questionResultBean.setQuestionAnswers(answers);
} else {
if (items != null) {
questionItemsTotalCount = getSurveyManager()
.getQuestionItemsTotalCount(rid, q.getQuestionId());
Iterator itemIterator = items.iterator();
while (itemIterator.hasNext()) {
QuestionItem qi = (QuestionItem) itemIterator.next();
QuestionItemResultBean qiResult = new QuestionItemResultBean();
qiResult.setQuestionItemText(qi.getQuestionItemText());
QuestionItemRecord qiRecord = getSurveyManager()
.getQuestionItemRecord(rid, qi.getQuestionItemId());
float votePercent = (float) Math
.round(((float) qiRecord
.getQuestionItemPolledTimes().intValue() / (float) questionItemsTotalCount) * 100F * 100F) / 100F;
qiResult.setQuestionPercent(votePercent);
qiResult.setPolledTimes(qiRecord
.getQuestionItemPolledTimes().intValue());
rs.add(qiResult);
}
}
}
questionResultBean.setQuestionItemResultList(rs);
questionResultBean.setQuestionItemsCount(questionItemsTotalCount);
return questionResultBean;
}
}