- From: David Hull <dmh@tibco.com>
- Date: Tue, 17 May 2005 01:32:31 -0400
- To: "public-ws-addressing@w3.org" <public-ws-addressing@w3.org>
- Message-id: <428981EF.5060405@tibco.com>
Last week, Umit suggested I produce a set of test cases to help clarify the rules in section 3.2 (and whatever else they pull in by reference). While I didn't think that was necessary to make the immediate point I was trying to make, I think it could be very useful in focusing the overall discussion. For our purposes here, there are essentially 5 headers whose presence or absence matters: [destination], [action], [reply endpoint], [fault endpoint], [message id]. There are other possibilities to consider, for example the case of a [relationship] that already contains a reply relationship, but I won't consider them here. It also doesn't matter here whether a reply or fault endpoint is anonymous or even valid, and I'm not considering transport-level failures and similar faults. These all need to be considered, but they are also an issue outside the context of formulating a reply. To this end, I'll model the rules in terms of what MAPs the receiver generates, as opposed to what might get delivered where. In this view, the rules are a function taking an incoming message and producing one of the following constraints: * The receiver MUST generate a response message (is that the right term?) with given MAPs. * The receiver MUST generate a fault message with given MAPs and given fault. * The receiver may generate whatever it likes. So for each of the 32 possible inputs, we need to specify exactly what constraints the rules produce. I'm deliberately saying "constraints" and not "behavior" here. It's fine if we don't constrain behavior in some cases -- in fact, we know we want this in the case where none of the properties has a value -- but we need to be able to say unequivocally that that's the case. There's a world of difference between "definitely not constrained" and "not definitely constrained". In a capricious attempt to apply the math part of my math/CS degree, I'll try to define a few auxiliary functions. In a nod to the CS half, I'll give them long names instead of single italic letters and use not-completely-rigorous notation. I'll use () to designate an undefined or empty value. I've bolded places where I wasn't sure how to translate the spec. * EffectiveResponseEndpoint(MAPs) = o [reply endpoint] if [reply endpoint] is defined o else UnknownDestination * EffectiveFaultEndpoint(MAPs) = o EffectiveResponseEndpoint(MAPs) if [fault endpoint] == () o else [fault endpoint] * EffectiveDestination(MAPs, responseType) = o EffectiveResponseEndpoint(MAPs) if the reply is a normal response o EffectiveFaultEndpoint(MAPs) if the reply is a fault * UnknownDestination() = o *either (), an EPR with anonymous address and nothing else, or something transport-specific* * ReplyRelationship(MAPs) = o (replyURI, [message id]) if [message id] is defined o () otherwise * AddReply(relationship, newRel) = o relationship, if newRel = () o *else whatever we mean when we say "a new pair of IRIs is added to this value", which in turn depends on whether we view this list of ordered pairs as a relation, a function, or just a list of ordered pairs.* * Reply(MAPs, responseType) is defined by o [destination] = EffectiveDestination(MAPs, responseType) o [action] = + http://www.w3.org/2005/03/addressing/fault if responseType is-a FAULT and the fault is a WSA fault + else unconstrained o [relationship] = AddReply([relationship], ReplyRelationship(MAPs)) o [reply endpoint] unconstrained o [fault endpoint] unconstrained o [message id] != (), otherwise unconstrained Unconstrained() means no constraint on MAPs at all. I believe the current consensus on what the rules /ought to mean/ is given by * All MAPs = () => Unconstrained() * [reply endpoint] = () => Reply(MAPs, NO REPLY ENDPOINT FAULT) * [reply endpoint] != () o [destination] = () or [action] = () or [message id] = () => Reply(MAPs, MISSING MAP FAULT) o else Reply(MAPs, RESPONSE) Note that if the reply endpoint is missing, but a fault endpoint is present, the fault will go there, by the rules above. Otherwise, the outbound [destination] is undefined. Note also that section 3.2 is a bit looser -- it specifically doesn't say what happens if there is no [reply endpoint] but there is a [fault endpoint], because the second clause of rule 1 is specifically marked "otherwise". On the other hand, the current formulation /might well mean: / * All of [destination], [action], [reply endpoint] and [message id] defined => Reply(MAPs, RESPONSE) * Unconstrained() otherwise The a la carte rules are given by the single rule * ALaCarte(MAPs, responseType) where ALaCarte(MAPs, responseType) is a simpler version of Reply(MAPs, responseType) * [destination] = EffectiveDestination(MAPs, responseType) * [action] unconstrained * [relationship] = AddReply([relationship], ReplyRelationship(MAPs)) (if [message id] is missing, this ends up being the original [relationship]) * [reply endpoint] unconstrained * [fault endpoint] unconstrained * [message id] unconstrained In any of these case, the full 32-case table can be produced mechanically, with assertions based on everything that's not "unconstrained". To take a couple of somewhat random examples: If {[destination], [action], [reply endpoint]} are defined: * Under the "ought to mean" rules: o [destination] = [fault endpoint] o [action] = http://www.w3.org/2005/03/addressing/fault o [relationship] = AddReply([relationship], (replyURI, [message id])) o all other MAPs unconstrained * Under the "might well mean" rules, Unconstrained() * Under the "a la carte" rules: o [destination] = [reply endpoint] o [relationship] = [relationship] o all other MAPs unconstrained If {[destination], [action], [fault endpoint], [message id]} are defined: * Under the "ought to mean" rules: o [destination] = [fault endpoint] o [action] = http://www.w3.org/2005/03/addressing/fault o [relationship] = AddReply([relationship], (replyURI, [message id])) o all other MAPs unconstrained * Under the "might well mean" rules, Unconstrained() * Under the "a la carte" rules: o [destination] = UnknownDestination() o [relationship] = AddReply([relationship], (replyURI, [message id])) o all other MAPs unconstrained
Received on Tuesday, 17 May 2005 05:32:50 UTC