#!/usr/local/bin/python -- ## -*-python-*- ##**************************************************************************** ## ## File: AsyncInterClient.py ## RCS: $Header: $ ## Description: Asynchronous DL Interchange client ## Author: Scott Hassan, Stanford University ## Created: ## Modified: ## Language: python ## Package: N/A ## Status: Experimental (Do Not Distribute) ## ## (c) Copyright 1995, Stanford University, all rights reserved. ## ##***************************************************************************** ## ## ## import posix, os, socket, sys import time, string, regex import ilu import urllib import ICosProperty import IDLInterchange, IDLInterchange__skel try: dllib = None import dlcoslib except ImportError: import dllib dlcoslib = dllib ## class Cit(IDLInterchange__skel.CItem, dlcoslib.IPropertySetImpl): def __init__(self, pCollection): dlcoslib.IPropertySetImpl.__init__(self) self.fOptions = [] self.fCollection = pCollection self.define_property(IDLInterchange.kDocTitle, None) self.define_property(IDLInterchange.kDocAuthor, None) self.define_property(IDLInterchange.kDocAbstract, None) self.define_property(IDLInterchange.kDocDate, None) self.define_property(IDLInterchange.kItemWeight, None) self.define_property(IDLInterchange.kItemContent, None) self.define_property(IDLInterchange.kItemContentType, None) self.define_property(IDLInterchange.kItemContentLength, None) self.define_property("url", None) def AddAccessOptions(self, pOptions): self.fOptions = self.fOptions + pOptions def GetAccessCapability(self): return self.fOptions def keys(self): names, rest = self.get_all_property_names(10000) return names def has_key(self, key): return self.is_property_defined(key) def __getitem__(self, key): if not self.has_key(key): raise KeyError if self.get_property_value(key) == None: self.fCollection.GetItemProperties(self, [key]) return self.get_property_value(key) def __str__(self): s = "" names = self.keys() for name in names: if self.get_property_value(name) != None: s = s + name + ": " s = s + `self[name]` s = s + " " return s class ResultCollection(IDLInterchange__skel.CCollection, dlcoslib.IPropertySetImpl): def __init__(self, pModule, pQuery, pServPref): self.module = pModule dlcoslib.IPropertySetImpl.__init__(self) self.fTotalItems = None self.fItems = [] self.fMoreCookie = None self.fQuery = pQuery self.fServPref = pServPref def GetQuery(self): return self.fQuery def __len__(self): return int(self.fTotalItems) def __getitem__(self, key): return self.getitems(key, key+1)[0] def __getslice__(self, i, j): return self.getitems(i,j) def getitems(self, pFrom, pTo): if pFrom > pTo: raise IndexError, "range error" if pTo > self.fTotalItems: raise IndexError, "index out of range" l = len(self.fItems) if pTo <= l: return self.fItems[pFrom:pTo] aStart = l aEnd = (pTo-1) + self.fServPref["aNumberOfItems"] if aEnd >= self.fTotalItems: aEnd = self.fTotalItems print `l`, ",", `aStart`, ",", `aEnd` aRS = self.fMoreCookie[0]['aTarget'] aCookie = self.fMoreCookie[0]['aCookie'] pItems, pMoreCookie = aRS.GetItems(self.fQuery["aItemPropertyNames"], aCookie, aEnd - aStart) self.AddItems(None, pItems, pMoreCookie) return self.fItems[pFrom:pTo] def GetItemProperties(self, pCit, pFields): ac = pCit.GetAccessCapability() ao = ac[0] aTarget = ao['aTarget'] cookie = ao['aCookie'] items = aTarget.GetItemsProperties(pFields, [cookie]) names = items['aNames'] values = items['anItemsState'][0] j = 0 for value in values: pCit.define_property(names[j], dlcoslib.InputAny(value)) j = j + 1 ## ------------------------------------------------------------ def CompletedRequest(self, pMessageID): print "CompletedRequest(" + `pMessageID` + ")" def GetTotalItems(self): return self.fTotalItems def SetTotalItems(self, pTotalItems): dlcoslib.LogMessage(self.module, "SetTotalItems(" + `pTotalItems` + ")", 1) self.fTotalItems = pTotalItems ## ------------------------------------------------------------ def AddItems(self, pMessageID, pItems, pMoreCookie): dlcoslib.LogMessage(self.module, "AddItems(" + `pMessageID` + ")", 1) names = pItems['aState']['aNames'] valueslist = pItems['aState']['anItemsState'] aACs = pItems['aACs'] i = 0 for values in valueslist: item = Cit(self) self.fItems.append(item) j = 0 item.AddAccessOptions(aACs[i]) for value in values: item.define_property(names[j], dlcoslib.InputAny(value)) j = j + 1 i = i + 1 self.fMoreCookie = pMoreCookie ## ------------------------------------------------------------ def SetItemsProperties(self, pMessageID, pItems): dlcoslib.LogMessage(self.module, "SetItemsProperties()", 1) print pItems ## ------------------------------------------------------------ def GetItemsProperties(self, pMessageID, pPropertyNames, pCookies): anItems = [] for cookie in pCookies: pass return anItems ## ------------------------------------------------------------ gSets = [] def Search(pLine, pRock): if not dllib: wc = dlcoslib.LookupObject(IDLInterchange.CConstrainCollection, "Services/WebCrawler") else: wc = ilu.ObjectOfSBH(IDLInterchange.CConstrainCollection, "1@Service@sunrpc_2_0x31000400_4272011225|tcp_localhost_3000") if wc.IluPing() == 0: print "Service not available." return aTerms = string.split(pLine) query = {} query["aQuery"] = None query["aQueryComponents"] = aTerms[1:] ## query["aItemPropertyNames"] = ["url", IDLInterchange.kDocTitle, IDLInterchange.kItemWeight] query["aItemPropertyNames"] = [IDLInterchange.kDocTitle] query["aMoreSummary"] = [] servpref = {} servpref["aServicePreferences"] = None servpref["aNumberOfItems"] = 10 servpref["aMoreSummary"] = [] results = ResultCollection("results", query, servpref) ## print results.IluSBH() gSets.append(results) wc.RequestConstrain(dlcoslib.OutputAny(42), query, servpref, results) print "submitted query." def List(pLine, pRock): i = 0 for aSet in gSets: aResults = aSet print "Set " + `i` + ": " + `aResults.GetTotalItems()` + " (" + `aResults.GetQuery()["aQueryComponents"]` + ")" i = i + 1 def MoreType(pLine, pRock): aTerms = string.split(pLine) if len(aTerms) < 3: print "wrong number of arguments to type" return aSetNum = string.atoi(aTerms[1]) aNum = string.atoi(aTerms[2]) aWhat = aTerms[3] aResults = gSets[aSetNum] if aNum >= len(aResults): aNum = len(aResults) cits = aResults[0:aNum] i = 0 for cit in cits: print `i` + ": ", print cit[aWhat] i = i + 1 def Type(pLine, pRock): aTerms = string.split(pLine) if len(aTerms) < 3: print "wrong number of arguments to type" return aSetNum = string.atoi(aTerms[1]) aNum = string.atoi(aTerms[2]) aResults = gSets[aSetNum] if aNum >= len(aResults): aNum = len(aResults) cits = aResults[0:aNum] i = 0 for cit in cits: print `i` + ": ", print cit i = i + 1 def Help(pLine, pRock): print "-" * 70 print "s {keywords}+ - Search for keywords." print "ls - List all active sets. " print "m {setnum} {n} {field} - Type 'n' citations from setnum." print "t {setnum} {n} - Type 'n' citations from setnum." print "h - Help." print "quit - Exit program." print "-" * 70 print ## ## Main ## def main(argc, argv): server = ilu.CreateServer(None, None, None); if not dllib: args = dlcoslib.ParseStandardArgs() Help(None, None) dlcoslib.cbRegisterCommand("s", Search, 0) dlcoslib.cbRegisterCommand("ls", List, 0) dlcoslib.cbRegisterCommand("m", MoreType, 0) dlcoslib.cbRegisterCommand("t", Type, 0) dlcoslib.cbRegisterCommand("type", Type, 0) dlcoslib.cbRegisterCommand("h", Help, 0) dlcoslib.cbRegisterCommand("help", Help, 0) dlcoslib.RunMainLoop() if __name__ == '__main__': main(len(sys.argv), sys.argv)