/* * QuestionSetImporter.java * * Created on 16 September 2006, 11:04 */ package uk.co.bytemark.vm.enigma.inquisition.questions; import java.io.IOException; import java.io.InputStream; import java.text.ParseException; import org.jdom.Document; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import uk.co.bytemark.vm.enigma.inquisition.questions.bundledquestions.BundledQuestions; /** * * @author Matt */ abstract class AbstractQuestionSetImporter implements QuestionSetImporter { /** * Constructs a <tt>QuestionSet</tt> from an <tt>InputStream<tt> where the stream provides * an XML description of the data. * @param stream an input stream from which to read XML data. * @throws org.jdom.JDOMException * @throws java.io.IOException * @throws java.text.ParseException */ public QuestionSet buildQuestionSet(InputStream inputStream) throws JDOMException, IOException, ParseException { Document doc = readStreamAndBuildFromXML(inputStream); return processDocument(doc); } /** * Subclasses override this to implement an XML file format reader */ abstract QuestionSet processDocument(Document doc) throws ParseException; /** * Utility method to convert an inputStream into an XML Document */ public static Document readStreamAndBuildFromXML(InputStream inputStream) throws JDOMException, IOException { SAXBuilder builder = new SAXBuilder(false); // true); // builder.setEntityResolver(new Utils.NoOpEntityResolver()); // ignore DTDs builder.setEntityResolver(new InquisitionDtdResolver()); return builder.build(inputStream); } public static class InquisitionDtdResolver implements EntityResolver { private static final String INQUISITION_QUESTIONS_DTD = "inquisitionQuestions.dtd"; public InputSource resolveEntity(String publicId, String systemId) { if (systemId != null && systemId.endsWith(INQUISITION_QUESTIONS_DTD)) { InputStream input = BundledQuestions.class.getResourceAsStream(INQUISITION_QUESTIONS_DTD); return new InputSource(input); } else { return new InputSource(); } } } }