Index: specification/types.xml =================================================================== --- specification/types.xml (revision 111) +++ specification/types.xml (revision 123) @@ -22,10 +22,10 @@

- The AMQP type system defines a set of commonly used primitive types used for interoperable - data representation. AMQP values may be annotated with additional semantic information - beyond that associated with the primitive type. This allows for the association of an AMQP - value with an external type that is not present as an AMQP primitive. For example, a URL is + The AMQP type system defines a set of commonly used primitive types for interoperable data + representation. AMQP values can be annotated with additional semantic information beyond + that associated with the primitive type. This allows for the association of an AMQP value + with an external type that is not present as an AMQP primitive. For example, a URL is commonly represented as a string, however not all strings are valid URLs, and many programming languages and/or applications define a specific type to represent URLs. The AMQP type system would allow for the definition of a code with which to annotate strings when the @@ -35,16 +35,17 @@

- The following primitive types are defined: + The AMQP type system defines a standard set of primitive types for representing both common + scalar values and common collections. The scalar types include booleans, integral numbers, + floating point numbers, timestamps, UUIDs, characters, strings, binary data, and symbols. + The collection types include arrays (monomorphic), lists (polymorphic), and maps.

- -

The primitive types defined by AMQP can directly represent many of the basic types present - in most popular programming languages, and therefore may be trivially used to exchange basic + in most popular programming languages, and therefore can be trivially used to exchange basic data. In practice, however, even the simplest applications have their own set of custom types used to model concepts within the application's domain. In messaging applications these custom types need to be externalized for transmission. @@ -69,40 +70,41 @@

- +

- Descriptor values other than symbolic () or numeric - () are, while not syntactically invalid, reserved - this includes - numeric types other than . To allow for users of the type system to - define their own descriptors without collision of descriptor values, an assignment policy - for symbolic and numeric descriptors is given below. -

+ AMQP defines a number of composite types used for encoding structured data such as + frame bodies. A composite type defines a composite value where each constituent value is + identified by a well-known named field. Each composite type definition includes an + ordered sequence of fields, each with a specified name, type, and multiplicity. Composite + type definitions also include one or more descriptors (symbolic and/or numeric) for + identifying their defined representations. Composite types are formally defined using the + XML notation defined in . +

+
-

- The namespace for both symbolic and numeric descriptors is divided into distinct domains. - Each domain has a defined symbol and/or 4 byte numeric id assigned by the AMQP working - group. For numeric ids the assigned domain-id will be equal to the IANA Private Enterprise - Number (PEN) of the requesting organisation [IANAPEN] with - domain-id 0 reserved for descriptors defined in the AMQP specification. + +

+ AMQP defines the notion of a restricted type. This is a new type derived from an + existing type where the permitted values of the new type are a subset of the values of the + existing type. Restricted types are commonly used programming constructs, the most frequent + being "enumerations" which in AMQP terminology are restrictions of the integral types. + However, the AMQP notion of restricted types can also represent more open ended restrictions + such as a URL which can be thought of as a restriction of the string type.

- Descriptors are then assigned within each domain according to the following rules: + A restricted type definition might limit the permitted values to either a pre-defined fixed + set, or an open-ended set. In the former case, each permitted value is called a + choice and all possible choices are listed in the formal type definition. In the + latter case, the nature of the restriction is specified as text in the formal type + definition.

-
-
symbolic descriptors
-
-

<domain>:<name>

-
- -
numeric descriptors
-
-

- (domain-id << 32) | descriptor-id -

-
-
+

+ The existing type from which a restricted type is derived is referred to as the + source type for the restriction. A restricted type might or might not be annotated + with a descriptor on the wire depending on the formal definition for the type. +

@@ -160,7 +162,7 @@ primitive format code for the str8-utf8 encoding - (Note: this example shows a string-typed descriptor, which should be + (Note: this example shows a string-typed descriptor, which is considered reserved) ]]> @@ -258,7 +260,7 @@

- The bits within a format code may be interpreted according to the following layout: + The bits within a format code can be interpreted according to the following layout:

- The width of a specific fixed width encoding may be computed from the subcategory of the + The width of a specific fixed width encoding can be computed from the subcategory of the format code for the fixed width value:

@@ -334,6 +336,415 @@
+ +

+ All variable width encodings consist of a size in octets followed by size octets of + encoded data. The width of the size for a specific variable width encoding can be computed + from the subcategory of the format code: +

+ + + +
+ + +

+ All compound encodings consist of a size and a count followed by count encoded items. + The width of the size and count for a specific compound encoding can be computed from the + category of the format code: +

+ + + +
+ + +

+ All array encodings consist of a size followed by a count followed by an element constructor + followed by count elements of encoded data formated as REQUIRED by the element + constructor: +

+ + + +
+ + + + +
+ +

+ Types are formally specified using an XML notation described below. Please note that this + XML notation is used only to define the type and is never used to represent encoded data. + All encoded AMQP data is binary as described in . +

+ +

+ The type element formally defines a semantic type used to exchange data on the wire. Every + type definition has the following general form. The child elements present depend upon the + class of the type definition (primitive, composite, or restricted): +

+ + + ... + +]]> + + +

+ The attributes of a type definition specify the following: +

+ +
+
name

The name of the type.

+
label

A short description of the type.

+
class

A string identifying what class of type is being defined: "primitive", + "composite", or "restricted".

+
provides

A comma separated list of archetypes (see field element).

+
+ +

+ There are three different classes of types identified by the "class" attribute: primitive, + composite, and restricted. +

+
+ + +

+ A "primitive" type definition will contain one or more encoding elements that describe how + the data is formatted on the wire. Primitive types do not contain the descriptor, field, or + choice elements. +

+ + + ... + ... + ... + +]]> + + +

+ The encoding element defines how a primitive type is encoded. The specification defines 4 + general categories of encodings: fixed, variable, compound, and array. A specific encoding + provides further details of how data is formatted within its general category. +

+ + + ... + + ... + +]]> + + +
+
name

The name of the encoding.

+
label

A short description of the encoding.

+
code

The numeric value that prefixes the encoded data on the wire.

+
category

The category of the encoding: "fixed", "variable", "compound", or + "array".

+
width

The width of the encoding or the size/count prefixes depending on the + category.

+
+
+ + +

+ A "composite" type definition specifies a new kind of record type, i.e., a type composed of + a fixed number of fields whose values are each of a specific type. A composite type does not + have a new encoding, but is sent on the wire as a list annotated by a specific descriptor + value that identifies it as a representation of the defined composite type. A composite type + definition will contain a descriptor and zero or more field elements. Composite types do not + contain encoding or choice elements. The source attribute of a composite type will always be + "list", other values are reserved for future use. +

+ + + + ... + ... + ... + +]]> + +
+ + +

+ The descriptor element specifies what annotation is used to identify encoded values as + representations of a described type. +

+ + + ... + + + ... + +]]> + + +
+
name

A symbolic name for the representation.

+
code

The numeric value.

+
+
+ + +

+ The field element identifies a field within a composite type. Every field has the following + attributes: +

+ + + ... + + ... + +]]> + + +
+
name

A name that uniquely identifies the field within the type.

+ +
type

The type of the field. This attribute defines the range of values that + are permitted to appear in this field. It might name a specific type, in which case the + values are restricted to that type, or it might be the special character "*", in which case + a value of any type is permitted. In the latter case the range of values might be further + restricted by the requires attribute.

+ +
requires

A comma separated list of archetypes. Field values are restricted + to types providing at least one of the specified archetypes.

+ +
default

A default value for the field if no value is encoded.

+
label

A short description of the field.

+
mandatory

"true" iff a non null value for the field is always + encoded.

+
multiple

"true" iff the field can have multiple values of its specified + type.

+
+
+ + +

+ A "restricted" type definition specifies a new kind of type whose values are restricted to a + subset of the values that might be represented with another type. The source attribute + identifies the base type from which a restricted type is derived. A restricted type can have + a descriptor element in which case it is identified by a descriptor on the wire. The values + permitted by a restricted type can be specified either via documentation, or directly + limited to a fixed number of values by the choice elements contained within the definition. +

+ + + + + ... + + +]]> + + +

+ The choice element identifies a legal value for a restricted type. The choice element has + the following attributes: +

+ + + ... + + ... + +]]> + + +
+
name

A name for the value.

+
value

The permitted value.

+
+
+
+ + + +
+ +

+ AMQP composite types are represented as a described list. Each element in the list is + positionally correlated with the fields listed in the composite type definition. The + permitted element values are determined by the type specification and multiplicity of the + corresponding field definitions. When the trailing elements of the list representation are + null, they MAY be omitted. The descriptor of the list indicates the specific composite type + being represented. +

+ + + +

An example composite type.

+
+ + + + + + + + + +]]> +
+ +

+ The mandatory attribute of a field description controls whether a null element value + is permitted in the representation. +

+ +

+ The multiple attribute of a field description controls whether multiple element + values are permitted in the representation. A single element of the type specified in the + field description is always permitted. Multiple values are represented by the use of an + array where the type of the elements in the array is the type defined in the field + definition. Note that a null value and a zero-length array (with a correct type for its + elements) both describe an absence of a value and MUST be treated as semantically identical. +

+ +

+ A field which is defined as both multiple and mandatory MUST contain at least one value + (i.e. for such a field both null and an array with no entries are invalid). +

+ +

+ The described list shown below is an example composite value of the book type defined + above. A trailing null element corresponding to the absence of an ISBN value is depicted in + the example, but can optionally be omitted according to the encoding rules. +

+ + + +
+
+ + + +
+ +

+ Descriptor values other than symbolic () or numeric + () are, while not syntactically invalid, reserved - this includes + numeric types other than . To allow for users of the type system to + define their own descriptors without collision of descriptor values, an assignment policy + for symbolic and numeric descriptors is given below. +

+ +

+ The namespace for both symbolic and numeric descriptors is divided into distinct domains. + Each domain has a defined symbol and/or 4 byte numeric id assigned by the AMQP working + group. For numeric ids the assigned domain-id will be equal to the IANA Private Enterprise + Number (PEN) of the requesting organisation [IANAPEN] with + domain-id 0 reserved for descriptors defined in the AMQP specification. +

+ +

+ Descriptors are then assigned within each domain according to the following rules: +

+ +
+
symbolic descriptors
+
+

<domain>:<name>

+
+ +
numeric descriptors
+
+

+ (domain-id << 32) | descriptor-id +

+
+
+
+
+ + + +
@@ -490,27 +901,6 @@ - -

- All variable width encodings consist of a size in octets followed by size octets of - encoded data. The width of the size for a specific variable width encoding may be computed - from the subcategory of the format code: -

- - - -
- @@ -550,35 +940,6 @@ label="up to 2^32 - 1 seven bit ASCII characters representing a symbolic value"/> - -

- All compound encodings consist of a size and a count followed by count encoded items. - The width of the size and count for a specific compound encoding may be computed from the - category of the format code: -

- - - -
- @@ -604,9 +965,9 @@ ]]>

- Map encodings must contain an even number of items (i.e. an equal number of keys and + Map encodings MUST contain an even number of items (i.e. an equal number of keys and values). A map in which there exist two identical key values is invalid. Unless known to - be otherwise, maps must be considered to be ordered, that is, the order of the key-value + be otherwise, maps MUST be considered to be ordered, that is, the order of the key-value pairs is semantically important and two maps which are different only in the order in which their key-value pairs are encoded are not equal.

@@ -617,140 +978,12 @@ label="up to 2^32 - 1 octets of encoded map data"/>
- -

- All array encodings consist of a size followed by a count followed by an element constructor - followed by count elements of encoded data formated as required by the element - constructor: -

- - - -
- - - - - -
- - -
- -

- AMQP defines a number of composite types used for encoding structured data such as - frame bodies. A composite type describes a composite value where each constituent value is - identified by a well-known named field. Each composite type definition includes an - ordered sequence of fields, each with a specified name, type, and multiplicity. Composite - type definitions also include one or more descriptors (symbolic and/or numeric) for - identifying their defined representations. -

- -

- Composite types are formally defined in the XML documents included with the specification. - The following notation is used to define them: -

- - - -

An example composite type.

-
- - - - - - - - - -]]> -
- -

- The mandatory attribute of a field description controls whether a null element value - is permitted in the representation. -

-

- The multiple attribute of a field description controls whether multiple element - values are permitted in the representation. A single element of the type specified in the - field description is always permitted. Multiple values are represented by the use of an - array where the type of the elements in the array is the type defined in the field - definition. Note that a null value and a zero-length array (with a correct type for its - elements) both describe an absence of a value and MUST be treated as semantically - identical. -

-

- A field which is defined as both multiple and mandatory MUST contain at least one value - (i.e. for such a field both null and an array with no entries are invalid). -

-
- - -

