/*
* CompatibilityRssFeed2.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
*
*/
package com.substanceofcode.rssreader.businessentities;
import com.substanceofcode.utils.CompatibilityBase64;
import com.substanceofcode.utils.StringUtil;
import java.io.UnsupportedEncodingException;
import com.substanceofcode.rssreader.businessentities.RssFeed;
import com.substanceofcode.rssreader.businessentities.RssItem;
import java.util.*;
/**
* CompatibilityRssFeed2 class contains one RSS feed's properties.
* Properties include name and URL to RSS feed.
*
* @author Tommi Laukkanen
*/
public class CompatibilityRssFeed2 extends RssFeed {
/** Creates a new instance of RSSBookmark */
public CompatibilityRssFeed2(String name, String url, String username, String password){
super();
m_name = name;
m_url = url;
m_username = username;
m_password = password;
}
/** Create feed from an existing feed. **/
public CompatibilityRssFeed2(RssFeed feed) {
super();
this.m_url = feed.m_url;
this.m_name = feed.m_name;
this.m_username = feed.m_username;
this.m_password = feed.m_password;
this.m_upddate = feed.m_upddate;
this.m_items = new Vector();
for (int ic = 0; ic < feed.m_items.size(); ic++) {
this.m_items.addElement(
new CompatibilityRssItem2((RssItem)feed.m_items.elementAt(ic)));
}
}
/** Creates a new instance of RSSBookmark with record store string */
public CompatibilityRssFeed2(String storeString){
try {
String[] nodes = StringUtil.split( storeString, "|" );
/* Node count should be 5
* name | url | username | password | items
*/
int NAME = 0;
m_name = nodes[ NAME ];
int URL = 1;
m_url = nodes[ URL ];
int USERNAME = 2;
m_username = nodes[ USERNAME ];
int PASSWORD = 3;
m_password = nodes[ PASSWORD ];
int ITEMS = 5;
if (ITEMS < nodes.length) {
int UPDDATE = 4;
String dateString = nodes[UPDDATE];
if(dateString.length()>0) {
m_upddate = new Date(Long.parseLong(dateString));
}
// Encode for better UTF-8 and to allow '|' in the name.
CompatibilityBase64 b64 = new CompatibilityBase64();
byte[] decodedName = b64.decode(m_name);
try {
m_name = new String( decodedName , "UTF-8" );
} catch (UnsupportedEncodingException e) {
m_name = new String( decodedName );
}
} else {
ITEMS = 4;
}
String itemArrayData = nodes[ ITEMS ];
// Deserialize itemss
String[] serializedItems = StringUtil.split(itemArrayData, ".");
m_items = new Vector();
for(int itemIndex=0; itemIndex<serializedItems.length; itemIndex++) {
String serializedItem = serializedItems[ itemIndex ];
if(serializedItem.length()>0) {
RssItem rssItem = CompatibilityRssItem2.deserialize2( serializedItem );
if (rssItem != null) {
m_items.addElement( rssItem );
}
}
}
} catch(Exception e) {
System.err.println("Error while rssfeed initialization : " + e.toString());
e.printStackTrace();
}
}
/** Return record store string */
public String getStoreString(boolean serializeItems){
String serializedItems = "";
if( serializeItems ) {
for(int itemIndex=0; itemIndex<m_items.size();itemIndex++) {
CompatibilityRssItem2 rssItem =
new CompatibilityRssItem2((RssItem)m_items.elementAt(itemIndex));
String serializedItem = rssItem.serialize();
serializedItems += serializedItem + ".";
}
}
String encodedName;
CompatibilityBase64 b64 = new CompatibilityBase64();
try {
encodedName = b64.encode( m_name.getBytes("UTF-8") );
} catch (UnsupportedEncodingException e) {
encodedName = b64.encode( m_name.getBytes() );
}
String storeString = encodedName + "|" +
m_url + "|" + m_username + "|" +
m_password + "|" +
((m_upddate == null) ? "" :
String.valueOf(m_upddate.getTime())) + "|" +
serializedItems;
return storeString;
}
/** Compare feed to an existing feed. **/
public boolean equals(RssFeed feed) {
if (!feed.m_url.equals(this.m_url)) {
System.out.println("m_url != new m_url=" + m_url + "," + feed.m_url);
return false;
}
if (!feed.m_name.equals(this.m_name)) {
System.out.println("m_name != new m_name=" + m_name + "," + feed.m_name);
return false;
}
if (!feed.m_username.equals(this.m_username)) {
System.out.println("m_username != new m_username=" + m_username + "," + feed.m_username);
return false;
}
if (!feed.m_password.equals(this.m_password)) {
System.out.println("m_password != new m_password=" + m_password + "," + feed.m_password);
return false;
}
if ((feed.m_upddate == null) && (this.m_upddate == null)) {
System.out.println("m_upddate != new m_upddate=" + m_upddate + "," + feed.m_upddate);
} else if ((feed.m_upddate != null) && (this.m_upddate != null)) {
if (feed.m_upddate.equals(this.m_upddate)) {
} else {
System.out.println("m_upddate != new m_upddate=" + m_upddate + "," + feed.m_upddate);
return false;
}
} else {
System.out.println("m_upddate != new m_upddate=" + m_upddate + "," + feed.m_upddate);
return false;
}
if (feed.m_items.size() != m_items.size()) {
System.out.println("m_items.size() != new m_items.size()=" + m_items.size() + "," + feed.m_items.size());
return false;
}
int ilen = m_items.size();
RssItem [] ritems = new RssItem[ilen];
m_items.copyInto(ritems);
int flen = feed.m_items.size();
RssItem [] fitems = new RssItem[flen];
feed.m_items.copyInto(fitems);
for (int ic = 0; ic < ilen; ic++) {
if (!ritems[ic].equals(fitems[ic])) {
System.out.println("m_items[ic] != new m_items[ic]=" + ic + "," + ritems[ic] + "," + fitems[ic]);
return false;
}
}
return true;
}
}