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.
Files changed (40) hide show
  1. data/Rakefile +21 -8
  2. data/bin/access_jruby_with_command.rb +5 -0
  3. data/lib/luruju.rb +12 -16
  4. data/lib/luruju/configuration.rb +11 -0
  5. data/lib/luruju/dto.rb +8 -0
  6. data/lib/luruju/enjoy_ruby.rb +186 -0
  7. data/lib/luruju/jude_api/add_dynamic_method.rb +9 -3
  8. data/lib/luruju/jude_api/jude_base.rb +89 -1
  9. data/lib/luruju/jude_api_loader.rb +7 -158
  10. data/lib/luruju/jude_api_loader_for_cache.rb +22 -0
  11. data/lib/luruju/jude_api_loader_for_locked_project.rb +37 -0
  12. data/lib/luruju/jude_api_loader_in_cruby.rb +38 -0
  13. data/lib/luruju/jude_api_loader_in_jruby.rb +113 -0
  14. data/lib/luruju/jude_meta.rb +75 -0
  15. data/lib/luruju/luruju_client.rb +20 -0
  16. data/lib/luruju/prepare.rb +16 -0
  17. data/lib/luruju/server/luruju_server.rb +33 -0
  18. data/lib/luruju/version.rb +2 -4
  19. data/lib/tasks/luruju.rb +5 -0
  20. data/lib/tasks/server.rake +21 -0
  21. data/test/abstract_unit.rb +26 -12
  22. data/test/{jude_api_test.rb → class_diagram_test.rb} +6 -1
  23. data/test/configuration_test.rb +108 -0
  24. data/test/er_diagram_test.rb +1 -1
  25. data/test/jude/base.jude +0 -0
  26. data/test/jude/community-5.0.2/class_diagram/dummy.jude +1 -0
  27. data/test/jude/community-5.0.2/class_diagram/locked.jude +0 -0
  28. data/test/jude/community-5.0.2/class_diagram/locked.jude.test +0 -0
  29. data/test/jude/community-5.0.2/locked.jude +0 -0
  30. data/test/jude/professional-5.1/class_diagram/dummy.jude +1 -0
  31. data/test/jude/professional-5.1/class_diagram/locked.jude +0 -0
  32. data/test/jude/professional-5.1/class_diagram/locked.jude.test +0 -0
  33. data/test/jude_api_loader_for_locked_project_test.rb +97 -0
  34. data/test/jude_base_test.rb +71 -0
  35. data/test/luruju_server_test.rb +77 -0
  36. metadata +78 -47
  37. data/lib/luruju/customize_inflector.rb +0 -3
  38. data/lib/luruju/dynamic_method.rb +0 -16
  39. data/lib/luruju/easy_breakpoint.rb +0 -22
  40. 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 ..."
@@ -1,8 +1,6 @@
1
1
  module Luruju #:nodoc:
2
2
  module VERSION #:nodoc:
3
- MAJOR = 0
4
- MINOR = 1
5
- TINY = 0
3
+ MAJOR, MINOR, TINY = 0, 2, 0
6
4
  STRING = [MAJOR, MINOR, TINY].join('.')
7
5
  end
8
- end
6
+ end
@@ -0,0 +1,5 @@
1
+ $VERBOSE = nil
2
+ require 'rubygems'
3
+ require 'luruju'
4
+
5
+ Dir["#{File.dirname(__FILE__)}/*.rake"].each { |ext| load ext }
@@ -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
@@ -6,31 +6,46 @@ require 'fileutils'
6
6
 
7
7
  class Test::Unit::TestCase
8
8
 
9
- java_class_path = java.lang.System.getProperty "java.class.path"
10
- jude_product = "community-5.0.2" if java_class_path.include? "Community"
11
- jude_product = "professional-5.1" if java_class_path.include? "Professional"
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
- # JudeApi.constants.each {|c| JudeApi.remove_const(c)}
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 = "#{TEST_JUDE_DIR}/#{@@test_jude_model_dir}/#{jude_file}.jude"
23
- FileUtils.cp jude_path, "c:/#{jude_file}.jude"
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 self.test_jude_model_dir dir_sym
28
- @@test_jude_model_dir = dir_sym.to_s
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
-