- AMQP composite values are encoded as a described list. Each element in the list is - positionally correlated with the fields listed in the composite type definition. The - permitted element values are determined by the type specification and multiplicity of the - corresponding field definitions. When the trailing elements of the list representation are - null, they MAY be omitted. The descriptor of the list indicates the specific composite type - being represented. -

- -

- The described list shown below is an example composite value of the book type defined - above. A trailing null element corresponding to the absence of an ISBN value is depicted in - the example, but may optionally be omitted according to the encoding rules. -

- - - -
-
- Index: specification/overview.xml =================================================================== --- specification/overview.xml (revision 111) +++ specification/overview.xml (revision 123) @@ -27,7 +27,7 @@ AMQP is comprised of several layers. The lowest level defines an efficient, binary, peer-to-peer protocol for transporting messages between two processes over a network. Above this, the messaging layer defines an abstract message format, with - concrete standard encoding. Every compliant AMQP process must be able to send and receive + concrete standard encoding. Every compliant AMQP process MUST be able to send and receive messages in this standard encoding.

@@ -102,6 +102,15 @@

+ [RFC1982] + +
R. Elz, R. Bush, + Serial Number Arithmetic. + IETF RFC 1982, August 1996.
+

+

+ [RFC2046]
N. Freed, N. Borenstein, @@ -111,15 +120,6 @@

- [RFC1982] - -
R. Elz, R. Bush, - Serial Number Arithmetic. - IETF RFC 1982, August 1996.
-

-

- [RFC2119]
S. Bradner, Key words for use in RFCs to Indicate Requirement Levels. @@ -172,6 +172,14 @@ name="http://www.ietf.org/rfc/rfc4422.txt"/>

+ [RFC4616] +
+ K. Zeilenga, Ed., The PLAIN Simple Authentication and Security Layer (SASL) + Mechanism. IETF RFC 4616, August 2006. +
+ +

+

[RFC5246] @@ -189,6 +197,14 @@ name="http://www.ietf.org/rfc/rfc5646.txt"/>

+ [RFC5802] +
+ C. Newman, A. Menon-Sen, A. Melnikov, N. Williams, Salted Challenge Response + Authentication Mechanism (SCRAM) SASL and GSS-API Mechanisms. IETF RFC 5802, July 2010. +
+ +

+

[UNICODE6] @@ -335,10 +351,96 @@

- A conformant implementation MUST perform protocol negotiation, and then parse, process, and - produce frames in accordance with the format and semantics defined in parts 1 through 5 of - this specification. + AMQP defines a wire level protocol for business messaging. The definition allows for all + common business messaging behaviors. AMQP does not define a wire-level distinction between + "clients" and "brokers", the protocol is symmetric. It is expected and encouraged that + implementations of AMQP will have different capabilities. Expectations of the capabilities + of a "client library" are different from expectations of a "broker" which are themselves + different from the capabilities of a "router". As relevant profiles emerge (where + appropriate and applicable) these will be formalised.

+

+ A conformant implementation MUST perform protocol negotiation (see ), and then parse, process, and produce frames in accordance + with the format and semantics defined in parts 1 through 5 of this specification. +

+

+ Conformant implementations MUST NOT require the use of any extensions defined outside this + document in order to interoperate with any other conformant implementation. +

+

+ Part 1 of this document defines the type system and + type encodings that every conformant implementation MUST implement. +

+

+ Part 2 defines the peer-to-peer transport protocol + which operates over TCP. Every conformant implementation of AMQP over TCP MUST implement + Part 2. Future standards mapping AMQP to protocols other than TCP MAY modify or replace Part + 2 when AMQP is being used over that protocol. A conformant implementation MUST implement + Part 2 or a mapping of AMQP to some non-TCP protocol. +

+

+ Part 2 admits behaviors that might not be appropriate for every implementation. For example + a "client library" might not allow for its communication partner to spontaneously attempt to + initiate a connection and request messages. Where an implementation does not allow for a + behavior the implementation MUST respond according to the rules defined within Part 2 of the + specification. +

+

+ Part 3 of this document defines the AMQP + Messaging Layer. Every conformant implementation which processes messages MUST implement + this part of the specification. +

+

+ Some implementations might not process messages (for example, an implementation acting as a + "router" which looks only at the routing information carried by the AMQP Transport layer). + Such implementations do not actively implement Part 3, but MUST NOT act in ways which + violate the rules of this part of the specification. +

+

+ The Messaging layer admits behaviors that might not be appropriate for all implementations + (and within an implementation all behaviors might not be available for all configurations). + Where a behavior is not admitted, the implementation MUST respond according to the rules + defined within this specification. +

+

+ Part 4 defines the requirements for + transactional messaging. Transactional messaging defines two roles, that of the + transactional resource and that of the transaction controller. A conformant + implementation SHOULD be capable of operating in one of these roles but MAY be unable + to operate in either (for instance a simplistic client library might have no ability + to act as a transaction controller and would not be expected to act as a transactional + resource). +

+

+ It is RECOMMENDED that implementations designed to act as messaging intermediaries support + the ability to act as a transactional resource. It is RECOMMENDED that implementations or + re-usable libraries provide Application Programming Interfaces to enable them to act as + transactional controllers. +

+

+ Where a behavior is not admitted, the rules defined in part 4 regarding responses to + non-admitted behaviors MUST be followed. +

+

+ Part 5 defines Security Layers to provide an + authenticated and/or encrypted transport. Implementations SHOULD allow the configuration of + appropriate levels of security for the domain in which they are to be deployed. +

+

+ Conformant implementations acting in the TCP server role are strongly RECOMMENDED to + implement (or ). Implementations acting in the TCP server role are + strongly RECOMMENDED to implement and to support commonly + used SASL mechanisms. In particular such implementations SHOULD support the PLAIN [RFC4616] and SCRAM-SHA1 [RFC5802] + mechanisms. +

+

+ Conformant implementations acting in the TCP client role SHOULD be capable of being + configured to connect to an implementation in the TCP server role that is following the + recommendations above. +

Index: specification/security.xml =================================================================== --- specification/security.xml (revision 111) +++ specification/security.xml (revision 123) @@ -21,8 +21,8 @@

Security layers are used to establish an authenticated and/or encrypted transport over which - regular AMQP traffic can be tunneled. Security layers may be tunneled through one another - (for instance a security layer used by the peers to do authentication may be tunneled + regular AMQP traffic can be tunneled. Security layers can be tunneled through one another + (for instance a security layer used by the peers to do authentication might be tunneled through a security layer established for encryption purposes).

@@ -126,18 +126,18 @@
- +

- In certain situations, such as connecting through firewalls, it may not be possible to - establish a TLS security layer using the above procedure. This might be because a deep - packet inspecting firewall sees the first few bytes of the connection 'as not being TLS'. + In certain situations, such as connecting through firewalls, it might not be possible to + establish a TLS security layer using the above procedure (for example, because a deep + packet inspecting firewall sees the first few bytes of the connection 'as not being TLS').

As an alternative, implementations MAY run a pure TLS server, i.e., one that does not expect the initial TLS-invoking handshake. The IANA service name for this is amqps and the port is - (5671). Implementations may also choose to run this pure TLS - server on other ports, should this be operationally required (e.g., to tunnel through a + (5671). Implementations MAY also choose to run this pure TLS + server on other ports, if this is operationally necessary (e.g., to tunnel through a legacy firewall that only expects TLS traffic on port 443).

@@ -232,21 +232,21 @@ +--------------------------+ -' *1 SHOULD be set to 0x0000 - *2 Ignored, so DOFF should be set to 0x02 ]]> + *2 Ignored, so DOFF SHOULD be set to 0x02 ]]>

The maximum size of a SASL frame is defined by . There is no mechanism within the SASL negotiation to negotiate a different size. The frame body of a - SASL frame may contain exactly one AMQP type, whose type encoding must have + SASL frame MUST contain exactly one AMQP type, whose type encoding MUST have . Receipt of an empty frame is an irrecoverable error.

- The peer acting as the SASL server must announce supported authentication mechanisms using - the frame. The partner must then choose one of the supported + The peer acting as the SASL server MUST announce supported authentication mechanisms using + the frame. The partner MUST then choose one of the supported mechanisms and initiate a sasl exchange.

@@ -262,7 +262,7 @@ <-- SASL-OUTCOME -------------------------------- * Note that the SASL - challenge/response step may + challenge/response step can occur zero or more times depending on the details of the SASL mechanism chosen.]]> @@ -282,7 +282,7 @@ label="advertise available sasl mechanisms">

- Advertises the available SASL mechanisms that may be used for authentication. + Advertises the available SASL mechanisms that can be used for authentication.

@@ -294,7 +294,7 @@

A list of the sasl security mechanisms supported by the sending peer. It is invalid for this list to be null or empty. If the sending peer does not require its partner - to authenticate with it, then it should send a list of one element with its value as + to authenticate with it, then it SHOULD send a list of one element with its value as the SASL mechanism ANONYMOUS. The server mechanisms are ordered in decreasing level of preference.

@@ -337,7 +337,7 @@

The DNS name of the host (either fully qualified or relative) to which the sending peer is connecting. It is not mandatory to provide the hostname. If no hostname is provided - the receiving peer should select a default based on its own configuration. + the receiving peer SHOULD select a default based on its own configuration.

@@ -347,7 +347,7 @@

- This field may already have been specified by the server name indication extension as + This field might already have been specified by the server name indication extension as described in RFC-4366 [RFC4366], if a TLS layer is used, in which case this field SHOULD either be null or contain the same value. It is undefined what a different value to those already specified means. @@ -403,7 +403,7 @@

This frame indicates the outcome of the SASL dialog. Upon successful completion of the - SASL dialog the security layer has been established, and the peers must exchange protocol + SASL dialog the security layer has been established, and the peers MUST exchange protocol headers to either start a nested security layer, or to establish the AMQP connection.

Index: specification/transactions.xml =================================================================== --- specification/transactions.xml (revision 111) +++ specification/transactions.xml (revision 123) @@ -41,7 +41,7 @@ controller over the control link to allocate and complete transactions respectively (they do not represent the demarcation of transactional work). No transactional work is allowed on the control link. Each transactional operation requested is - explicitly identified with the desired transaction-id and therefore may occur on any link + explicitly identified with the desired transaction-id and therefore can occur on any link within the controlling session, or, if permitted by the capabilities of the controller, any link on the controlling connection. If the control link is closed while there exist non-discharged transactions it created, then all such transactions are immediately rolled @@ -59,14 +59,15 @@ name="coordinator"/> cannot be resumed.

- To begin transactional work, the transaction controller must obtain a transaction identifier - from the resource. It does this by sending a message to the whose - body consists of the type in a single section. Other standard message sections such as the header section - SHOULD be ignored. This message MUST NOT be sent settled as the sender is required to - receive and interpret the outcome of the declare from the receiver. If the coordinator - receives a that has been settled by the sender, it - should with an error. + To begin transactional work, the transaction controller needs to obtain a transaction + identifier from the resource. It does this by sending a message to the whose body consists of the type in a single + section. Other standard message sections such as the + header section SHOULD be ignored. This message MUST NOT be sent settled as the sender is + REQUIRED to receive and interpret the outcome of the declare from the receiver. If the + coordinator receives a that has been settled by the + sender, it SHOULD with an error.

If the declaration is successful, the coordinator responds with a disposition outcome of @@ -134,7 +135,7 @@ type="type" name="transfer"/> pre-settled.

- Should the coordinator be unable to complete the , the coordinator + If the coordinator is unable to complete the , the coordinator MUST convey the error to the controller as a . If the for the link to the supports the outcome, then the message MUST be The , , and frames may travel in either direction, i.e., from the controller + type="type" name="flow"/> frames can travel in either direction, i.e., from the controller to the resource and from the resource to the controller. When these frames travel from the controller to the resource, any embedded txn-ids are requesting that the resource assigns transactional work to the indicated transaction. When traveling in the other direction, from @@ -252,11 +253,11 @@

If the transaction controller wishes to associate an outgoing with a - transaction, it must set the state of the transfer with a + transaction, it MUST set the state of the transfer with a carrying the appropriate transaction identifier. Note that if delivery is split across several frames then all frames MUST be explicitly associated with the same transaction. It is an error for the controller to attempt to discharge a - transaction against which a partial delivery has been posted. Should this happen, the + transaction against which a partial delivery has been posted. If this happens, the control link MUST be terminated with the error.

@@ -298,8 +299,8 @@

On receiving a non-settled delivery associated with a live transaction, the transactional - resource must inform the controller of the presumptive terminal outcome before it can - successfully discharge the transaction. That is, the resource must send a performative which covers the posted transfer with the state of the delivery being a with the correct transaction identified, and a terminal outcome. This informs the controller of the outcome that will be in effect at @@ -310,7 +311,7 @@

- The transaction controller may wish to associate the outcome of a delivery with a + The transaction controller might wish to associate the outcome of a delivery with a transaction. The delivery itself need not be associated with the same transaction as the outcome, or indeed with any transaction at all. However, the delivery MUST NOT be associated with a different non-discharged transaction than the outcome. If this happens then the @@ -364,13 +365,13 @@

