-1. I just don't see the value. - James
Thomas Broyer wrote: > > http://www.intertwingly.net/wiki/pie/PaceUnifiedEntryEditing > > == Abstract == > > Unifies editing of entries, whether they are "plain Atom" or use a > content from another media type (a.k.a. "media entries") > > == Status == > > Proposed (Thomas Broyer) > > Keep in mind that english is not my native language, so wording can be > tweaked a bit if it's too "tortured", at the discretion of the > editors... > > == Rationale == > > Have an easy-to-explain, easy-to-implement way for uploading binaries > and getting an address and a place to wrangle metadata. > > The motivation for each constraint is explained. Constraints and uses > that are copied from HTTP (for information) are explicitely marked as > is, to avoid any ambiguity and eventually let HTTP evolve without > having APP becoming out of sync and incompatible. > > Most of the content of this Pace has already been exposed here > http://www.imc.org/atom-protocol/mail-archive/msg05441.html > > == Proposal == > > In section 3 of draft-atom-protocol-09, replace definitions of > Collection and Members as follows. > > {{{ > Collection - A resource that contains a set of Entries and has at > least an Atom Feed Document representation. > > Entry - A resource that has at least an Atom Entry Document > representation. > }}} > > Then, everywhere in the document, replace {{{Members}}} with {{{Entries}}}. > > Replace section 7.2.4 with the following: > {{{ > 7.2.4 The "app:accept" element > > The app:collection element MAY contain one "app:accept" element. The > app:accept element value specifies a comma-separated list of media- > ranges [RFC2616] identifying the types of representations that can be > POSTed to the Collection's URI and will be treated as the content of the > Entry, or that can be POSTed to the Collection's URI as the inline content > of an Atom Entry Document. In particular, types of representations from > which the server will derive an Atom Entry Document representation > rather than use it as the content of the entry MUST NOT be listed here. > If the "application/atom+xml" is listed (or is matched by a listed media- > range), this means a client might send an Atom Entry Document whose > "atom:content" element contains an Atom Entry or Atom Feed Document. > Section 8.2 "Creating Entries" discusses these possible server behaviors. > Whitespace separating the media-range values is considered insignificant > and MUST be ignored. > > The app:accept element is similar to the HTTP Accept request-header > [RFC2616] with the exception that app:accept has no notion of > preference. Accordingly, the value syntax of app:accept does not use > accept-params or "q" parameters as specified in [RFC2616], section > 14.1. The order of media-ranges is not significant. The following > lists are all equivalent: > > <app:accept>image/png, image/*</app:accept> > <app:accept>image/*, image/png</app:accept> > <app:accept>image/*</app:accept> > > The special value "entry" indicates that Atom Entry Documents can be > posted to the Collection using an "atom:content" element with a type > value of "text", "html" or "xhtml". If the app:accept element is omitted, > or empty, the collection SHOULD be interpreted as if the "app:accept" > element were present with a value of "entry". > > appAccept = > element app:accept { > appCommonAttributes, > ( appTypeValue? ) > } > > appTypeValue = ( "entry" | media-type | entry-or-media-type ) > media-type = xsd:string { pattern = "(.+/.+(;.+=(".+"|.+))*,?)*" } > entry-or-media-type = xsd:string { pattern = > "entry,(.+/.+(;.+=(".+"|.+))*,?)*" } > }}} > Please note that the above patterns are not really accurate (I can > provide exact ones if needed), but as the Relax NG schema is not > normative, it shouldn't count in this Pace discussion. > > Replace sections 8, 9 and 10 with sections 8 and 9 as follows: > > {{{ > 8. Working with Collections > > Clients have two ways of interacting with Collections: they can list > Collections' membership and the can create new Entries inside > Collections. > }}} > Insert here section 9. "Listing Collections", renumbered as section > 8.1, then follow on with: > {{{ > 8.2 Creating Entries > > To add entries to a collection, clients send POST requests to the > collection's URI. The server then creates a resource with at least an > Atom Entry Document representation. > > If the body of the request is an Atom Entry Document, then the Atom > Entry Document representation of the created resource MUST be derived > from it. For example, servers might mint a new "atom:id" value, fix > spelling > errors in textual content, add or remove categories, make an inline > content > out-of-line (if possible), etc. > > If the body of the request is not an Atom Entry Document, then the Atom > Entry Document representation of the created resource MAY use the > body of the request (or a derived form) as the content of the entry, > either > inlined in the atom:content element or referenced using a "src" attribute. > [EMAIL PROTECTED]@: note that this leaves place for implementing 2WayRSS, > Annotea, HTML-form (multipart/x-form-data) processing or other protocols > at the same URI] > > This specification does not define what's the result of POSTing an Atom > Feed Document and servers MAY reject such entities using 422 > (Unprocessable Entity) or 400 (Bad Request) status codes. > > If an entry was created in the collection which received the POST, its URI > (the URI of the Atom Entry Document) MUST be returned in a Location > header in the 201 ("Created") response. If the entry has been accepted but > not yet created, the URI where it will be available (if it ever is) > MUST be > returned in a Location header in the 202 ("Accepted") response. > > Clients MUST NOT assume that the URI provided by the Location header can > be used to edit the created entry: the created entry MAY NOT be editable, > or the URI used to edit it MAY be a different one. Section 9.1.1 > discusses how > servers indicate the URI to be used to edit an entry. > > As clients are likely to issue a GET to the URI given in the Location > header > of 201 ("Created") responses, to retrieve at least some basic information > such the entry's atom:id, a server might want to return the entry in the > body of the response. Per [HTTP/1.1], to unambiguously tell the client > that > the response body is a representation of the resource identified by the > URI in the Location header, the server has to include a Content-Location > header with the same value. To remove any ambiguity with respect to URI > normalization and comparison, this specification allows clients to > OPTIONALLY compare Location and Content-Location values character by > character. Even in the presence of such a Content-Location header (with > the > same value as the Location response header), clients MUST NOT assume that > the response body is an Atom Entry Document, as content negotiation might > have been used. If the response body is an Atom Entry Document, clients > MUST NOT assume that it is a full representation of the member resource or > the exact same representation that could be retrieved at the URI given in > the Location header. > > Collections MAY impose constraints on the media-types of request entities > POSTed to the collection and MAY generate a response with a status code > of 415 ("Unsupported Media Type"). [EMAIL PROTECTED]@: not sure this is the > place to > talk about it, maybe near app:accept would be a better place] > > 8.3 Examples of Entry Creation > > This section contains examples of sending an Atom Entry and a JPEG image > to a collection. > > 8.3.1 Sending an Atom Entry to a Collection > > Below, the client sends a POST request containing an Atom Entry to the URI > of the Collection: > > POST /edit/myblog/entries HTTP/1.1 > Host: example.org > User- Agent: Thingio/1.0 > Content- Type: application/atom+xml > Content- Length: nnn > > <?xml version="1.0" ?> > <entry xmlns="http://www.w3.org/2005/Atom"> > <title>Atom-Powered Robots Run Amok</title> > <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> > <updated>2003-12-13T18:30:02Z</updated> > <author><name>John Doe</name></author> > <content>Some text.</content> > </entry> > > The server signals a successful creation with a status code of 201. The > response includes a "Location" header indicating the URI of the Atom > Entry and a representation of that entry in the body of the response > (the server indicates that the entry is a representation of the created > resource with the "Content-Location header", having the same value as > the "Location" header). > > HTTP/1.1 201 Created > Date: Fri, 7 Oct 2005 17:17:11 GMT > Content- Length: nnn > Content- Type: application/atom+xml; charset="utf-8" > Content- Location: http://example.org/edit/myblog/entries/first > Location: http://example.org/edit/myblog/entries/first > > <?xml version="1.0"?> > <entry xmlns="http://www.w3.org/2005/Atom"> > <title>Atom-Powered Robots Run Amok</title> > <id>tag:example.org,2005-10-07:myblog:entries:first</id> > <updated>2005-10-07T17:17:11Z</updated> > <author><name>John Doe</name></author> > <content>Some text.</content> > <link rel="alternate" type="text/html" > href="http://example.org/myblog/entries/first" /> > <link rel="edit" type="application/atom+xml" > href="http://example.org/edit/myblog/entries/first" /> > </entry> > > Note that the entry created by the server does not exactly match the > entry POSTed by the client. In particular, the server has changed the > values > of various elements in the entry such as the atom:id and atom:updated, and > has added an atom:link with a rel value of "alternate" to communicate the > URI of an alternate representation (here, in HTML) of the entry, and an > atom:link with a rel value of "edit" (this is discussed in Section 9.1.1). > > 8.3.2 Sending a JPEG image to a collection > > Below, the client sends a POST request containing a JPEG image to the URI > of the Collection, along with a Title header and authorization > credentials: > > POST /edit/myblog/photos HTTP/1.1 > Host: example.org > User- Agent: Thingio/1.0 > Content- Type: image/jpeg > Content- Length: nnn > Title: Sunrise on Miami Beach > Authorization: Basic ZG9lOmpvaG4= > > ...binary data... > > The server signals a successful creation of the resource and its Atom > Entry Document representation with a status code of 201. The > response includes a "Location" header indicating the URI of the Atom > Entry and a representation of that entry in the body of the response > (the server indicates that the entry is a representation of the created > resource with the "Content-Location" header, having the same value as > the "Location" header). > > HTTP/1.1 201 Created > Date: Fri, 7 Oct 2005 17:17:11 GMT > Content- Length: nnn > Content- Type: application/atom+xml; charset="utf-8" > Content- Location: > http://example.org/myblog/photos/SunriseOnMiamiBeach.atom > Location: http://example.org/myblog/photos/SunriseOnMiamiBeach.atom > > <?xml version="1.0"?> > <entry xmlns="http://www.w3.org/2005/Atom"> > <title>Sunrise on Miami Beach</title> > <id>tag:example.org,2005-10-07:myblog:photos:SunriseOnMiamiBeach</id> > <updated>2005-10-07T17:17:11Z</updated> > <author><name>John Doe</name></author> > <summary>Sunrise on Miami Beach</summary> > <content type="image/jpeg" src="SunriseOnMiamiBeach.jpg" /> > <link rel="edit" type="application/atom+xml" > > href="http://example.org/edit/myblog/photos/SunriseOnMiamiBeach.atom" > /> > <link rel="edit" type="image/jpeg" > > href="http://example.org/edit/myblog/photos/SunriseOnMiamiBeach.jpg" > /> > </entry> > > Note that the server here has used the provided title to mint the URI > of the created resource along with its "atom:id". It has also used it as > the entry summary, which is mandatory for the entry to be a valid Atom > Entry Document. Here, the author of the entry might have been derived > from the authenticated user, or it might have been defined by a server > configuration. > > 9. Working with Entries > > There are two ways of interacting with Entries: editing them to update > their content and deleting them. > > 9.1 Editing Entries > > Editing an Entry consists in sending an updated representation of the > Entry to the server using a PUT request. The IRI to which to send the > updated representation is called the representation's Edit IRI and each > representation might have its own Edit IRI. > As every Entry has a mandatory Atom Entry Document representation, > this representation's Edit IRI is also called the Entry's Edit IRI. > > 9.1.1 Retrieving the representation's Edit IRI > > Servers expose every editable representation of an Entry by including > links with a rel value of "edit" in its Atom Entry representation. Each > one > of these links identifies an editable representation and gives its Edit > IRI > as the value of the "href" attribute. > > Clients selects the appropriate representation's Edit IRI depending on > the media type and language of the updated representations it wants > to send to the server. > > In Atom Feed representations of Collections, servers MAY expose only > a single link with a rel value of "edit", whose href value identifies the > Atom Entry Document representation of the Entry, where every other > editable representation will be exposed. Consequently, clients SHOULD > retrieve the Atom Entry Document representation of an Entry in order to > discover every one of its editable representations. > > 9.1.1.1 The "edit" Link Relation > > An atom:entry element MUST NOT contain more than one link with a rel > value of "edit" that has the same combination of type and hreflang > attribute values. If the type attribute is not present, the link > element MUST > be interpreted as if it were present with a value of > "application/atom+xml". > If the hreflang attribute is not present, the element MUST be interpreted > as if it were present with a value equal to the in-scope "xml:lang" > attribute > value, defaulting to the Content-Language HTTP header value if there is > no in-scope "xml:lang" attribute, and to an undefined language if there is > no Content-Language header either. > > On a link with a rel value of "edit", a type value of > "application/atom+xml" > always identifies an Atom Entry Document representation, never an > Atom Feed Document. > > The meaning of a link with a rel value of "edit" at the feed level > (i.e. as a > direct child of an atom:feed element) is not defined. > > 9.1.2 Updating an Entry > > To update an Entry, clients send an updated representation in the body > of a PUT request to the appropriate representation's Edit IRI. > > To avoid lost updates, clients SHOULD send precondition headers (e.g. > If-Not-Modified-Since or If-Match) in their PUT requests. This also means > servers SHOULD send accurate values in Last-Modified or ETag headers > and SHOULD honour precondition headers, responding with a 412 > (Precondition Failed) status code when appropriate. > [EMAIL PROTECTED]@: should we add an informative reference to > http://www.w3.org/1999/04/Editing/ @] > > 9.1.3. Editing Entries with Unrecognized Metadata > > To avoid unintentional loss of data, Atom Protocol clients SHOULD preserve > all metadata, including HTTP entity-headers and unknown HTTP headers and > unknown foreign markup as defined in Section 6 of [RFC4287], which has > not been intentionally modified. > > 9.2 Deleting Entries > > To delete an entry and remove it from collections, clients send a DELETE > request to the Entry's Edit IRI, i.e. the Edit IRI of the Atom Entry > Document > representation of the Entry. > > If an Entry can be deleted but its Atom Entry Document is not editable, a > server still has to expose a link with a rel value of "edit" and a type > value > of "application/atom+xml" and it will respond to PUT requests with a 4xx > status code (for example, 405 Method Not Allowed, 403 Forbidden > or 401 Unauthorized). > }}} > > == Impacts == > > Actually makes things even better > > == Notes == > >
