Class: Luruju::JudeApiBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/luruju/jude_api.rb

Constant Summary collapse

CLASS_DEFAULT_METHODS =
Class.methods.clone

Instance Method Summary collapse

Constructor Details

#initializeJudeApiBuilder

Returns a new instance of JudeApiBuilder.



28
29
30
# File 'lib/luruju/jude_api.rb', line 28

def initialize
  @already_builded = Hash.new
end

Instance Method Details

#build(java_parent, java_getter) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/luruju/jude_api.rb', line 32

def build(java_parent, java_getter)
  begin
    java_obj = java_parent.send(java_getter.getName)
    rescue NativeException => e
    # p "Warning(#{__FILE__},#{__LINE__}) " + java_getter.getName
  end
  
  return nil if java_obj == nil
  
  java_return_class = java_getter.getReturnType
  
  if is_jude_class?(java_return_class)
    return build_judeapi(java_obj, java_return_class)
  elsif java_return_class.isArray
    return build_array(java_obj, java_getter)
  else
    return java_obj
  end
end

#build_array(java_obj, java_getter) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/luruju/jude_api.rb', line 52

def build_array(java_obj, java_getter)
  
  comp_type =  java_getter.getReturnType.getComponentType
  
  if is_jude_class?(comp_type)
    jude_objects = Array.new
    java_obj.each {|i| jude_objects << build_judeapi(i, comp_type) }
    return jude_objects
  else
    return java_obj.to_a
  end
end

#build_judeapi(jude_obj, jude_class) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/luruju/jude_api.rb', line 65

def build_judeapi(jude_obj, jude_class)
  
  if is_jude_named_element?(jude_obj) and @already_builded.key?(jude_obj.getId)
    return @already_builded[jude_obj.getId] 
  end
  
  raise "UnExpected." + jude_obj.getClass if jude_obj.getClass.getInterfaces.length > 1
  
  interface = jude_obj.getClass.getInterfaces[0]
  judeapi_class = define_judeapi_class(interface) 
  judeapi_obj = judeapi_class.new
  
  @already_builded[jude_obj.getId] = judeapi_obj if is_jude_named_element?(jude_obj)
  
  interface.getMethods.each { |java_method|
    setter_name = define_judeapi_method(judeapi_class, java_method)
    judeapi_obj.send(setter_name, build(jude_obj, java_method))
  }
  return judeapi_obj
end

#define_judeapi_class(java_class) ⇒ Object



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/luruju/jude_api.rb', line 115

def define_judeapi_class(java_class)
  java_class_name = java_class.getSimpleName
  judeapi_class_name = "Jude" + java_class_name.sub(/^I/,'')
  if JudeApi.const_defined?(judeapi_class_name)
    return JudeApi.module_eval(judeapi_class_name) 
  end
  
  JudeApi.module_eval("class #{judeapi_class_name} < JudeBase ; end")
  judeapi_class = JudeApi.module_eval(judeapi_class_name)
  java_class.getDeclaredFields.each do |p|
    const_name = p.getName
    const_value = p.get(nil)
    judeapi_class.class_eval("#{const_name} = #{const_value}")
  end
  return judeapi_class
end

#define_judeapi_method(judeapi_class, java_method) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/luruju/jude_api.rb', line 86

def define_judeapi_method(judeapi_class, java_method)
  
  java_method_name = java_method.getName
  attr_name =java_method_name.sub(/^(get)/,'')
  attr_name = Inflector.underscore(attr_name)
  getter_name = attr_name.clone
  getter_name << "?" if java_method_name.match(/^is/)
  setter_name = attr_name + "="
  return setter_name if judeapi_class.method_defined?(setter_name)
  
  statement = String.new
  statement << "def #{getter_name}() @#{attr_name} end\n"
  statement << "def #{setter_name}(#{attr_name}) @#{attr_name}=#{attr_name} end\n"      
  judeapi_class.class_eval(statement)
  return setter_name
  
end

#is_jude_class?(java_class) ⇒ Boolean

Returns:

  • (Boolean)


104
105
106
# File 'lib/luruju/jude_api.rb', line 104

def is_jude_class?(java_class)
  java_class.getName.index(JUDEAPI_PHEAD) == 0
end

#is_jude_named_element?(jude_obj) ⇒ Boolean

Returns:

  • (Boolean)


108
109
110
111
112
113
# File 'lib/luruju/jude_api.rb', line 108

def is_jude_named_element?(jude_obj)
  jude_obj.getClass.getMethod("getId", nil)
  return true
  rescue  java.lang.NoSuchMethodException =>e
  return false
end