package org.xhtmlrenderer.demo.browser;

import org.xml.sax.*;
import org.xml.sax.helpers.AttributesImpl;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * Read plain text file as if it was xml with a text-tag around it.
 * <p/>
 * Fulfills minimum requirements.
 * <p/>
 * Maybe not the easiest way to do this :-)
 */
public class PlainTextXMLReader implements XMLReader {
    private EntityResolver entityResolver;
    private DTDHandler dtdHandler;
    private ContentHandler contentHandler;
    private ErrorHandler errorHandler;
    private BufferedReader text;

    PlainTextXMLReader(InputStream is) {
        text = new BufferedReader(new InputStreamReader(is));
    }

    public boolean getFeature(String s) throws SAXNotRecognizedException, SAXNotSupportedException {
        if (s.equals("http://xml.org/sax/features/namespaces")) {
            return true;
        }
        if (s.equals("http://xml.org/sax/features/namespace-prefixes")) {
            return false;
        }
        throw new SAXNotRecognizedException(s);
    }

    public void setFeature(String s, boolean b) throws SAXNotRecognizedException, SAXNotSupportedException {
        if (s.equals("http://xml.org/sax/features/namespaces")) {
            if (!b)
                throw new SAXNotSupportedException(s);
            else
                return;
        }
        if (s.equals("http://xml.org/sax/features/namespace-prefixes")) {
            if (b)
                throw new SAXNotSupportedException(s);
            else
                return;
        }
        throw new SAXNotRecognizedException(s);
    }

    public Object getProperty(String s) throws SAXNotRecognizedException, SAXNotSupportedException {
        throw new SAXNotRecognizedException(s);
    }

    public void setProperty(String s, Object o) throws SAXNotRecognizedException, SAXNotSupportedException {
        throw new SAXNotRecognizedException(s);
    }

    public void setEntityResolver(EntityResolver entityResolver) {
        this.entityResolver = entityResolver;
    }

    public EntityResolver getEntityResolver() {
        return entityResolver;
    }

    public void setDTDHandler(DTDHandler dtdHandler) {
        this.dtdHandler = dtdHandler;
    }

    public DTDHandler getDTDHandler() {
        return dtdHandler;
    }

    public void setContentHandler(ContentHandler contentHandler) {
        this.contentHandler = contentHandler;
    }

    public ContentHandler getContentHandler() {
        return contentHandler;
    }

    public void setErrorHandler(ErrorHandler errorHandler) {
        this.errorHandler = errorHandler;
    }

    public ErrorHandler getErrorHandler() {
        return errorHandler;
    }

    public void parse(InputSource inputSource) throws IOException, SAXException {
        contentHandler.startDocument();
        contentHandler.startElement("http://www.w3.org/1999/xhtml", "pre", "pre", new AttributesImpl());

        String line;
        do {
            line = text.readLine();
            if (line == null) break;
            char[] chars = (line + "\n").toCharArray();
            contentHandler.characters(chars, 0, chars.length);
        } while (line != null);

        contentHandler.endElement("http://www.w3.org/1999/xhtml", "pre", "pre");
        contentHandler.endDocument();
    }

    public void parse(String s) throws IOException, SAXException {
        throw new SAXNotRecognizedException(s);
    }
}
