s2container 0.9.1 → 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog CHANGED
@@ -1,4 +1,11 @@
1
1
 
2
+ 2009-07-04 s2container-0.9.2
3
+ * fix: manual-constructor-assembler.
4
+ * fix: init method of S2ApplicationContext class.
5
+ * fix: init method of S2ApplicationContext class.
6
+ * modify: The instance method of S2ApplicationContext (use thread local).
7
+ * modify: The s2component method. (for define instance class method).
8
+
2
9
  2009-06-20 s2container-0.9.1
3
10
 
4
11
  * modify: for JRuby.
data/Rakefile CHANGED
@@ -1,4 +1,4 @@
1
- RUBY_S2CONTAINER_VERSION = '0.9.1'
1
+ RUBY_S2CONTAINER_VERSION = '0.9.2'
2
2
 
3
3
  require 'rubygems'
4
4
  require 'rake'
@@ -18,7 +18,7 @@ end
18
18
 
19
19
  spec = Gem::Specification.new do |s|
20
20
  s.name = 's2container'
21
- s.date = '2009-06-20'
21
+ s.date = '2009-07-04'
22
22
  s.version = RUBY_S2CONTAINER_VERSION
23
23
  s.authors = ['klove']
24
24
  s.email = 'klovelion@gmail.com'
@@ -6,5 +6,11 @@ class Action
6
6
  s2component
7
7
  end
8
8
 
9
+ action = Action.instance
10
+ p action
11
+
9
12
  action = s2app.get(Action)
10
13
  action = s2app[Action]
14
+ p action
15
+
16
+
@@ -1,9 +1,11 @@
1
1
  $LOAD_PATH.unshift(File::expand_path(File::dirname(__FILE__)) + '/../../../lib')
2
+
2
3
  require 's2container'
3
4
 
4
5
  class Action
5
6
  s2comp :name => :act, :instance => :prototype
6
7
  end
7
8
 
9
+ p Action.instance
8
10
  p s2app.get(:act)
9
11
  p s2app[:act]
@@ -0,0 +1,44 @@
1
+ $LOAD_PATH.unshift(File::expand_path(File::dirname(__FILE__)) + '/../../../lib')
2
+ require 'rubygems'
3
+ require 's2container'
4
+
5
+ s2comp(:class => Seasar::DBI::DBIInterceptor, :name => :dbi_interceptor)
6
+ s2comp(:class => Seasar::DBI::TxInterceptor, :name => :tx_interceptor)
7
+ s2comp(:class => DBI::DatabaseHandle, :name => :dbh, :autobinding => :none) { DBI.connect("dbi:SQLite3::memory:") }
8
+
9
+ class Dao
10
+ s2comp
11
+ s2aspect :interceptor => :dbi_interceptor
12
+ def create_table; 'create table sample(id integer primary key, name text);' end
13
+ def find_all; 'select * from sample;' end
14
+ def insert_name(val); 'insert into sample(name) values(?);' end
15
+ def insert(id, name); 'insert into sample values(?, ?);' end
16
+ #def update_name(id, name); ['update sample set name = :name where id = :id;', :name => name, :id => id ] end
17
+ def update_name(id, name); [<<-EOSQL, :id => id, :name => name]
18
+ update sample
19
+ set name = :name
20
+ where id = :id;
21
+ EOSQL
22
+ end
23
+ end
24
+
25
+ class Service
26
+ s2comp
27
+ s2aspect :interceptor => :tx_interceptor
28
+ attr_accessor :dao
29
+ def run_in_tx
30
+ @dao.update_name(1, 'FOO')
31
+ @dao.insert(2, 'BAR')
32
+ end
33
+ end
34
+
35
+ dao = Dao.instance
36
+ dao.create_table
37
+ dao.insert_name('foo')
38
+ dao.insert_name('bar')
39
+ p dao.find_all
40
+
41
+ Service.instance.run_in_tx rescue p $!.message
42
+ p dao.find_all
43
+
44
+ s2app.get(:dbh).disconnect
data/lib/s2container.rb CHANGED
@@ -22,6 +22,7 @@ require 'seasar/aop'
22
22
  require 'seasar/util'
