package org.egonet.io; import java.io.File; import java.io.IOException; import java.util.Calendar; import java.util.Date; import java.util.Iterator; import javax.swing.JOptionPane; import org.egonet.exceptions.EgonetException; import org.egonet.model.QuestionList; import org.egonet.model.Shared; import org.egonet.model.Study; import org.egonet.model.question.Question; import org.egonet.model.question.Selection; import org.egonet.model.question.StudyQuestion; import org.egonet.util.DateUtils; import electric.xml.Document; import electric.xml.Element; import electric.xml.ParseException; public class StudyWriter { private File studyFile; public StudyWriter(File studyFile) { this.studyFile = studyFile; } public void setStudy(Study study) throws IOException { Document document = new Document(); document.setEncoding("UTF-8"); document.setVersion("1.0"); Element studyElement = document.setRoot("Package"); studyElement.setAttribute("Id", ""+study.getStudyId()); studyElement.setAttribute("InUse", study.isInUse() ? "Y" : "N"); studyElement.setAttribute("Creator", org.egonet.model.Shared.version); studyElement.setAttribute("Updated", DateUtils.getDateString(Calendar.getInstance().getTime(), "dd/MM/yyyy hh:mm a")); writeStudyData(studyElement, study); writeAllQuestionData(studyElement, study.getQuestions()); document.write(studyFile); } public void setStudyInUse(boolean inUse) throws IOException, EgonetException { Document packageDocument; try { packageDocument = new Document(studyFile); } catch (ParseException e) { throw new EgonetException(e); } Element root = packageDocument.getRoot(); root.setAttribute("InUse", "Y"); packageDocument.write(studyFile); //studyFile.setReadOnly(); } private void writeAllQuestionData(Element document, QuestionList questionList) throws IOException { Element element = document.addElement("QuestionList"); for(Question q : questionList.values()) { writeQuestion(element.addElement("Question"), q); } } public void writeAllQuestionData(QuestionList questionList) throws IOException { Document document = new Document(); //document.addChild( new XMLDecl( "1.0", "UTF-8" ) ); document.setEncoding("UTF-8"); document.setVersion("1.0"); Element study = document.setRoot("QuestionFile"); study.setAttribute("Id", Long.toString(new Date().getTime())); writeAllQuestionData(study, questionList); document.write(studyFile); } private void writeStudyData(Element document, Study studyObject) { try { Element study = document.addElement("Study"); study.addElement("name").setText(studyObject.getStudyName()); study.addElement("altermodeunlimited").setBoolean(studyObject.isUnlimitedAlterMode()); study.addElement("minalters").setInt(studyObject.getMinimumNumberOfAlters()); //Only adds max alters if study is in limited mode. if(!studyObject.isUnlimitedAlterMode()) { study.addElement("maxalters").setInt(studyObject.getMaximumNumberOfAlters()); } study.addElement("altersamplingmodel").setInt(studyObject.getAlterSamplingModel().ordinal()); study.addElement("altersamplingparameter").setInt(studyObject.getAlterSamplingParameter() == null ? 0 : studyObject.getAlterSamplingParameter()); study.addElement("alternamemodel").setInt(studyObject.getAlterNameModel().ordinal()); study.addElement("allowskipquestions").setBoolean(studyObject.getAllowSkipQuestions()); for (Class<? extends Question> type : Shared.questionClasses) { if(type.equals(StudyQuestion.class)) continue; Element qorder = new Element("questionorder"); Iterator<Long> it = studyObject.getQuestionOrder(type).iterator(); if (it.hasNext()) { study.addElement(qorder).setAttribute("questiontype", type.getSimpleName()); while (it.hasNext()) { qorder.addElement("id").setLong(((Long) it.next()).longValue()); } } } } catch (Exception ex) { JOptionPane.showMessageDialog( null, "Unable to write to this study file", "Study Writing Error", JOptionPane.ERROR_MESSAGE); } } public void writeQuestion(Element e, Question q) { e.addComment(q.getString()); if (q.centralMarker) { e.setAttribute("CentralityMarker", "true"); } e.addElement("Id").setLong(q.UniqueId.longValue()); e.addElement("QuestionType").setString(q.getClass().getCanonicalName()); e.addElement("AnswerType").setString(q.answerType.getCanonicalName()); e.addElement("FollowUpOnly").setBoolean(q.followupOnly); if ((q.title != null) && (!q.title.equals(""))) { e.addElement("QuestionTitle").setText(q.title); } if ((q.text != null) && (!q.text.equals(""))) { e.addElement("QuestionText").setText(q.text); } if ((q.citation != null) && (!q.citation.equals(""))) { e.addElement("Citation").setText(q.citation); } if (q.getSelections().size() > 0) { int size = q.getSelections().size(); Element selections = e.addElement("Answers"); for (int i = 0; i < size; i++) { Element answer = selections.addElement("AnswerText"); Selection ptr = q.getSelections().get(i); answer.setText(ptr.getString()); answer.setAttribute("index", Integer.toString(i)); answer.setAttribute("value", Integer.toString(ptr.getValue())); answer.setAttribute("adjacent", ptr.isAdjacent() ? "true" : "false"); } } if (q.link.isActive()) { Element link = e.addElement("Link"); link.addElement("Id").setLong(q.link.getAnswer().getQuestionId()); link.addElement("value").setInt(q.link.getAnswer().getValue()); link.addElement("string").setText(q.link.getAnswer().string); } } }