- On a successful , the resource will apply the given outcome and may + On a successful , the resource will apply the given outcome and can immediately settle the transfers. In the event of a controller-initiated rollback (a where the fail flag is set to true) or a resource-initiated rollback (the message being rejected, or the link to the being detached with an error), the outcome will not be applied, and the deliveries will still be "live" and will remain acquired by the controller, i.e., the - resource should expect the controller to request a disposition for the delivery (either + resource can expect the controller to request a disposition for the delivery (either transactionally on a new transaction, or non-transactionally).

@@ -379,14 +380,13 @@

In the case of the frame, the transactional work is not necessarily directly initiated or entirely determined when the frame arrives at the resource, but may in fact occur at some later point and + name="flow"/> frame arrives at the resource, but can in fact occur at some later point and in ways not necessarily anticipated by the controller. To accommodate this, the resource - associates an additional piece of state with outgoing link endpoints, an optional - txn-id that identifies the transaction with which acquired messages will be - associated. This state is determined by the controller by specifying a txn-id entry - in the properties map of the flow frame. When a transaction is discharged, the - txn-id of any link endpoints will be - cleared. + associates an additional piece of state with outgoing link endpoints, a txn-id that + identifies the transaction with which acquired messages will be associated. This + state is determined by the controller by specifying a txn-id entry in the + properties map of the flow frame. When a transaction is discharged, the txn-id + of any link endpoints will be cleared.

@@ -399,7 +399,7 @@ not affect the level of outstanding credit. To prevent the sending link endpoint from acquiring outside of any transaction, the controller SHOULD ensure there is no outstanding credit at the sender before it discharges the transaction. The controller - may do this by either setting the drain mode of the sending link endpoint to true + can do this by either setting the drain mode of the sending link endpoint to true before discharging the transaction, or by reducing the link-credit to zero, and waiting to hear back that the sender has seen this state change.

@@ -464,7 +464,7 @@

The transport layer defines a notion of settlement which refers to the point at which the association of a delivery-tag to a delivery attempt is forgotten. Transactions do not in - themselves change this notion, however the fact that transactional work may be rolled back + themselves change this notion, however the fact that transactional work can be rolled back does have implications for deliveries which the endpoint has marked as settled (and for which it can therefore no longer exchange state information using the previously allocated transport level identifiers). @@ -475,8 +475,8 @@

Delivery Sent Settled By Controller

The delivered message will not be made available at the node until the transaction has been successfully discharged. If the transaction is rolled back then the delivery - is not made available. Should the resource be unable to process the delivery it MUST - NOT allow the successful discharge of the associated transaction. This may be + is not made available. If the resource is unable to process the delivery it MUST + NOT allow the successful discharge of the associated transaction. This can be communicated by immediately destroying the controlling link on which the transaction was declared, or by rejecting any attempt to discharge the transaction where the fail flag is not set to true. @@ -493,7 +493,7 @@ If the transaction is rolled back then the delivery is not made available at the target. If the resource can no longer apply the outcome that it originally indicated would be the result of a successful discharge then it MUST NOT allow the successful - discharge of the associated transaction. This may be communicated by immediately + discharge of the associated transaction. This can be communicated by immediately destroying the controlling link on which the transaction was declared, or by rejecting any attempt to discharge the transaction where the fail flag is not set to true.

@@ -502,8 +502,8 @@

Behavior prior to discharge is the same as the previous case.

After a successful discharge, the state of unsettled deliveries at the resource MUST - reflect the outcome that was applied. If the discharge was unsuccessful then no - outcome should be associated with the unsettled deliveries. The controller SHOULD + reflect the outcome that was applied. If the discharge was unsuccessful then an + outcome SHOULD NOT be associated with the unsettled deliveries. The controller SHOULD settle any outstanding unsettled deliveries in a timely fashion after the transaction has discharged.

@@ -519,14 +519,14 @@
Delivery Sent Unsettled By Resource; Controller Settles

Upon a successful discharge the outcome specified by the controller is applied at - the source. Should the controller request a rollback or the discharge attempt be + the source. If the controller requests a rollback or the discharge attempt be unsuccessful, then the outcome is not applied. At this point the controller can no longer influence the state of the delivery as it is settled, and the resource MUST apply the default outcome.

Delivery Sent Unsettled By Resource; Controller Does Not Settle
-

The resource may or may not settle the delivery before the transaction is +

The resource might or might not settle the delivery before the transaction is discharged. If the resource settles the delivery before the discharge then the behavior after discharge is the same as the case above.

@@ -626,7 +626,7 @@ - +

If set, this flag indicates that the work associated with this transaction has failed, @@ -644,7 +644,7 @@

- A transaction-id may be up to 32 octets of binary data. + A transaction-id can be up to 32 octets of binary data.

Index: specification/transport.xml =================================================================== --- specification/transport.xml (revision 111) +++ specification/transport.xml (revision 123) @@ -20,11 +20,12 @@
- + +

An AMQP network consists of nodes connected via links. Nodes are named entities responsible for the safe storage and/or delivery of messages. - messages can originate from, terminate at, or be relayed by nodes. + Messages can originate from, terminate at, or be relayed by nodes.

@@ -32,18 +33,19 @@ a terminus. There are two kinds of terminus: sources and targets. A terminus is responsible for tracking the state of a particular stream of incoming or outgoing messages. Sources track outgoing messages and targets track - incoming messages. Messages may only travel along a link if they meet the entry criteria at + incoming messages. Messages only travel along a link if they meet the entry criteria at the source.

As a message travels through an AMQP network, the responsibility for safe storage and - delivery of the message is transferred between the nodes it encounters. The link - protocol (defined in ) manages the transfer of responsibility - between the source and target. + delivery of the message is transferred between the nodes it encounters. The + link protocol (defined in ) manages the transfer of + responsibility between the source and target.

- +

- Nodes exist within a container. Examples of containers are brokers - and client applications. Each container may hold many nodes. Examples of AMQP - nodes are producers, consumers, and queues. Producers - and consumers are the elements within an application that generate and process messages. - Queues are entities that store and forward messages. + Nodes exist within a container. Examples of containers are + brokers and client applications. Each container MAY hold many + nodes. Examples of AMQP nodes are producers, consumers, and + queues. Producers and consumers are the elements within an application that + generate and process messages. Queues are entities that store and forward messages.

- + > | 1..1 0..n | <> | |---------------|<>-------------------->|----------| @@ -86,42 +89,80 @@ | | | | | | | | | | +--------+ +--------+ +----------+ +----------+ +-------+]]> - +
+

The AMQP transport specification defines a peer-to-peer protocol for transferring messages between nodes in an AMQP network. This portion of the specification is not concerned with the internal workings of any sort of node, and only deals with the mechanics of unambiguously transferring a message from one node to another.

+

+ In order for communication to occur between nodes in different containers a connection + needs be established. +

+ + +