23
23
  require 'seasar/exception'
24
24
  require 'seasar/beans'
25
+ require 'seasar/dbi'
25
26
 
26
27
  if RUBY_VERSION < '1.8.7'
27
28
  class Method
@@ -21,7 +21,7 @@ module Seasar
21
21
  module Aop
22
22
  module Interceptor
23
23
  class TraceInterceptor
24
- s2component :name => 'trace', :namespace => 'interceptor', :default => true
24
+ #s2component :name => 'trace', :namespace => 'interceptor', :static => true
25
25
 
26
26
  #
27
27
  # - args
data/lib/seasar/aop.rb CHANGED
@@ -16,8 +16,6 @@
16
16
  # | governing permissions and limitations under the License. |
17
17
  # +----------------------------------------------------------------------+
18
18
  #++
19
-
20
- require 'seasar/aop/interceptor/trace-interceptor'
21
19
  module Seasar
22
20
  module Aop
23
21
  autoload :Aspect, 'seasar/aop/aspect'
@@ -28,6 +26,9 @@ module Seasar
28
26
  else
29
27
  autoload :S2AopFactory, 'seasar/aop/s2aop-factory186'
30
28
  end
29
+ module Interceptor
30
+ autoload :TraceInterceptor, 'seasar/aop/interceptor/trace-interceptor'
31
+ end
31
32
  end
32
33
  end
33
34
 
File without changes
@@ -36,11 +36,6 @@ module Seasar
36
36
  # - return
37
37
  # - none
38
38
  def assemble
39
- args = []
40
- for arg_def in @component_def.get_arg_defs
41
- args << arg_def.value
42
- end
43
-
44
39
  procedure = nil
45
40
  if @component_def.onetime_proc.is_a?(Proc)
46
41
  procedure = @component_def.onetime_proc
@@ -49,11 +44,12 @@ module Seasar
49
44
  procedure = @component_def.constructor
50
45
  end
51
46
  if procedure.nil?
47
+ args = @component_def.get_arg_defs.map {|arg_def| arg_def.value}
52
48
  return @component_def.get_concreate_class.new(*args)
53
49
  elsif @component_def.component_class == Proc
54
50
  return procedure
55
51
  else
56
- component = procedure.call(*args)
52
+ component = procedure.call(@component_def)
57
53
  if component.is_a?(@component_def.component_class)
58
54
  return component
59
55
  else
@@ -74,6 +74,8 @@ module Seasar
74
74
  # - none
75
75
  #
76
76
  def init
77
+ @concreate_class = nil
78
+ @onetime_proc = nil
77
79
  return self.get_component_deployer.init
78
80
  end
79
81
 
@@ -84,6 +86,8 @@ module Seasar
84
86
  # - none
85
87
  #
86
88
  def destroy
89
+ @concreate_class = nil
90
+ @onetime_proc = nil
87
91
  return self.get_component_deployer.destroy
88
92
  end
89
93
 
@@ -37,7 +37,7 @@ module Seasar
37
37
  # - Object
38
38
  def deploy
39
39
  if @instantiating
40
- raise Seasar::Container::Exception::CyclicReferenceRuntimeException(@component_def.component_class)
40
+ raise Seasar::Container::Exception::CyclicReferenceRuntimeException.new(@component_def.component_class)
41
41
  end
42
42
  @instantiating = true
43
43
  component = @constructor_assembler.assemble
@@ -52,8 +52,9 @@ module Seasar
52
52
  # - args
53
53
  # - none
54
54
  # - return
55
- # - none
55
+ # - Object
56
56
  def init
57
+ @component = nil
57
58
  self.deploy
58
59
  end
59
60
 
@@ -26,9 +26,9 @@ module Seasar
26
26
  #
27
27
  class S2ApplicationContext
28
28
  @@static_component_infos = []
