修訂 | 18 (tree) |
---|---|
時間 | 2007-07-29 01:56:20 |
作者 | junkikuchi |
* trunk/lib/tenarai/db/container.rb
* trunk/lib/tenarai/classloader.rb
* trunk/lib/tenarai/service.rb
* trunk/lib/tenarai/server.rb
@@ -0,0 +1,44 @@ | ||
1 | +# | |
2 | +# Copyright (C) 2007 Jun Kikuchi <kikuchi@bonnou.com> | |
3 | +# | |
4 | + | |
5 | +require 'tenarai/container' | |
6 | +require 'tenarai/db/table' | |
7 | + | |
8 | +module Tenarai | |
9 | + class DB | |
10 | + class Container < Container | |
11 | + def initialize(db, config) | |
12 | + super() | |
13 | + | |
14 | + @relations = [] | |
15 | + | |
16 | + config[:tables].each do |key, val| | |
17 | + self << if name = val[:class] | |
18 | + Tenarai::ClassLoader[name] | |
19 | + else | |
20 | + Tenarai::DB::Table | |
21 | + end.new(db, Tenarai::ClassLoader[val[:row]], key) | |
22 | + end | |
23 | + | |
24 | + config[:relations].each do |val| | |
25 | + a = val.shift.split('.') | |
26 | + b = val.shift.split('.') | |
27 | + @relations << Tenarai::DB::Relation.new( | |
28 | + db, fetch(a.shift), a.shift, fetch(b.shift), b.shift | |
29 | + ) | |
30 | + end | |
31 | + end | |
32 | + | |
33 | + def create | |
34 | + each do |val| val.create end | |
35 | + @relations.each do |val| val.create end | |
36 | + end | |
37 | + | |
38 | + def drop | |
39 | + @relations.each do |val| val.drop end | |
40 | + each do |val| val.drop end | |
41 | + end | |
42 | + end | |
43 | + end | |
44 | +end |
@@ -0,0 +1,56 @@ | ||
1 | +# | |
2 | +# Copyright (C) 2007 Jun Kikuchi <kikuchi@bonnou.com> | |
3 | +# | |
4 | + | |
5 | +module Tenarai | |
6 | + module ClassLoader | |
7 | + class << self | |
8 | + def dir=(dir) | |
9 | + @dir = dir | |
10 | + end | |
11 | + | |
12 | + def dir | |
13 | + @dir ||= './' | |
14 | + end | |
15 | + | |
16 | + def repository | |
17 | + @repository ||= {} | |
18 | + end | |
19 | + | |
20 | + def extended(mod) | |
21 | + super | |
22 | + self.repository[mod.name] = mod | |
23 | + end | |
24 | + | |
25 | + def load_class(class_name) | |
26 | + require self.dir + '/' + class_name.gsub(%r!::!, '/') | |
27 | + end | |
28 | + | |
29 | + def [](class_name) | |
30 | + self.load_class(class_name) unless self.repository.key?(class_name) | |
31 | + self.repository[class_name] | |
32 | + end | |
33 | + | |
34 | + def load_all(base_dir=nil) | |
35 | + base_dir ||= self.dir | |
36 | + | |
37 | + dirs = [] | |
38 | + Dir.foreach(base_dir) do |n| | |
39 | + next if %r!^\.!.match(n) | |
40 | + | |
41 | + name = base_dir + '/' + n | |
42 | + require name if FileTest.file?(name) | |
43 | + dirs.push(name) if FileTest.directory?(name) | |
44 | + end | |
45 | + dirs.each do |name| | |
46 | + self.load_all(name) | |
47 | + end | |
48 | + end | |
49 | + | |
50 | + def each(&block) | |
51 | + self.load_all | |
52 | + self.repository.sort.each(&block) | |
53 | + end | |
54 | + end | |
55 | + end | |
56 | +end |
@@ -5,64 +5,52 @@ | ||
5 | 5 | require 'tenarai/container' |
6 | 6 | |
7 | 7 | module Tenarai |
8 | - class Service | |
9 | - class MethodNotFoundError < StandardError; end | |
8 | + module Service | |
9 | + attr_accessor :container | |
10 | + attr_accessor :request | |
11 | + attr_accessor :response | |
10 | 12 | |
11 | - attr_reader :name | |
12 | - | |
13 | - def initialize(name) | |
14 | - @name = name | |
13 | + def dispatch(method, params) | |
14 | + __send__(method, *params) | |
15 | 15 | end |
16 | 16 | |
17 | - def dispatch(params) | |
18 | - @request = params[:request] | |
19 | - @response = params[:response] | |
20 | - @method = params[:method] | |
21 | - @params = params[:params] || [] | |
22 | - | |
23 | - method = @request.method + '_' + @method | |
24 | - | |
25 | - raise( | |
26 | - MethodNotFoundError, | |
27 | - "method '%s' does not found on '%s'(%s) service" % [ | |
28 | - @method, @name, self.class.name | |
29 | - ] | |
30 | - ) unless respond_to?(method) | |
31 | - | |
32 | - __send__(method, *@params) | |
33 | - end | |
34 | - | |
35 | - class Container < Container | |
17 | + module Dispatcher | |
36 | 18 | class ServiceNotFoundError < StandardError; end |
19 | + class MethodNotFoundError < StandardError; end | |
37 | 20 | |
38 | 21 | attr_accessor :default |
39 | - attr_accessor :error | |
40 | 22 | |
41 | - def initialize | |
42 | - super | |
23 | + def fetch_service(name) | |
24 | + end | |
43 | 25 | |
44 | - @default = nil | |
45 | - @error = 'core.dump' | |
26 | + def parse_request(request) | |
27 | + _nil, action, *params = (request['path_info'] || '/').split('/') | |
28 | + name, method = (action || @default).split('.') | |
46 | 29 | |
47 | - self << Dump.new('core') | |
30 | + [name, request.method + '_' + method, params] | |
48 | 31 | end |
49 | 32 | |
50 | 33 | def dispatch(request, response) |
51 | - begin | |
52 | - _nil, action, *params = (request['path_info'] || '/').split('/') | |
53 | - service, method = (action || @default).split('.') | |
34 | + name, method, params = parse_request(request) | |
54 | 35 | |
55 | - unless key?(service) | |
56 | - raise ServiceNotFoundError, "service '%s' does not found" % service | |
57 | - end | |
36 | + service = fetch_service(name) | |
58 | 37 | |
59 | - fetch(service).dispatch( | |
60 | - :request => request, | |
61 | - :response => response, | |
62 | - :method => method, | |
63 | - :params => params | |
64 | - ) | |
65 | - end | |
38 | + raise( | |
39 | + ServiceNotFoundError, | |
40 | + "Could not found '%s' service." % name | |
41 | + ) unless service | |
42 | + | |
43 | + raise( | |
44 | + MethodNotFoundError, | |
45 | + "Could not found '%s' method on '%s' class." % [ | |
46 | + method, service.class.name | |
47 | + ] | |
48 | + ) unless service.respond_to?(method) | |
49 | + | |
50 | + service.container = self | |
51 | + service.request = request | |
52 | + service.response = response | |
53 | + service.dispatch(method, params) | |
66 | 54 | end |
67 | 55 | |
68 | 56 | def to_proc |
@@ -70,13 +58,6 @@ | ||
70 | 58 | begin |
71 | 59 | dispatch(request, response) |
72 | 60 | rescue |
73 | - service, method = @error.split('.') | |
74 | - fetch(service).dispatch( | |
75 | - :request => request, | |
76 | - :response => response, | |
77 | - :method => method | |
78 | - ) | |
79 | - | |
80 | 61 | $stderr.puts Time.now |
81 | 62 | $stderr.puts '%s - %s' % [$!.class.name, $!.to_s] |
82 | 63 | $!.backtrace.each do |val| |
@@ -87,7 +68,9 @@ | ||
87 | 68 | end |
88 | 69 | end |
89 | 70 | |
90 | - class Dump < Service | |
71 | + module Dump | |
72 | + include Service | |
73 | + | |
91 | 74 | def get_dump |
92 | 75 | require 'tenarai/xml' |
93 | 76 |
@@ -16,7 +16,7 @@ | ||
16 | 16 | |
17 | 17 | def cgi |
18 | 18 | require 'tenarai/cgi' |
19 | - Tenarai::CGI.new do |req, res| @handler.call(req, res) end | |
19 | + Tenarai::CGI.new(&@handler) | |
20 | 20 | end |
21 | 21 | |
22 | 22 | def webrick |