s2container 0.9.1 → 0.9.2

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/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