package edu.vserver.exercises.math.essentials.level; import java.io.IOException; import java.io.StringReader; import java.io.UnsupportedEncodingException; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import fi.utu.ville.exercises.model.ExerciseData; import fi.utu.ville.exercises.model.ExerciseException; import fi.utu.ville.exercises.model.PersistenceHandler; import fi.utu.ville.exercises.model.SubmissionInfo; import fi.utu.ville.standardutils.TempFilesManager; public class LevelXML<E extends ExerciseData, S extends SubmissionInfo> implements PersistenceHandler<LevelMathDataWrapper<E>, S> { /** * */ private static final long serialVersionUID = -114630597593544006L; protected Document document; private final PersistenceHandler<E, S> specificXMLWriter; public LevelXML(PersistenceHandler<E, S> specificXMLWriter) { this.specificXMLWriter = specificXMLWriter; } @Override public byte[] saveExerData(LevelMathDataWrapper<E> data, TempFilesManager tempMan, ByRefSaver refHandler) throws ExerciseException { LevelXMLHelper handler = new LevelXMLHelper(); Document document = handler.getDocument(); DocumentBuilder builder = handler.getDocumentBuilder(); handler.createLevels(); E easy = data.getForLevel(DiffLevel.EASY); E normal = data.getForLevel(DiffLevel.NORMAL); E hard = data.getForLevel(DiffLevel.HARD); String easyString = convertStreamToString(specificXMLWriter .saveExerData(easy, tempMan, refHandler)); String normalString = convertStreamToString(specificXMLWriter .saveExerData(normal, tempMan, refHandler)); String hardString = convertStreamToString(specificXMLWriter .saveExerData(hard, tempMan, refHandler)); NodeList list = document.getElementsByTagName("Easy"); try { appendXmlFragment(builder, list.item(0), easyString); } catch (IOException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } list = document.getElementsByTagName("Normal"); try { appendXmlFragment(builder, list.item(0), normalString); } catch (IOException e1) { e1.printStackTrace(); } catch (SAXException e1) { e1.printStackTrace(); } list = document.getElementsByTagName("Hard"); try { appendXmlFragment(builder, list.item(0), hardString); } catch (IOException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } return handler.writeXMLtoStream(); } @Override public LevelMathDataWrapper<E> loadExerData(byte[] inStream, TempFilesManager tempMan, ByRefLoader refHandler) throws ExerciseException { if (inStream != null) { LevelXMLHelper handler = new LevelXMLHelper(inStream); document = handler.getDocument(); NodeList easy = document.getElementsByTagName("Easy"); LevelXMLHelper easyHandler = new LevelXMLHelper(); easyHandler.getDocument().appendChild( easyHandler.getDocument().importNode(easy.item(0), true)); NodeList normal = document.getElementsByTagName("Normal"); LevelXMLHelper normalHandler = new LevelXMLHelper(); normalHandler.getDocument().appendChild( normalHandler.getDocument() .importNode(normal.item(0), true)); NodeList hard = document.getElementsByTagName("Hard"); LevelXMLHelper hardHandler = new LevelXMLHelper(); hardHandler.getDocument().appendChild( hardHandler.getDocument().importNode(hard.item(0), true)); byte[] easyStream = easyHandler.writeXMLtoStream(); byte[] normalStream = normalHandler.writeXMLtoStream(); byte[] hardStream = hardHandler.writeXMLtoStream(); LevelMathDataWrapper<E> levels = new LevelMathDataWrapper<E>( specificXMLWriter.loadExerData(easyStream, tempMan, refHandler), specificXMLWriter.loadExerData( normalStream, tempMan, refHandler), specificXMLWriter.loadExerData(hardStream, tempMan, refHandler)); return levels; } else { return null; } } private String convertStreamToString(byte[] utf8Data) { String res = ""; try { res = new String(utf8Data, "UTF-8"); } catch (java.util.NoSuchElementException e) { res = ""; } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return res; } private static void appendXmlFragment(DocumentBuilder docBuilder, Node parent, String fragment) throws IOException, SAXException { Document doc = parent.getOwnerDocument(); Node fragmentNode = docBuilder.parse( new InputSource(new StringReader(fragment))) .getDocumentElement(); fragmentNode = doc.importNode(fragmentNode, true); parent.appendChild(fragmentNode); } @Override public byte[] saveSubmission(S subm, TempFilesManager tempManager) throws ExerciseException { return specificXMLWriter.saveSubmission(subm, tempManager); } @Override public S loadSubmission(byte[] inStream, boolean forStatGiver, TempFilesManager tempManager) throws ExerciseException { return specificXMLWriter.loadSubmission(inStream, forStatGiver, tempManager); } }