During the week of 9th-13th February 2004, the various designers and implementors of SRW 1.1 froze the specification ready for release, but at the last moment decided to put in a few more days of implementation work and interoperability testing, to check that the specification really was as clear as it appeared to be.
As is the way with these things, those few days turned up numerous compatibility issues between the various implementations: some of them were simply bugs, but others showed places where ambiguities in the SRW specification left space for mutually incompatible implementations to exist while both being technically compliant. The extra tightening of the specification during those few days made them among the most productive of the entire year-long SRW 1.1 design period.
As a salutory example of the kinds of issues that can arise, here is an single, continuous, unretouched extract from an irc session between Rob ``Azaroth'' Sanderson and Ralph ``The Wonder-Llama'' LeVan, as they tested their clients against each others' servers.
To be clear: it's not that this specific conversation is overwhelmingly fascinating; just that it's a set of good examples of the kinds of things that can go wrong when two people set out independently to code what they expect to be interoperating systems on the basis of what seems to be solid, unambiguous specifications.
Enjoy!
~#srw~<azaroth> Ralph, can you hit up my server with some requests? ~#srw~<azaroth> http://srw.cheshire3.org:8080/l5r ~#srw~<azaroth> Preferably SRW rather than SRU ~#srw~* Ralph Cranking up client software ~#srw~<azaroth> Thanks ~#srw~<Ralph> Oh, cheshire*3* ~#srw~<azaroth> *nods* ... goes to look at the trace you just created :) ~#srw~<azaroth> Missing version parameter ~#srw~<Ralph> Sent a scan request. SOmething blew up ~#srw~<Ralph> Why a blow up and not a diagnostic? ~#srw~<azaroth> SOAP tk requires version to be present, so it doesn't get to my application code before it fails it ~#srw~<Ralph> Nasty. That's going to get us a lot of phone calls asking for looks into logs ~#srw~<azaroth> Worked that time ~#srw~<Ralph> scanRequest.setVersion("1.1"); ~#srw~<Ralph> Sorry. Crummy paste ~#srw~<Ralph> Invalid element in gov.loc.www.zing.cql.xcql.SearchClauseType - searchClause ~#srw~<Ralph> My toolkit didn't like your response ~#srw~* azaroth puts in debugging ... can you resend the request? ~#srw~<Ralph> At which point I pause and wonder how I get a peek at what you sent me ~#srw~* Ralph sends again ~#srw~* azaroth goes to check the namespace for XCQL... ~#srw~<azaroth> Gah. Ooops :) ~#srw~<azaroth> Try now? ~#srw~* Ralph starts up tcpmon ~#srw~<azaroth> That's one way of doing it ~#srw~<azaroth> Any better with the right namespace for XCQL? ~#srw~<Ralph> Nope, still same complaint about searchClause ~#srw~<azaroth> Err ~#srw~* azaroth goes to look at schema this time ~#srw~<azaroth> Oh! ~#srw~<azaroth> Hmmm. ~#srw~<azaroth> xScanClause is a searchClause, it doesn't /contain/ a searchClause ~#srw~<Ralph> You've got a searchClause and a scanClause in the echoed response ~#srw~<azaroth> As opposed to xQuery which contains the query ~#srw~<azaroth> I think that's a schema bug, personally ~#srw~<azaroth> Currently the schema wants: <srw:xScanClause><xcql:index>...</xcql:index>...</xcql:term></ srw:xScanClause> ~#srw~<azaroth> As opposed to xQuery on searchResponse which wants: <srw:xQuery><xcql:searchClause>...</xcql:searchClause></srw:xQuery> ~#srw~<azaroth> Can't check Adam's implementation as he points at LC which doesn't do scan. ~#srw~<Ralph> I'm setting xScanClause in the response too. Let me grab mine and compare them. I'll send you an email ~#srw~<azaroth> You do it as per the schema ~#srw~<azaroth> (unsurprisingly) ~#srw~* azaroth goes the check what the documentation says should happen ~#srw~<Ralph> Oops. Poked your server instead of mine. Sorry. ~#srw~<azaroth> *grins* ~#srw~<azaroth> Hmm. Documentation is totally ambiguous ~#srw~<azaroth> I guess I'll just fix my implementation to the schema ~#srw~<azaroth> But I'll note the interop issue on list ~#srw~* Ralph sent email ~#srw~<azaroth> *nods* Yup, I have an extraneous searchClause wrapper ~#srw~<azaroth> Any trouble with search? ~#srw~<Ralph> You made me blow up! ~#srw~<azaroth> Heh. ~#srw~<Ralph> You sent back an empty records element ~#srw~<azaroth> Want an email with the xml sent? ~#srw~<Ralph> Nope, the tcpmon works like a charm ~#srw~<azaroth> Is that illegal? ~#srw~<Ralph> I don't know. I guess I omit it when there are no records. It looked like I got records back from you ~#srw~<Ralph> so I tried to read one and blew up. ~#srw~* Ralph fixes code ~#srw~<Ralph> What's a guy got to do to get a hit on your db? ~#srw~<azaroth> *lol* ~#srw~<azaroth> dc.title any sword ~#srw~<azaroth> Unless you want to hit on my database, then I suggest psychiatric analysis ~#srw~<Ralph> getting a record this time ~#srw~<Ralph> blew up again! ~#srw~<Ralph> Ooo. String packing. ~#srw~<Ralph> Well, I didn't do anything smart with the response, but that's just dumb client code. ~#srw~<Ralph> I seem to think I got something real and I love what I see in tcpmon ~#srw~* azaroth grins ~#srw~<azaroth> Going down for a sec ~#srw~<azaroth> Back up ~#srw~<azaroth> Drat forgot the namespace ~#srw~<Ralph> We've just about exhaused my SRW client capabilities. ~#srw~<Ralph> I'm going to try to poke your SRU server with my latest stylesheet and see how that works out. ~#srw~<Ralph> It'll take a few minutes to change the server-side stylesheet into a client side one. (Mostly references to other stylesheets.) ~#srw~<azaroth> Okay, I think I've fixed my scanResponse ~#srw~<Ralph> Okay, I'll send you a scanRequest ~#srw~<Ralph> Like a charm!!! ~#srw~<azaroth> Ugly hack, but it should work? ~#srw~<azaroth> Cool :) ~#srw~<azaroth> idle to get coffee ~#srw~<Ralph> Why doesn't http://srw.cheshire3.org:8080/l5r?operation=explain work? ~#srw~<Ralph> But when I send http://srw.cheshire3.org:8080/l5r?stylesheet=pooh I get a snotty diagnostic about missing mandatory operation! ~#srw~<Ralph> And, you ignored my stylesheet request. (Which might well be ill-formed.) ~#srw~<azaroth> version ~#srw~<azaroth> Err, maybe not ~#srw~<Ralph> Version wasn't required on the second request ~#srw~<azaroth> First issue solved (make record non mandatory) ~!all~*<* Signoff: Ralph (Read error: Connection reset by peer) ~#srw~*>* Ralph (~levan@132.174.124.10) has joined channel #srw ~#srw~<Ralph> Damn! My machine crashed! ~#srw~<Ralph> Did I miss an explanation for my problems? ~#srw~<azaroth> I fixed the first issue ~#srw~<azaroth> Which was that I had made record mandatory. Ooops ~#srw~<azaroth> So I couldn't serialise. ~#srw~<azaroth> Second -- I thought we decided that there was only one way when version wasn't mandatory, and that was when there were no parameters ~#srw~<azaroth> But as soon as you give a parameter, you need to give all the mandatory ones ~#srw~<Ralph> Did I just kill you with this or did you just bounce your server? ~#srw~<Ralph> http://srw.cheshire3.org:8080/l5r?operation=explain&version=1.1 ~#srw~<azaroth> It crashed during serialisation ~#srw~<Ralph> You seem to be okay now, including echoing back my stylesheet! ~#srw~<azaroth> *nods* ~#srw~<azaroth> Don't you want file://d:\\xsl\\explainResponse.xsl ? ~#srw~<azaroth> Also, what would it take to install your client? ~#srw~<azaroth> I'm JDK 1.4.2, linux ~#srw~* Ralph burps and rubs tummy ~#srw~<azaroth> *grins* ~#srw~<Ralph> Sorry, I was forced to go eat a cookie to celebrate the opening of a branch of our corporate library ~#srw~* azaroth hates it when that happens ~#srw~<Ralph> So, you want my source? I'll email it to you. ~#srw~<Ralph> Well, give me a minute to figure out how many jars it needs. ~#srw~<azaroth> *nods* ~#srw~<azaroth> Just the client stuff is good. I don't have all the kit necessary to run the server ~#srw~* Ralph sends client via email ~#srw~<azaroth> Thanks :) ~#srw~<Ralph> It's 7:30 your time, isn't it? You should stop doing this for a while! ~#srw~<azaroth> S'okay, I start work at like 11:00 ~#srw~<azaroth> I might convince Jen to start working on dinner though ~#srw~<azaroth> Erk. Of those jars, I have ... commons-logging ~#srw~* Ralph sends more jars via email ~#srw~<Ralph> Damn if I can figure out how to get my local stylesheet read. I know I've done it before. ~#srw~<azaroth> Send me the stylesheet and I'll put it in the server? :) ~#srw~<azaroth> Put it in webspace somewhere else and point to it there? ~#srw~<azaroth> Got the jars email, many thanks :) ~#srw~<azaroth> Woo! ~#srw~<azaroth> [azaroth@mithlond srw]$ ../j2sdk1.4.2/bin/java -cp "srw.jar:axis-1_> 2.jar:jaxrpc.jar:commons-logging.jar:commons-discovery.jar:saa j.jar" ORG.oclc.os.SRW.SRWClient ~#srw~<azaroth> 20 terms returned ~#srw~<Ralph> Congrats! Looks like it works! ~#srw~<azaroth> Yup. ~#srw~<Ralph> Crap! ~#srw~<azaroth> ? ~#srw~<Ralph> My stylesheet problem looks like a browser security issue. ~#srw~<Ralph> When I send the request to you through tcpmon, it works ~#srw~<azaroth> Did Theo say something about having to open up all sorts of permissions to get things like that working? ~#srw~<Ralph> Well, I looked at the security stuff a few minutes ago and didn't see anything appropriate ~#srw~<azaroth> Does your SRU support it? ~#srw~<azaroth> Yup. Mozilla doesn't process either ~!all~*<* Signoff: Ralph (Read error: Connection reset by peer)
(There's much more, but this gives the flavour.)