package feed.parser;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import org.caudexorigo.io.UnsynchronizedByteArrayInputStream;
import org.caudexorigo.io.UnsynchronizedByteArrayOutputStream;
import org.caudexorigo.text.DetectEncoding;
public class FeedParser
{
private final StaxParser staxParser;
public FeedParser()
{
super();
staxParser = new StaxParser();
}
public FeedChannel parse(Reader reader)
{
return staxParser.parse(reader, true, false);
}
public FeedChannel parse(Reader reader, boolean failOnError)
{
return staxParser.parse(reader, failOnError, false);
}
public FeedChannel parse(Reader reader, boolean failOnError, boolean stripHtml)
{
return staxParser.parse(reader, failOnError, stripHtml);
}
public FeedChannel parse(InputStream stream)
{
return parse(stream, true);
}
public FeedChannel parse(InputStream stream, boolean failOnError)
{
return parse(stream, failOnError, false);
}
public FeedChannel parse(InputStream stream, boolean failOnError, boolean stripHtml)
{
try
{
Reader reader = buildReader(stream);
return staxParser.parse(reader, failOnError, stripHtml);
}
catch (Throwable t)
{
throw new RuntimeException(t);
}
}
private Reader buildReader(InputStream stream) throws IOException, UnsupportedEncodingException
{
if (stream.markSupported())
{
DetectEncoding encDetector = new DetectEncoding("UTF-8");
stream.mark(512);
String encoding = encDetector.detect(stream);
stream.reset();
encDetector.stripBOM(stream);
Reader reader = new InputStreamReader(stream, encoding);
return reader;
}
else
{
UnsynchronizedByteArrayOutputStream bout = new UnsynchronizedByteArrayOutputStream();
int b;
while ((b = stream.read()) > -1)
{
bout.write(b);
}
Reader r = buildReader(new UnsynchronizedByteArrayInputStream(bout.toByteArray()));
bout.close();
return r;
}
}
}