Author: rajith
Date: Wed Apr 18 14:48:48 2007
New Revision: 530171

URL: http://svn.apache.org/viewvc?view=rev&rev=530171
Log:
initial commit for distribution transaction support

Added:
    
incubator/qpid/branches/client_restructure/java/newclient/src/main/java/org/apache/qpid/nclient/amqp/AMQPDtxCoordination.java
    
incubator/qpid/branches/client_restructure/java/newclient/src/main/java/org/apache/qpid/nclient/amqp/AMQPDtxDemarcation.java
    
incubator/qpid/branches/client_restructure/java/newclient/src/main/java/org/apache/qpid/nclient/amqp/qpid/QpidAMQPDtxDemarcation.java
Modified:
    
incubator/qpid/branches/client_restructure/java/newclient/src/main/java/org/apache/qpid/nclient/amqp/qpid/QpidAMQPChannel.java
    incubator/qpid/branches/client_restructure/specs/amqp.0-9.xml

Added: 
incubator/qpid/branches/client_restructure/java/newclient/src/main/java/org/apache/qpid/nclient/amqp/AMQPDtxCoordination.java
URL: 
http://svn.apache.org/viewvc/incubator/qpid/branches/client_restructure/java/newclient/src/main/java/org/apache/qpid/nclient/amqp/AMQPDtxCoordination.java?view=auto&rev=530171
==============================================================================
--- 
incubator/qpid/branches/client_restructure/java/newclient/src/main/java/org/apache/qpid/nclient/amqp/AMQPDtxCoordination.java
 (added)
+++ 
incubator/qpid/branches/client_restructure/java/newclient/src/main/java/org/apache/qpid/nclient/amqp/AMQPDtxCoordination.java
 Wed Apr 18 14:48:48 2007
@@ -0,0 +1,52 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.nclient.amqp;
+
+import org.apache.qpid.framing.DtxCoordinationCommitBody;
+import org.apache.qpid.framing.DtxCoordinationCommitOkBody;
+import org.apache.qpid.framing.DtxCoordinationForgetBody;
+import org.apache.qpid.framing.DtxCoordinationForgetOkBody;
+import org.apache.qpid.framing.DtxCoordinationGetTimeoutBody;
+import org.apache.qpid.framing.DtxCoordinationGetTimeoutOkBody;
+import org.apache.qpid.framing.DtxCoordinationPrepareBody;
+import org.apache.qpid.framing.DtxCoordinationPrepareOkBody;
+import org.apache.qpid.framing.DtxCoordinationRecoverBody;
+import org.apache.qpid.framing.DtxCoordinationRecoverOkBody;
+import org.apache.qpid.framing.DtxCoordinationRollbackBody;
+import org.apache.qpid.framing.DtxCoordinationRollbackOkBody;
+import org.apache.qpid.nclient.core.AMQPException;
+
+public interface AMQPDtxCoordination
+{
+       public DtxCoordinationCommitOkBody commit(DtxCoordinationCommitBody 
dtxCoordinationCommitBody) throws AMQPException;
+       
+       public DtxCoordinationForgetOkBody forget(DtxCoordinationForgetBody 
dtxCoordinationForgetBody) throws AMQPException;
+       
+       public DtxCoordinationGetTimeoutOkBody 
getTimeOut(DtxCoordinationGetTimeoutBody dtxCoordinationGetTimeoutBody) throws 
AMQPException;
+       
+       public DtxCoordinationPrepareOkBody prepare(DtxCoordinationPrepareBody 
dtxCoordinationPrepareBody) throws AMQPException;
+       
+       public DtxCoordinationRecoverOkBody recover(DtxCoordinationRecoverBody 
dtxCoordinationRecoverBody) throws AMQPException;
+       
+       public DtxCoordinationRollbackOkBody 
getTimeOut(DtxCoordinationRollbackBody dtxCoordinationRollbackBody) throws 
AMQPException;
+       
+       //public DtxCoordinationSetTimeoutOkBody 
getTimeOut(DtxCoordinationSetTimeoutBody dtxCoordinationSetTimeoutBody) throws 
AMQPException;
+}

Added: 
incubator/qpid/branches/client_restructure/java/newclient/src/main/java/org/apache/qpid/nclient/amqp/AMQPDtxDemarcation.java
URL: 
http://svn.apache.org/viewvc/incubator/qpid/branches/client_restructure/java/newclient/src/main/java/org/apache/qpid/nclient/amqp/AMQPDtxDemarcation.java?view=auto&rev=530171
==============================================================================
--- 
incubator/qpid/branches/client_restructure/java/newclient/src/main/java/org/apache/qpid/nclient/amqp/AMQPDtxDemarcation.java
 (added)
+++ 
incubator/qpid/branches/client_restructure/java/newclient/src/main/java/org/apache/qpid/nclient/amqp/AMQPDtxDemarcation.java
 Wed Apr 18 14:48:48 2007
@@ -0,0 +1,38 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.nclient.amqp;
+
+import org.apache.qpid.framing.DtxDemarcationEndBody;
+import org.apache.qpid.framing.DtxDemarcationEndOkBody;
+import org.apache.qpid.framing.DtxDemarcationSelectBody;
+import org.apache.qpid.framing.DtxDemarcationSelectOkBody;
+import org.apache.qpid.framing.DtxDemarcationStartBody;
+import org.apache.qpid.framing.DtxDemarcationStartOkBody;
+import org.apache.qpid.nclient.core.AMQPException;
+
+public interface AMQPDtxDemarcation
+{
+       public DtxDemarcationSelectOkBody select(DtxDemarcationSelectBody 
dtxDemarcationSelectBody) throws AMQPException;
+       
+       public DtxDemarcationStartOkBody start(DtxDemarcationStartBody 
dtxDemarcationStartBody) throws AMQPException;
+       
+       public DtxDemarcationEndOkBody end(DtxDemarcationEndBody 
dtxDemarcationEndBody) throws AMQPException;
+}