- Containers communicate via connections. An AMQP connection consists of a - full-duplex, reliably ordered sequence of frames. The precise requirement for a - connection is that if the nth frame arrives, all frames prior to n MUST also have - arrived. It is assumed connections are transient and may fail for a variety of reasons - resulting in the loss of an unknown number of frames, but they are still subject to the - aforementioned ordered reliability criteria. This is similar to the guarantee that TCP or - SCTP provides for byte streams, and the specification defines a framing system used to parse - a byte stream into a sequence of frames for use in establishing an AMQP connection (see + An AMQP connection consists of a full-duplex, reliably ordered sequence of + frames. A frame is the unit of work carried on the wire. Connections have a + negotiated maximum frame size allowing byte streams to be easily defragmented into complete + frame bodies representing the independently parsable units formally defined in + . The precise requirement for a connection is that if the + nth frame arrives, all frames prior to n MUST also have arrived. It is assumed + connections are transient and can fail for a variety of reasons resulting in the loss of + an unknown number of frames, but they are still subject to the aforementioned ordered + reliability criteria. This is similar to the guarantee that TCP or SCTP provides for byte + streams, and the specification defines a framing system used to parse a byte stream into + a sequence of frames for use in establishing an AMQP connection (see ).

-

An AMQP connection is divided into a negotiated number of independent unidirectional channels. Each frame is marked with the channel number indicating its parent - channel, and the frame sequence for each channel is multiplexed into a single frame sequence - for the connection. + channel, and the frame sequence for each channel is multiplexed into a single frame + sequence for the connection.

-

- An AMQP session correlates two unidirectional channels to form a bidirectional, - sequential conversation between two containers. A single connection may have multiple - independent sessions active simultaneously, up to the negotiated channel limit. Both - connections and sessions are modeled by each peer as endpoints that store local - and last known remote state regarding the connection or session in question. + An AMQP session correlates two unidirectional channels to form a + bidirectional, sequential conversation between two containers. Sessions provide a flow + control scheme based on the number of transfer frames transmitted. Since + frames have a maximum size for a given connection, this provides flow control based on the + number of bytes transmitted and can be used to optimize performance. +

+ + + +

+ A single connection MAY have multiple independent sessions active simultaneously, up to + the negotiated channel limit. Both connections and sessions are modeled by each peer as + endpoints that store local and last known remote state regarding the + connection or session in question.

- + Session (ICH=1, OCH=1) | | (ICH=1, OCH=1) \|/ \|/ @@ -135,14 +176,82 @@

- Sessions provide the context for communication between sources and targets. A link - endpoint associates a terminus with a session endpoint. Within a - session, the link protocol (defined in ) is used to establish links - between sources and targets and to transfer messages across them. A single session may be - simultaneously associated with any number of links. + In order to transfer messages between nodes (e.g., to move messages from a queue to a + consumer) a link needs to be established between the nodes. A link is a + unidirectional route between two nodes. + A link attaches to a node at a terminus. There are two kinds of terminus: sources and + targets. A terminus is responsible for tracking the state of a particular stream of + incoming or outgoing messages. Sources track outgoing messages and targets track incoming + messages. Messages only travel along a link if they meet the entry criteria at the source.

+

+ Links provide a credit-based flow control scheme based on the number of messages + transmitted, allowing applications to control which nodes to receive messages from at a + given point (e.g., to explicitly fetch a message from a given queue). +

+ + + +

+ Sessions provide the context for communication between sources and targets. + A link endpoint associates a terminus with a session endpoint. + Within a session, the link protocol (defined in ) is used to establish + links between sources and targets and to transfer messages across them. A single session + can be simultaneously associated with any number of links. +

+

+ Links are named, and the state at the termini can live longer than the connection on which + they were established. +

- + + +

+ The retained state at the termini can be used to reestablish the link on a new connection + (and session) with precise control over delivery guarantees (e.g., ensuring "exactly once" + delivery). +

+ + + +

+ The diagram below shows the relationship between the three AMQP communication endpoints, + Connection, Session and Link. +

+ + +
+

- A frame is the unit of work carried on the wire. Connections have a negotiated maximum frame - size allowing byte streams to be easily defragmented into complete frame bodies representing - the independently parsable units formally defined in . The - following table lists all frame bodies and defines which endpoints handle them. + The protocol consists of nine frame body types that are formally defined in + . The following table lists the frame bodies and + defines which endpoints handle them.

- +
frame header

The frame header is a fixed size (8 byte) structure that precedes each frame. The - frame header includes mandatory information required to parse the rest of the frame + frame header includes mandatory information necessary to parse the rest of the frame including size and type information.

extended header
@@ -424,7 +535,7 @@
SIZE

Bytes 0-3 of the frame header contain the frame size. This is an unsigned 32-bit integer that MUST contain the total frame size of the frame header, extended header, and - frame body. The frame is malformed if the size is less than the size of the required + frame body. The frame is malformed if the size is less than the size of the frame header (8 bytes).

DOFF
@@ -435,7 +546,7 @@
TYPE

Byte 5 of the frame header is a type code. The type code indicates the format and - purpose of the frame. The subsequent bytes in the frame header may be interpreted + purpose of the frame. The subsequent bytes in the frame header MAY be interpreted differently depending on the type of the frame. A type code of 0x00 indicates that the frame is an AMQP frame. A type code of 0x01 indicates that the frame is a SASL frame, see . @@ -484,7 +595,7 @@

- An AMQP frame with no body may be used to generate artificial traffic as needed to + An AMQP frame with no body MAY be used to generate artificial traffic as needed to satisfy any negotiated idle timeout interval (see ).

@@ -551,9 +662,9 @@

Although not strictly directed at the connection endpoint, the and - frames may be useful for the connection endpoint to intercept as these - frames are how sessions mark the beginning and ending of communication on a given channel - (see ). + frames are potentially useful for the connection endpoint to intercept + as these frames are how sessions mark the beginning and ending of communication on a given + channel (see ).

@@ -562,7 +673,7 @@ Each AMQP connection begins with an exchange of capabilities and limitations, including the maximum frame size. Prior to any explicit negotiation, the maximum frame size is and the maximum channel number is 0. After establishing or - accepting a TCP connection and sending the protocol header, each peer must send an frame before sending any other frames. The frame describes the capabilities and limits of that peer. The frame can only be sent on channel 0. After sending the

- For applications that use many short-lived connections, it may be desirable to pipeline the - connection negotiation process. A peer may do this by starting to send subsequent frames + For applications that use many short-lived connections, it MAY be desirable to pipeline the + connection negotiation process. A peer MAY do this by starting to send subsequent frames before receiving the partner's connection header or frame. This is permitted so long as the pipelined frames are known a priori to conform to - the capabilities and limitations of its partner. For example, this may be accomplished by + the capabilities and limitations of its partner. For example, this can be accomplished by keeping the use of the connection within the capabilities and limits expected of all AMQP implementations as defined by the specification of the frame. @@ -627,7 +738,7 @@ order to guard against erroneously or maliciously implemented partners, a peer SHOULD implement a timeout to give its partner a reasonable time to receive and process the close before giving up and simply closing the underlying transport mechanism). A frame may be received on any channel up to the maximum channel number + name="close"/> frame MAY be received on any channel up to the maximum channel number negotiated in open. However, implementations SHOULD send it on channel 0, and MUST send it on channel 0 if pipelined in a single batch with the corresponding .

@@ -655,7 +766,7 @@

Normally one peer will initiate the connection close, and the partner will send its close in - response. However, because both endpoints may simultaneously choose to close the connection + response. However, because both endpoints MAY simultaneously choose to close the connection for independent reasons, it is possible for a simultaneous close to occur. In this case, the only potentially observable difference from the perspective of each endpoint is the code indicating the reason for the close. @@ -679,34 +790,34 @@ Connections are subject to an idle timeout threshold. The timeout is triggered by a local peer when no frames are received after a threshold value is exceeded. The idle timeout is measured in milliseconds, and starts from the time the last frame is received. If the - threshold is exceeded, then a peer should try to gracefully close the connection using a + threshold is exceeded, then a peer SHOULD try to gracefully close the connection using a frame with an error explaining why. If the remote peer does - not respond gracefully within a threshold to this, then the peer may close the TCP socket. + not respond gracefully within a threshold to this, then the peer MAY close the TCP socket.

Each peer has its own (independent) idle timeout. At connection open each peer communicates the maximum period between activity (frames) on the connection that it desires from its partner.The frame carries the idle-time-out field for this - purpose. To avoid spurious timeouts, the value in idle-time-out should be half the peer's + purpose. To avoid spurious timeouts, the value in idle-time-out SHOULD be half the peer's actual timeout threshold.

- If a peer can not, for any reason support a proposed idle timeout, then it should close + If a peer can not, for any reason support a proposed idle timeout, then it SHOULD close the connection using a frame with an error explaining why. There is no requirement for peers to support arbitrarily short or long idle timeouts.

The use of idle timeouts is in addition to any network protocol level control. - Implementations should make use of TCP keep-alive wherever possible in order to be good + Implementations SHOULD make use of TCP keep-alive wherever possible in order to be good citizens.

If a peer needs to satisfy the need to send traffic to prevent idle timeout, and has - nothing to send, it may send an empty frame, i.e., a frame consisting solely of a frame + nothing to send, it MAY send an empty frame, i.e., a frame consisting solely of a frame header, with no frame body. Implementations MUST be prepared to handle empty frames arriving on any valid channel, though implementations SHOULD use channel 0 when sending empty frames, and MUST use channel 0 if a maximum channel number has not yet been negotiated @@ -784,15 +895,15 @@

CLOSE_RCVD

In this state a frame has been received indicating - that the peer has initiated an AMQP close. There should be no further frames arriving on + that the peer has initiated an AMQP close. No further frames are expected to arrive on the connection; however, frames can still be sent. If desired, an implementation MAY do a TCP half-close at this point to shut down the read side of the connection.

CLOSE_SENT

In this state a frame has been sent to the peer. - It is illegal to write anything more onto the connection, however there may still be - incoming frames. If desired, an implementation MAY do a TCP half-close at this point - to shutdown the write side of the connection.

+ It is illegal to write anything more onto the connection, however there could + potentially still be incoming frames. If desired, an implementation MAY do a TCP + half-close at this point to shutdown the write side of the connection.

DISCARDING

The DISCARDING state is a variant of the CLOSE_SENT state where the @@ -802,7 +913,7 @@

END

In this state it is illegal for either endpoint to write anything more onto the - connection. The connection may be safely closed and discarded.

+ connection. The connection can be safely closed and discarded.

@@ -892,7 +1003,7 @@ A session is a bidirectional sequential conversation between two containers that provides a grouping for related links. Sessions serve as the context for link communication. Any number of links of any directionality can be attached to a given session. However, a link - may be attached to at most one session at a time. + MUST NOT be attached to more than one session at a time.

- Messages transferred on a link are sequentially identified within the session. A session may + Messages transferred on a link are sequentially identified within the session. A session can be viewed as multiplexing link traffic, much like a connection multiplexes session traffic. However, unlike the sessions on a connection, links on a session are not entirely independent since they share a common delivery sequence scoped to the session. This common @@ -932,7 +1043,7 @@

- To make it easier to monitor AMQP sessions, it is recommended that implementations always + To make it easier to monitor AMQP sessions, it is RECOMMENDED that implementations always assign the lowest available unused channel number.

@@ -993,8 +1104,8 @@

- Due to the potentially asynchronous nature of sessions, it is possible that both peers may - simultaneously decide to end a session. If this should happen, it will appear to each peer + Due to the potentially asynchronous nature of sessions, it is possible that both peers + simultaneously decide to end a session. If this happens, it will appear to each peer as though their partner's spontaneously initiated frame is actually an answer to the peers initial frame.

@@ -1015,9 +1126,9 @@ ----------------------------------------------------------------- - (1) At this point no more frames may be sent by A. + (1) At this point no more frames can be sent by A. - (2) At this point no more frames may be sent by B. + (2) At this point no more frames can be sent by B. (3) At this point endpoint A is fully ended. @@ -1058,27 +1169,27 @@
BEGIN_SENT

In the BEGIN_SENT state, the session endpoint is assigned an outgoing channel number, - but there is no entry in the incoming channel map. In this state the endpoint may send + but there is no entry in the incoming channel map. In this state the endpoint MAY send frames but cannot receive them.

BEGIN_RCVD

In the BEGIN_RCVD state, the session endpoint has an entry in the incoming channel - map, but has not yet been assigned an outgoing channel number. The endpoint may receive + map, but has not yet been assigned an outgoing channel number. The endpoint MAY receive frames, but cannot send them.

MAPPED

In the MAPPED state, the session endpoint has both an outgoing channel number and an - entry in the incoming channel map. The endpoint may both send and receive + entry in the incoming channel map. The endpoint MAY both send and receive frames.

END_SENT

In the END_SENT state, the session endpoint has an entry in the incoming channel map, - but is no longer assigned an outgoing channel number. The endpoint may receive frames, + but is no longer assigned an outgoing channel number. The endpoint MAY receive frames, but cannot send them.

END_RCVD

In the END_RCVD state, the session endpoint is assigned an outgoing channel number, - but there is no entry in the incoming channel map. The endpoint may send frames, but + but there is no entry in the incoming channel map. The endpoint MAY send frames, but cannot receive them.

DISCARDING
@@ -1143,7 +1254,7 @@
next-outgoing-id

The next-outgoing-id is the transfer-id to assign to the next transfer frame. - The next-outgoing-id may be initialized to an arbitrary value and is incremented + The next-outgoing-id MAY be initialized to an arbitrary value and is incremented after each successive according to RFC-1982 [RFC1982] serial number arithmetic.

@@ -1161,10 +1272,10 @@
remote-outgoing-window

The remote-outgoing-window reflects the maximum number of incoming transfers - that may arrive without exceeding the remote endpoint's outgoing-window. This value MUST + that MAY arrive without exceeding the remote endpoint's outgoing-window. This value MUST be decremented after every incoming frame is received, and recomputed when informed of the remote session endpoint state. When this window shrinks, - it is an indication of outstanding transfers. Settling outstanding transfers may cause the + it is an indication of outstanding transfers. Settling outstanding transfers can cause the window to grow.

@@ -1176,13 +1287,13 @@
sending a transfer

Upon sending a transfer, the sending endpoint will increment its next-outgoing-id, - decrement its remote-incoming-window, and may (depending on policy) decrement its + decrement its remote-incoming-window, and MAY (depending on policy) decrement its outgoing-window.

receiving a transfer

Upon receiving a transfer, the receiving endpoint will increment the next-incoming-id to match the implicit transfer-id of the incoming transfer plus one, as well as - decrementing the remote-outgoing-window, and may (depending on policy) decrement its + decrementing the remote-outgoing-window, and MAY (depending on policy) decrement its incoming-window.

receiving a flow
@@ -1241,7 +1352,7 @@

- Termini may exist beyond their associated link endpoints, so it is possible for a session to + Termini can exist beyond their associated link endpoints, so it is possible for a session to terminate and the termini to remain. A link is said to be suspended if the termini exist, but have no associated link endpoints. The process of associating new link endpoints with existing termini and re-establishing communication is referred to @@ -1260,18 +1371,18 @@

- Links are named so that they may be recovered when communication is interrupted. Link names + Links are named so that they can be recovered when communication is interrupted. Link names MUST uniquely identify the link amongst all links of the same direction between the two - participating containers. Link names are only used when attaching a link, so they may be + participating containers. Link names are only used when attaching a link, so they can be arbitrarily long without a significant penalty.

A link's name uniquely identifies the link from the container of the source to the container of the target node, i.e., if the container of the source node is A, and the - container of the target node is B, the link may be globally identified by the (ordered) - tuple (A,B,<name>). Consequently, a link may only be active in one connection + container of the target node is B, the link can be globally identified by the (ordered) + tuple (A,B,<name>). Consequently, a link can only be active in one connection at a time. If an attempt is made to attach the link subsequently when it is not suspended, - then the link can be 'stolen', i.e., the second attach succeeds and the first attach must + then the link can be 'stolen', i.e., the second attach succeeds and the first attach MUST then be closed with a link error of . This behavior ensures that in the event of a connection failure occurring and being noticed by one party, that re-establishment has the desired effect. @@ -1285,7 +1396,7 @@ , , , ). This handle is assigned by the initial frame and remains in use until the link is - detached. The two endpoints are not required to use the same handle. This means a peer is + detached. The two endpoints are not REQUIRED to use the same handle. This means a peer is free to independently chose its handle when a link endpoint is associated with the session. The locally chosen handle is referred to as the output handle. The remotely chosen handle is referred to as the input handle. @@ -1333,7 +1444,7 @@ directionality of the link endpoint. On receipt of the , the remote session endpoint creates a corresponding link endpoint and informs its application of the attaching link. The application attempts to locate the terminus previously associated with - the link. This terminus is associated with the link endpoint and may be updated if its + the link. This terminus is associated with the link endpoint and can be updated if its properties do not match those sent by the remote link endpoint. If no such terminus exists, the application MAY choose to create one using the properties supplied by the remote link endpoint. The link endpoint is then mapped to an unused handle, and an - Note that the expected terminus properties may not always match the actual terminus - properties reported by the remote endpoint. In this case, the link is always considered to - be between the source as described by the sender, and the target as described by the - receiver. This can happen both when establishing and when resuming a link. + Note that it is possible that the expected terminus properties do not match the actual + terminus properties reported by the remote endpoint. In this case, the link is always + considered to be between the source as described by the sender, and the target as described + by the receiver. This can happen both when establishing and when resuming a link.

- When a link is established, an endpoint may not have all the capabilities necessary to - create the terminus exactly matching the expectations of the peer. Should this happen, the - endpoint MAY adjust the properties in order to succeed in creating the terminus. In this - case the endpoint MUST report the actual properties of the terminus as created. + When a link is established, it is possible for an endpoint not to have all the capabilities + necessary to create the terminus exactly matching the expectations of the peer. If this + happens, the endpoint MAY adjust the properties in order to succeed in creating the + terminus. In this case the endpoint MUST report the actual properties of the terminus as + created.

- When resuming a link, the source and target properties may have changed while the link was - suspended. When this happens, the termini properties communicated in the source and target - fields of the frames may be in conflict. In this case, the sender is - considered to hold the authoritative version of the source properties, the receiver is - considered to hold the authoritative version of the target properties. As above, the - resulting link is constructed to be between the source as described by the sender, and the - target as described by the receiver. Once the link is resumed, either peer is free to - continue if the updated properties are acceptable, or, if not, the link. + When resuming a link, it is possible that the properties of the source and target have + changed while the link was suspended. When this happens, the termini properties + communicated in the source and target fields of the frames could be + in conflict. In this case, the sender is considered to hold the authoritative version of + the source properties, the receiver is considered to hold the authoritative version of the + target properties. As above, the resulting link is constructed to be between the source + as described by the sender, and the target as described by the receiver. Once the link is + resumed, either peer is free to continue if the updated properties are acceptable, or, if + not, the link.

@@ -1464,7 +1576,7 @@

It is possible to resume a link even if one of the termini has lost nearly all its state. - All that is required is the link name and direction. This is referred to as + All that is necessary is the link name and direction. This is referred to as recovering a link. This is done by creating a new link endpoint with an empty source or target for incoming or outgoing links respectively. The full link state is then constructed from the authoritative source or target supplied by the other endpoint once the @@ -1495,10 +1607,10 @@

A session endpoint can choose to unmap its output handle for a link. In this case, the endpoint MUST send a frame to inform the remote peer that the handle - is no longer attached to the link endpoint. Should both endpoints do this, the link may - return to a fully detached state. Note that in this case the link endpoints may still - indirectly communicate via the session, as there may be active deliveries on the link - referenced via delivery-id. + is no longer attached to the link endpoint. If both endpoints do this, the link MAY + return to a fully detached state. Note that in this case the link endpoints MAY still + indirectly communicate via the session, as there could still be active deliveries on the + link referenced via delivery-id.

When an error occurs at a link endpoint, the endpoint MUST be detached with appropriate error information supplied in the error field of the frame. The link - endpoint MUST then be destroyed. Should any input (other than a detach) related to the + endpoint MUST then be destroyed. If any input (other than a detach) related to the endpoint either via the input handle or delivery-ids be received, the session MUST be terminated with an session-error. Since the link endpoint has been destroyed, the peer cannot reattach, and MUST resume the link in @@ -1604,7 +1716,7 @@

- Note that one peer may send a closing detach while its partner is sending a non-closing + Note that one peer MAY send a closing detach while its partner is sending a non-closing detach. In this case, the partner MUST signal that it has closed the link by reattaching and then sending a closing detach.

@@ -1622,7 +1734,7 @@
delivery-count

The delivery-count is initialized by the sender when a link endpoint is - created, and is incremented whenever a message is sent. Only the sender may + created, and is incremented whenever a message is sent. Only the sender MAY independently modify this field. The receiver's value is calculated based on the last known value from the sender and any subsequent messages received on the link. Note that, despite its name, the delivery-count is not a count but a sequence number initialized at @@ -1630,8 +1742,8 @@

link-credit

The link-credit variable defines the current maximum legal amount that the - delivery-count may be increased. This identifies a delivery-limit that may - be computed by adding the link-credit to the delivery-count.

+ delivery-count can be increased by. This identifies a delivery-limit that + can be computed by adding the link-credit to the delivery-count.

Only the receiver can independently choose a value for this field. The sender's value MUST always be maintained in such a way as to match the delivery-limit identified @@ -1665,11 +1777,11 @@ Only the sender can independently modify this field. The receiver's value is calculated based on the last known value from the sender and any subsequent incoming messages received. The sender MAY transfer messages even if the available variable is zero. - Should this happen, the receiver MUST maintain a floor of zero in it's calculation of + If this happens, the receiver MUST maintain a floor of zero in its calculation of the value of available.

drain
-

The drain flag indicates how the sender should behave when insufficient messages are +

The drain flag indicates how the sender SHOULD behave when insufficient messages are available to consume the current link-credit. If set, the sender will (after sending all available messages) advance the delivery-count as much as possible, consuming all link-credit, and send the flow state to the receiver. Only the receiver can @@ -1711,7 +1823,7 @@

The initial flow state of a link endpoint is determined as follows. The link-credit and available variables are initialized to zero. The drain flag is initialized - to false. The sender may choose an arbitrary point to initialize the delivery-count. + to false. The sender MAY choose an arbitrary point to initialize the delivery-count. This value is communicated in the initial frame. The receiver initializes its delivery-count upon receiving the sender's .

@@ -1816,7 +1928,7 @@ Asynchronous notification can be accomplished as follows. The receiver maintains a target amount of link-credit for that link. As transfers arrive on the link, the sender's link-credit decreases as the delivery-count increases. When the sender's - link-credit falls below a threshold, the state may be sent to increase + link-credit falls below a threshold, the state MAY be sent to increase the sender's link-credit back to the desired target amount.

@@ -1849,11 +1961,11 @@

Stopping the transfers on a given link is accomplished by updating the link-credit to be - zero and sending the updated state. Some transfers may be in flight at - the time the state is sent, so incoming transfers may still arrive on - the link. The echo field of the frame may be used to request the - sender's state be echoed back. This may be used to determine when the - link has finally quiesced. + zero and sending the updated state. It is possible that some transfers + could be in flight at the time the state is sent, so incoming transfers + could still arrive on the link. The echo field of the frame MAY be used + to request the sender's state be echoed back. This MAY be used to + determine when the link has finally quiesced.

@@ -1947,10 +2059,10 @@

Once notified of the received message data, the application processes the message, - indicating the updated delivery state to the link endpoint as desired. Applications may wish + indicating the updated delivery state to the link endpoint as desired. Applications MAY wish to classify delivery states as terminal or non-terminal depending on whether an endpoint will ever update the state further once it has been reached. In some - cases (e.g., large messages or transactions), the receiving application may wish to indicate + cases (e.g., large messages or transactions), the receiving application MAY wish to indicate non-terminal delivery states to the sender. This is done via the frame.

@@ -2012,7 +2124,7 @@ that the delivery is settled at the sender. Note that this amounts to the sender announcing that it is forever forgetting everything about the delivery-tag in question, and as such it is only possible to make such an announcement once, since after the sender forgets, it has - no way of remembering to make the announcement again. Should this frame get lost due to an + no way of remembering to make the announcement again. If this frame gets lost due to an interruption in communication, the receiver will find out that the sender has settled the delivery upon link recovery. When the sender re-attaches the receiver will examine the unsettled state of the sender (i.e., what has not been forgotten) and from this can @@ -2050,7 +2162,7 @@

- The application may then perform some final action, e.g., remove the delivery-tag from a set + The application can then perform some final action, e.g., remove the delivery-tag from a set kept for de-duplication, and then notify the receiver that the delivery is settled. The receiver will then remove the delivery-tag from its unsettled map. Note that because the receiver knows that the delivery is already settled at the sender, it makes no effort to @@ -2071,7 +2183,7 @@

As alluded to above, it is possible for the sending application to transition a delivery to a terminal state at the sender spontaneously (i.e., not as a consequence of a disposition - that has been received from the receiver). In this case the sender should send a disposition + that has been received from the receiver). In this case the sender SHOULD send a disposition to the receiver, but not settle until the receiver confirms, via a disposition in the opposite direction, that it has updated the state at its endpoint.

