You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2008/02/22 03:57:22 UTC

svn commit: r630075 - /incubator/qpid/trunk/qpid/cpp/rubygen/amqpgen.rb

Author: aconway
Date: Thu Feb 21 18:57:19 2008
New Revision: 630075

URL: http://svn.apache.org/viewvc?rev=630075&view=rev
Log:
Extended amqpgen.rb to cover 0-10 final model.

Modified:
    incubator/qpid/trunk/qpid/cpp/rubygen/amqpgen.rb

Modified: incubator/qpid/trunk/qpid/cpp/rubygen/amqpgen.rb
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/rubygen/amqpgen.rb?rev=630075&r1=630074&r2=630075&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/rubygen/amqpgen.rb (original)
+++ incubator/qpid/trunk/qpid/cpp/rubygen/amqpgen.rb Thu Feb 21 18:57:19 2008
@@ -2,6 +2,16 @@
 # Generic AMQP code generation library.
 #
 
+# TODO aconway 2008-02-21:
+#
+# The amqp_attr_reader and amqp_child_reader for each Amqp* class
+# should correspond exactly to ampq.dtd.  Currently they are more
+# permissive so we can parse 0-10 preview and 0-10 final XML.
+#
+# Code marked with "# preview" should be removed/modified when final  0-10
+# is complete and we are ready to remove preview-related code.
+#
+
 require 'delegate'
 require 'rexml/document'
 require 'pathname'
@@ -120,11 +130,16 @@
   # The root <amqp> element.
   def root() @root ||=parent ? parent.root : self; end
 
+  # Are we in preview or final 0-10
+  # preview - used to make some classes behave differently for preview vs. final
+  def final?() root().version == "0-10"; end 
+
   def to_s() "#<#{self.class}(#{name})>"; end
   def inspect() to_s; end
 
   # Text of doc child if there is one.
   def doc() d=xml.elements["doc"]; d and d.text; end
+
 end
 
 AmqpResponse = AmqpElement
@@ -134,10 +149,21 @@
   def text() @xml.text end
 end
 
+class AmqpChoice < AmqpElement
+  def initialize(xml,parent) super; end
+  amqp_attr_reader :name, :value
+end
+  
+class AmqpEnum < AmqpElement
+  def initialize(xml,parent) super; end
+  amqp_child_reader :choice
+end
+
 class AmqpDomain < AmqpElement
   def initialize(xml, parent) super; end
   amqp_attr_reader :type
-  amqp_single_child_reader :struct
+  amqp_single_child_reader :struct # preview
+  amqp_single_child_reader :enum
 
   def unalias()
     d=self
@@ -148,13 +174,21 @@
   end
 end
 
+class AmqpException < AmqpElement
+  def initialize(xml, amqp) super; end;
+  amqp_attr_reader :error_code
+end
+
 class AmqpField < AmqpElement
   def initialize(xml, amqp) super; end;
   def domain() root.domain(xml.attributes["domain"]); end
-  amqp_single_child_reader :struct
+  amqp_single_child_reader :struct # preview
+  # FIXME aconway 2008-02-21: exceptions in fields - need to update c++ mapping.
+  amqp_child_reader :exception
+  amqp_attr_reader :type, :default, :code, :required
 end
 
-class AmqpChassis < AmqpElement
+class AmqpChassis < AmqpElement # preview
   def initialize(xml, parent) super; end
   amqp_attr_reader :implement
 end
@@ -164,16 +198,47 @@
   amqp_attr_reader :value, :class
 end
 
+# FIXME aconway 2008-02-21: 
+# class AmqpResponse < AmqpElement
+#   def initialize(xml, parent) super; end
+# end
+
 class AmqpResult < AmqpElement
   def initialize(xml, parent) super; end
