さっそくなんですが、
http://code.google.com/p/rubeus/source/browse/trunk/lib/rubeus/component_loader.rb?r=96
def build_class_to_package_table(java_package)
・・
@class_to_package[class_name] = @class_to_package.key?(class_name) ?
[@class_to_package[class_name], package] : package
end
end
の部分は、同じ名前のクラスが3個以上あると、おそらく意図せざる結果を返す
と思われます。
@classlist =<<MMMM
java/lang1/One
java/lang1/Two
java/lang2/Two
java/lang1/Three
java/lang2/Three
java/lang3/Three
MMMM
def class_names
classes = []
@classlist.each do |line|
classes << line.gsub(/\//, '.').strip
end
classes
end
def build_class_to_package_table(java_package)
@class_to_package = {}
class_names.each do |fqn|
parts = fqn.split('.')
class_name = parts.pop
next if class_name.include?('$')
package = parts.join('.')
@class_to_package[class_name] = @class_to_package.key?(class_name) ?
[@class_to_package[class_name], package] : package
end
end
のとき
{"Two"=>["java.lang1", "java.lang2"], "One"=>"java.lang1", "Three"=>[["java.lang1", "java.lang2"], "java.lang3"]}
となります。(Three の値が二重配列になる)。
{"Two"=>["java.lang1", "java.lang2"], "One"=>"java.lang1", "Three"=>["java.lang1", "java.lang2", "java.lang3"]}
というようなフラットな配列を期待しているなら、
def build_class_to_package_table(java_package)
・・
#@class_to_package[class_name] = @class_to_package.key?(class_name) ?
# [@class_to_package[class_name], package] : package
# ↓
case @class_to_package[class_name]
when nil ; @class_to_package[class_name] = package
when String ; @class_to_package[class_name] = [@class_to_package[class_name], package]
when Array ; @class_to_package[class_name] << package
else ; raise
end
end
end
でしょう。また、もし、一つでも配列に入るということでもよければ、
{"Two"=>["java.lang1", "java.lang2"], "One"=>["java.lang1"], "Three"=>["java.lang1", "java.lang2", "java.lang3"]}
def build_class_to_package_table(java_package)
## @class_to_package = {}
@class_to_package = Hash.new{[]} # ← ★ 存在しないときのデフォルト値
class_names.each do |fqn|
parts = fqn.split('.')
class_name = parts.pop
next if class_name.include?('$')
package = parts.join('.')
@class_to_package[class_name] <<= package # ← ★ 「<<」の自己代入
end
end
なんていう方法もあります。
Take_tk = KUMAGAI Hidetake
たけ(tk)=熊谷秀武
はじめまして。秋間と申します。
参考になるご意見ありがとうございます。
Rubeusでは基本的に一つのComponentLoaderが重複したクラス名を
扱わないようにかんがえていますが、二重配列になっている点は気付いて
ませんでした。助かります。
別のパッケージで重複したクラス名になっているものを一つの
ComponentLoaderで扱う方法としては、別名でも付けられる様に
しようかなと思っております。
何かお気づきの点がありましたらご指摘ください。宜しくお願い致します。
take_tk さんは書きました: