libreccm-legacy/ccm-simplesurvey/src/com/arsdigita/simplesurvey/ui/admin/AdminPanel.java

345 lines
12 KiB
Java
Executable File

/*
* Copyright (C) 2002-2004 Red Hat Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.simplesurvey.ui.admin;
import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.Form;
import com.arsdigita.bebop.FormData;
import com.arsdigita.bebop.form.Submit;
import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.ActionEvent;
import com.arsdigita.bebop.event.ActionListener;
import com.arsdigita.bebop.event.FormInitListener;
import com.arsdigita.bebop.parameters.ParameterData;
import com.arsdigita.persistence.DataQuery;
import com.arsdigita.persistence.DataOperation;
import com.arsdigita.persistence.SessionManager;
import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.formbuilder.PersistentDate;
import com.arsdigita.formbuilder.PersistentLabel;
import com.arsdigita.formbuilder.PersistentWidget;
import com.arsdigita.formbuilder.ui.ControlEditor;
import com.arsdigita.formbuilder.util.FormBuilderUtil;
import com.arsdigita.formbuilder.PersistentLabel;
import com.arsdigita.formbuilder.PersistentWidget;
import com.arsdigita.simplesurvey.Survey;
import com.arsdigita.simplesurvey.ui.SurveyForm;
import com.arsdigita.simplesurvey.ui.SurveySelectionModel;
import com.arsdigita.simplesurvey.ui.SurveyProcessListener;
import com.arsdigita.simplesurvey.ui.Question;
//import com.arsdigita.simplesurvey.ui.admin.AnswerValuesForm;
import java.util.Iterator;
import java.math.BigDecimal;
import java.math.BigInteger;
import com.arsdigita.persistence.OID;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.ParseException;
public class AdminPanel extends SimpleContainer {
public final static String MODE_VIEW = "view";
public final static String MODE_RESPONSES = "responses";
public final static String MODE_PROPERTIES = "properties";
public final static String MODE_WIDGETS = "widgets";
public final static String MODE_CORRECT_ANSWERS = "correctAnswers";
public final static String MODE_ANSWER_VALUES = "answerValues";
private static org.apache.log4j.Logger s_log =
org.apache.log4j.Logger.getLogger(AdminPanel.class.getName());
private SurveySelectionModel m_survey;
private SurveyForm m_view;
private ControlEditor m_controls;
private PropertiesForm m_props;
private ReportPanel m_reports;
private SurveyForm m_correctAnswerView;
private AnswerValuesPanel m_answerValuesPanel;
private FormSelectionModel m_form;
public AdminPanel(SurveySelectionModel survey,
Class type) {
m_survey = survey;
m_form = new FormSelectionModel(m_survey);
m_view = new SurveyForm(m_survey, null);
// The admin is just viewing the form, so hitting submit shouldn't actually
// do anything
m_view.addProcessListener(new FormProcessListener() {
public void process(FormSectionEvent e)
throws FormProcessException {
fireCompletionEvent(e.getPageState());
}
});
//Correct Answers lets admin fill in the correct answers to questions
m_correctAnswerView = new SurveyForm(m_survey, null);
// Add an init listener to fill in the existing correct answers
m_correctAnswerView.addInitListener(new CorrectAnswersInitListener());
// Add a process listener that saves the answers to the form
// as the correct answers
m_correctAnswerView.addProcessListener(new CorrectAnswersProcessListener());
//AnswerValues lets admin assign point values per multiple choice answer
m_answerValuesPanel = new AnswerValuesPanel(m_survey);
m_controls = new ControlEditor(type.equals(Survey.class) ? "Survey" : "Poll",
m_form);
Form form = new Form("controlComplete");
form.add(new Submit("Done editing"));
form.addProcessListener(new FormProcessListener() {
public void process(FormSectionEvent e)
throws FormProcessException {
fireCompletionEvent(e.getPageState());
}
});
m_controls.add(form);
m_reports = new ReportPanel(m_survey);
m_reports.addCompletionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
fireCompletionEvent(e.getPageState());
}
});
m_props = new PropertiesForm(m_survey,
type);
m_props.addProcessListener(new FormProcessListener() {
public void process(FormSectionEvent e)
throws FormProcessException {
fireCompletionEvent(e.getPageState());
}
});
add(m_view);
add(m_correctAnswerView);
add(m_answerValuesPanel);
add(m_controls);
add(m_props);
add(m_reports);
}
public void setDisplayMode(PageState state,
String mode) {
if (MODE_VIEW.equals(mode)) {
m_view.setVisible(state, true);
m_correctAnswerView.setVisible(state,false);
m_controls.setVisible(state, false);
m_props.setVisible(state, false);
m_reports.setVisible(state, false);
m_answerValuesPanel.setVisible(state,false);
} else if (MODE_RESPONSES.equals(mode)) {
m_view.setVisible(state, false);
m_correctAnswerView.setVisible(state,false);
m_controls.setVisible(state, false);
m_props.setVisible(state, false);
m_reports.setVisible(state, true);
m_answerValuesPanel.setVisible(state,false);
} else if (MODE_CORRECT_ANSWERS.equals(mode)) {
m_view.setVisible(state, false);
m_correctAnswerView.setVisible(state,true);
m_controls.setVisible(state, false);
m_props.setVisible(state, false);
m_reports.setVisible(state, false);
m_answerValuesPanel.setVisible(state,false);
} else if (MODE_PROPERTIES.equals(mode)) {
m_view.setVisible(state, false);
m_correctAnswerView.setVisible(state,false);
m_controls.setVisible(state, false);
m_props.setVisible(state, true);
m_reports.setVisible(state, false);
m_answerValuesPanel.setVisible(state,false);
} else if (MODE_WIDGETS.equals(mode)) {
m_view.setVisible(state, false);
m_correctAnswerView.setVisible(state,false);
m_controls.setVisible(state, true);
m_props.setVisible(state, false);
m_reports.setVisible(state, false);
m_answerValuesPanel.setVisible(state,false);
} else if (MODE_ANSWER_VALUES.equals(mode)) {
m_view.setVisible(state, false);
m_correctAnswerView.setVisible(state,false);
m_controls.setVisible(state, false);
m_props.setVisible(state, false);
m_reports.setVisible(state, false);
m_answerValuesPanel.setVisible(state,true);
}
}
private class CorrectAnswersInitListener implements FormInitListener {
// Fills in existing correct answers into the SurveyForm for the admin to edit
private static final String ANSWER_VALUE = "answerValue";
private static final String WIDGET_ID = "widgetID";
private static final String PARAMETER_NAME = "parameterName";
private static final String PARAMETER_MODEL = "parameterModel";
private static final String DOMAIN_CLASS = "domainClass";
private CorrectAnswersInitListener() {
}
public void init(FormSectionEvent e) throws FormProcessException {
PageState ps = e.getPageState();
FormData fd = e.getFormData();
// Get the surveyID of this survey
BigDecimal surveyID = (BigDecimal) m_survey.getSelectedSurvey(ps).getID();
DataQuery dq = SessionManager.getSession().retrieveQuery("com.arsdigita.simplesurvey.getCorrectAnswers");
dq.setParameter("surveyID", surveyID);
String answerValue = null;
String parameterName = null;
String parameterModel = null;
String domainClass = null;
BigInteger widgetID = null;
PersistentWidget pw = null;
while ( dq.next() ) {
// Get the value of the correct answer and the label (i.e. component) belonging to it
answerValue = (String) dq.get(ANSWER_VALUE);
widgetID = (BigInteger) dq.get(WIDGET_ID);
parameterName = (String) dq.get(PARAMETER_NAME);
parameterModel = (String) dq.get(PARAMETER_MODEL);
domainClass = (String) dq.get(DOMAIN_CLASS);
if ( domainClass.equals("com.arsdigita.formbuilder.PersistentDate") ) {
PersistentDate pd;
try {
pd = (PersistentDate) DomainObjectFactory.newInstance( new OID("com.arsdigita.formbuilder.Widget",widgetID.intValue()));
} catch (DataObjectNotFoundException ex) {
//s_log.warn("Can't create this object" + widgetID);
}
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd hh:mm:ss zzz yyyy");
try {
Date d = sdf.parse(answerValue);
fd.put(parameterName, d);
} catch ( ParseException ex ) {
//s_log.warn("Can't parse this date");
}
} else {
fd.put(parameterName, answerValue);
}
}
dq.close();
}
}
private class CorrectAnswersProcessListener extends SurveyProcessListener {
//Stores answers as THE correct answers for this particular survey/quiz
private CorrectAnswersProcessListener() {
super();
}
public void process(FormSectionEvent event) {
//s_log.debug("executing process listener");
FormData formData = event.getFormData();
PageState pageState = event.getPageState();
BigDecimal surveyID = (BigDecimal)formData.get(SURVEY_ID_NAME);
Survey survey = (Survey)FormBuilderUtil.instantiateObjectOneArg(Survey.class.getName(), surveyID);
m_persistentForm.set(pageState, survey.getForm());
//Iterate over the widget parameters and insert the answers to the survey response
Iterator parameterIter = formData.getParameters().iterator();
while (parameterIter.hasNext()) {
ParameterData parameterData = (ParameterData)parameterIter.next();
String parameterName = (String)parameterData.getName();
Object parameterValue = parameterData.getValue();
if (parameterValue instanceof java.lang.String[]) {
// This is a multi-answer question - iterate over the
// answer values and add them one by one
String[] valueArray = (String[])parameterValue;
for (int i = 0; i < valueArray.length; ++i) {
addCorrectAnswer(pageState, valueArray[i], parameterName);
}
} else {
// Single answer question
addCorrectAnswer(pageState, parameterValue, parameterName);
}
}
fireCompletionEvent(event.getPageState());
}
private void addCorrectAnswer(PageState ps, Object parameterValue, String parameterName) {
// Saves the answer to the database if it's not already there, otherwise, updates the database
Question question = getQuestion(ps, parameterName);
if (question != null && parameterValue != null && parameterValue != "" ) {
PersistentLabel persistentLabel = question.getLabel();
PersistentWidget persistentWidget = question.getWidget();
BigDecimal labelID = persistentLabel.getID();
BigDecimal widgetID = persistentWidget.getID();
DataOperation dao;
if ( correctAnswerExists(labelID, widgetID) ) {
dao = SessionManager.getSession().retrieveDataOperation("com.arsdigita.simplesurvey.updateCorrectAnswer");
} else {
dao = SessionManager.getSession().retrieveDataOperation("com.arsdigita.simplesurvey.insertCorrectAnswer");
}
dao.setParameter("labelID", labelID);
dao.setParameter("widgetID", widgetID);
dao.setParameter("value", parameterValue.toString());
dao.execute();
}
}
private boolean correctAnswerExists ( BigDecimal labelID, BigDecimal widgetID ) {
DataQuery dq = SessionManager.getSession().retrieveQuery("com.arsdigita.simplesurvey.correctAnswerExists");
dq.setParameter("labelID", labelID);
dq.setParameter("widgetID", widgetID);
if ( dq.next() ) {
dq.close();
return true;
} else {
dq.close();
return false;
}
}
}
}