29
- @@static_aspect_infos = []
29
+ @@static_aspect_infos = []
30
30
  @@instance = nil
31
-
31
+
32
32
  class << self
33
33
  #
34
34
  # - args
@@ -37,6 +37,14 @@ module Seasar
37
37
  # - Seasar::Container::S2ApplicationContext
38
38
  #
39
39
  def instance
40
+ if Seasar::Container.use_thread_local?
41
+ require 'thread'
42
+ th = Thread.current
43
+ if th[:S2ApplicationContext].nil?
44
+ th[:S2ApplicationContext] = self.new
45
+ end
46
+ return th[:S2ApplicationContext]
47
+ end
40
48
  if @@instance.nil?
41
49
  @@instance = self.new
42
50
  end
@@ -45,11 +53,18 @@ module Seasar
45
53
 
46
54
  #
47
55
  # - args
48
- # 1. Seasar::Container::S2ApplicationContext
56
+ # 1. Boolean
49
57
  # - return
50
58
  # - nil
51
59
  #
52
- def instance=(obj); @@instance = obj; end
60
+ def instance=(val)
61
+ if Seasar::Container.use_thread_local?
62
+ require 'thread'
63
+ Thread.current[:S2ApplicationContext] = val
64
+ else
65
+ @@instance = val
66
+ end
67
+ end
53
68
  end
54
69
 
55
70
  #
@@ -72,7 +87,7 @@ module Seasar
72
87
  if options[:force] == true
73
88
  @@static_component_infos = []
74
89
  @@static_aspect_infos = []
75
- @@instance = nil
90
+ Seasar::Beans::BeanDescFactory.init
76
91
  end
77
92
  @include_patterns = []
78
93
  @exclude_patterns = []
@@ -203,8 +218,7 @@ module Seasar
203
218
  # - Object
204
219
  #
205
220
  def get_component(key, namespaces = [], &procedure)
206
- namespace_key = self.create_singleton(namespaces)
207
- return @singletons[namespace_key].get_component(key, &procedure)
221
+ return self.get_singleton_container(namespaces).get_component(key, &procedure)
208
222
  end
209
223
  alias component get_component
210
224
  alias get get_component
@@ -218,35 +232,36 @@ module Seasar
218
232
  # - Boolean
219
233
  #
220
234
  def has_component_def(key, namespaces = [])
221
- namespace_key = self.create_singleton(namespaces)
222
- return @singletons[namespace_key].has_component_def(key)
235
+ return self.get_singleton_container(namespaces).has_component_def(key)
223
236
  end
224
237
  alias component_def? has_component_def
225
238
 
226
239
  #
227
240
  # - args
228
241
  # 1. Array <em>namespaces</em> String namespaces
242
+ # 2. Proc <em>procedure</em> component selector block
229
243
  # - return
230
244
  # - String
231
245
  #
232
- def create_singleton(namespaces)
233
- namespaces = [namespaces] unless namespaces.is_a?(Array)
246
+ def create_singleton_container(namespaces = [], &procedure)
247
+ namespaces = [namespaces] if namespaces.is_a?(String)
234
248
  key = namespaces.sort
235
- if not @singletons.key?(key)
236
- @singletons[key] = self.create(namespaces)
249
+ unless @singletons.key?(key)
250
+ @singletons[key] = self.create(namespaces, &procedure)
237
251
  end
238
- return key
252
+ return @singletons[key]
239
253
  end
254
+ alias get_singleton_container create_singleton_container
240
255
 
241
256
  #
242
257
  # - args
243
258
  # 1. Array <em>namespaces</em> String namespaces
244
- # 2. Proc <em>procedure</em> constructor block
259
+ # 2. Proc <em>procedure</em> component selector block
245
260
  # - return
246
261
  # - Seasar::Container::S2Container
247
262
  #
248
263
  def create(namespaces = [], &procedure)
249
- namespaces = [namespaces] unless namespaces.is_a?(Array)
264
+ namespaces = [namespaces] if namespaces.is_a?(String)
250
265
  container = S2Container.new
