<> <> <> <<>> <> DIRECTORY Basics, FSPseudoServers, List, Rope, KeyNotePseudoServer; KeyNotePseudoServerImpl: CEDAR PROGRAM IMPORTS Basics, FSPseudoServers, List, Rope EXPORTS KeyNotePseudoServer = { ROPE: TYPE = Rope.ROPE; ServerNameReadServerList: TYPE = LIST OF ServerNameReadServerHandle; ServerNameReadServerHandle: TYPE = REF ANY; <> ServerNameReadServerObject: TYPE = RECORD [ name: ROPE, readServer: ROPE ]; <> RecomputeReadServerList: PUBLIC PROC [] = { readList: ServerNameReadServerList; LongestNamesFirst: List.CompareProc= { RETURN[Basics.CompareInt[Rope.InlineSize[NARROW[ref2, REF ServerNameReadServerObject].readServer], Rope.InlineSize[NARROW[ref1, REF ServerNameReadServerObject].readServer]]]; }; FOR psl: FSPseudoServers.PseudoServerList _ FSPseudoServers.GetPseudoServers[], psl.rest WHILE psl # NIL DO FOR readers: LIST OF ROPE _ psl.first.read, readers.rest WHILE readers#NIL DO item: REF ServerNameReadServerObject _ NEW [ ServerNameReadServerObject _ [name: psl.first.server, readServer: readers.first]]; TRUSTED {readList _ List.Nconc1[readList, LOOPHOLE[item]]; }; ENDLOOP; ENDLOOP; <> pseudoServerReadList _ List.Sort[list: readList, compareProc: LongestNamesFirst]; }; SubstituteLongestPrefixWithPseudoServer: PUBLIC PROC [fileName: ROPE] RETURNS [fileNameAfterShortening: ROPE] = { FOR psrl: ServerNameReadServerList _ pseudoServerReadList, psrl.rest WHILE psrl # NIL DO readServerPath: REF ServerNameReadServerObject _ NARROW[psrl.first]; shortened: BOOLEAN; shortenedName: ROPE; [shortened: shortened, shortenedName: shortenedName] _ TryToPseudoServerShortenFileName[readServerName: readServerPath.readServer, pseudoServerName: readServerPath.name, fileName: fileName]; IF shortened THEN RETURN[shortenedName]; ENDLOOP; RETURN[fileName]; }; TryToPseudoServerShortenFileName: PROC [readServerName: ROPE, pseudoServerName:ROPE, fileName: ROPE] RETURNS [shortened: BOOLEAN, shortenedName: ROPE] = { <Documentation>Mumble.tioga'>> <> <<'[Cyan]Documentation>'>> <> fileNameHead: ROPE; fileNameBody: ROPE; readServerNameHead: ROPE; readServerNameBody: ROPE; [head: fileNameHead, body: fileNameBody] _ GetHeadAndBody[fileName]; [head: readServerNameHead, body: readServerNameBody] _ GetHeadAndBody[readServerName]; <> IF Rope.IsPrefix[readServerNameBody, fileNameBody, FALSE] THEN { equivalentHeads: LIST OF ROPE _ GetPseudoServers[fileNameHead]; <> FOR heads: LIST OF ROPE _ equivalentHeads, heads.rest WHILE heads#NIL DO IF Rope.Equal[heads.first,BracketServerName[readServerNameHead]] THEN RETURN[shortened: TRUE, shortenedName: Rope.Concat[BracketServerName[pseudoServerName], Rope.Substr[base: fileNameBody, start: Rope.Length[readServerNameBody]] ] ]; ENDLOOP; }; RETURN[shortened: FALSE, shortenedName: NIL]; }; GetHeadAndBody: PROC [name: ROPE] RETURNS [head: ROPE, body: ROPE] = { endOfHead: INT _ Rope.Find[s1: name, s2: "]", pos1: 0, case: FALSE]; head _ Rope.Substr[name, 1, endOfHead-1]; body _ Rope.Substr[name, endOfHead+1]; }; BracketServerName: PROC [name: ROPE] RETURNS [bracketedName: ROPE] = { bracketedName _ Rope.Cat[ "[", name, "]"]; }; GetPseudoServers: PROC [name: ROPE] RETURNS [servers: LIST OF ROPE] = { servers _ FSPseudoServers.TranslateForRead[name]; IF Rope.Equal[servers.first, name] THEN RETURN[LIST[BracketServerName[name]]] ELSE RETURN[servers]; }; <<>> <> pseudoServerReadList: ServerNameReadServerList; RecomputeReadServerList[]; }. <<>>