/*
* LineByLineParser.java
*
* Copyright (C) 2005-2006 Tommi Laukkanen
* http://www.substanceofcode.com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
// Expand to define logging define
//#define DNOLOGGING
package com.substanceofcode.rssreader.businesslogic;
import com.substanceofcode.utils.EncodingUtil;
import com.substanceofcode.utils.EncodingStreamReader;
import com.substanceofcode.rssreader.businessentities.RssItunesFeed;
import com.substanceofcode.utils.StringUtil;
import com.substanceofcode.utils.CauseException;
import com.substanceofcode.utils.CauseMemoryException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.Vector;
//#ifdef DLOGGING
//@import net.sf.jlogmicro.util.logging.Logger;
//@import net.sf.jlogmicro.util.logging.Level;
//#endif
/**
* LineByLineParser class is used when we are parsing RSS feed list
* line-by-line.
*
* @author Tommi Laukkanen
*/
public class LineByLineParser extends FeedListParser {
//#ifdef DLOGGING
//@ private Logger m_logger = Logger.getLogger("LineByLineParser");
//@ final private boolean m_fineLoggable = m_logger.isLoggable(Level.FINE);
//@ final private boolean m_finerLoggable = m_logger.isLoggable(Level.FINER);
//@ final private boolean m_finestLoggable = m_logger.isLoggable(Level.FINEST);
//#endif
/** Creates a new instance of LineByLineParser */
public LineByLineParser(String url, String username, String password) {
super(url, username, password);
}
public RssItunesFeed[] parseFeeds(InputStream is)
throws IOException, CauseMemoryException, CauseException, Exception {
// Prepare buffer for input data
StringBuffer inputBuffer = new StringBuffer();
EncodingUtil encUtl = new EncodingUtil(is);
EncodingStreamReader esr = encUtl.getEncodingStreamReader();
try {
// Read all data to buffer. Use 100 char increments to save on
// memory.
inputBuffer = esr.readFile(100);
} catch (IOException ex) {
CauseException cex = new CauseException(
"Error while parsing line by feed " + m_url, ex);
throw cex;
}
String text;
if (esr.isUtfDoc()) {
final String fileEncoding = esr.getFileEncoding();
if (esr.isUtf16Doc()) {
encUtl.getEncoding(fileEncoding, "UTF-16");
} else {
encUtl.getEncoding(fileEncoding, "UTF-8");
}
final String docEncoding = encUtl.getDocEncoding();
if (docEncoding.length() == 0) {
text = inputBuffer.toString();
} else {
try {
// We read the bytes in as ISO8859_1, so we must get them
// out as that and then encode as they should be.
if (fileEncoding.length() == 0) {
text = new String(inputBuffer.toString().getBytes(),
docEncoding);
} else {
text = new String(inputBuffer.toString().getBytes(
fileEncoding), docEncoding);
}
} catch (UnsupportedEncodingException e) {
//#ifdef DLOGGING
//@ m_logger.severe("parseFeeds Could not convert string from,to" + fileEncoding + "," + docEncoding, e);
//#endif
System.out.println("parseFeeds Could not convert string from,to" + fileEncoding + "," + docEncoding);
text = inputBuffer.toString();
} catch (IOException e) {
//#ifdef DLOGGING
//@ m_logger.severe("parseFeeds Could not convert string from,to" + fileEncoding + "," + docEncoding, e);
//#endif
System.out.println("parseFeeds Could not convert string from,to" + fileEncoding + "," + docEncoding);
text = inputBuffer.toString();
}
}
} else {
text = inputBuffer.toString();
}
inputBuffer = null;
// Split buffer string by each new line
text = StringUtil.replace(text, "\r", "");
String[] lines = StringUtil.split(text, '\n');
text = null;
RssItunesFeed[] feeds = new RssItunesFeed[ lines.length ];
for(int lineIndex=0; lineIndex<lines.length;
lines[lineIndex] = null, lineIndex++) {
String line = lines[lineIndex];
String name;
String url;
int indexOfSpace = line.indexOf(' ');
if(indexOfSpace>0) {
name = line.substring(indexOfSpace+1);
url = line.substring(0, indexOfSpace);
} else {
name = line;
url = line;
}
if((( m_feedNameFilter != null) &&
(name.toLowerCase().indexOf(m_feedNameFilter) < 0)) ||
(( m_feedURLFilter != null) &&
(url.toLowerCase().indexOf(m_feedURLFilter) < 0))) {
continue;
}
feeds[lineIndex] = new RssItunesFeed(name, url, "", "");
}
return feeds;
}
}