Automatically generating QMF agents with spqr-gen

spqr
qpid
qmf
ruby
Published

November 24, 2009

In a previous post, I introduced SPQR and presented a couple of examples of how one could use SPQR to publish Ruby objects over QMF. Sometimes, though, you aren’t starting from an application – instead, you’re starting from an XML QMF schema document. SPQR includes spqr-gen, a tool designed to automatically generate a skeleton SPQR application from a QMF schema. In this post, we’ll see an example of spqr-gen in action.

First, let’s look at a simple QMF schema for a class that exposes one method, echo, which returns its argument (note that the code examples may not show up if you’re viewing this in a feed reader):

<schema package="examples.codegen">
  <class name="EchoAgent">
    <method name="echo" desc="returns its argument">
      <arg name="arg" dir="IO" type="lstr"/>
    </method>
  </class>
</schema>

Running spqr-gen on this example produces two files: agent-app.rb and examples/codegen/EchoAgent.rb. As you can see, these two files contain all of the boilerplate we need to start implementing these QMF methods — and, by chance, the boilerplate methods actually have the behavior that our agent is meant to!

require 'spqr/spqr'
require 'spqr/app'
 
require 'examples/codegen/EchoAgent'
 
app = SPQR::App.new( => )
app.register Examples::Codegen::EchoAgent
 
app.main
module Examples
  module Codegen
    class EchoAgent
      include SPQR::Manageable
      # Find method (NB:  you must implement this)
      def EchoAgent.find_by_id(objid)
        EchoAgent.new
      end
      
# Find-all method (NB:  you must implement this)
      def EchoAgent.find_all
        [EchoAgent.new]
      end
      ### Schema method declarations
      
      # echo returns its argument
      # * arg (lstr/IO)
      # 
      def echo(args)
        # Print values of in/out parameters
        log.debug "arg => #{args["arg"]}" # 
        # Assign values to in/out parameters
        args["arg"] = args["arg"]
      end
      
      spqr_expose  do |args|
        args.declare , , , {}
      end
    end
  end
end

spqr-gen is included in the SPQR repository; the system as documented in the last two posts is tagged “introducing-spqr”.