@@ -2089,7 +2201,7 @@ example if the sending application settles the delivery before sending it, this results in an at-most-once guarantee. The sender has indicated up front with his initial transmission that he has forgotten everything about this delivery and will therefore - make no further attempts to send it. Should this delivery make it to the receiver, the + make no further attempts to send it. If this delivery makes it to the receiver, the receiver clearly has no obligation to respond with updates of the receiver's delivery state, as they would be meaningless and ignored by the sender.

@@ -2137,10 +2249,10 @@

- The sender and receiver policy regarding settling may either be preconfigured for the - entire link, thereby allowing for optimized endpoint choices, or may be determined on an - ad-hoc basis for each delivery. An application may also choose to settle at an endpoint - independently of its delivery state, for example the sending application may choose to + The sender and receiver policy regarding settling can either be preconfigured for the + entire link, thereby allowing for optimized endpoint choices, or can be determined on an + ad-hoc basis for each delivery. An application MAY also choose to settle at an endpoint + independently of its delivery state, for example the sending application MAY choose to settle a delivery due to the message ttl expiring regardless of whether the receiver has reached a terminal state.

@@ -2174,10 +2286,10 @@

Note that in the case where an endpoint indicates that the unsettled map is incomplete, the absence of an entry in the unsettled map is not an indication of settlement. In this case - the two endpoints must reduce the levels of unsettled state as much as they can by the + the two endpoints MUST reduce the levels of unsettled state as much as they can by the sender resuming and/or settling transfers that it observes that the receiver considers - unsettled. Upon completion of this reduction of state, the two parties must suspend and - re-attempt to resume the link. Only when both sides have complete unsettled maps may new + unsettled. Upon completion of this reduction of state, the two parties MUST suspend and + re-attempt to resume the link. Only when both sides have complete unsettled maps can new unsettled state be created by the sending of non-resuming transfers.

@@ -2202,9 +2314,9 @@

- Each frame may carry an arbitrary amount of message data up to the + Each frame can carry an arbitrary amount of message data up to the limit imposed by the maximum frame size. For messages that are too large to fit within the - maximum frame size, additional data may be transferred in additional + maximum frame size, additional data MAY be transferred in additional frames by setting the more flag on all but the last frame. When a message is split up into multiple frames in this manner, messages being transferred along different links MAY be interleaved. However, messages transferred @@ -2212,7 +2324,7 @@

- The sender may indicate an aborted attempt to deliver a message by setting the abort flag on + The sender MAY indicate an aborted attempt to deliver a message by setting the abort flag on the last . In this case the receiver MUST discard the message data that was transferred prior to the abort.

@@ -2297,13 +2409,13 @@

The name of the host (either fully qualified or relative) to which the sending peer is connecting. It is not mandatory to provide the hostname. If no hostname is provided - the receiving peer should select a default based on its own configuration. This field + the receiving peer SHOULD select a default based on its own configuration. This field can be used by AMQP proxies to determine the correct back-end service to connect the client to.

- This field may already have been specified by the frame, if a + This field MAY already have been specified by the frame, if a SASL layer is used, or, the server name indication extension as described in RFC-4366, if a TLS layer is used, in which case this field SHOULD be null or contain the same value. It is undefined what a different value to that already specified @@ -2329,10 +2441,10 @@ + label="the maximum channel number that can be used on the connection">

- The channel-max value is the highest channel number that may be used on the connection. + The channel-max value is the highest channel number that can be used on the connection. This value plus one is the maximum number of sessions that can be simultaneously active on the connection. A peer MUST not use channel numbers outside the range that its partner can handle. A peer that receives a channel number outside the supported range @@ -2344,15 +2456,15 @@

- The idle timeout required by the sender (see ). A value + The idle timeout REQUIRED by the sender (see ). A value of zero is the same as if it was not set (null). If the receiver is unable or unwilling - to support the idle time-out then it should close the connection with an error + to support the idle time-out then it SHOULD close the connection with an error explaining why (e.g., because it is too small).

If the value is not set, then the sender does not have an idle time-out. However, - senders doing this should be aware that implementations MAY choose to use an + senders doing this SHOULD be aware that implementations MAY choose to use an internal default to efficiently manage a peer's resources.

@@ -2379,7 +2491,7 @@ list is ordered in decreasing level of preference. The receiving partner will choose the first (most preferred) incoming locale from those which it supports. If none of the requested locales are supported, en-US will be chosen. Note that en-US - need not be supplied in this list as it is always the fallback. A peer may determine + need not be supplied in this list as it is always the fallback. A peer MAY determine which of the permitted incoming locales is chosen by examining the partner's supported locales as specified in the outgoing-locales field. A null value or an empty list implies that only en-US is supported. @@ -2402,7 +2514,7 @@ + label="extension capabilities the sender can use if the receiver supports them">

The desired-capability list defines which extension capabilities the sender MAY use if @@ -2474,10 +2586,10 @@ + label="the maximum handle value that can be used on the session">

- The handle-max value is the highest handle value that may be used on the session. + The handle-max value is the highest handle value that can be used on the session. A peer MUST NOT attempt to attach a link using a handle value outside the range that its partner can handle. A peer that receives a handle outside the supported range MUST close the connection with the framing-error error-code. @@ -2496,7 +2608,7 @@ + label="the extension capabilities the sender can use if the receiver supports them">

The sender MUST NOT attempt to use any capability other than those it has declared in @@ -2537,7 +2649,7 @@

This name uniquely identifies the link from the container of the source to the container of the target node, e.g., if the container of the source node is A, and the container of - the target node is B, the link may be globally identified by the (ordered) tuple + the target node is B, the link MAY be globally identified by the (ordered) tuple (A,B,<name>).

@@ -2557,7 +2669,7 @@ carrying a handle-in-use .

- To make it easier to monitor AMQP link attach frames, it is recommended that + To make it easier to monitor AMQP link attach frames, it is RECOMMENDED that implementations always assign the lowest available handle to this field.

@@ -2700,7 +2812,7 @@ + label="the extension capabilities the sender can use if the receiver supports them">

The sender MUST NOT attempt to use any capability other than those it has declared in @@ -2856,7 +2968,7 @@

- If set to true then the receiver should send its state at the earliest convenient + If set to true then the receiver SHOULD send its state at the earliest convenient opportunity.

@@ -2871,8 +2983,8 @@