-  amqp_single_child_reader :struct
+  amqp_single_child_reader :struct # preview
+  amqp_attr_reader :type
+end
+
+class AmqpEntry < AmqpElement
+  def initialize(xml,parent) super; end
+  amqp_attr_reader :type
+end
+
+class AmqpHeader < AmqpElement
+  def initialize(xml,parent) super; end
+  amqp_child_reader :entry
+  amqp_attr_reader :required
+end
+
+class AmqpBody < AmqpElement
+  def initialize(xml,parent) super; end
+  amqp_attr_reader :required  
+end
+
+class AmqpSegments < AmqpElement
+  def initialize(xml,parent) super; end
+  amqp_child_reader :header, :body
 end
 
 class AmqpStruct < AmqpElement
   def initialize(xml, parent) super; end
-  amqp_attr_reader :size, :type, :pack => "short"
+  amqp_attr_reader :type        # preview
+  amqp_attr_reader :size, :code, :pack 
   amqp_child_reader :field
-  
+
+  alias :raw_pack :pack
+  # preview - preview code needs default "short" for pack.
+  def pack() raw_pack or (not parent.final? and "short"); end 
   def result?() parent.xml.name == "result"; end
   def domain?() parent.xml.name == "domain"; end
 end
@@ -190,27 +255,58 @@
   def on_server?() on_chassis? "server"; end
 end
 
+class AmqpImplement < AmqpElement
+  def initialize(xml,amqp) super; end
+  amqp_attr_reader :handle, :send
+end
+
+class AmqpRole < AmqpElement
+  def initialize(xml,amqp) super; end
+  amqp_attr_reader :implement
+end
+
+class AmqpControl < AmqpElement
+  def initialize(xml,amqp) super; end
+  amqp_child_reader :implement, :field, :response
+  amqp_attr_reader :code
+end
+
+class AmqpCommand < AmqpElement
+  def initialize(xml,amqp) super; end
+  amqp_child_reader :implement, :field, :exception, :response
+  amqp_single_child_reader :result, :segments
+  amqp_attr_reader :code
+end
+
 class AmqpClass < AmqpElement
   def initialize(xml,amqp) super; end
-  amqp_attr_reader :index
 
-  amqp_child_reader :method
+  amqp_attr_reader :index       # preview
+  amqp_child_reader :method     # preview
+  
+  amqp_child_reader :struct, :domain, :control, :command, :role
+  amqp_attr_reader :code
 
   # chassis should be "client" or "server"
-  def methods_on(chassis)
+  def methods_on(chassis)       # preview
     @methods_on ||= { }
     @methods_on[chassis] ||= methods_.select { |m| m.on_chassis? chassis }
   end
 
-  def l4?()
+  def l4?()                     # preview
     !["connection", "session", "execution"].include?(name)
   end
 end
 
-
+class AmqpType < AmqpElement
+  amqp_attr_reader :code, :fixed_width, :variable_width
+end
 
 # AMQP root element.
 class AmqpRoot < AmqpElement
+  amqp_attr_reader :major, :minor, :port, :comment
+  amqp_child_reader :doc, :type, :struct, :domain, :constant, :class
+
   def parse(filename) Document.new(File.new(filename)).root; end
 
   # Initialize with output directory and spec files from ARGV.
@@ -221,17 +317,16 @@
     super(xml, nil)
   end
 
-  amqp_attr_reader :major, :minor
-  amqp_child_reader :class, :domain, :constant
-
   def version() major + "-" + minor; end
 
-  def domain_structs() domains.map{ |d| d.struct }.compact; end
+  # Find a child node from a dotted amqp name, e.g. message.transfer
+  def lookup(dotted_name) elements[dotted_name.gsub(/\./,"/")]; end
 
+  # preview - only struct child reader remains for new mapping
+  def domain_structs() domains.map{ |d| d.struct }.compact; end
   def result_structs()
     methods_.map { |m| m.result and m.result.struct }.compact
   end
-
   def structs() result_structs+domain_structs;  end
   
   def methods_() classes.map { |c| c.methods_ }.flatten; end
@@ -242,6 +337,8 @@
     @methods_on[chassis] ||= classes.map { |c| c.methods_on(chassis) }.flatten
   end
 
+  # TODO aconway 2008-02-21: methods by role.
+  
   private
   
   # Merge contents of elements.