/* * Created on 8/Apr/2004 */ package net.sourceforge.fenixedu.util.tests; import java.util.ArrayList; import java.util.List; import net.sourceforge.fenixedu.util.FenixUtil; /** * @author Susana Fernandes */ public class XMLQuestion extends FenixUtil { private static final String openTag = "<"; private static final String openEndTag = "\n"; private static final String presentation = "presentation"; private static final String resprocessing = "resprocessing"; private static final String flow = "flow"; private static final String material = "material"; private static final String mattext = "mattext"; // //////////////////////// private static final String start = "\n\n\n\n"; private static final String end = "\n"; // //////////////////////// private List allOptions = new ArrayList(); public XMLQuestion() { } public String getXmlQuestion(String questionText, String secondQuestionText, QuestionType questionType, String[] options, String[] shuffle, List responseProcessingInstructionsList, String correctFeedbackText, String wrongFeedbackText, Boolean breakLineBeforeResponseBox, Boolean breakLineAfterResponseBox) { if (breakLineBeforeResponseBox == null) breakLineBeforeResponseBox = Boolean.valueOf(false); if (breakLineAfterResponseBox == null) breakLineAfterResponseBox = Boolean.valueOf(false); String result = start + getPresentation(questionText, secondQuestionText, breakLineBeforeResponseBox, breakLineAfterResponseBox, questionType, options, shuffle); result = result.concat(getResponseProcessingInstructions(responseProcessingInstructionsList, correctFeedbackText, wrongFeedbackText, questionType)); return result + end; } private String getPresentation(String questionText, String secondQuestionText, Boolean breakLineBeforeResponseBox, Boolean breakLineAfterResponseBox, QuestionType questionType, String[] options, String[] shuffle) { String result = new String(getStartElementTag(presentation) + getStartElementTag(flow)); result = result.concat(getTextArea(questionText)); if (breakLineBeforeResponseBox.booleanValue()) result = result.concat(getStartElementTag(flow)); result = result.concat(getResponseLabels(questionType, options, shuffle)); if (breakLineAfterResponseBox.booleanValue()) { if (breakLineBeforeResponseBox.booleanValue()) result = result.concat(getEndElementTag(flow)); result = result.concat(getStartElementTag(flow)); } if (secondQuestionText != null && !secondQuestionText.equals("")) result = result.concat(getTextArea(secondQuestionText)); if (breakLineAfterResponseBox.booleanValue() || breakLineBeforeResponseBox.booleanValue()) result = result.concat(getEndElementTag(flow)); result = result.concat(getEndElementTag(flow) + getEndElementTag(presentation)); return result; } private String getResponseLabels(QuestionType questionType, String[] options, String[] shuffle) { String result = new String(); if (questionType.getType().intValue() == QuestionType.LID) { for (int i = 0; i < options.length; i++) { allOptions.add(Integer.valueOf(i + 1).toString()); result = result.concat(getResponseLabelLID(options[i], i + 1, contains(shuffle, Integer.valueOf(i + 1).toString()))); } } else result = result.concat(getResponseLabel()); result = questionType.toXML(result, 1); return result; } private String getResponseLabel() { return "\n\n"; } private String getResponseLabelLID(String text, int ident, boolean shuffle) { String result = ""; String[] texts = text.split("\n"); for (int i = 0; i < texts.length; i++) if (!texts[i].equals("\r")) result = result.concat(getMattextElement(texts[i])); return result.concat("\n"); } private String getResponseProcessingInstructions(List rpList, String correctFeedbackText, String wrongFeedbackText, QuestionType questionType) { if (rpList == null || rpList.size() == 0) return ""; String result = new String(getStartElementTag(resprocessing) + "\n\n\n"); String displayfeedbackCorrect = ""; String displayfeedbackIncorrect = ""; String feedback = ""; if (correctFeedbackText != null && !correctFeedbackText.equals("")) { displayfeedbackCorrect = "\n"; feedback = feedback.concat("\n" + getMattextElement(correctFeedbackText) + getEndElementTag("itemfeedback")); } if (wrongFeedbackText != null && !wrongFeedbackText.equals("")) { if (questionType.getType().intValue() == QuestionType.LID) rpList.addAll(getIncorrectResponseProcessingLID(rpList, questionType.getCardinalityType().getType().intValue())); else rpList.add(getIncorrectResponseProcessing(rpList)); displayfeedbackIncorrect = "\n"; feedback = feedback.concat(new String("\n" + getMattextElement(wrongFeedbackText) + getEndElementTag("itemfeedback"))); } for (int i = 0; i < rpList.size(); i++) { ResponseProcessing responseProcessing = (ResponseProcessing) rpList.get(i); if (responseProcessing.isFenixCorrectResponse()) result = result.concat(responseProcessing.toXML(displayfeedbackCorrect)); else result = result.concat(responseProcessing.toXML(displayfeedbackIncorrect)); } result = result.concat(getEndElementTag(resprocessing) + feedback); return result; } // ResponseProcessingList private List getIncorrectResponseProcessingLID(List rpList, int cardinality) { List newRpList = new ArrayList(); for (int i = 0; i < rpList.size(); i++) { ResponseProcessing responseProcessing = (ResponseProcessing) rpList.get(i); if (responseProcessing.isFenixCorrectResponse()) { ResponseProcessing newResponseProcessing = new ResponseProcessing(new ArrayList(), Double.valueOf(0), Integer .valueOf(ResponseProcessing.SET), null, false); if (cardinality == CardinalityType.MULTIPLE) newRpList = getAllMultipleIncorrectResponseProcessingList(newResponseProcessing, responseProcessing .getResponseConditions()); else { newResponseProcessing.setResponseConditions(responseProcessing.getResponseConditions()); newRpList = getAllSingleIncorrectResponseProcessingList(newResponseProcessing); } } } return newRpList; } private List getAllSingleIncorrectResponseProcessingList(ResponseProcessing rp) { List all = new ArrayList(); for (int i = 0; i < allOptions.size(); i++) { String thisResponse = (String) allOptions.get(i); ResponseProcessing newRp = new ResponseProcessing(new ArrayList(), rp.getResponseValue(), rp.getAction(), null, false); if (!(thisResponse.equals(((ResponseCondition) rp.getResponseConditions().get(0)).getResponse()))) { newRp.getResponseConditions() .add(new ResponseCondition(ResponseCondition.VAREQUAL_XML_STRING, thisResponse, "1")); all.add(newRp); } } return all; } private List getAllMultipleIncorrectResponseProcessingList(ResponseProcessing rp, List correctResponseCondition) { List all = new ArrayList(); all.add(rp); for (int i = 0; i < allOptions.size(); i++) { all = addNextIncorrectResponse(all, (String) allOptions.get(i), "1"); } // remove correct condition for (int i = 0; i < all.size(); i++) { ResponseProcessing rpAux = (ResponseProcessing) all.get(i); if (rpAux.hasEqualVAREQUALConditionList(correctResponseCondition)) all.remove(i); } return all; } private List addNextIncorrectResponse(List rpList, String value, String ident) { List newRpList = new ArrayList(); for (int i = 0; i < rpList.size(); i++) { ResponseProcessing rp2Copy = (ResponseProcessing) rpList.get(i); ResponseProcessing rp = new ResponseProcessing(new ArrayList(), rp2Copy.getResponseValue(), rp2Copy.getAction(), null, false); ResponseProcessing rpNot = new ResponseProcessing(new ArrayList(), rp2Copy.getResponseValue(), rp2Copy.getAction(), null, false); for (int j = 0; j < rp2Copy.getResponseConditions().size(); j++) { ResponseCondition rc = (ResponseCondition) rp2Copy.getResponseConditions().get(j); rp.getResponseConditions().add(rc); rpNot.getResponseConditions().add(rc); } rp.getResponseConditions().add(new ResponseCondition(ResponseCondition.VAREQUAL_XML_STRING, value, ident)); rpNot.getResponseConditions().add(new ResponseCondition(ResponseCondition.NOTVAREQUAL_XML_STRING, value, ident)); newRpList.add(rp); newRpList.add(rpNot); } return newRpList; } private ResponseProcessing getIncorrectResponseProcessing(List rpList) { ResponseProcessing newRp = null; for (int i = 0; i < rpList.size(); i++) { ResponseProcessing responseProcessing = (ResponseProcessing) rpList.get(i); if (responseProcessing.isFenixCorrectResponse()) { newRp = new ResponseProcessing(getIncorrectResponseConditionsList(responseProcessing.getResponseConditions()), Double.valueOf(0), Integer.valueOf(ResponseProcessing.SET), null, false); } } return newRp; } private List getIncorrectResponseConditionsList(List correctRcList) { List newRcList = new ArrayList(); for (int i = 0; i < correctRcList.size(); i++) { ResponseCondition responseCondition = (ResponseCondition) correctRcList.get(i); ResponseCondition newRc = new ResponseCondition(ResponseCondition.getConditionString(responseCondition .getReverseCondition()), responseCondition.getResponse(), responseCondition.getResponseLabelId()); newRcList.add(newRc); } return newRcList; } private String getStartElementTag(String tag) { return openTag + tag + closeTag; } private String getEndElementTag(String tag) { return openEndTag + tag + closeTag; } private String getTextArea(String text) { text = text.replace('\r', '\n'); String[] texts = text.split("\n"); String result = new String(); for (int i = 0; i < texts.length; i++) { if (!texts[i].equals("")) { if (i != 0 && i != texts.length - 1) result = result.concat(getStartElementTag(flow)); result = result.concat(getMattextElement(texts[i])); if (i != 0 && i != texts.length - 1) result = result.concat(getEndElementTag(flow)); } } return result; } private String getMattextElement(String text) { return new String(getStartElementTag(material) + getStartElementTag(mattext) + convertCharacters(text) + getEndElementTag(mattext) + getEndElementTag(material)); } private boolean contains(String[] array, String value) { for (int i = 0; i < array.length; i++) if (array[i].equals(value)) return true; return false; } private String convertCharacters(String text) { text = text.replaceAll("&", "&"); text = text.replaceAll("<", "<"); text = text.replaceAll(">", ">"); return text; } }