Modified: 
incubator/qpid/branches/client_restructure/java/newclient/src/main/java/org/apache/qpid/nclient/amqp/qpid/QpidAMQPChannel.java
URL: 
http://svn.apache.org/viewvc/incubator/qpid/branches/client_restructure/java/newclient/src/main/java/org/apache/qpid/nclient/amqp/qpid/QpidAMQPChannel.java?view=diff&rev=530171&r1=530170&r2=530171
==============================================================================
--- 
incubator/qpid/branches/client_restructure/java/newclient/src/main/java/org/apache/qpid/nclient/amqp/qpid/QpidAMQPChannel.java
 (original)
+++ 
incubator/qpid/branches/client_restructure/java/newclient/src/main/java/org/apache/qpid/nclient/amqp/qpid/QpidAMQPChannel.java
 Wed Apr 18 14:48:48 2007
@@ -21,7 +21,6 @@
 
 package org.apache.qpid.nclient.amqp.qpid;
 
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
@@ -36,7 +35,6 @@
 import org.apache.qpid.framing.ChannelOpenBody;
 import org.apache.qpid.framing.ChannelOpenOkBody;
 import org.apache.qpid.framing.ChannelResumeBody;
-import org.apache.qpid.framing.ConnectionCloseBody;
 import org.apache.qpid.nclient.amqp.AMQPChannel;
 import org.apache.qpid.nclient.amqp.event.AMQPMethodEvent;
 import org.apache.qpid.nclient.amqp.event.AMQPMethodListener;

Added: 
incubator/qpid/branches/client_restructure/java/newclient/src/main/java/org/apache/qpid/nclient/amqp/qpid/QpidAMQPDtxDemarcation.java
URL: 
http://svn.apache.org/viewvc/incubator/qpid/branches/client_restructure/java/newclient/src/main/java/org/apache/qpid/nclient/amqp/qpid/QpidAMQPDtxDemarcation.java?view=auto&rev=530171
==============================================================================
--- 
incubator/qpid/branches/client_restructure/java/newclient/src/main/java/org/apache/qpid/nclient/amqp/qpid/QpidAMQPDtxDemarcation.java
 (added)
+++ 
incubator/qpid/branches/client_restructure/java/newclient/src/main/java/org/apache/qpid/nclient/amqp/qpid/QpidAMQPDtxDemarcation.java
 Wed Apr 18 14:48:48 2007