251
266
  component_defs = []
252
267
  component_infos = self.get_component_infos(namespaces)
@@ -50,6 +50,22 @@ def s2component(option = {}, &procedure)
50
50
  raise TypeError.new("class not specified.")
51
51
  end
52
52
  end
53
+
54
+ option[:class].class_eval {
55
+ @s2component_key = option[:name].nil? ? option[:class] : option[:name]
56
+ @s2component_namespace = option[:namespace]
57
+ unless option[:class].respond_to?(:instance)
58
+ class << self
59
+ def instance
60
+ if @s2component_namespace.nil?
61
+ return s2app.get(@s2component_key)
62
+ else
63
+ return s2app.get(@s2component_namespace).get(@s2component_key)
64
+ end
65
+ end
66
+ end
67
+ end
68
+ }
53
69
  return s2app.register(option, &procedure)
54
70
  end
55
71
  alias s2comp s2component
@@ -134,6 +150,16 @@ module Seasar
134
150
  autoload :IllegalInstanceDefRuntimeException, 'seasar/container/exception/illegal-instance-def-runtime-exception'
135
151
  autoload :TooManyRegistrationRuntimeException, 'seasar/container/exception/toomany-registration-runtime-exception'
136
152
  end
153
+
154
+ @use_thread_local = true
155
+ module_function
156
+ def use_thread_local?
157
+ return @use_thread_local
158
+ end
159
+
160
+ def use_thread_local=(val)
161
+ @use_thread_local = val
162
+ end
137
163
  end
138
164
  end
139
165
 
@@ -16,10 +16,11 @@
16
16
  # | governing permissions and limitations under the License. |
17
17
  # +----------------------------------------------------------------------+
18
18
  #++
19
+ require 'dbi'
19
20
  module Seasar
20
21
  module DBI
21
22
  class DBIInterceptor
22
- s2comp :namespace => 'dbi', :name => 'interceptor', :default => true
23
+ #s2comp :namespace => 'dbi', :name => 'interceptor', :static => true
23
24
 
24
25
  # - args
25
26
  # - none
@@ -16,10 +16,11 @@
16
16
  # | governing permissions and limitations under the License. |
17
17
  # +----------------------------------------------------------------------+
18
18
  #++
19
+ require 'dbi'
19
20
  module Seasar
20
21
  module DBI
21
22
  class TxInterceptor
22
- s2comp :namespace => 'dbi', :name => 'tx', :default => true
23
+ #s2comp :namespace => 'dbi', :name => 'tx', :static => true
23
24
 
24
25
  # - args
25
26
  # - none
data/lib/seasar/dbi.rb CHANGED
@@ -17,11 +17,10 @@
17
17
  # +----------------------------------------------------------------------+
18
18
  #++
19
19
 
20
- require 'dbi'
21
- require 'seasar/dbi/dbi-interceptor'
22
- require 'seasar/dbi/tx-interceptor'
23
20
  module Seasar
24
21
  module DBI
25
22
  autoload :Paginate, 'seasar/dbi/paginate'
23
+ autoload :DBIInterceptor, 'seasar/dbi/dbi-interceptor'
24
+ autoload :TxInterceptor, 'seasar/dbi/tx-interceptor'
26
25
  end
27
26
  end
@@ -24,6 +24,7 @@ module Seasar
24
24
  class RubyLoggerFactory
25
25
  @@logger = nil
26
26
  @@logdev = STDERR
27
+ @@level = Logger::WARN
27
28
  class << self
28
29
 
29
30
  #
@@ -36,6 +37,7 @@ module Seasar
36
37
  if @@logger.nil?
37
38
  @@logger = Logger.new(@@logdev)
38
39
  @@logger.datetime_format = "%Y-%m-%d %H:%M:%S"
40
+ @@logger.level = @@level
39
41
  end
40
42
  return @@logger
41
43
  end
@@ -61,6 +63,17 @@ module Seasar
61
63
  @@logdev = logdev
