Monday, April 04, 2011 at 1:06 AM.

feedhoseSuite.newItemCallback

on newItemCallback (adrriveritem, adrfeed, adrxitem) {
	<<Changes
		<<12/8/10; 8:25:58 AM by DW
			<<Put the section that gets the description in a try, since some feeds don't have descriptions on their items. This was causing the Hacker News hose not to wake up when an update came in.
		<<9/29/10; 12:37:36 PM by DW
			<<Adapt for hoses.
		<<9/24/10; 4:19:13 AM by DW
			<<Called when a new RSS item arrives.
	local (adrdata = feedHoseSuite.init (), now = clock.now ());
	adrdata^.server.stats.ctCallbackCalls++;
	bundle { //check title, skip duplicates
		local (adrtitle = @adrdata^.server.titles.[adrriveritem^.title]);
		if defined (adrtitle^) {
			adrdata^.server.stats.ctDuplicateTitles++;
			return};
		adrtitle^ = now};
	adrdata^.server.stats.ctNewItemsLastScan++;
	adrdata^.server.stats.lastNewItemFeed = nameof (adrfeed^);
	on encode (s) {
		if system.environment.isMac { //02/22/2001 JES: convert to Latin text
			return (xml.entityEncode (latinToMac.macToLatin (s), true))}
		else {
			return (xml.entityEncode (s, true))}};
	on deleteNamespaceElements (adrx) {
		local (i, adrelement);
		for i = sizeof (adrx^) downto 1 {
			adrelement = @adrx^ [i];
			if defined (adrelement^.["/atts"].namespace) {
				delete (adrelement)}}};
	on encodePcdata (adrx) {
		local (adrelement);
		for adrelement in adrx {
			if typeof (adrelement^) == tabletype {
				if defined (adrelement^.["/pcdata"]) {
					adrelement^.["/pcdata"] = encode (adrelement^.["/pcdata"])}}}};
	
	local (adrhose);
	for adrhose in @adrdata^.server.hoses {
		local (flcatch = false, hosename = nameof (adrhose^));
		feedhosesuite.inithose (hosename); //make sure all fields are init'd
		if adrhose^.prefs.enabled {
			try {
				if adrhose^.condition (adrriveritem, adrfeed, adrxitem) {
					adrhose^.stats.ctItemsMatchCondition++;
					adrhose^.stats.whenLastMatch = now;
					flcatch = true}};
			if flcatch {
				local (adrday = mainresponder.calendar.getdayaddress (@adrhose^.calendar, now));
				local (adritem = @adrday^.[string.padwithzeros (sizeof (adrday^) + 1, 5)]);
				new (tabletype, adritem);
				adritem^.riveritem = adrriveritem^;
				<<adritem^.feedUrl = nameof (adrfeed^)
				adritem^.xitem = adrxitem^;
				deleteNamespaceElements (@adritem^.xitem);
				encodePcdata (@adritem^.xitem); //the category element values aren't encoded properly
				bundle { //process the description
					try {
						local (adrdescription = xml.getaddress (@adritem^.xitem, "description"));
						local (s = searchengine.stripmarkup (adrdescription^));
						if sizeof (s) > 280 {
							s = string.mid (s, 1, 280);
							while s [sizeof (s)] != " " {
								s = string.delete (s, sizeof (s), 1)};
							s = string.delete (s, sizeof (s), 1) + "..."};
						adrdescription^ = s}};
				<<bundle //temporary debugging code -- 12/8/10 by DW
					<<log2.add ("FeedHose", "Wakeup", "Waking up threads waiting for the \"" + hosename + "\" hose.")
				feedhoseSuite.wakeWaitingThreads (hosename)}}}};
bundle { //test code
	newItemCallback (@config.feedHose.calendar.["2010"].["09"].["24"].["01115"].riveritem, @config.river2.feeds.["http://jobs.nytimes.com/careers/rss/jobs/?pbt=nytcategoryexecutive"], @config.feedHose.calendar.["2010"].["09"].["24"].["01115"].xitem)}



This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.