Note that if a peer responds to echo requests with flows which themselves have the echo - field set to true, an infinite loop may result if its partner adopts the same policy - (therefore such a policy should be avoided). + field set to true, an infinite loop could result if its partner adopts the same policy + (therefore such a policy SHOULD be avoided).

@@ -2896,9 +3008,9 @@ label="transfer a message">

- The transfer frame is used to send messages across a link. Messages may be carried by a + The transfer frame is used to send messages across a link. Messages MAY be carried by a single transfer up to the maximum negotiated frame size for the connection. Larger - messages may be split across several transfer frames. + messages MAY be split across several transfer frames.

@@ -2925,7 +3037,7 @@

Uniquely identifies the delivery attempt for a given message on this link. This field - MUST be specified for the first transfer of a multi-transfer message and may only be + MUST be specified for the first transfer of a multi-transfer message and can only be omitted for continuation transfers. It is an error if the delivery-tag on a continuation transfer differs from the delivery-tag on the first transfer of a delivery.

@@ -2935,7 +3047,7 @@

- This field MUST be specified for the first transfer of a multi-transfer message and may + This field MUST be specified for the first transfer of a multi-transfer message and can only be omitted for continuation transfers. It is an error if the message-format on a continuation transfer differs from the message-format on the first transfer of a delivery. @@ -2956,7 +3068,7 @@

If the negotiated value for snd-settle-mode at attachment is , then this field MUST be true on at least - one transfer frame for a delivery (i.e., the delivery must be settled at the sender at + one transfer frame for a delivery (i.e., the delivery MUST be settled at the sender at the point the delivery has been completely transferred).

@@ -2972,7 +3084,7 @@

Note that if both the more and aborted fields are set to true, the aborted flag takes - precedence. That is, a receiver should ignore the value of the more field if the + precedence. That is, a receiver SHOULD ignore the value of the more field if the transfer is marked as aborted. A sender SHOULD NOT set the more flag to true if it also sets the aborted flag to true.

@@ -3043,12 +3155,12 @@

If a resumed delivery spans more than one transfer performative, then the resume flag MUST be set to true on the first transfer of the resumed delivery. For subsequent - transfers for the same delivery the resume flag may be set to true, or may be omitted. + transfers for the same delivery the resume flag MAY be set to true, or MAY be omitted.

In the case where the exchange of unsettled maps makes clear that all message data has been successfully transferred to the receiver, and that only the final state (and - potentially settlement) at the sender needs to be conveyed, then a resumed delivery may + potentially settlement) at the sender needs to be conveyed, then a resumed delivery MAY carry no payload and instead act solely as a vehicle for carrying the terminal state of the delivery at the sender.

@@ -3059,7 +3171,7 @@ label="indicates that the message is aborted">