62
64
  @@logger = nil
63
65
  end
66
+
67
+ #
68
+ # - args
69
+ # 1. Object <em>level</em>
70
+ # - return
71
+ # - nil
72
+ #
73
+ def level=(level)
74
+ @@level = level
75
+ @@logger = nil
76
+ end
64
77
  end
65
78
  end
66
79
  end
@@ -42,13 +42,17 @@ module Seasar
42
42
 
43
43
  #
44
44
  # - args
45
- # 1. Class <em>target</em>
45
+ # 1. Object <em>target</em>
46
46
  # - return
47
47
  # - Array
48
48
  #
49
49
  def get_accessor_attributes(target)
50
50
  #method_names = (target.public_methods - Object.public_methods).map {|method_name| method_name.to_s}
51
51
  method_names = target.public_methods(false).map {|method_name| method_name.to_s}
52
+ if target.class.name.match(/EnhancedByS2Aop/)
53
+ method_names += target.class.superclass.public_instance_methods(false).map {|method_name| method_name.to_s}
54
+ method_names.uniq!
55
+ end
52
56
  attributes = []
53
57
  method_names.each {|name|
54
58
  next if name.match(/^==+$/)
@@ -33,8 +33,8 @@ module Seasar
33
33
 
34
34
  def test_proc_args
35
35
  container = S2Container.new
36
- cd = Seasar::Container::ComponentDef.new(C, 'c') {|val1, val2|
37
- C.new(val1, val2)
36
+ cd = Seasar::Container::ComponentDef.new(C, 'c') {|cd|
37
+ cd.get_concreate_class.new(*cd.get_arg_defs.map {|arg_def| arg_def.value})
38
38
  }
39
39
  cd.add_arg_def(Seasar::Container::ArgDef.new(100))
40
40
  cd.add_arg_def(Seasar::Container::ArgDef.new(200))
@@ -41,7 +41,7 @@ module Seasar
41
41
 
42
42
  def test_onetime_proc
43
43
  cd = Seasar::Container::ComponentDef.new(B, "b")
44
- cd.onetime_proc = lambda {
44
+ cd.onetime_proc = lambda {|cd|
45
45
  b = B.new
46
46
  b.name = "abc"
47
47
  b
@@ -185,10 +185,10 @@ module Seasar
185
185
  assert(2, s2app.select_component_info_by_namespace(infos, %w[a.e x.y]).size)
186
186
  end
187
187
 
188
- def test_create_singleton
188
+ def test_create_singleton_container
189
189
  s2app.init
190
- c1 = s2app.create_singleton(%w[a.b a.c])
191
- c2 = s2app.create_singleton(%w[a.c a.b])
190
+ c1 = s2app.create_singleton_container(%w[a.b a.c])
191
+ c2 = s2app.create_singleton_container(%w[a.c a.b])
192
192
  assert(c1 == c2)
193
193
  end
194
194
 
@@ -0,0 +1,78 @@
1
+ module Seasar
2
+ module Container
3
+ class TC_S2Component < Test::Unit::TestCase
4
+ def setup
5
+ s2app.init
6
+ end
7
+
8
+ def teardown
9
+ end
10
+
11
+ def test_instance
12
+ b = B.instance
13
+ assert(b.is_a?(B))
14
+ assert(b.c.is_a?(C))
15
+ end
16
+
17
+ def test_instance_exist
18
+ a = A.instance
19
+ assert(a == 1000)
20
+ end
21
+
22
+ def test_instance_method
23
+ d = D.instance
24
+ assert(d.is_a?(D))
25
+ end
26
+
27
+ def test_namespaced
28
+ e = E.instance
29
+ assert(e.is_a?(E))
30
+ end
31
+
32
+ def test_inherit
33
+ g = G.instance
34
+ assert(g.is_a?(G))
35
+ end
36
+
37
+ class A
38
+ s2comp
39
+ class << self
40
+ def instance
41
+ return 1000
42
+ end
43
+ end
44
+ end
45
+
46
+ class B
47
+ s2comp
48
+ def initialize
49
+ @c = :di, Seasar::Container::TC_S2Component::C
50
+ end
51
+ attr_reader :c
52
+ end
53
+
54
+ class C
55
+ s2comp
56
+ end
57
+
58
+ class D
59
+ s2comp
60
+ def instance
61
+ return 1000
62
+ end
63
+ end
64
+
65
+ class E
66
+ s2comp :namespace => 'xxx', :name => 'TC_S2Component'
67
+ end
68
+
69
+ class F
70
+ s2comp
71
+ end
72
+
73
+ class G < F
74
+ s2comp
75
+ end
76
+ end
77
+ end
78
+ end
@@ -11,10 +11,10 @@ module Seasar
11
11
 
12
12
  def test_logging
13
13
  return if defined? JRUBY_VERSION
14
- #logger = s2logger('/tmp/a.log')
15
14
  logger = s2logger
16
- logger.level = Logger::DEBUG
15
+ #logger.level = Logger::DEBUG
17
16
  s2logger.debug(self) {"debug level logging"}
17
+ #logger.level = Logger::WARN
18
18
  end
19
19
 
20
20
  def test_jlogger
@@ -24,6 +24,12 @@ module Seasar
24
24
  assert_equal('Seasar::Util::TC_ClassUtil', Seasar::Util::ClassUtil.module_name(A))
25
25
  end
26
26
 
27
+ def test_aspect
28
+ s2app.init
29
+ b = s2app.get(B)
30
+ assert_equal(5 * 2, b.calc(2, 3))
31
+ end
32
+
27
33
  class A
28
34
  def initialize
29
35
  @a = "abc"
@@ -41,6 +47,21 @@ module Seasar
41
47
  class AbcDef_; end
42
48
  class ABCde; end
43
49
  class ABCdeFG; end
50
+
51
+ class B
52
+ s2comp
53
+ s2aspect(:pointcut => 'calc') {|invoker| invoker.proceed * 2}
54
+ attr_accessor :tc_class_util_c
55
+ def calc(a, b)
56
+ @tc_class_util_c.calc(a, b)
57
+ end
58
+ end
59
+ class C
60
+ s2comp :name => :tc_class_util_c
61
+ def calc(a, b)
62
+ return a + b
63
+ end
64
+ end
44
65
  end
45
66
  end
46
67
  end
data/test/test-suite.rb CHANGED
@@ -2,6 +2,6 @@ $LOAD_PATH.unshift(File::expand_path(File::dirname(__FILE__)) + '/../lib')
2
2
 
3
3
  require 'test/unit'
4
4
  require 's2container'
5
-
5
+ Seasar::Log::Factory::RubyLoggerFactory.level = Logger::DEBUG
6
6
  Test::Unit::AutoRunner.run(true, File::expand_path(File::dirname(__FILE__)))
7
7
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: s2container
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - klove
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-06-20 00:00:00 +09:00
12
+ date: 2009-07-04 00:00:00 +09:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -95,6 +95,7 @@ files:
95
95
  - lib/s2container.rb
96
96
  - test/test-suite.rb
97
97
  - test/seasar/container/test_component-info-def.rb
98
+ - test/seasar/container/test_s2component.rb
98
99
  - test/seasar/container/test_arg-def.rb
99
100
  - test/seasar/container/s2app_load_sample.rb
100
101
  - test/seasar/container/deployer/test_instance_def_factory.rb
@@ -171,6 +172,8 @@ files:
171
172
  - example/quickstart/quickstart3/quickstart.rb
172
173
  - example/quickstart/quickstart5
173
174
  - example/quickstart/quickstart5/quickstart.rb
175
+ - example/quickstart/quickstart8
176
+ - example/quickstart/quickstart8/quickstart.rb
174
177
  - example/quickstart/quickstart7
175
178
  - example/quickstart/quickstart7/quickstart.rb
176
179
  - example/quickstart/quickstart1