// BlogBridge -- RSS feed reader, manager, and web based service // Copyright (C) 2002-2006 by R. Pito Salas // // 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 // // Contact: R. Pito Salas // mailto:pitosalas@users.sourceforge.net // More information: about BlogBridge // http://www.blogbridge.com // http://sourceforge.net/projects/blogbridge // // $Id: Channel.java,v 1.7 2006/02/16 10:04:19 spyromus Exp $ // package com.salas.bb.utils.parser; import java.net.URL; import java.util.Arrays; import java.util.Date; /** * Channel taken from the feed. Each channel has several optional fields and items. */ public class Channel { private String title; private String description; private String author; private URL siteURL; private String format; private String language; private long updatePeriod; private Item[] items; private long creationTime; /** * The time of last feed update according to the server. * May or may not be set. */ private long lastUpdateServerTime; /** * Creates the channel. */ public Channel() { creationTime = System.currentTimeMillis(); items = new Item[0]; lastUpdateServerTime = -1; } /** * Returns title of the channel. * * @return title or NULL. */ public String getTitle() { return title; } /** * Sets title of the channel. * * @param aTitle title. */ public void setTitle(String aTitle) { title = aTitle; } /** * Returns description of the channel. * * @return description or NULL. */ public String getDescription() { return description; } /** * Sets description of the channel. * * @param aDescription description. */ public void setDescription(String aDescription) { description = aDescription; } /** * Returns author of the channel. * * @return author or NULL. */ public String getAuthor() { return author; } /** * Sets author of the channel. * * @param aAuthor author. */ public void setAuthor(String aAuthor) { author = aAuthor; } /** * Returns URL of the site associated with the channel. * * @return site URL or NULL. */ public URL getSiteURL() { return siteURL; } /** * Sets URL of the site associated with the channel. * * @param aSiteURL site URL. */ public void setSiteURL(URL aSiteURL) { siteURL = aSiteURL; } /** * Returns format of the channel. * * @return format or NULL. */ public String getFormat() { return format; } /** * Sets format of the channel. * * @param aFormat format. */ public void setFormat(String aFormat) { format = aFormat; } /** * Returns language of the channel. * * @return language or NULL. */ public String getLanguage() { return language; } /** * Sets language of the channel. * * @param aLanguage language. */ public void setLanguage(String aLanguage) { language = aLanguage; } /** * Returns number of items in the channel. * * @return number of items. */ public int getItemsCount() { return items.length; } /** * Returns item at the given index. * * @param index index of the item. * * @return item. */ public Item getItemAt(int index) { return items[index]; } /** * Adds item to the list of items. * * @param aItem item to add. */ public void addItem(Item aItem) { // Every next item without publication date/time gets current channel creation // time and decreases it by 1ms to shift the next item without date a bit to the past. // Every item with publication date earlier than current updates it to let // further dateless items follow it. Date pubDate = aItem.getPublicationDate(); if (pubDate == null) { aItem.setPublicationDate(new Date(creationTime--)); } else if (pubDate.getTime() < creationTime) { creationTime = pubDate.getTime(); } int index = Arrays.binarySearch(items, aItem, Item.COMPARATOR); // If index is positive, we have articles with the same timestamp and we reuse // their index for upcoming insertion, otherwise -- we convert to insertion index. if (index < 0) index = -index - 1; insertItem(aItem, index); } /** * Inserts the item at a given position. * * @param item item. * @param index index. */ private void insertItem(Item item, int index) { Item[] newItems = new Item[items.length + 1]; System.arraycopy(items, 0, newItems, 0, index); newItems[index] = item; System.arraycopy(items, index, newItems, index + 1, items.length - index); items = newItems; } /** * Returns update period in milliseconds or (-1) if not set. * * @return period or (-1). */ public long getUpdatePeriod() { return updatePeriod; } /** * Sets update period in milliseconds. * * @param period period value or -1. */ public void setUpdatePeriod(long period) { updatePeriod = period; } /** * Returns time of the last update according to a server. * * @return timestamp. */ public long getLastUpdateServerTime() { return lastUpdateServerTime; } /** * Sets time of the last update according to a server. * * @param time timestamp. */ public void setLastUpdateServerTime(long time) { lastUpdateServerTime = time; } }