- Aborted messages should be discarded by the recipient (any payload within the frame + Aborted messages SHOULD be discarded by the recipient (any payload within the frame carrying the performative MUST be ignored). An aborted message is implicitly settled.

@@ -3069,7 +3181,7 @@

If true, then the issuer is hinting that there is no need for the peer to urgently - communicate updated delivery state. This hint may be used to artificially increase the + communicate updated delivery state. This hint MAY be used to artificially increase the amount of batching an implementation uses when communicating delivery states, and thereby save bandwidth.

@@ -3094,7 +3206,7 @@

The disposition frame is used to inform the remote peer of local changes in the state of - deliveries. The disposition frame may reference deliveries from many different links + deliveries. The disposition frame MAY reference deliveries from many different links associated with a session, although all links MUST have the directionality indicated by the specified role.

@@ -3106,7 +3218,7 @@ performative for the delivery.

- The disposition performative may refer to deliveries on links that are no longer attached. + The disposition performative MAY refer to deliveries on links that are no longer attached. As long as the links have not been closed or detached with an error then the deliveries are still "live" and the updated state MUST be applied.

@@ -3161,7 +3273,7 @@

If true, then the issuer is hinting that there is no need for the peer to urgently - communicate the impact of the updated delivery states. This hint may be used to + communicate the impact of the updated delivery states. This hint MAY be used to artificially increase the amount of batching an implementation uses when communicating delivery states, and thereby save bandwidth.

@@ -3196,7 +3308,7 @@

If set, this field indicates that the link is being detached due to an error condition. - The value of the field should contain details on the cause of the error. + The value of the field SHOULD contain details on the cause of the error.

@@ -3215,7 +3327,7 @@

If set, this field indicates that the session is being ended due to an error condition. - The value of the field should contain details on the cause of the error. + The value of the field SHOULD contain details on the cause of the error.

@@ -3240,7 +3352,7 @@

If set, this field indicates that the connection is being closed due to an error - condition. The value of the field should contain details on the cause of the error. + condition. The value of the field SHOULD contain details on the cause of the error.

@@ -3274,7 +3386,7 @@

- The sender may send a mixture of settled and unsettled deliveries to the receiver. + The sender MAY send a mixture of settled and unsettled deliveries to the receiver.

@@ -3305,7 +3417,7 @@

An alias established by the frame and subsequently used by endpoints as a shorthand to refer to the link in all outgoing frames. The two endpoints - may potentially use different handles to refer to the same link. Link handles may be + MAY potentially use different handles to refer to the same link. Link handles MAY be reused once a link is closed for both send and receive.

@@ -3319,7 +3431,7 @@

- A delivery-tag may be up to 32 octets of binary data. + A delivery-tag can be up to 32 octets of binary data.

@@ -3368,7 +3480,7 @@ [IANASUBTAG].

- All AMQP implementations should understand at the least the IETF language tag + All AMQP implementations SHOULD understand at the least the IETF language tag en-US (note that this uses a hyphen separator, not an underscore).

@@ -3414,7 +3526,7 @@

- An internal error occurred. Operator intervention may be required to resume normal + An internal error occurred. Operator intervention might be necessary to resume normal operation.

@@ -3508,7 +3620,7 @@ currently valid values would be too large to fit within a frame of the agreed maximum frame size. When transferring a message the message data can be sent in multiple frames thereby avoiding this error. Similarly when attaching a link - with a large unsettled map the endpoint may make use of the incomplete-unsettled flag to + with a large unsettled map the endpoint MAY make use of the incomplete-unsettled flag to avoid the need for overly large frames.

@@ -3521,8 +3633,8 @@

- An operator intervened to close the connection for some reason. The client may retry at - some later date. + An operator intervened to close the connection for some reason. The client could retry + at some later date.

@@ -3536,14 +3648,14 @@

- The container is no longer available on the current connection. The peer should + The container is no longer available on the current connection. The peer SHOULD attempt reconnection to the container using the details provided in the info map.

hostname

- the hostname of the container. This is the value that should be supplied in the + the hostname of the container. This is the value that SHOULD be supplied in the hostname field of the frame, and during the SASL and TLS negotiation (if used).

@@ -3629,14 +3741,14 @@

The address provided cannot be resolved to a terminus at the current container. - The info map may contain the following information to allow the client to locate + The info map MAY contain the following information to allow the client to locate the attach to the terminus.

hostname

- the hostname of the container hosting the terminus. This is the value that should + the hostname of the container hosting the terminus. This is the value that SHOULD be supplied in the hostname field of the frame, and during SASL and TLS negotiation (if used).

@@ -3699,7 +3811,7 @@

- Implementations listening on this port should NOT expect a protocol handshake before TLS + Implementations listening on this port SHOULD NOT expect a protocol handshake before TLS is negotiated.

@@ -3713,7 +3825,7 @@ label="the lower bound for the agreed maximum frame size (in bytes)">

- During the initial connection negotiation, the two peers must agree upon a maximum frame + During the initial connection negotiation, the two peers MUST agree upon a maximum frame size. This constant defines the minimum value to which the maximum frame size can be set. By defining this value, the peers can guarantee that they can send frames of up to this size until they have agreed a definitive maximum frame size for that Index: specification/messaging.xml =================================================================== --- specification/messaging.xml (revision 111) +++ specification/messaging.xml (revision 123) @@ -88,7 +88,7 @@

- The term message is used with various connotations in the messaging world. The sender may + The term message is used with various connotations in the messaging world. The sender might like to think of the message as an immutable payload handed off to the messaging infrastructure for delivery. The receiver often thinks of the message as not only that immutable payload from the sender, but also various annotations supplied by the messaging @@ -201,8 +201,8 @@ Durable messages MUST NOT be lost even if an intermediary is unexpectedly terminated and restarted. A target which is not capable of fulfilling this guarantee MUST NOT accept messages where the durable header is set to true: if the source allows the outcome then the message should be rejected with the error, otherwise the link must be + name="rejected"/> outcome then the message SHOULD be rejected with the error, otherwise the link MUST be detached by the receiver with the same error.

@@ -259,11 +259,11 @@

- Duration in milliseconds for which the message should be considered "live". If this is + Duration in milliseconds for which the message is to be considered "live". If this is set then a message expiration time will be computed based on the time of arrival at an intermediary. Messages that live longer than their expiration time will be discarded (or dead lettered). When a message is transmitted by an intermediary that was received - with a ttl, the transmitted message's header should contain a ttl that is computed as + with a ttl, the transmitted message's header SHOULD contain a ttl that is computed as the difference between the current time and the formerly computed message expiration time, i.e., the reduced ttl, so that messages will eventually die if they end up in a delivery loop. @@ -286,9 +286,9 @@

The number of unsuccessful previous attempts to deliver this message. If this value is - non-zero it may be taken as an indication that the delivery may be a duplicate. On first - delivery, the value is zero. It is incremented upon an outcome being settled at the - sender, according to rules defined for each outcome. + non-zero it can be taken as an indication that the delivery might be a duplicate. On + first delivery, the value is zero. It is incremented upon an outcome being settled at + the sender, according to rules defined for each outcome.

@@ -302,9 +302,9 @@ the head of the message. Delivery annotations convey information from the sending peer to the receiving peer. If the recipient does not understand the annotation it cannot be acted upon and its effects (such as any implied propagation) cannot be acted upon. Annotations - may be specific to one implementation, or common to multiple implementations. The + might be specific to one implementation, or common to multiple implementations. The capabilities negotiated on link and on the and - should be used to establish which annotations a peer supports. A + SHOULD be used to establish which annotations a peer supports. A registry of defined annotations and their meanings is maintained [AMQPDELANN]. The symbolic key "rejected" is reserved for the use of communicating error information regarding rejected messages. Any values @@ -324,7 +324,7 @@

The message-annotations section is used for properties of the message which are aimed at - the infrastructure and should be propagated across every delivery step. Message + the infrastructure and SHOULD be propagated across every delivery step. Message annotations convey information about the message. Intermediaries MUST propagate the annotations unless the annotations are explicitly augmented or modified (e.g., by the use of the outcome). @@ -332,10 +332,10 @@

The capabilities negotiated on link and on the - and may be used to establish which annotations a peer understands; - however, in a network of AMQP intermediaries it may not be possible to know if every - intermediary will understand the annotation. Note that for some annotations it may not be - necessary for the intermediary to understand their purpose, i.e., they could be + and can be used to establish which annotations a peer understands; + however, in a network of AMQP intermediaries it might not be possible to know if every + intermediary will understand the annotation. Note that for some annotations it might not + be necessary for the intermediary to understand their purpose, i.e., they could be used purely as an attribute which can be filtered on.

@@ -369,11 +369,11 @@ label="application message identifier">

- Message-id is an optional property which uniquely identifies a message within the - message system. The message producer is usually responsible for setting the message-id - in such a way that it is assured to be globally unique. A broker MAY discard a message - as a duplicate if the value of the message-id matches that of a previously received - message sent to the same node. + Message-id, if set, uniquely identifies a message within the message system. The message + producer is usually responsible for setting the message-id in such a way that it is + assured to be globally unique. A broker MAY discard a message as a duplicate if the + value of the message-id matches that of a previously received message sent to the same + node.

@@ -392,7 +392,7 @@

The to field identifies the node that is the intended destination of the message. On any - given transfer this may not be the node at the receiving end of the link. + given transfer this might not be the node at the receiving end of the link.

@@ -415,7 +415,7 @@ label="application correlation identifier">

- This is a client-specific id that may be used to mark or identify messages between + This is a client-specific id that can be used to mark or identify messages between clients.

@@ -426,7 +426,7 @@

The RFC-2046 [RFC2046] MIME type for the message's application-data section (body). As per RFC-2046 [RFC2046] - this may contain a charset parameter defining the character encoding used: e.g., + this can contain a charset parameter defining the character encoding used: e.g., 'text/plain; charset="utf-8"'.

@@ -447,8 +447,8 @@

The content-encoding property is used as a modifier to the content-type. When present, its value indicates what additional content encodings have been applied - to the application-data, and thus what decoding mechanisms must be applied in order to - obtain the media-type referenced by the content-type header field. + to the application-data, and thus what decoding mechanisms need to be applied in order + to obtain the media-type referenced by the content-type header field.

Content-encoding is primarily used to allow a document to be compressed without @@ -466,7 +466,7 @@

Implementations MUST NOT use the identity encoding. Instead, implementations - should not set this property. Implementations SHOULD NOT + SHOULD NOT set this property. Implementations SHOULD NOT use the compress encoding, except as to remain compatible with messages originally sent with other protocols, e.g. HTTP or SMTP.

@@ -529,7 +529,7 @@

The application-properties section is a part of the bare message used for structured - application data. Intermediaries may use the data within this structure for the purposes + application data. Intermediaries can use the data within this structure for the purposes of filtering or routing.

@@ -653,8 +653,8 @@

- State transitions may also occur spontaneously at the distribution node. For example if a - message with a ttl expires, the effect of expiry may be (depending on specific type and + State transitions can also occur spontaneously at the distribution node. For example if a + message with a ttl expires, the effect of expiry might be (depending on specific type and configuration of the distribution node) to move spontaneously from the AVAILABLE state into the ARCHIVED state. In this case any transfers of the message are transitioned to a terminal outcome at the distribution node regardless of receiver state. @@ -695,7 +695,7 @@

The messaging layer defines a concrete set of delivery states which can be used (via the frame) to indicate the state of the message at the - receiver. Delivery states may be either terminal or non-terminal. Once a delivery reaches a + receiver. Delivery states can be either terminal or non-terminal. Once a delivery reaches a terminal delivery state, the state for that delivery will no longer change. A terminal delivery state is referred to as an outcome.

@@ -761,7 +761,7 @@

When sent by the receiver this indicates the first section of the message for which - all data may not yet have been received. + all data might not yet have been received.

@@ -776,7 +776,7 @@

When sent by the receiver this indicates the first byte of the given section which has not yet been received. Note that if a receiver has received all of section number X - (which contains N bytes of data), but none of section number X + 1, then it may indicate + (which contains N bytes of data), but none of section number X + 1, then it can indicate this by sending either Received(section-number=X, section-offset=N) or Received(section-number=X+1, section-offset=0). The state Received(section-number=0, section-offset=0) indicates that no message data at all has been transferred. @@ -794,7 +794,7 @@

At the source the accepted state means that the message has been retired from the node, and transfer of payload data will not be able to be resumed if the link becomes suspended. - A delivery may become accepted at the source even before all transfer frames have been + A delivery can become accepted at the source even before all transfer frames have been sent, this does not imply that the remaining transfers for the delivery will not be sent - only the aborted flag on the performative can be used to indicate a premature termination of the transfer. @@ -824,7 +824,7 @@

At the source, the rejected outcome means that the target has informed the source that - the message was rejected, and the source has taken the required action. The delivery + the message was rejected, and the source has taken the necessary action. The delivery SHOULD NOT ever spontaneously attain the rejected state at the source.

@@ -850,10 +850,10 @@ receiving from the node. The message is unchanged at the node (i.e., the delivery-count of the header of the released message MUST NOT be incremented). As released is a terminal outcome, transfer of payload data will not be able to be resumed - if the link becomes suspended. A delivery may become released at the source even before + if the link becomes suspended. A delivery can become released at the source even before all transfer frames have been sent. This does not imply that the remaining transfers for the delivery will not be sent. The source MAY spontaneously attain the released outcome - for a message (for example the source may implement some sort of time-bound acquisition + for a message (for example the source might implement some sort of time-bound acquisition lock, after which the acquisition of a message at a node is revoked to allow for delivery to an alternative consumer).

@@ -876,10 +876,10 @@ receiver, and has been made available for (re-)delivery to the same or other targets receiving from the node. The message has been changed at the node in the ways indicated by the fields of the outcome. As modified is a terminal outcome, transfer of payload data - will not be able to be resumed if the link becomes suspended. A delivery may become + will not be able to be resumed if the link becomes suspended. A delivery can become modified at the source even before all transfer frames have been sent. This does not imply that the remaining transfers for the delivery will not be sent. The source MAY - spontaneously attain the modified outcome for a message (for example the source may + spontaneously attain the modified outcome for a message (for example the source might implement some sort of time-bound acquisition lock, after which the acquisition of a message at a node is revoked to allow for delivery to an alternative consumer with the message modified in some way to denote the previous failed, e.g., with delivery-failed @@ -887,7 +887,7 @@

At the target, the modified outcome is used to indicate that a given transfer was not and - will not be acted upon, and that the message should be modified in the specified ways at + will not be acted upon, and that the message SHOULD be modified in the specified ways at the node.

@@ -928,7 +928,7 @@

provides the general scheme for how two - endpoints should re-establish state after link resumption was provided. The concrete + endpoints can re-establish state after link resumption was provided. The concrete delivery states defined above allow for a more comprehensive set of examples of link resumption.

@@ -975,8 +975,8 @@

For delivery-tag 2, the receiver has retained some of the data making up the message, but - not the whole. In order to complete the delivery the sender must resume sending from some - point before or at the next position which the receiver is expecting. + not the whole. In order to complete the delivery the sender needs to resume sending from + some point before or at the next position which the receiver is expecting.

** Append message data not ** @@ -1019,7 +1019,7 @@ guarantees, the sender MUST resend the whole message. Unlike the case with delivery-tag 1 the resent delivery MUST be sent with the resume flag set to true and the delivery-tag set to 4. (While this use of null in the receivers map is valid, it is discouraged. It is - recommended that receiver SHOULD NOT retain such an entry in its map, in which case the + RECOMMENDED that receiver SHOULD NOT retain such an entry in its map, in which case the situation would be as for delivery-tag 1 in this example).

** Append message data not ** @@ -1106,7 +1106,7 @@

For delivery-tags 10 to 14 inclusive the sender indicates that it has reached a terminal outcome, namely . Once the sender has arrived at a terminal outcome - it may not change. As such, if a sender is capable of resuming a delivery (even if the only + it MUST NOT change. As such, if a sender is capable of resuming a delivery (even if the only possible outcome of the delivery is a pre-defined terminal outcome such as ) it MUST NOT use this state as the value of the state in its unsettled map until it is sure that the receiver will not require the resending of the message data. @@ -1119,7 +1119,7 @@ resumption) there is no need to resend the message.

- For delivery-tag 11 it must be assumed that the sender spontaneously attained the terminal + For delivery-tag 11 it MUST be assumed that the sender spontaneously attained the terminal outcome (and is unable to resume). In this case the sender can simply abort the delivery as it cannot be resumed.

@@ -1130,7 +1130,7 @@ aborted=true) ]]>

For delivery-tag 12 both the sender and receiver have attained the same view of the terminal - outcome, but neither has settled. In this case the sender should simply settle the delivery. + outcome, but neither has settled. In this case the sender SHOULD simply settle the delivery.

** Locally settle the delivery ** @@ -1141,7 +1141,7 @@ For delivery-tag 13 the sender and receiver have both attained terminal outcomes, but the outcomes differ. In this case, since the outcome actually takes effect at the sender, it is the sender's view that is definitive. The sender thus MUST restate this as the terminal - outcome, and the receiver should then echo this and settle. + outcome, and the receiver SHOULD then echo this and settle.

** Update any state affected ** @@ -1213,7 +1213,7 @@

- The source defines an optional distribution-mode that informs and/or indicates how + The source optionally defines a distribution-mode that informs and/or indicates how distribution nodes are to behave with respect to the link. The distribution-mode of a source determines how messages from a distribution node are distributed among its associated links. There are two defined distribution-modes: move and copy. When specified, the @@ -1233,9 +1233,9 @@ the source, i.e., reached an ACCEPTED delivery state at the receiver. For a move link with a default configuration this is trivially achieved as such an end result will lead to the message in the ARCHIVED state on the node, and thus - ineligible for transfer. For a copy link, state must be retained at the source to + ineligible for transfer. For a copy link, state MUST be retained at the source to ensure compliance. In practice, for nodes which maintain a strict order on messages at the - node, the state may simply be a record of the most recent message transferred. + node, the state might simply be a record of the most recent message transferred.

@@ -1323,7 +1323,7 @@ label="properties of the dynamically created node">

- If the dynamic field is not set to true this field must be left unset. + If the dynamic field is not set to true this field MUST be left unset.

When set by the receiving link endpoint, this field contains the desired properties of @@ -1378,7 +1378,7 @@ The values in this field are the symbolic descriptors of the outcomes that can be chosen on this link. This field MAY be empty, indicating that the default-outcome will be assumed for all message transfers (if the default-outcome is not set, and no outcomes - are provided, then the outcome must be supported by the source). + are provided, then the outcome MUST be supported by the source).

When present, the values MUST be a symbolic descriptor of a valid outcome, e.g., @@ -1480,7 +1480,7 @@ label="properties of the dynamically created node">

- If the dynamic field is not set to true this field must be left unset. + If the dynamic field is not set to true this field MUST be left unset.

When set by the sending link endpoint, this field contains the desired properties of @@ -1599,10 +1599,10 @@

- A set of named filters. Every key in the map must be of type , every value must be either or of a + A set of named filters. Every key in the map MUST be of type , every value MUST be either or of a described type which provides the archetype filter. A filter acts as a function on - a message which returns a boolean result indicating whether the message may pass through + a message which returns a boolean result indicating whether the message can pass through that filter or not. A message will pass through a filter-set if and only if it passes through each of the named filters. If the value for a given key is null, this acts as if there were no such key present (i.e., all messages pass through the null filter). @@ -1635,7 +1635,7 @@

Definitionally, the lifetime will never be less than the lifetime of the link which caused its creation, however it is possible to extend the lifetime of dynamically - created node using a lifetime policy. The value of this entry must be of a type + created node using a lifetime policy. The value of this entry MUST be of a type which provides the lifetime-policy archetype. The following standard lifetime-policies are defined below: , , or @@ -1648,8 +1648,8 @@ The distribution modes that the node supports.

- The value of this entry must be one or more symbols which are valid - distribution-modes. That is, the value must be of the same type as would be + The value of this entry MUST be one or more symbols which are valid + distribution-modes. That is, the value MUST be of the same type as would be valid in a field defined with the following attributes:

Index: tools/xml2latex.xsl =================================================================== --- tools/xml2latex.xsl (revision 111) +++ tools/xml2latex.xsl (revision 123) @@ -309,19 +309,21 @@ \href{}{} ()\url{} + + \hyperref[chapter-]{Part } - Part : \autoref{section-} + sectionPart : \autoref{section-} \hyperref[choice--]{\tt\bfseries } \autoref{type-} \nameref{type-}\hyperref[type-]{\tt\bfseries } - \hyperref[doc-]{\autoref{doc-}Part : \ref{doc-} \nameref{doc-}} + \hyperref[doc-]{\autoref{doc-}docPart : \ref{doc-} \nameref{doc-}} \hyperref[definition-]{ ()} - \hyperref[chapter-]{} + \hyperref[chapter-]{} - +any @@ -343,10 +345,11 @@ -.xml - %section| - %type| - %doc| +.xml + %part| + %section| + %type| + %doc| %definition| %anchor| %part| @@ -368,8 +371,10 @@ N -\subsubsection*{Type: {\tt }} +\subsection{{\tt }} \label{type-} +. + + - -\vspace{0.3cm} -\begin{tabular}{llp{4cm}p{9cm}} -{\bfseries Encoding} & {\bfseries Code} & {\bfseries Category} & {\bfseries Description} \\[2pt] \hline \\[-8pt] -%%\begin{tabular}{p{1.5cm}p{4.5cm}p{6cm}} -Y -\end{tabular} -Y - - - - {\tt } & & - fixed-width, -byte value - variable-width, byte size - & {\em }\vspace{2pt}\\ - & \multicolumn{3}{p{14cm}}{Y}\vspace{10pt}\\ - - - - - -\begin{longtable}{lp{10.5cm}} - -\hyperref[type-]{} & \\ - -\end{longtable} - - - - -\begin{longtable}{llllp{7cm}} -{\bfseries Type} & {\bfseries Encoding} & {\bfseries Code} & {\bfseries Category} & {\bfseries Description} \\[2pt] \hline \endhead - - - - \hyperref[type-]{} - & - & - & / - & \\ - - -\end{longtable} - - -{\renewcommand{\arraystretch}{1.1} \begin{longtable}{|l|p{15cm}|} -\hline -{\bfseries Revision} & {\bfseries Changes} \\ \hline \endhead - - - & \href{}{} : \\ \hline + + +{\renewcommand{\arraystretch}{1.1} \begin{longtable}{r@{\hspace{0.5em}}p{15cm}} +{\large\bfseries\color{oasispurple} :} & {\large\bfseries\color{oasispurple} } \vspace{0.2cm} \\ + +\href{}{} : & \\ \end{longtable} } + @@ -500,8 +462,8 @@ \begin{Verbatim}[samepage=true,fontsize=\small] -<type name="" class="" source="" provides=""/> - +<type name="" class="" source="" provides=""/> + </type> \end{Verbatim} @@ -512,6 +474,12 @@ <descriptor name="" code=""/> + + + <encoding name="" code="" category="" width="" + label=""/> + + <choice =""/> Index: tools/xml2xml.xsl =================================================================== --- tools/xml2xml.xsl (revision 111) +++ tools/xml2xml.xsl (revision 123) @@ -104,10 +104,10 @@ - - Revision + + :

    - +
  • :

Index: tools/amqp.words =================================================================== --- tools/amqp.words (revision 111) +++ tools/amqp.words (revision 123) @@ -1,3 +1,5 @@ +0xNN +0xNNNNNNNN 26T18 521Z 64K @@ -2,10 +4,5 @@ ABNF -ack ACK -acked -addr AES128 AES256 -Aiyagari -amq AMQP @@ -18,25 +15,20 @@ AMQPLINKPROP AMQPLINKSTATEPROP AMQPMESSANN -amqps AMQPSESSCAP AMQPSOURCECAP AMQPTARGETCAP +API +Aiyagari AmqpValue -API Arrott Axway -bcp47 BCP47 BigInteger -binary32 -binary64 Blanz -blockmode Boerse Borenstein Bridgen -browsable CH0 CH1 CH2 @@ -45,19 +37,8 @@ CH5 CH6 CH7 -charset -chunked -cmd -cmp-exp +CTRL Cooney -ctl -CTRL -datetime -definitionally -defragmented -Delaporte -demux -designator DEST DNS DT1 @@ -65,69 +46,36 @@ DT3 DT4 DT5 -dtx +Delaporte Elz -en -endpoint -endpoints -enqueued -enum -etc -fallback +FIXME FalseClass -fanout -firewalls -FIXME -footer Frystyk +GSS Gettys -Hara -heuristically HMAC HMACs -http -hypertext +Hara Hypertext IANAPEN IANASUBTAG ICHE -idempotent IEEE -ietf -iff IIT -implementers INETCO INIT -int16 -int32 -int64 -int8 -interoperability -interoperable -interoperating -intra IP -Isaiadis -iso ISO10126 IVs +Isaiadis +JPMorgan Jeyaraman -JPMorgan Kaazing Kahlert Kritikos -log2 LSB M1 M2 -MacMullen -MacNaughton -Makesh -Mansour -Masinter -Mazinani -McGarry MD5 ME1 ME2 @@ -135,45 +83,143 @@ ME4 ME5 ME6 -Mealling -Melnikov MGF MI1 MI2 +MSB +MacMullen +MacNaughton +Makesh +Mansour +Masinter +Mazinani +McGarry +Mealling +Melnikov Microsoft -middleware Mikkelsen Moravec -MSB -multi-byte NAGARAJAN -namespace NilClass NoneType Nystrom OCHE OEAP OFB +Overell +PKCS1 +PKCS5 +POSIX +Peeples +Primeton +QoS +Queinnec +RCVD +RFC +RFC2119 +RFC5646 +RFCs +ROLLEDBACK +Rescorla +SASL +SCTP +SHA1 +SHA256 +SHA384 +SHA512 +SURYANARAYANAN +Salz +Schloming +Schur +StormMQ +Sunjeet +TCO +TIMEOUT +TODO +TransactionalState +Traxian +Trieloff +TrueClass +URLs +UTF +UUID +UUIDs +VMware +Vedamuthu +WSO2 +Walshe +Weerasiri +XA +XFRS +XML +Xin +Xuan +Yendluri +Zeilenga +Zenika +ack +acked +addr +amq +amqps +bcp47 +binary32 +binary64 +blockmode +browsable +charset +chunked +cmd +cmp-exp +ctl +datetime +definitionally +defragmented +demux +designator +dtx +en +endpoint +endpoints +enqueued +enum +etc +fallback +fanout +firewalls +footer +heuristically +http +hypertext +idempotent +ietf +iff +implementers +int16 +int32 +int64 +int8 +interoperability +interoperable +interoperate +interoperating +intra +iso +log2 +middleware +multi-byte +namespace org -Overell parsable -Peeples pipelined -PKCS1 -PKCS5 positionally -POSIX pre prepended priori -Primeton processable prot -QoS -Queinnec quiesce rcv -RCVD reattached redeclare redeclared @@ -182,49 +228,24 @@ redelivery reinvoked relinking -Rescorla -RFC rfc1982 rfc2119 -RFC2119 rfc3986 rfc4366 rfc4422 rfc5246 rfc5646 -RFC5646 -RFCs -ROLLEDBACK routable runtime -Salz -SASL -Schloming -Schur -SCTP -SHA1 -SHA256 -SHA384 -SHA512 snd -StormMQ struct structs subtag subtags -Sunjeet -SURYANARAYANAN -TCO tcp -TIMEOUT tls -TODO transactional -TransactionalState transitioning -Traxian -Trieloff -TrueClass tunnelling txn-ctl txt @@ -242,28 +263,12 @@ unroutable untreatable url -URLs -UTF utf16 utf8 -UUID -Vedamuthu -VMware -Walshe wchar -Weerasiri -WSO2 wstring www -XA xfr -XFRS xfrs-rcvd -Xin -XML xref xrefs -Xuan -Yendluri -Zeilenga -Zenika Index: tools/xml2html.xsl =================================================================== --- tools/xml2html.xsl (revision 111) +++ tools/xml2html.xsl (revision 123) @@ -244,6 +244,7 @@ font-family:"Arial","sans-serif"; color:#3B006F; font-weight:bold;} + p.OasisContributor {margin-top:0in; margin-right:0in; @@ -293,7 +294,22 @@ font-size:10.0pt; font-family:"Arial","sans-serif";} - + table.RevisionHistory { + width: 650px; + } + table.RevisionHistory th { + font-size:11.0pt; + padding: 2px; + padding-below: 4px; + color:#3B006F; + text-align:left; + font-weight:bold;} + table.RevisionHistory td.issue { + width:6em; + padding-left: 1em; + vertical-align: top; + text-align: right} + @@ -474,7 +490,7 @@ #section- - + @@ -571,7 +587,7 @@ - + any @@ -581,9 +597,10 @@ + toc - + section subsection @@ -593,10 +610,11 @@ -.xml - %section|@ - %type| - %doc|@ +.xml + %part|@ + %section|@ + %type| + %doc|@ %definition| %anchor| @@ -607,16 +625,12 @@ -

Type: type-

+

type-

+

.

+
- signature - : - - - encodings -EncodingCodeCategoryDescription - - + +
@@ -624,6 +638,8 @@

type-

+

.

+
composite fields @@ -641,6 +657,8 @@

type-

+

.

+
compositepossible values @@ -654,8 +672,8 @@ -
<type name="" class="" source="" provides=""/> - +<type name="" class="" source="" provides=""/> + </type>
@@ -682,6 +700,11 @@ <error =""/>
+ + + + <encoding name="" code="" category="" width="" label=""/> + @@ -732,22 +755,17 @@ - - - + + +
RevisionChanges
+ + - - border-top: 1px solid black - - top - border-right: 1px solid black ; padding-left: 4pt; padding-right: 4pt - - - - +
:
: :
+
@@ -808,6 +826,12 @@ + + + + + + @@ -836,8 +860,8 @@ - - + + 1 Index: Makefile =================================================================== --- Makefile (revision 111) +++ Makefile (revision 123) @@ -20,7 +20,8 @@ XML2LATEX=${TOOLS}/xml2latex.xsl XML2XML=${TOOLS}/xml2xml.xsl -JIRAURI='http://tools.oasis-open.org/issues/sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml?pid=10082&resolution=1&status=5&status=6&sorter/field=priority&sorter/order=DESC&sorter/field=issuekey&sorter/order=ASC&tempMax=1000' +JIRAURI='http://tools.oasis-open.org/issues/sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml?pid=10082&resolution=1&status=5&status=6&status=10002&sorter/field=priority&sorter/order=DESC&sorter/field=issuekey&sorter/order=ASC&tempMax=1000' +VERSIONSURI='http://tools.oasis-open.org/issues/browse/AMQP?report=com.atlassian.jira.plugin.system.project:versions-panel&subset=-1' LATEX=pdflatex @@ -46,6 +47,7 @@ DATEOPTIONS=/T DATESEDSCRIPT="s/^0// ; s/\/01\// January / ; s/\/02\// February / ; s/\/03\// March / ; s/\/04\// April / ; s/\/05\// May / ; s/\/06\// June / ; s/\/07\// July / ; s/\/08\// August / ; s/\/09\// September / ; s/\/10\// October / ; s/\/11\// November / ; s/\/12\// December /" METADATASEDSCRIPT="s/^.\(.*>\)./\1/g" +VERSIONSURI="http://tools.oasis-open.org/issues/browse/AMQP?report=com.atlassian.jira.plugin.system.project:versions-panel&subset=-1" endif TITLE=OASIS AMQP @@ -91,20 +93,23 @@ -mkdir ${MKDIROPT} ${OUTPUT} -mkdir ${MKDIROPT} ${OUTPUT}${FS}temp ${CP} ${IMAGES} ${TEMP} + @echo "" | sed -e ${METADATASEDSCRIPT} > ${OUTPUT}/versions.xml + wget -q -O - ${VERSIONSURI} | grep -A2 "version_" | grep -v font-size | sed -e "s/--//" | sed -e "s/]*>\([^<]*\)<\/span>.*/date='\1'\/>/" | sed -e "s/^.*title=.[^ ]* - \([^\"]*\)\".*>\([^<]*\)<\/a>.*/> ${OUTPUT}${FS}versions.xml + @echo "" | sed -e ${METADATASEDSCRIPT} >> ${OUTPUT}/versions.xml xsltproc -o ${OUTPUT}${FS}version-history.xml ${TOOLS}${FS}version-history.xsl ${JIRAURI} - echo "" | sed -e ${METADATASEDSCRIPT} > ${OUTPUT}/metadata.xml - echo " ${TITLE}" | sed -e ${METADATASEDSCRIPT} >> ${OUTPUT}/metadata.xml - echo " ${DOCUMENT}" | sed -e ${METADATASEDSCRIPT} >> ${OUTPUT}/metadata.xml - echo " ${VERSION}" | sed -e ${METADATASEDSCRIPT} >> ${OUTPUT}/metadata.xml - echo " ${STATUS}" | sed -e ${METADATASEDSCRIPT} >> ${OUTPUT}/metadata.xml - echo " ${DOCDATE}" | sed -e ${METADATASEDSCRIPT} >> ${OUTPUT}/metadata.xml - echo " ${BASEURL}" | sed -e ${METADATASEDSCRIPT} >> ${OUTPUT}/metadata.xml - echo " ${DOCVERSION}" | sed -e ${METADATASEDSCRIPT} >> ${OUTPUT}/metadata.xml - echo " ${COMMITTEEID}" | sed -e ${METADATASEDSCRIPT} >> ${OUTPUT}/metadata.xml + @echo "" | sed -e ${METADATASEDSCRIPT} > ${OUTPUT}/metadata.xml + @echo " ${TITLE}" | sed -e ${METADATASEDSCRIPT} >> ${OUTPUT}/metadata.xml + @echo " ${DOCUMENT}" | sed -e ${METADATASEDSCRIPT} >> ${OUTPUT}/metadata.xml + @echo " ${VERSION}" | sed -e ${METADATASEDSCRIPT} >> ${OUTPUT}/metadata.xml + @echo " ${STATUS}" | sed -e ${METADATASEDSCRIPT} >> ${OUTPUT}/metadata.xml + @echo " ${DOCDATE}" | sed -e ${METADATASEDSCRIPT} >> ${OUTPUT}/metadata.xml + @echo " ${BASEURL}" | sed -e ${METADATASEDSCRIPT} >> ${OUTPUT}/metadata.xml + @echo " ${DOCVERSION}" | sed -e ${METADATASEDSCRIPT} >> ${OUTPUT}/metadata.xml + @echo " ${COMMITTEEID}" | sed -e ${METADATASEDSCRIPT} >> ${OUTPUT}/metadata.xml ifdef PREVDOCVERSION - echo " ${PREVDOCVERSION}" | sed -e ${METADATASEDSCRIPT} >> ${OUTPUT}/metadata.xml + @echo " ${PREVDOCVERSION}" | sed -e ${METADATASEDSCRIPT} >> ${OUTPUT}/metadata.xml endif - echo "" | sed -e ${METADATASEDSCRIPT} >> ${OUTPUT}/metadata.xml + @echo "" | sed -e ${METADATASEDSCRIPT} >> ${OUTPUT}/metadata.xml ${TEMP}/%.pdf: ${TEMP}/%.tex ${XML2HTML} @pushd ${TEMP} ${SEP} ${LATEX} $(<:${TEMP}/%.tex=%.tex) ${SEP} ${LATEX} $(<:${TEMP}/%.tex=%.tex) ${SEP} ${LATEX} $(<:${TEMP}/%.tex=%.tex) ${SEP} popd