345 lines
12 KiB
Java
Executable File
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;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|