On Sun, Jan 6, 2013 at 8:15 PM, Robert Sayre <say...@gmail.com> wrote:

> On Sun, Jan 6, 2013 at 4:01 PM, Robert Sayre <say...@gmail.com> wrote:
> > On Sun, Jan 6, 2013 at 3:35 PM, Paul C. Bryan <pbr...@anode.ca> wrote:
> >>
> >>
> >> Common concurrent editing algorithms should, in my opinion, use
> techniques
> >> to ensure the state of the resource (relative to the edits) is known. In
> >> HTTP, we have ETag and If-Match/If-None-Match preconditions. In JSON
> Patch,
> >> we have (a rudimentary) test operation.
> ...
> > links to make sure we're not talking past each other:
>
> Actually, let me restate my point in terms of RFC5789 (HTTP PATCH).
> That will make it easier to communicate.
>
> RFC 5789 Section 2.2 (Error Handling) defines error conditions which
> correspond directly to the point at hand: 'Conflicting state' and
> 'Conflicting modification'. Section 5 of the JSON Patch document
> directly references RFC5789, Section 2.2.
>
> With that in mind, let's note that there are several normative
> requirements in the JSON Patch document directed at conflicting state.
> One such example is from Section 4.2 'remove'. It reads: "The target
> location MUST exist for the operation to be successful.". If a server
> received an HTTP JSON Patch request attempting to delete a
> non-existent location, this text from RFC5789 would seem to apply:
>
> "Conflicting state:  Can be specified with a 409 (Conflict) status
>       code when the request cannot be applied given the state of the
>       resource.  For example, if the client attempted to apply a
>       structural modification and the structures assumed to exist did
>       not exist ..."
>
> The text above wouldn't be necessary in JSON Patch or RFC5789 if
> RFC5789 required checking ETags and preconditions for all use cases
> (it doesn't). The larger point is that RFC5789, and patch formats in
> general, make all sorts of allowances for *non-conflicting* concurrent
> edits to a common ancestor. The problem with leaving this JSON Pointer
> array ambiguity in the draft is that patch messages which should
> trigger '409 Conflict' errors can be mistakenly and 'successfully' (in
> the HTTP sense) applied to a different structure than intended.
>
> In summary, the JSON Patch draft allows patch documents to be
> formulated that make it impossible to correctly implement RFC5789, a
> normative reference.
>
> Here are the questions the IESG focuses on during review:
> "Reviews should focus on these questions: 'Is this document a
> reasonable basis on which to build the salient part of the Internet
> infrastructure? If not, what changes would make it so?'"
>
> For JSON Patch, the answer to the first question is 'no', because of a
> deficiency in JSON Pointer. The change needed to make these documents
> acceptable as part of the Internet infrastructure is to make Arrays
> explicit in JSON Pointer syntax.
>
> - Rob
>

For me the deficiency is not in the pointer, but patch format being
generated.

One approach is to push that *one* test, structure conformity, into the
pointer syntax. Another is via the type operation.

If a vague patch is generated, vague results are to be expected.

Testing for *just* the structure does not really create a verbose patch
either. Which is why I am not overly in favor of a syntax specific to
arrays, with this argument.

For example, if you are replacing a key in a object, the json-pointer to
get there, *and* the value would be required to ensure it is not
vague. Setting /a/b/c to 6 when it was 4, and applying that patch without
such tests to a document where /a/b/c is 13, is also vague.

Without tests, the patch format is optimistic at best, there is no escaping
this fact. Changing the spec for the json-pointer syntax to address
vagueness in json-patch specification seems wrong to me.

If json-pointer is not well suited, because of the desire for a descriptive
path which includes structure and value, perhaps a different specification
is need. One that provides both path, structure, and value confirmation in
the pointer string. Though at that point is more of a query path, so
something like JsonPath (http://goessner.net/articles/JsonPath/)?

I prefer the test/type operations and the json-pointer specification, with
optimistic patches.

-- 
Matthew P. C. Morley

Reply via email to