luruju 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +21 -8
- data/bin/access_jruby_with_command.rb +5 -0
- data/lib/luruju.rb +12 -16
- data/lib/luruju/configuration.rb +11 -0
- data/lib/luruju/dto.rb +8 -0
- data/lib/luruju/enjoy_ruby.rb +186 -0
- data/lib/luruju/jude_api/add_dynamic_method.rb +9 -3
- data/lib/luruju/jude_api/jude_base.rb +89 -1
- data/lib/luruju/jude_api_loader.rb +7 -158
- data/lib/luruju/jude_api_loader_for_cache.rb +22 -0
- data/lib/luruju/jude_api_loader_for_locked_project.rb +37 -0
- data/lib/luruju/jude_api_loader_in_cruby.rb +38 -0
- data/lib/luruju/jude_api_loader_in_jruby.rb +113 -0
- data/lib/luruju/jude_meta.rb +75 -0
- data/lib/luruju/luruju_client.rb +20 -0
- data/lib/luruju/prepare.rb +16 -0
- data/lib/luruju/server/luruju_server.rb +33 -0
- data/lib/luruju/version.rb +2 -4
- data/lib/tasks/luruju.rb +5 -0
- data/lib/tasks/server.rake +21 -0
- data/test/abstract_unit.rb +26 -12
- data/test/{jude_api_test.rb → class_diagram_test.rb} +6 -1
- data/test/configuration_test.rb +108 -0
- data/test/er_diagram_test.rb +1 -1
- data/test/jude/base.jude +0 -0
- data/test/jude/community-5.0.2/class_diagram/dummy.jude +1 -0
- data/test/jude/community-5.0.2/class_diagram/locked.jude +0 -0
- data/test/jude/community-5.0.2/class_diagram/locked.jude.test +0 -0
- data/test/jude/community-5.0.2/locked.jude +0 -0
- data/test/jude/professional-5.1/class_diagram/dummy.jude +1 -0
- data/test/jude/professional-5.1/class_diagram/locked.jude +0 -0
- data/test/jude/professional-5.1/class_diagram/locked.jude.test +0 -0
- data/test/jude_api_loader_for_locked_project_test.rb +97 -0
- data/test/jude_base_test.rb +71 -0
- data/test/luruju_server_test.rb +77 -0
- metadata +78 -47
- data/lib/luruju/customize_inflector.rb +0 -3
- data/lib/luruju/dynamic_method.rb +0 -16
- data/lib/luruju/easy_breakpoint.rb +0 -22
- data/lib/luruju/jude_api/add_method.rb +0 -52
@@ -0,0 +1,22 @@
|
|
1
|
+
module Luruju
|
2
|
+
|
3
|
+
class JudeApiLoader
|
4
|
+
|
5
|
+
@@jude_cache = {}
|
6
|
+
|
7
|
+
def self.wrap_load_for_cache jude_file, options={}
|
8
|
+
raise ProjectNotFoundException unless FileTest.file?(jude_file)
|
9
|
+
return yield(jude_file, options) unless Luruju.config.use_jude_cache
|
10
|
+
mtime = File.mtime(jude_file)
|
11
|
+
if previous = @@jude_cache[jude_file]
|
12
|
+
return previous if previous.mtime == mtime
|
13
|
+
end
|
14
|
+
loaded = yield jude_file, options
|
15
|
+
loaded.mtime = mtime
|
16
|
+
@@jude_cache[jude_file] = loaded
|
17
|
+
loaded
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'tmpdir'
|
2
|
+
|
3
|
+
module Luruju
|
4
|
+
|
5
|
+
class JudeApiLoader
|
6
|
+
|
7
|
+
def self.wrap_load_default_option jude_file, options={}
|
8
|
+
default = {:copy => :if_locked}
|
9
|
+
yield jude_file, default.merge(options)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.wrap_load_for_tmpdir jude_file, options={}
|
13
|
+
do_jude_file = options[:copy] == :first ? copy_jude_file(jude_file, options) : jude_file
|
14
|
+
yield do_jude_file, options
|
15
|
+
rescue ProjectLockedException
|
16
|
+
raise $! if do_jude_file != jude_file or options[:copy] != :if_locked or options[:retried]
|
17
|
+
do_jude_file = copy_jude_file jude_file, options
|
18
|
+
load do_jude_file, options.update(:retried => true)
|
19
|
+
ensure
|
20
|
+
FileUtils.remove_entry(File.dirname(do_jude_file), :force => true) if do_jude_file != jude_file
|
21
|
+
end
|
22
|
+
|
23
|
+
@@tmpdir_no = 0
|
24
|
+
protected
|
25
|
+
def self.copy_jude_file jude_file, options
|
26
|
+
@@tmpdir_no += 1
|
27
|
+
tmpdir = options[:tmpdir] || Dir.tmpdir
|
28
|
+
FileUtils.makedirs(tmpdir) unless FileTest.exist? tmpdir
|
29
|
+
current_tmpdir = FileUtils.makedirs File.join(tmpdir,"luruju.#{$$}.#{@@tmpdir_no}")
|
30
|
+
copy_jude_file = File.join current_tmpdir, File.basename(jude_file)
|
31
|
+
FileUtils.cp jude_file, copy_jude_file
|
32
|
+
copy_jude_file
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'base64'
|
2
|
+
|
3
|
+
module Luruju
|
4
|
+
|
5
|
+
class JudeApiLoader
|
6
|
+
|
7
|
+
def self.load jude_file, options={}
|
8
|
+
dto = unmarshal send("access_jruby_using_#{Luruju.config.access_jruby_with.to_s}", jude_file, options)
|
9
|
+
raise dto.exception if dto.exception
|
10
|
+
JudeMeta.instance= dto.meta
|
11
|
+
dto.meta.define_all
|
12
|
+
dto.model
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.access_jruby_using_drb jude_file, options
|
16
|
+
LurujuClient.new.marshal jude_file, options
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.access_jruby_using_command jude_file, options
|
20
|
+
encoded_options = Base64.encode64(Marshal.dump(options)).gsub(/\n/,' ')
|
21
|
+
%x{jruby #{luruju_bin 'access_jruby_with_command.rb'} #{jude_file} #{encoded_options}}
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.unmarshal marshaled
|
25
|
+
Marshal.load(Base64.decode64(marshaled))
|
26
|
+
rescue ArgumentError => e
|
27
|
+
define_dummy_jude_class(e.message.split(' ').last.split('::').last)
|
28
|
+
retry
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.define_dummy_jude_class const_name
|
32
|
+
return if /Methods$/ =~ const_name
|
33
|
+
JudeApi.module_eval "class #{const_name} < JudeBase ; end"
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'java'
|
2
|
+
require 'base64'
|
3
|
+
require 'luruju/jude_api_loader_for_locked_project'
|
4
|
+
|
5
|
+
module Luruju
|
6
|
+
|
7
|
+
JUDEAPI_PHEAD = 'com.change_vision.jude.api.inf'
|
8
|
+
include_class "#{JUDEAPI_PHEAD}.project.ProjectAccessorFactory"
|
9
|
+
|
10
|
+
def self.wrap_native_exception(exception)
|
11
|
+
return exception unless exception.is_a? NativeException
|
12
|
+
wrapped = UnexpectedNativeException.new(exception.message)
|
13
|
+
Luruju.constants.select{|x|/Exception$|Error$/ =~ x}.collect{|x|eval x}.each do |e|
|
14
|
+
wrapped = e.new(exception.message) if exception.message.match(Regexp.compile(e.name.split('::').last))
|
15
|
+
end
|
16
|
+
wrapped.set_backtrace(exception.backtrace)
|
17
|
+
wrapped
|
18
|
+
end
|
19
|
+
|
20
|
+
class JudeApiLoader
|
21
|
+
|
22
|
+
def initialize() @already_builded, @members = {}, [] end
|
23
|
+
|
24
|
+
def self.marshal jude_file, options={}
|
25
|
+
Base64.encode64(Marshal.dump(DtoBetweenCrubyAndJruby.new(self.load(jude_file, options))))
|
26
|
+
rescue
|
27
|
+
return Base64.encode64(Marshal.dump(DtoBetweenCrubyAndJruby.new(nil, Luruju.wrap_native_exception($!))))
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.load jude_file, options={}
|
31
|
+
project_accessor = ProjectAccessorFactory.getProjectAccessor
|
32
|
+
project_accessor.open jude_file
|
33
|
+
getter = project_accessor.getClass.getDeclaredMethod "getProject", nil
|
34
|
+
new.build project_accessor, getter
|
35
|
+
rescue
|
36
|
+
raise Luruju.wrap_native_exception($!)
|
37
|
+
ensure
|
38
|
+
project_accessor.close rescue Exception
|
39
|
+
end
|
40
|
+
|
41
|
+
def build java_parent, java_getter
|
42
|
+
|
43
|
+
return nil if java_getter.getGenericParameterTypes.length > 0
|
44
|
+
|
45
|
+
begin
|
46
|
+
java_obj = java_parent.send java_getter.getName
|
47
|
+
rescue NativeException
|
48
|
+
# p "Warning(#{__FILE__},#{__LINE__}) " + java_getter.getName
|
49
|
+
end
|
50
|
+
return nil if java_obj == nil
|
51
|
+
|
52
|
+
java_return_class = java_getter.getReturnType
|
53
|
+
return build_judeapi(java_obj) if is_jude_class? java_return_class
|
54
|
+
return build_array(java_obj, java_getter) if java_return_class.isArray
|
55
|
+
return java_obj
|
56
|
+
end
|
57
|
+
|
58
|
+
def build_array java_obj, java_getter
|
59
|
+
comp_type = java_getter.getReturnType.getComponentType
|
60
|
+
return java_obj.to_a unless is_jude_class? comp_type
|
61
|
+
java_obj.inject([]) {|jude_objects,i| jude_objects << build_judeapi(i) }
|
62
|
+
end
|
63
|
+
|
64
|
+
def build_judeapi java_obj
|
65
|
+
|
66
|
+
if is_jude_named_element?(java_obj) and @already_builded.key?(java_obj.getId)
|
67
|
+
return @already_builded[java_obj.getId]
|
68
|
+
end
|
69
|
+
|
70
|
+
java_if = java_obj.getClass.getInterfaces[0]
|
71
|
+
jude_object = define_jude_class(java_if).new(@members)
|
72
|
+
|
73
|
+
@members << jude_object
|
74
|
+
@already_builded[java_obj.getId] = jude_object if jude_object.kind_of_named_element?
|
75
|
+
|
76
|
+
java_if.getMethods.each do |java_method|
|
77
|
+
next if java_method.getGenericParameterTypes.length > 0
|
78
|
+
setter_name = java_method.getName.sub(/^(get)/,'').underscore << "="
|
79
|
+
jude_object.send setter_name, build(java_obj, java_method)
|
80
|
+
end
|
81
|
+
|
82
|
+
return jude_object
|
83
|
+
end
|
84
|
+
|
85
|
+
def is_jude_class?(java_class) java_class.getName.index(JUDEAPI_PHEAD) == 0 end
|
86
|
+
|
87
|
+
def define_jude_class java_if
|
88
|
+
jude_meta = JudeMeta.instance
|
89
|
+
jude_if_name = java_if.getSimpleName.sub(/^I/,'').sub(/ER/, "Er")
|
90
|
+
return jude_meta.jude_class(jude_if_name) if JudeMeta.is_defined_for_luruju?(jude_if_name)
|
91
|
+
|
92
|
+
jude_if = JudeMeta.instance.create_jude_if jude_if_name
|
93
|
+
java_if.getGenericInterfaces().each do |generic_if|
|
94
|
+
super_if_name = generic_if.getSimpleName.sub(/^I/,'').sub(/ER/, "Er")
|
95
|
+
jude_if.super_if_names << super_if_name
|
96
|
+
define_jude_class generic_if unless JudeMeta.is_defined_for_luruju?(super_if_name)
|
97
|
+
end
|
98
|
+
java_if.getDeclaredMethods.each do |method|
|
99
|
+
next if method.getGenericParameterTypes.length > 0
|
100
|
+
jude_if.attributes << method.getName.sub(/^(get)/,'').underscore
|
101
|
+
end
|
102
|
+
java_if.getDeclaredFields.each{|f| jude_if.constants[f.getName] = f.get(nil)}
|
103
|
+
jude_if.define_for_luruju
|
104
|
+
end
|
105
|
+
|
106
|
+
def is_jude_named_element? jude_obj
|
107
|
+
jude_obj.getClass.getMethod "getId", nil
|
108
|
+
return true
|
109
|
+
rescue java.lang.NoSuchMethodException
|
110
|
+
return false
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
module Luruju
|
4
|
+
|
5
|
+
class JudeMeta
|
6
|
+
|
7
|
+
def initialize() @interfaces = HashWithIndifferentAccess.new end
|
8
|
+
|
9
|
+
@@instance = new
|
10
|
+
def self.instance() @@instance end
|
11
|
+
def self.instance=(instance) @@instance = instance end
|
12
|
+
|
13
|
+
attr_accessor :interfaces
|
14
|
+
|
15
|
+
def jude_class(jude_if_name) JudeApi.module_eval "Jude#{jude_if_name}" end
|
16
|
+
|
17
|
+
def create_jude_if jude_if_name
|
18
|
+
jude_if = JudeInterface.new
|
19
|
+
jude_if.if_name = jude_if_name
|
20
|
+
@interfaces[jude_if_name] = jude_if
|
21
|
+
jude_if
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.is_defined_for_luruju? jude_if
|
25
|
+
JudeApi.const_defined? "Jude#{jude_if.if_name rescue jude_if}Methods"
|
26
|
+
end
|
27
|
+
|
28
|
+
def define_all() @interfaces.each_value{|i| i.define_for_luruju unless JudeMeta.is_defined_for_luruju?(i)} end
|
29
|
+
|
30
|
+
class JudeInterface
|
31
|
+
|
32
|
+
attr_accessor :if_name, :attributes, :super_if_names, :constants
|
33
|
+
|
34
|
+
def initialize() @attributes, @super_if_names, @constants = [], [], {} end
|
35
|
+
def super_ifs() @super_if_names.collect{|x|JudeMeta.instance.interfaces[x]} end
|
36
|
+
def module_name() "Jude#{if_name}Methods" end
|
37
|
+
def class_name() "Jude#{if_name}" end
|
38
|
+
|
39
|
+
def define_for_luruju
|
40
|
+
super_ifs.select{|x|!JudeMeta.is_defined_for_luruju?(x.if_name)}.each{|x|x.define_for_luruju}
|
41
|
+
JudeApi.module_eval ERB.new(module_erb_def).result(binding)
|
42
|
+
JudeApi.module_eval ERB.new(class_erb_def).result(binding)
|
43
|
+
JudeApi.module_eval class_name
|
44
|
+
end
|
45
|
+
|
46
|
+
protected
|
47
|
+
def module_erb_def
|
48
|
+
return <<-EOD
|
49
|
+
module <%= module_name %>
|
50
|
+
<% super_ifs.each do |super_if| %>
|
51
|
+
include <%= super_if.module_name %>
|
52
|
+
<% end %>
|
53
|
+
<% attributes.each do |attr| %>
|
54
|
+
attr_accessor :<%= attr %>
|
55
|
+
<% if /^is_/ =~ attr %>
|
56
|
+
alias_method :<%= attr %>?, :<%= attr %>
|
57
|
+
<% end %>
|
58
|
+
<% end %>
|
59
|
+
<% constants.each do |key,value| %>
|
60
|
+
<%= key %> = <%= value %>
|
61
|
+
<% end %>
|
62
|
+
end
|
63
|
+
EOD
|
64
|
+
end
|
65
|
+
|
66
|
+
def class_erb_def
|
67
|
+
return <<-EOD
|
68
|
+
class <%= class_name %> < JudeBase
|
69
|
+
include <%= module_name %>
|
70
|
+
end
|
71
|
+
EOD
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'drb'
|
2
|
+
|
3
|
+
DRb.start_service
|
4
|
+
|
5
|
+
module Luruju
|
6
|
+
|
7
|
+
class LurujuClient
|
8
|
+
|
9
|
+
def initialize() init end
|
10
|
+
def marshal(jude_file, options={}) @drb_object.marshal jude_file, options end
|
11
|
+
def shutdown_server() @drb_object.shutdown end
|
12
|
+
def self.shutdown_server() new.shutdown_server end
|
13
|
+
protected
|
14
|
+
def init
|
15
|
+
@drb_object = DRbObject.new_with_uri "druby://127.0.0.1:#{Luruju.config.drb_port}"
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
|
2
|
+
def luruju_bin(file) File.join File.dirname(__FILE__),'..','..','bin', file end
|
3
|
+
|
4
|
+
def am_i_jruby?
|
5
|
+
require "java"
|
6
|
+
self.class.method_defined? :include_class
|
7
|
+
rescue LoadError
|
8
|
+
false
|
9
|
+
end
|
10
|
+
|
11
|
+
def am_i_cruby?() !am_i_jruby? end
|
12
|
+
def ruby_vm_name() am_i_jruby? ? 'jruby' : 'cruby' end
|
13
|
+
|
14
|
+
Inflector.inflections do |inflect|
|
15
|
+
inflect.irregular 'schema', 'schemata'
|
16
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'drb'
|
2
|
+
raise 'Use Jruby for LuRuJu Server!!' unless am_i_jruby?
|
3
|
+
|
4
|
+
$SAFE = 1
|
5
|
+
|
6
|
+
module Luruju
|
7
|
+
|
8
|
+
class LurujuServer
|
9
|
+
|
10
|
+
def marshal(jude_file, options={})
|
11
|
+
puts "start loadding #{jude_file} #{options}"
|
12
|
+
JudeApiLoader.marshal jude_file, options
|
13
|
+
rescue
|
14
|
+
p $!
|
15
|
+
pp $!.backtrace
|
16
|
+
return $!
|
17
|
+
ensure
|
18
|
+
puts "end loading"
|
19
|
+
end
|
20
|
+
|
21
|
+
def shutdown()
|
22
|
+
puts "try shutdown."
|
23
|
+
DRb.stop_service
|
24
|
+
nil
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
url = "druby://127.0.0.1:#{Luruju.config.drb_port}"
|
30
|
+
DRb.start_service(url, Luruju::LurujuServer.new)
|
31
|
+
puts "start LuRuJu Server URL=#{url}"
|
32
|
+
DRb.thread.join
|
33
|
+
puts "shutdown LuRuJu Server ..."
|
data/lib/luruju/version.rb
CHANGED
data/lib/tasks/luruju.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
namespace :luruju do
|
2
|
+
|
3
|
+
namespace :server do
|
4
|
+
desc "Start up LuRuJu Server"
|
5
|
+
task :start do
|
6
|
+
if am_i_jruby?
|
7
|
+
require 'luruju/server/luruju_server'
|
8
|
+
else
|
9
|
+
IO.popen("jruby -S rake luruju:server:start", "r+") do |io|
|
10
|
+
io.each_line { |line| puts line}
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "Stop LuRuJu Server"
|
16
|
+
task :stop do
|
17
|
+
Luruju::LurujuClient.shutdown_server
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
data/test/abstract_unit.rb
CHANGED
@@ -6,31 +6,46 @@ require 'fileutils'
|
|
6
6
|
|
7
7
|
class Test::Unit::TestCase
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
if am_i_jruby?
|
10
|
+
java_class_path = java.lang.System.getProperty "java.class.path"
|
11
|
+
jude_product = "community-5.0.2" if java_class_path.include? "Community"
|
12
|
+
jude_product = "professional-5.1" if java_class_path.include? "Professional"
|
13
|
+
else
|
14
|
+
jude_product = "community-5.0.2"
|
15
|
+
end
|
16
|
+
|
12
17
|
TEST_JUDE_DIR = File.dirname(__FILE__) + '/jude/' + jude_product
|
13
18
|
|
14
19
|
include Luruju
|
15
20
|
|
21
|
+
@@test_jude_model_dir = {}
|
22
|
+
|
23
|
+
def self.test_jude_model_dir(dir_sym) @@test_jude_model_dir[self] = dir_sym.to_s end
|
24
|
+
|
16
25
|
def setup
|
17
|
-
|
26
|
+
Luruju::Configuration.install
|
27
|
+
end
|
28
|
+
|
29
|
+
def teardown
|
30
|
+
Luruju::Configuration.install
|
18
31
|
end
|
19
32
|
|
20
33
|
protected
|
21
|
-
def jude_api_load jude_file
|
22
|
-
jude_path = "#{
|
23
|
-
|
24
|
-
Luruju::JudeApiLoader.load "c:/#{jude_file}.jude"
|
34
|
+
def jude_api_load jude_file, options={}
|
35
|
+
jude_path = "#{jude_dir}/#{jude_file}.jude"
|
36
|
+
Luruju::JudeApiLoader.load jude_path, options
|
25
37
|
end
|
26
38
|
|
27
|
-
def
|
28
|
-
@@test_jude_model_dir
|
39
|
+
def jude_dir()
|
40
|
+
if @@test_jude_model_dir[self.class]
|
41
|
+
"#{TEST_JUDE_DIR}/#{@@test_jude_model_dir[self.class]}"
|
42
|
+
else
|
43
|
+
File.dirname(__FILE__) + '/jude/'
|
44
|
+
end
|
29
45
|
end
|
30
46
|
|
31
47
|
end
|
32
48
|
|
33
|
-
|
34
49
|
class Object
|
35
50
|
def jude_methods
|
36
51
|
self.class.ancestors.inject(self.methods) do |result,item|
|
@@ -39,4 +54,3 @@ class Object
|
|
39
54
|
end.sort
|
40
55
|
end
|
41
56
|
end
|
42
|
-
|