diff --git a/htroot/xml/feed.java b/htroot/xml/feed.java new file mode 100755 index 000000000..fb00ae2c2 --- /dev/null +++ b/htroot/xml/feed.java @@ -0,0 +1,83 @@ +// feed.java +// (C) 2008 by Michael Peter Christen; mc@yacy.net, Frankfurt a. M., Germany +// first published 25.04.2008 on http://yacy.net +// +// This is a part of YaCy, a peer-to-peer based web search engine +// +// $LastChangedDate: 2006-04-02 22:40:07 +0200 (So, 02 Apr 2006) $ +// $LastChangedRevision: 1986 $ +// $LastChangedBy: orbiter $ +// +// LICENSE +// +// 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 xml; + +import de.anomic.http.httpHeader; +import de.anomic.server.serverObjects; +import de.anomic.server.serverSwitch; +import de.anomic.xml.RSSFeed; +import de.anomic.xml.RSSMessage; + +public class feed { + + public static serverObjects respond(httpHeader header, serverObjects post, serverSwitch env) { + //plasmaSwitchboard sb = (plasmaSwitchboard) env; + + // insert default values + serverObjects prop = new serverObjects(); + prop.put("channel_title", ""); + prop.put("channel_description", ""); + prop.put("channel_pubDate", ""); + prop.put("item", "0"); + + if ((post == null) || (env == null)) return prop; + //boolean authorized = sb.adminAuthenticated(header) >= 2; + + String channelName = post.get("channel"); + if (channelName == null) return prop; + + RSSFeed feed = RSSFeed.channels(channelName); + if ((feed == null) || (feed.size() == 0)) return prop; + int count = post.getInt("count", 10); + + RSSMessage message = feed.getChannel(); + if (message != null) { + prop.put("channel_title", message.getTitle()); + prop.put("channel_description", message.getDescription()); + prop.put("channel_pubDate", message.getPubDate()); + } + int c = 0; + while ((count > 0) && (feed.size() > 0)) { + message = feed.pollMessage(); + if (message == null) continue; + + // create RSS entry + prop.putHTML("item_" + c + "_title", message.getTitle()); + prop.putHTML("item_" + c + "_description", message.getDescription()); + prop.putHTML("item_" + c + "_link", message.getLink()); + prop.put("item_" + c + "_pubDate", message.getPubDate()); + prop.put("item_" + c + "_guid", message.getGuid()); + c++; + count--; + } + prop.put("item", c); + + // return rewrite properties + return prop; + } + +} diff --git a/htroot/xml/feed.rss b/htroot/xml/feed.rss new file mode 100755 index 000000000..240028d12 --- /dev/null +++ b/htroot/xml/feed.rss @@ -0,0 +1,21 @@ + + + + + +#[channel_title]# +#[channel_description]# +#[channel_pubDate]# + + +#{item}# + +#[title]# +#[link]# +#[description]# +#[pubDate]# +#[guid]# + +#{/item}# + + diff --git a/source/de/anomic/plasma/plasmaCondenser.java b/source/de/anomic/plasma/plasmaCondenser.java index 9c9a86b79..b1c71981b 100644 --- a/source/de/anomic/plasma/plasmaCondenser.java +++ b/source/de/anomic/plasma/plasmaCondenser.java @@ -611,7 +611,7 @@ public final class plasmaCondenser { } - private static StringBuffer trim(StringBuffer sb) { + static StringBuffer trim(StringBuffer sb) { while ((sb.length() > 0) && (sb.charAt(0) <= ' ')) sb = sb.deleteCharAt(0); while ((sb.length() > 0) && (sb.charAt(sb.length() - 1) <= ' ')) sb = sb.deleteCharAt(sb.length() - 1); return sb; diff --git a/source/de/anomic/xml/RSSFeed.java b/source/de/anomic/xml/RSSFeed.java index 4b6fa90d2..a2728a350 100644 --- a/source/de/anomic/xml/RSSFeed.java +++ b/source/de/anomic/xml/RSSFeed.java @@ -35,8 +35,8 @@ public class RSSFeed implements Iterable { // class variables private RSSMessage channel; private String imageURL; - private ConcurrentLinkedQueue messageQueue; // a list of GUIDs, so the items can be retrieved by a specific order - private ConcurrentHashMap messages; // a guid:Item map + ConcurrentLinkedQueue messageQueue; // a list of GUIDs, so the items can be retrieved by a specific order + ConcurrentHashMap messages; // a guid:Item map private int maxsize; public RSSFeed() { @@ -136,6 +136,7 @@ public class RSSFeed implements Iterable { RSSFeed feed = channels.get(channelName); if (feed != null) return feed; feed = new RSSFeed(); + feed.setChannel(new RSSMessage(channelName, "")); channels.put(channelName, feed); return feed; } diff --git a/source/de/anomic/xml/RSSMessage.java b/source/de/anomic/xml/RSSMessage.java index c86b58517..2a9e0e4bc 100644 --- a/source/de/anomic/xml/RSSMessage.java +++ b/source/de/anomic/xml/RSSMessage.java @@ -27,6 +27,7 @@ package de.anomic.xml; +import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -58,6 +59,14 @@ public class RSSMessage { private HashMap map; + public RSSMessage(String title, String description) { + this(); + setValue("title", title); + setValue("description", description); + setValue("pubDate", new Date().toString()); + setValue("guid", Integer.toHexString((title + description).hashCode())); + } + public RSSMessage() { this.map = new HashMap(); this.map.put("guid", Long.toHexString(System.currentTimeMillis()) + ":" + guidcount++); @@ -68,50 +77,62 @@ public class RSSMessage { } public String getAuthor() { - return (String) map.get("author"); + String s = map.get("author"); + if (s == null) return ""; else return s; } public String getCopyright() { - return (String) map.get("copyright"); + String s = map.get("copyright"); + if (s == null) return ""; else return s; } public String getCategory() { - return (String) map.get("category"); + String s = map.get("category"); + if (s == null) return ""; else return s; } public String getTitle() { - return (String) map.get("title"); + String s = map.get("title"); + if (s == null) return ""; else return s; } public String getLink() { - return (String) map.get("link"); + String s = map.get("link"); + if (s == null) return ""; else return s; } public String getReferrer() { - return (String) map.get("referrer"); + String s = map.get("referrer"); + if (s == null) return ""; else return s; } public String getLanguage() { - return (String) map.get("language"); + String s = map.get("language"); + if (s == null) return ""; else return s; } public String getDescription() { - return (String) map.get("description"); + String s = map.get("description"); + if (s == null) return ""; else return s; } public String getCreator() { - return (String) map.get("creator"); + String s = map.get("creator"); + if (s == null) return ""; else return s; } public String getPubDate() { - return (String) map.get("pubDate"); + String s = map.get("pubDate"); + if (s == null) return ""; else return s; } public String getGuid() { - return (String) map.get("guid"); + String s = map.get("guid"); + if (s == null) return ""; else return s; } public String getDocs() { - return (String) map.get("docs"); + String s = map.get("docs"); + if (s == null) return ""; else return s; } } diff --git a/source/de/anomic/yacy/yacyNewsAction.java b/source/de/anomic/yacy/yacyNewsAction.java index 0272ce382..c8db8a504 100644 --- a/source/de/anomic/yacy/yacyNewsAction.java +++ b/source/de/anomic/yacy/yacyNewsAction.java @@ -48,6 +48,8 @@ import java.io.IOException; import de.anomic.server.serverCodings; import de.anomic.server.logging.serverLog; +import de.anomic.xml.RSSFeed; +import de.anomic.xml.RSSMessage; public class yacyNewsAction implements yacyPeerAction { @@ -64,6 +66,7 @@ public class yacyNewsAction implements yacyPeerAction { String decodedString = de.anomic.tools.crypt.simpleDecode(recordString, ""); yacyNewsRecord record = yacyNewsRecord.newRecord(decodedString); if (record != null) { + RSSFeed.channels("PEERNEWS").addMessage(new RSSMessage("Peer Arrival", peer.getName() + " has joined the network")); //System.out.println("### news arrival from peer " + peer.getName() + ", decoded=" + decodedString + ", record=" + recordString + ", news=" + record.toString()); String cre1 = (String) serverCodings.string2map(decodedString, ",").get("cre"); String cre2 = (String) serverCodings.string2map(record.toString(), ",").get("cre"); @@ -80,6 +83,7 @@ public class yacyNewsAction implements yacyPeerAction { } public void processPeerDeparture(yacySeed peer) { + RSSFeed.channels("PEERNEWS").addMessage(new RSSMessage("Peer Departure", peer.getName() + " has left the network")); } public void processPeerPing(yacySeed peer) {