読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

JSON-RPCで転送するJavaオブジェクトをさくっと作成するユーティリティ

JSON-RPCインターフェイスにRubyから接続するときに、Javaオブジェクトをハッシュでちまちま作るのはあまりにもメンドイと思って、ユーティリティを書いてみた。これを使うと

# json-rpcでKittenオブジェクトを送付
client = JsonRpc::Client.new( "testService", "http://example.com/jsonrpc" )
puts client.add( {
  "javaClass"=>"test.Kitten",
  "name"=>"mii",
  "age"=>1
} )

が、↓のような感じで書けます。

# json-rpcでKittenオブジェクトを送付
Kitten = JsonRpc.define( "test.Kitten", :name, :age )
client = JsonRpc::Client.new( "testService", "http://example.com/jsonrpc" )
puts client.add( Kitten.new( "mii", 1 ) )

Struct見たいな感じで、Javaオブジェクトを定義できるようにしてみた。実装は以下です。

module JsonRpc

  ... 略
      
  #JSON-RPCで送付するJavaクラスを定義する。
  #java_class:: 対応するJavaクラスのFQCN 
  #attrs:: Javaクラスの属性一覧
  #return:: Javaクラス
  def self.define( java_class, *attrs )
    return Class.new(JsonRpc::JavaClass) {|klass|
      @java_class = java_class
      @attrs = attrs
      def self.java_class ; @java_class; end
      def self.attrs; @attrs; end
      def initialize( *args )
        attrs = self.class.attrs
        args.each_index {|i|
          break if i >= attrs.length
          instance_variable_set("@" + attrs[i].to_s, args[i])
        }
      end
      attrs.each {|a| attr a,  true}
    }
  end
  # Javaクラスの基底クラス
  class JavaClass
    def to_hash
      h = {"javaClass"=>self.class.java_class}
      attrs = self.class.attrs
      attrs.each {|attr|
        tmp = attr.to_s.split(/_/)
        java_attr_name = ([tmp[0]] + tmp[1..-1].map{|i| i.capitalize}).join
        h[java_attr_name] = instance_variable_get("@" + attr.to_s)
      }
      return h
    end
    def to_json
      to_hash.to_json
    end
  end
end