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