@@ -0,0 +1,62 @@
+package org.apache.qpid.nclient.amqp.qpid;
+
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.apache.log4j.Logger;
+import org.apache.qpid.framing.DtxDemarcationEndBody;
+import org.apache.qpid.framing.DtxDemarcationEndOkBody;
+import org.apache.qpid.framing.DtxDemarcationSelectBody;
+import org.apache.qpid.framing.DtxDemarcationSelectOkBody;
+import org.apache.qpid.framing.DtxDemarcationStartBody;
+import org.apache.qpid.framing.DtxDemarcationStartOkBody;
+import org.apache.qpid.nclient.amqp.AMQPDtxDemarcation;
+import org.apache.qpid.nclient.amqp.state.AMQPState;
+import org.apache.qpid.nclient.amqp.state.AMQPStateManager;
+import org.apache.qpid.nclient.core.AMQPException;
+import org.apache.qpid.nclient.core.Phase;
+
+public class QpidAMQPDtxDemarcation implements AMQPDtxDemarcation
+{
+       private static final Logger _logger = 
Logger.getLogger(QpidAMQPDtxDemarcation.class);
+
+       // the channelId assigned for this channel
+       private int _channelId;
+
+       private Phase _phase;
+
+       private AMQPState _currentState;
+
+       private AMQPStateManager _stateManager;
+
+       private final AMQPState[] _validCloseStates = new AMQPState[]
+       { AMQPState.CHANNEL_OPENED, AMQPState.CHANNEL_SUSPEND };
+
+       private final AMQPState[] _validResumeStates = new AMQPState[]
+       { AMQPState.CHANNEL_CLOSED, AMQPState.CHANNEL_NOT_OPENED };
+
+       // The wait period until a server sends a respond
+       private long _serverTimeOut = 1000;
+
+       private final Lock _lock = new ReentrantLock();
+       
+       
+       public DtxDemarcationEndOkBody end(DtxDemarcationEndBody 
dtxDemarcationEndBody) throws AMQPException
+       {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       public DtxDemarcationSelectOkBody select(DtxDemarcationSelectBody 
dtxDemarcationSelectBody) throws AMQPException
+       {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       public DtxDemarcationStartOkBody start(DtxDemarcationStartBody 
dtxDemarcationStartBody) throws AMQPException
+       {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+}

Modified: incubator/qpid/branches/client_restructure/specs/amqp.0-9.xml
URL: 
http://svn.apache.org/viewvc/incubator/qpid/branches/client_restructure/specs/amqp.0-9.xml?view=diff&rev=530171&r1=530170&r2=530171
==============================================================================
--- incubator/qpid/branches/client_restructure/specs/amqp.0-9.xml (original)
+++ incubator/qpid/branches/client_restructure/specs/amqp.0-9.xml Wed Apr 18 
14:48:48 2007
@@ -4311,72 +4311,855 @@
     </method>
   </class>
 
-  <!-- ==  DTX  ============================================================== 
-->
 
-  <class name = "dtx" handler = "channel" index = "100" label = "work with 
distributed transactions">
+<!--
+      ======================================================
+      ==       CONSTANTS
+      ======================================================
+  -->
+
+ <!-- XA constants -->
+
+  <constant name = "xa-rbrollback" value = "1">
     <doc>
-      Distributed transactions provide so-called "2-phase commit". The AMQP 
distributed
-      transaction model supports the X-Open XA architecture and other 
distributed transaction
-      implementations. The Dtx class assumes that the server has a private 
communications
-      channel (not AMQP) to a distributed transaction coordinator.
+       The rollback was caused by an unspecified reason.
+    </doc>
+  </constant>
+  <constant name = "xa-rbtimeout" value = "2">
+    <doc>
+      A transaction branch took too long.
+    </doc>
+  </constant>
+  <constant name = "xa-heurhaz" value = "3">
+    <doc>
+      The transaction branch may have been heuristically completed.
+    </doc>
+  </constant>
+  <constant name = "xa-heurcom" value = "4">
+    <doc>
+      The transaction branch has been heuristically committed.
+    </doc>
+  </constant>
+  <constant name = "xa-heurrb" value = "5">
+    <doc>
+     The transaction branch has been heuristically rolled back.
+    </doc>
+  </constant>
+  <constant name = "xa-heurmix" value = "6">
+    <doc>
+     The transaction branch has been heuristically committed and rolled back.
+    </doc>
+  </constant>
+  <constant name = "xa-rdonly" value = "7">
+    <doc>
+     The transaction branch was read-only and has been committed. 
+    </doc>
+  </constant>
+  <constant name = "xa-ok" value = "8">
+    <doc>
+     Normal execution. 
+    </doc>
+  </constant>
+
+
+<!--
+      ======================================================
+      ==       DOMAIN TYPES
+      ======================================================
+  -->
+
+  <domain name = "Xid" type = "longstr" label = "Transaction branch 
identifier">
+     <doc>
+       An Xid uniquely identifies a transaction branch.   
+    </doc>
+    <rule name = "implementation">
+      <doc>
+        Xid contains a format identifier, two length fields and a data field:  
+       format_id       long
+       gtrid_length    octet   
+       bqual_length    octet  
+       data            
+        
+        format_id is an implementation specific format identifier
+       the data field is a sequence of octets of at most 128 bytes containing 
the txn id and the branch id
+       gtrid_length field indicates how many bytes of this form the 
transaction id
+       bqual_length field indicates how many bytes of this form the branch id
+       The sum of the two lengths must equal the length of the data field
+      </doc>      
+    </rule>   
+  </domain>
+ 
+  <!-- ==  dtx-demarcation  
========================================================== -->
+
+ 
+  <class name = "dtx-demarcation" handler = "channel" index = "100" label = 
"demarcates distributed transaction branches">
+    <doc>
+       This class is part of the X-Open XA distributed transaction protocol 
support. It allows a channel to be 
+       selected for use with distributed transactions and the transactional 
boundaries for work on that channel
+       to be demarcated.
     </doc>
-    
     <doc type = "grammar">
-      dtx                 = C:SELECT S:SELECT-OK
-                            C:START S:START-OK
+      dtx-demarcation     = C:SELECT S:SELECT-OK *demarcation
+
+      demarcation         = C:START S:START-OK C:END S:END-OK                  
          
     </doc>
 
+   
     <chassis name = "server" implement = "MAY" />
     <chassis name = "client" implement = "MAY" />
 
-    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-->
+    <rule name = "access-control">
+      <doc>
+       Access-tickets are propagated with XA association methods with the aim 
of 
+       restricting which users are allowed to control which transactions. 
+       The server MAY restrict transaction association to a particular 
identity.       
+      </doc>
+    </rule>    
+
+    <rule name = "transactionality">
+      <doc>
+       Enabling XA transaction support on a channel implies that the server 
MUST manage transactions demarcated by start-end blocks. That is to say that on 
this XA-enabled channel, work undergone within transactional blocks is 
performed on behalf a transaction branch whereas work performed outside of 
transactional blocks is NOT transactional.     
+      </doc>
+    </rule>    
+
+ 
+    <!-- - - - SELECT - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - -->
 
-    <method name = "select" synchronous = "1" index = "10" label = "select 
standard transaction mode">
+    <method name = "select" synchronous = "1" index = "10" label = "select 
distributed transaction mode">
       <doc>
-        This method sets the channel to use distributed transactions. The 
client must use
-        this method at least once on a channel before using the Start method.
+         This method sets the channel to use distributed transactions. The 
client must use this method at least once on a channel before using XA 
demarcation operations.
       </doc>
-      <chassis name = "server" implement = "MUST" />
+      <chassis name = "server" implement = "MAY" />
       <response name = "select-ok" />
     </method>
 
-    <method name = "select-ok" synchronous = "1" index = "11" label = "confirm 
transaction mode">
+    <!-- - - - SELECT-OK - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - -->
+
+    <method name = "select-ok" synchronous = "1" index = "11" label = "confirm 
distributed transaction mode">
       <doc>
-        This method confirms to the client that the channel was successfully 
set to use
-        distributed transactions.
+        This method confirms to the client that the channel was successfully 
set to use distributed transactions.
       </doc>
-      <chassis name = "client" implement = "MUST" />
+      <chassis name = "client" implement = "MAY" />
     </method>
 
-    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-->
+    <!-- - - START - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - -->
 
-    <method name = "start" synchronous = "1" index = "20"
-      label = "start a new distributed transaction">
+    <method name = "start" synchronous = "1" index = "20" label = "Start a 
transaction branch">
       <doc>
-        This method starts a new distributed transaction. This must be the 
first method on a
-        new channel that uses the distributed transaction mode, before any 
methods that
-        publish or consume messages.
+        This method is called when messages should be produced and consumed on 
behalf a transaction branch identified by xid. 
       </doc>
       <chassis name = "server" implement = "MAY" />
       <response name = "start-ok" />
-      <field name = "dtx-identifier" domain = "shortstr" label = "transaction 
identifier">
+      <!-- rules  -->
+      <rule name = "commandInvalid ">
+         <doc>
+        If the method is invoked in an improper context (see class grammar) 
then the server MUST raise a channel exception with reply code 503 (command 
invalid)
+         </doc>
+      </rule>     
+       <rule name = "alreadyAssociated">
+        <doc>
+         If neither join nor resume is specified is specified and the 
transaction branch specified by xid has previously been seen then the server 
MUST raise a channel exception with reply code 530 (not allowed).
+        </doc>
+      </rule>  
+        <rule name = "joinAndresume">
+         <doc>
+        If join and resume are specified then the server MUST raise a channel 
exception with reply code 503 (command invalid)
+         </doc>
+      </rule>   
+
+      <field name = "ticket" domain = "access-ticket" label = "Access-ticket 
granted by the server for a specific realm">
         <doc>
-          The distributed transaction key. This identifies the transaction so 
that the
-          AMQP server can coordinate with the distributed transaction 
coordinator.
+          Access-ticket granted by the server for a specific realm. 
+        </doc>
+        <assert check = "notnull" />   
+      </field>
+
+      <field name = "xid" domain = "Xid" label = "Start any work associated 
with transaction branch with Xid xid">
+        <doc>
+          Specifies the xid of the transaction branch to be started. 
         </doc>
         <assert check = "notnull" />
+        <!-- rules -->
+       <rule name = "unknownXid">
+        <doc>
+         If Xid is already known by the broker then the server MUST raise a 
channel exception with reply code 530 (not allowed).
+        </doc>
+        </rule>                
+      </field>
+
+      <field name = "join" domain = "bit" label = "Indicate whether this is 
joining an already associated  Xid">
+        <doc>    
+         Indicate that the start applies to joining a transaction previously 
seen. 
+        </doc> 
+      <!-- rules -->     
+      <rule name = "unsupported">
+        <doc>        
+         If the broker does not support join the server MUST raise a channel 
exception with reply code 540 (not implemented).
+       </doc>
+      </rule>
+        <assert check = "notnull" />   
+      </field>
+
+      <field name = "resume" domain = "bit" label = "Indicate whether this is 
resuming a suspended transaction branch">
+        <doc>    
+         Indicate that the start applies to resuming a suspended transaction 
branch specified.
+        </doc>       
+        <assert check = "notnull" />   
+      </field>
+    </method>
+
+     <!-- - - - START-OK - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - -->
+
+    <method name = "start-ok" synchronous = "1" index = "21" label = "confirm 
distributed transaction start">
+      <doc>
+        This method confirms to the client that the transaction branch is 
started or specify the error condition. 
+      </doc>
+      <chassis name = "client" implement = "MAY" />
+      
+      <field name = "flags" domain = "short" label = "xa-ok or xa-rbrollback">
+        <doc> 
+         xa-ok: Normal execution. 
+         xa-rbrollback: The broker marked the transaction branch rollback-only 
for an unspecified reason.        
+        </doc>
+        <assert check = "notnull" />   
+      </field>
+    </method>
+
+
+    <!-- - - END - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- -->
+
+    <method name = "end" synchronous = "1" index = "30" label = "End a 
transaction branch">
+      <doc>
+        This method is called when the work done on behalf a transaction 
branch finishes or needs to be suspended.     
+      </doc>
+      <chassis name = "server" implement = "MAY" />
+      <response name = "end-ok" />
+
+      <rule name = "commandInvalid ">
+         <doc>
+        If the method is invoked in an improper context (see class grammar) 
then the server MUST raise a channel exception with reply code 503 (command 
invalid)
+         </doc>
+      </rule>   
+
+      <rule name = "suspendAndfail">
+         <doc>
+        If suspend and fail are specified then the server MUST raise a channel 
exception with reply code 503 (command invalid)
+         </doc>
+      </rule>    
+        
+      <rule name = "internalError ">
+         <doc>
+        If an error occurs in ending the transaction branch then the server 
MUST raise a channel exception with reply code 541 (internal error)
+         </doc>
+      </rule> 
+
+      <rule name = "success ">
+         <doc>
+        If neither fail nor suspend are specified then the portion of work has 
completed successfully
+         </doc>
+      </rule> 
+
+      <field name = "ticket" domain = "access-ticket" label = "Access-ticket 
granted by the server for a specific realm">
+        <doc>
+          Access-ticket granted by the server for a specific realm. 
+        </doc>
+        <assert check = "notnull" />   
+      </field>
+
+      <field name = "xid" domain = "Xid" label = "End any work associated with 
transaction branch with Xid xid">
+        <doc>
+          Specifies the xid of the transaction branch to be ended. 
+        </doc>
+        <assert check = "notnull" />   
+        <!-- rules -->
+       <rule name = "unknownXid">
+        <doc>
+         If Xid is unknown (the transaction branch has not been started or has 
already been ended) then the server MUST raise a channel exception with reply 
code 404 (not found).
+        </doc>
+        </rule> 
+      </field>
+
+      <field name = "fail" domain = "bit" label = "Indicate whether the 
portion of work has failed">
+        <doc>    
+         Indicates that the portion of work has failed otherwise the portion 
of work has completed successfully.
+        </doc>      
+      <rule name = "failure">
+        <doc>
+         If fail is specified then the transaction should be marked as 
rollback-only.     
+        </doc>
+      </rule>
+        <assert check = "notnull" />   
+      </field>
+
+      <field name = "suspend" domain = "bit" label = "Indicate that the 
transaction branch is temporarily suspended in an incomplete state">
+        <doc>    
+         Indicates that the transaction branch is temporarily suspended in an 
incomplete state. 
+        </doc>      
+      <rule name = "resume">
+        <doc>
+         The transaction context is in a suspended state and must be resumed 
via the start method with resume specified.   
+        </doc>
+      </rule>
+        <assert check = "notnull" />   
+      </field>
+
+    </method>
+   
+     <!-- - - - END-OK - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - -->
+
+    <method name = "end-ok" synchronous = "1" index = "31" label = "confirm 
distributed transaction end">
+      <doc>
+        This method confirms to the client that the transaction branch is 
ended or specify the error condition. 
+      </doc>
+      <chassis name = "client" implement = "MAY" />
+      
+       <field name = "flags" domain = "short" label = "xa-ok, xa-rbrollback, 
xa-rbtimeout">
+        <doc> 
+         xa-ok: Normal execution. 
+         xa-rbrollback: The broker marked the transaction branch rollback-only 
for an unspecified reason.
+        xa-rbtimeout: The work represented by this transaction branch took too 
long.
+        </doc>
+        <assert check = "notnull" />   
+      </field>
+    </method> 
+   </class>
+
+
+<!-- ==  dtx-coordination   
========================================================== -->
+
+
+  <class name = "dtx-coordination" handler = "channel" index = "105" label = 
"coordinate transaction outcomes">
+    <doc>
+      This class is part of the X-Open XA distributed transaction protocol 
support. 
+      It allows the transaction manager to coordinate transaction outcomes. 
+    </doc>
+ 
+    <doc type = "grammar">
+
+      dtx-coordination    = *coordination
+
+      coordination        =  command 
+                          /  outcome
+                          /  recovery
+
+      command             = C:SET-TIMEOUT S:SET-TIMEOUT-OK
+                         / C:GET-TIMEOUT S:GET-TIMEOUT-OK
+                          
+      outcome             = one-phase-commit
+                          / one-phase-rollback
+                          / two-phase-commit
+                          / two-phase-rollback
+
+      one-phase-commit    = C:COMMIT S:COMMIT-OK
+
+      one-phase-rollback  = C:ROLLBACK S:ROLLBACK-OK
+
+      two-phase-commit    = C:PREPARE S:PREPARE-OK C:COMMIT S:COMMIT-OK
+
+      two-phase-rollback  = C:PREPARE S:PREPARE-OK C:ROLLBACK S:ROLLBACK-OK
+
+      recovery           = C:RECOVER S:RECOVER-OK *recovery-outcome
+
+      recovery-outcome    = one-phase-commit
+                          / one-phase-rollback
+                          / C:FORGET S:FORGET-OK
+    </doc>
+
+    <chassis name = "server" implement = "MAY" />
+    <chassis name = "client" implement = "MAY" />
+
+    <rule name = "security">
+      <doc>
+       Access-tickets are propagated with XA demarcation methods with the aim 
of 
+       restricting which users are allowed to control which transactions. 
+       The server MAY restrict transaction coordination to a particular 
identity.       
+      </doc>
+      <doc type = "scenario">        
+      </doc>
+    </rule>    
+
+   
+    <!-- - - COMMIT - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - -->
+
+    <method name = "commit" synchronous = "1" index = "10" label = "Commit the 
work done on behalf a transaction branch ">
+      <doc>
+        This method commits the work associated with xid. Any produced 
messages are made available and any consumed messages are discarded. 
+      </doc>
+      <chassis name = "server" implement = "MAY" />
+      <response name = "commit-ok" />
+      
+      <rule name = "internalError">
+         <doc>
+        If an error occurs in committing the transaction branch then the 
server MUST raise a channel exception with reply code 541 (internal error)
+         </doc>
+      </rule> 
+
+      <rule name = "commandInvalid">
+         <doc>
+        If the method is invoked in an improper context (see class grammar) 
then the server MUST raise a channel exception with reply code 503 (command 
invalid)
+         </doc>
+      </rule>
+    
+      <field name = "ticket" domain = "access-ticket" label = "Access-ticket 
granted by the server for a specific realm">
+        <doc>
+          Access-ticket granted by the server for a specific realm. 
+        </doc>
+        <assert check = "notnull" />   
+      </field>
+
+      <field name = "xid" domain = "Xid" label = "Commit the work associated 
with Xid xid">
+        <doc> 
+          Specifies the Xid of the transaction branch to be committed. 
+        </doc>
+        <assert check = "notnull" />   
+        <!-- rules -->
+       <rule name = "unknownXid">
+        <doc>
+         If Xid is unknown (the transaction branch has not been started or has 
already been ended) then the server MUST raise a channel exception with reply 
code 404 (not found).
+        </doc>
+      </rule>
+      <rule name = "notdisassociated">
+         <doc>
+        If this method is called when Xid is still associated with a channel 
then the server MUST raise a channel exception with reply code 503 (command 
invalid)
+         </doc>
+      </rule>
+      </field>
+
+      <field name = "one-phase" domain = "bit" label = "Indicate that 
one-phase optimization must be used">
+        <doc>
+          When set then one-phase commit optimization is used.  
+        </doc>
+        <assert check = "notnull" />   
+      </field>
+    </method>
+
+    <!-- - - - COMMIT-OK - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - -->
+
+    <method name = "commit-ok" synchronous = "1" index = "11" label = "confirm 
distributed transaction commit">
+      <doc>
+        This method confirms to the client that the transaction branch is 
committed or specify the error condition. 
+      </doc>
+      <chassis name = "client" implement = "MAY" />
+      
+       <field name = "flags" domain = "short" label = "xa-ok, xa-heurhaz, 
xa-heurcom, xa-heurrb, xa-heurmix, xa-rbrollback">
+        <doc> 
+         xa-ok: Normal execution,
+        xa-heurhaz: Due to some failure, the work done on behalf of the 
specified transaction branch may have been heuristically completed.
+        xa-heurcom: Due to a heuristic decision, the work done on behalf of 
the specified transaction
+   branch was committed.
+       xa-heurrb: Due to a heuristic decision, the work done on behalf of the 
specified transaction
+   branch was rolled back.
+       xa-heurmix: Due to a heuristic decision, the work done on behalf of the 
specified transaction
+   branch was partially committed and partially rolled back.
+        xa-rbrollback: The broker marked the transaction branch rollback-only 
for an unspecified reason.        
+       xa-rbtimeout: The work represented by this transaction branch took too 
long.    
+        </doc>
+        <assert check = "notnull" />   
+      </field>
+    </method>
+
+
+    <!-- - - FORGET - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - -->
+
+    <method name = "forget" synchronous = "1" index = "20" label = "Discard 
knowledge of a heuristically-completed transaction branch">
+      <doc>
+        This method is called to forget about a heuristically completed 
transaction branch.       
+      </doc>
+      <chassis name = "server" implement = "MAY" />
+      <response name = "forget-ok" />
+
+      <rule name = "internalError ">
+         <doc>
+        If an error occurs in forgetting the transaction branch then the 
server MUST raise a channel exception with reply code 541 (internal error)
+         </doc>
+      </rule>  
+      
+      <rule name = "commandInvalid ">
+         <doc>
+        If the method is invoked in an improper context (see class grammar) 
then the server MUST raise a channel exception with reply code 503 (command 
invalid)
+         </doc>
+      </rule>
+
+      <field name = "ticket" domain = "access-ticket" label = "Access-ticket 
granted by the server for a specific realm">
+        <doc>
+          Access-ticket granted by the server for a specific realm. 
+        </doc>
+        <assert check = "notnull" />   
+      </field>
+
+      <field name = "xid" domain = "Xid" label = "Erase RM its knowledge of 
Xid xid">
+        <doc> 
+          Specifies the xid of the transaction branch to be forgotten. 
+        </doc>
+        <assert check = "notnull" />   
+        <!-- rules -->
+      <rule name = "unknownXid">
+        <doc>
+         If Xid is unknown (the transaction branch has not been started or has 
already been ended) then the server MUST raise a channel exception with reply 
code 404 (not found).
+        </doc>
+      </rule>
+      <rule name = "notdisassociated">
+         <doc>
+        If this method is called when Xid is still associated with a channel 
then the server MUST raise a channel exception with reply code 503 (command 
invalid)
+         </doc>
+      </rule>
+      </field>
+    </method>
+
+    <!-- - - - FORGET-OK - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - -->
+
+    <method name = "forget-ok" synchronous = "1" index = "21" label = "Confirm 
distributed transaction forget">
+      <doc>
+        This method confirms to the client that the transaction branch is 
forgotten or specify the error condition. 
+      </doc>
+      <chassis name = "client" implement = "MAY" />          
+    </method>
+ 
+    <!-- - - - get-Timeout - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - -->
+
+    <method name = "get-timeout" synchronous = "1" index = "30" label = 
"Obtain the transaction timeout value in seconds">
+      <doc>
+        This method obtains the current transaction timeout value in seconds. 
+       If setTimeout was not used prior to invoking this method, the return 
value is the default timeout; otherwise, the value used in the previous 
setTimeout call is returned.
+      </doc>
+      <chassis name = "server" implement = "MAY" />
+      <response name = "get-timeout-ok" />
+
+
+      <field name = "xid" domain = "Xid" label = "Xid of the branch to get the 
timeout value">
+        <doc> 
+          Specifies the Xid of the transaction branch for getting the timeout.
+        </doc>
+        <assert check = "notnull" />   
+        <!-- rules -->
+      <rule name = "unknownXid">
+        <doc>
+         If Xid is unknown (the transaction branch has not been started or has 
already been ended) then the server MUST raise a channel exception with reply 
code 404 (not found).
+        </doc>
+      </rule>
       </field>
+
+      <rule name = "internalError ">
+         <doc>
+        If an error occurs in setting the transaction timeout then the server 
MUST raise a channel exception with reply code 541 (internal error)
+         </doc>
+      </rule> 
     </method>
 
-    <method name = "start-ok" synchronous = "1" index = "21"
-      label = "confirm the start of a new distributed transaction">
+    <!-- - - - get-Timeout-OK - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - - - -->
+
+    <method name = "get-timeout-ok" synchronous = "1" index = "31" label = 
"Return transaction timeout">
       <doc>
-        This method confirms to the client that the transaction started. Note 
that if a
-        start fails, the server raises a channel exception.
+        This method returns the current transaction timeout value in seconds. 
       </doc>
-      <chassis name = "client" implement = "MUST" />
+      <chassis name = "client" implement = "MAY" />
+      
+       <field name = "timeout" domain = "long" label = "The current 
transaction timeout value">
+        <doc> 
+        The current transaction timeout value in seconds. 
+        </doc>
+        <assert check = "notnull" />   
+      </field>
     </method>
-  </class>
+ 
+    <!-- - - PREPARE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - -->
+
+    <method name = "prepare" synchronous = "1" index = "40" label = "Ask to 
prepare a transaction branch">
+      <doc>
+        This method prepares for commitment any message produced or consumed 
on behalf of xid.          
+      </doc>
+       
+      <rule name = "internalError">
+         <doc>
+        If an error occurs in preparing the transaction branch then the server 
MUST raise a channel exception with reply code 541 (internal error). The 
specified Xid may or may not have been prepared.
+         </doc>
+      </rule> 
+
+      <rule name = "commandInvalid">
+         <doc>
+        If the method is invoked in an improper context (see class grammar) 
then the server MUST raise a channel exception with reply code 503 (command 
invalid)
+         </doc>
+      </rule>
+
+      <rule name = "obligation1">
+        <doc>
+          Once this method successfully returns it is guaranteed that the 
transaction branch may be either 
+         committed or rolled back regardless of failures.
+        </doc>
+      </rule>
+
+      <rule name = "obligation2">
+        <doc>
+          The knowledge of xid cannot be erased before commit or rollback 
complete the branch. 
+        </doc>
+      </rule>
+
+      <chassis name = "server" implement = "MAY" />
+      <response name = "prepare-ok" />
+
+      <field name = "ticket" domain = "access-ticket" label = "Access-ticket 
granted by the server for a specific realm">
+        <doc>
+          Access-ticket granted by the server for a specific realm. 
+        </doc>
+        <assert check = "notnull" />   
+      </field>
+
+      <field name = "xid" domain = "Xid" label = "Prepare for commitment any 
work associated with Xid xid">
+        <doc> 
+          Specifies the Xid of the transaction branch that can be prepared.
+        </doc>
+        <assert check = "notnull" />   
+        <!-- rules -->
+       <rule name = "unknownXid">
+        <doc>
+         If Xid is unknown (the transaction branch has not been started or has 
already been ended) then the server MUST raise a channel exception with reply 
code 404 (not found).
+        </doc>
+        </rule>
+          <rule name = "notdisassociated">
+         <doc>
+        If this method is called when Xid is still associated with a channel 
then the server MUST raise a channel exception with reply code 503 (command 
invalid)
+         </doc>
+        </rule>
+      </field>
+     </method>
+
+
+    <!-- - - - PREPARE-OK - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - -->
+
+    <method name = "prepare-ok" synchronous = "1" index = "41" label = 
"confirm distributed transaction prepare">
+      <doc>
+        This method confirms to the client that the transaction branch is 
prepared or specify the error condition. 
+      </doc>
+      <chassis name = "client" implement = "MAY" />
+      
+       <field name = "flags" domain = "short" label = "xa-ok, xa-rdonly, 
xa-rbrollback, xa-rbtimeout">
+        <doc> 
+         xa-ok: Normal execution.
+         xa-rdonly: The transaction branch was read-only and has been 
committed.
+         xa-rbrollback: The broker marked the transaction branch rollback-only 
for an unspecified reason.    
+        xa-rbtimeout: The work represented by this transaction branch took too 
long.            
+        </doc>
+        <assert check = "notnull" />   
+      </field>
+    </method>
+
+
+    <!-- - - RECOVER - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - -->
+
+    <method name = "recover" synchronous = "1" index = "50" label = "Get a 
list of Xids the RM has prepared or  heuristically completed">
+      <doc>
+       This method is called to obtain a list of transaction branches that are 
in a 
+       prepared or heuristically completed state.
+      </doc>
+       
+      <rule name = "internalError ">
+         <doc>
+        If an error occurs in recovering then the server MUST raise a channel 
exception with reply code 541 (internal error)
+         </doc>
+      </rule> 
+
+      <rule name = "startEnd">
+          <doc>
+             If this endscan is used in conjunction with startscan then a 
single call starts and then ends a scan.     
+          </doc>
+      </rule>
+
+      <rule name = "mustBeStarted">
+          <doc>
+             If none of endscan and startscan are set then a recovery scan 
must already be started otherwise the server MUST raise a channel exception 
with reply code 503 (command invalid)
+          </doc>
+      </rule>
+
+      <chassis name = "server" implement = "MAY" />
+      <response name = "recover-ok" />
+
+      <field name = "ticket" domain = "access-ticket" label = "Access-ticket 
granted by the server for a specific realm">
+        <doc>
+          Access-ticket granted by the server for a specific realm. 
+        </doc>
+        <assert check = "notnull" />   
+      </field>
+
+      <field name = "startscan" domain = "bit" label = "Indicates that 
recovery scan should start">
+        <doc> 
+          Indicates that recovery scan should start. 
+        </doc>
+       <rule name = "recoveryAlreadyOpen">
+          <doc>
+           If a recovery scan is already open, the effect is as if the 
recovery scan were ended and then restarted.
+          </doc>
+        </rule>
+        <assert check = "notnull" />   
+      </field>
+      
+      <field name = "endscan" domain = "long" label = "indicates that the 
recovery scan should end after returning the Xids">
+        <doc>           
+         Indicates that the recovery scan should end after returning the Xids. 
          
+        </doc>
+        <assert check = "notnull" />   
+      </field>
+    </method>
+
+    <!-- - - RECOVER-OK - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - -->
+
+    <method name = "recover-ok" synchronous = "1" index = "51" label = "list 
of Xids to be recovered">
+      <doc>
+       Returns to the client a table of transaction Xids that are in a 
prepared or heuristically completed state.
+      </doc>
+
+      <chassis name = "server" implement = "MAY" />
+     
+      <field name = "xids" domain = "table" label = "Table of xids to be 
recovered">
+        <doc>
+          table containing transaction Xids that are in a prepared or 
heuristically completed state.
+        </doc>
+        <assert check = "notnull" />   
+      </field>
+    </method>
+
+    <!-- - - ROLLBACK - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - -->
+
+    <method name = "rollback" synchronous = "1" index = "60" label = "Rollback 
a transaction branch">
+      <doc>
+        This method rolls back the work associated with xid. Any produced 
messages are discarded 
+       and any consumed messages are re-enqueued.      
+      </doc>
+
+      <rule name = "internalError">
+         <doc>
+        If an error occurs in rolling back the transaction branch then the 
server MUST raise a channel exception with reply code 541 (internal error)
+         </doc>
+      </rule> 
+
+      <rule name = "commandInvalid">
+         <doc>
+        If the method is invoked in an improper context (see class grammar) 
then the server MUST raise a channel exception with reply code 503 (command 
invalid)
+         </doc>
+      </rule>
+
+      <chassis name = "server" implement = "MAY" />
+      <response name = "rollback-ok" />
+
+      <field name = "ticket" domain = "access-ticket" label = "Access-ticket 
granted by the server for a specific realm">
+        <doc>
+          Access-ticket granted by the server for a specific realm. 
+        </doc>
+        <assert check = "notnull" />   
+      </field>
+
+      <field name = "xid" domain = "Xid" label = "Rollback any work associated 
with Xid xid">
+        <doc> 
+          Specifies the Xid of the transaction branch that can be rolled back.
+        </doc>
+        <assert check = "notnull" />   
+        <!-- rules -->
+      <rule name = "unknownXid">
+        <doc>
+         If Xid is unknown (the transaction branch has not been started or has 
already been ended) then the server MUST raise a channel exception with reply 
code 404 (not found).
+        </doc>
+      </rule>
+      <rule name = "notdisassociated">
+         <doc>
+        If this method is called when Xid is still associated with a channel 
then the server MUST raise a channel exception with reply code 503 (command 
invalid)
+         </doc>
+      </rule>
+      </field>
+    </method>
+
+  <!-- - - - ROLLBACK-OK - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - -->
+
+    <method name = "rollback-ok" synchronous = "1" index = "61" label = 
"confirm distributed transaction rollback">
+      <doc>
+        This method confirms to the client that the transaction branch is 
rolled back or specify the error condition. 
+      </doc>
+      <chassis name = "client" implement = "MAY" />
+      
+       <field name = "flags" domain = "short" label = "xa-ok, xa-heurhaz, 
xa-heurcom, xa-heurrb, xa-heurmix, xa-rbrollback">
+        <doc> 
+         xa-ok: Normal execution,
+        xa-heurhaz: Due to some failure, the work done on behalf of the 
specified transaction branch may have been heuristically completed.
+        xa-heurcom: Due to a heuristic decision, the work done on behalf of 
the specified transaction
+   branch was committed.
+       xa-heurrb: Due to a heuristic decision, the work done on behalf of the 
specified transaction
+   branch was rolled back.
+       xa-heurmix: Due to a heuristic decision, the work done on behalf of the 
specified transaction
+   branch was partially committed and partially rolled back.
+        xa-rbrollback: The broker marked the transaction branch rollback-only 
for an unspecified reason. 
+       xa-rbtimeout: The work represented by this transaction branch took too 
long.        
+        </doc>
+        <assert check = "notnull" />   
+      </field>
+    </method>
+
+
+
+   <!-- - - SETTIMEOUT - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - -->
+
+    <method name = "set-timeout" synchronous = "1" index = "70" label = "Set 
the transaction timeout value">
+      <doc>
+        Sets the specified transaction branch timeout value in seconds.        
+      </doc>
+
+      <rule name = "internalError ">
+         <doc>
+        If an error occurs in setting the transaction timeout then the server 
MUST raise a channel exception with reply code 541 (internal error)
+         </doc>
+      </rule> 
+
+      <rule name = "effective">
+        <doc>
+          Once set, this timeout value is effective until this method is 
reinvoked with a different value.
+        </doc>
+      </rule>
+
+      <rule name = "reset">
+        <doc>
+          A value of zero resets the timeout value to the default value.
+        </doc>
+      </rule>
+
+      <chassis name = "server" implement = "MAY" />
+      <response name = "set-timeout-ok" />
+
+      <field name = "ticket" domain = "access-ticket" label = "Access-ticket 
granted by the server for a specific realm">
+        <doc>
+          Access-ticket granted by the server for a specific realm. 
+        </doc>
+        <assert check = "notnull" />   
+      </field>
+
+       <field name = "xid" domain = "Xid" label = "Xid of the branch to set 
the timeout value">
+        <doc> 
+          Specifies the Xid of the transaction branch for setting the timeout.
+        </doc>
+        <assert check = "notnull" />   
+        <!-- rules -->
+      <rule name = "unknownXid">
+        <doc>
+         If Xid is unknown (the transaction branch has not been started or has 
already been ended) then the server MUST raise a channel exception with reply 
code 404 (not found).
+        </doc>
+      </rule>
+      </field>
+
+      <field name = "timeout" domain = "long" label = "The transaction timeout 
value in seconds">
+        <doc> 
+          The transaction timeout value in seconds.
+        </doc>
+        <assert check = "notnull" />   
+      </field>
+    </method>
+
+    <!-- - - - SETTIMEOUT-OK - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - - -->
+
+    <method name = "select-ok" synchronous = "1" index = "71" label = "confirm 
timeout set">
+      <doc>
+        This method confirms that the timeout has been set. 
+      </doc>
+      <chassis name = "client" implement = "MAY" />
+    </method> 
+   </class>
+
+
 
   <!-- ==  TUNNEL  =========================================================== 
-->
 


Reply via email to