backlog 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. data/History.txt +10 -0
  2. data/Rakefile +2 -1
  3. data/app/controllers/application.rb +55 -8
  4. data/app/controllers/groups_controller.rb +62 -0
  5. data/app/controllers/periods_controller.rb +13 -55
  6. data/app/controllers/tasks_controller.rb +9 -5
  7. data/app/controllers/works_controller.rb +43 -6
  8. data/app/helpers/application_helper.rb +20 -2
  9. data/app/helpers/groups_helper.rb +2 -0
  10. data/app/models/backlog.rb +19 -10
  11. data/app/models/estimate.rb +2 -1
  12. data/app/models/group.rb +11 -0
  13. data/app/models/party.rb +3 -0
  14. data/app/models/period.rb +43 -6
  15. data/app/models/task.rb +27 -14
  16. data/app/models/user.rb +37 -8
  17. data/app/models/work.rb +4 -6
  18. data/app/views/backlogs/_name_list.rhtml +5 -0
  19. data/app/views/backlogs/show.rhtml +4 -4
  20. data/app/views/groups/_form.rhtml +7 -0
  21. data/app/views/groups/edit.rhtml +31 -0
  22. data/app/views/groups/list.rhtml +27 -0
  23. data/app/views/groups/new.rhtml +8 -0
  24. data/app/views/layouts/wide.rhtml +2 -2
  25. data/app/views/periods/_burn_down_chart.rhtml +1 -1
  26. data/app/views/periods/_form.rhtml +13 -9
  27. data/app/views/periods/_show_active.rhtml +6 -12
  28. data/app/views/periods/_title.rhtml +4 -5
  29. data/app/views/periods/edit.rhtml +1 -1
  30. data/app/views/periods/new.rhtml +1 -1
  31. data/app/views/periods/show.rhtml +10 -6
  32. data/app/views/tasks/_backlog_header.rhtml +22 -0
  33. data/app/views/tasks/_description_list.rhtml +5 -0
  34. data/app/views/tasks/_form.rhtml +26 -7
  35. data/app/views/tasks/_task.rhtml +4 -4
  36. data/app/views/tasks/edit.rhtml +2 -3
  37. data/app/views/tasks/list_started.rhtml +1 -0
  38. data/app/views/tasks/new.rhtml +2 -2
  39. data/app/views/works/_buttons.rhtml +3 -0
  40. data/app/views/works/_form.rhtml +15 -10
  41. data/app/views/works/daily_work_sheet.rhtml +30 -18
  42. data/app/views/works/edit.rhtml +4 -4
  43. data/app/views/works/list.rhtml +2 -2
  44. data/app/views/works/new.rhtml +3 -2
  45. data/app/views/works/weekly_work_sheet.rhtml +2 -2
  46. data/bin/backlog +2 -0
  47. data/bin/backlog_init.d_kubosch_production +27 -0
  48. data/bin/copy_production2development.rb +33 -0
  49. data/config/database.yml +13 -7
  50. data/config/deploy_kubosch.rb +1 -0
  51. data/config/environment.rb +2 -0
  52. data/config/environments/development_mysql.rb +27 -0
  53. data/config/environments/kubosch_production_mysql.rb +21 -0
  54. data/config/routes.rb +1 -1
  55. data/db/migrate/{001_tasks.rb → 001_create_tasks.rb} +1 -1
  56. data/db/migrate/{002_backlogs.rb → 002_create_backlogs.rb} +2 -2
  57. data/db/migrate/003_add_estimation_points.rb +1 -1
  58. data/db/migrate/004_add_period.rb +2 -2
  59. data/db/migrate/013_create_estimates.rb +1 -1
  60. data/db/migrate/015_add_user_option.rb +9 -5
  61. data/db/migrate/017_insert_datek_projects.rb +13 -10
  62. data/db/migrate/018_create_groups.rb +115 -0
  63. data/db/schema.rb +72 -12
  64. data/lang/en.yaml +7 -0
  65. data/lang/no.yaml +7 -0
  66. data/lib/big_decimal_yaml_fix.rb +27 -0
  67. data/lib/class_table_inheritance.rb +163 -0
  68. data/lib/tasks/backup.rake +92 -0
  69. data/public/images/person.org.png +0 -0
  70. data/public/images/person.png +0 -0
  71. data/public/stylesheets/backlog.css +3 -1
  72. data/public/stylesheets/mwrt002.css +1 -1
  73. data/test/fixtures/groups.yml +6 -0
  74. data/test/fixtures/parties.yml +31 -0
  75. data/test/fixtures/periods.yml +2 -2
  76. data/test/fixtures/tasks.yml +2 -0
  77. data/test/fixtures/users.yml +6 -6
  78. data/test/functional/backlogs_controller_test.rb +1 -1
  79. data/test/functional/groups_controller_test.rb +120 -0
  80. data/test/functional/periods_controller_test.rb +1 -1
  81. data/test/functional/tasks_controller_test.rb +16 -1
  82. data/test/functional/user_controller_test.rb +8 -2
  83. data/test/test_helper.rb +5 -0
  84. data/test/unit/big_decimal_yaml_fix_test.rb +14 -0
  85. data/test/unit/estimate_test.rb +1 -1
  86. data/test/unit/group_test.rb +10 -0
  87. data/test/unit/user_test.rb +56 -44
  88. data/tmp/sessions/ruby_sess.22dec3e9df47fb4e +0 -0
  89. data/tmp/sessions/ruby_sess.8037e0ab58cbcf1a +0 -0
  90. data/vendor/plugins/activerecord_foreign_key_extensions/lib/active_record_extensions.rb +35 -0
  91. data/vendor/rails/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.rhtml.bak +1 -0
  92. data/vendor/rails/{actionwebservice/lib/action_web_service/templates/scaffolds/layout.rhtml → railties/configs/empty.log} +0 -0
  93. metadata +36 -105
  94. data/backlog.gemspec +0 -21
  95. data/vendor/rails/actionwebservice/CHANGELOG +0 -265
  96. data/vendor/rails/actionwebservice/MIT-LICENSE +0 -21
  97. data/vendor/rails/actionwebservice/README +0 -364
  98. data/vendor/rails/actionwebservice/Rakefile +0 -171
  99. data/vendor/rails/actionwebservice/TODO +0 -32
  100. data/vendor/rails/actionwebservice/examples/googlesearch/README +0 -143
  101. data/vendor/rails/actionwebservice/examples/googlesearch/autoloading/google_search_api.rb +0 -50
  102. data/vendor/rails/actionwebservice/examples/googlesearch/autoloading/google_search_controller.rb +0 -57
  103. data/vendor/rails/actionwebservice/examples/googlesearch/delegated/google_search_service.rb +0 -108
  104. data/vendor/rails/actionwebservice/examples/googlesearch/delegated/search_controller.rb +0 -7
  105. data/vendor/rails/actionwebservice/examples/googlesearch/direct/google_search_api.rb +0 -50
  106. data/vendor/rails/actionwebservice/examples/googlesearch/direct/search_controller.rb +0 -58
  107. data/vendor/rails/actionwebservice/examples/metaWeblog/README +0 -17
  108. data/vendor/rails/actionwebservice/examples/metaWeblog/apis/blogger_api.rb +0 -60
  109. data/vendor/rails/actionwebservice/examples/metaWeblog/apis/blogger_service.rb +0 -34
  110. data/vendor/rails/actionwebservice/examples/metaWeblog/apis/meta_weblog_api.rb +0 -67
  111. data/vendor/rails/actionwebservice/examples/metaWeblog/apis/meta_weblog_service.rb +0 -48
  112. data/vendor/rails/actionwebservice/examples/metaWeblog/controllers/xmlrpc_controller.rb +0 -16
  113. data/vendor/rails/actionwebservice/install.rb +0 -30
  114. data/vendor/rails/actionwebservice/lib/action_web_service.rb +0 -66
  115. data/vendor/rails/actionwebservice/lib/action_web_service/api.rb +0 -301
  116. data/vendor/rails/actionwebservice/lib/action_web_service/base.rb +0 -42
  117. data/vendor/rails/actionwebservice/lib/action_web_service/casting.rb +0 -138
  118. data/vendor/rails/actionwebservice/lib/action_web_service/client.rb +0 -3
  119. data/vendor/rails/actionwebservice/lib/action_web_service/client/base.rb +0 -28
  120. data/vendor/rails/actionwebservice/lib/action_web_service/client/soap_client.rb +0 -113
  121. data/vendor/rails/actionwebservice/lib/action_web_service/client/xmlrpc_client.rb +0 -58
  122. data/vendor/rails/actionwebservice/lib/action_web_service/container.rb +0 -3
  123. data/vendor/rails/actionwebservice/lib/action_web_service/container/action_controller_container.rb +0 -93
  124. data/vendor/rails/actionwebservice/lib/action_web_service/container/delegated_container.rb +0 -86
  125. data/vendor/rails/actionwebservice/lib/action_web_service/container/direct_container.rb +0 -69
  126. data/vendor/rails/actionwebservice/lib/action_web_service/dispatcher.rb +0 -2
  127. data/vendor/rails/actionwebservice/lib/action_web_service/dispatcher/abstract.rb +0 -207
  128. data/vendor/rails/actionwebservice/lib/action_web_service/dispatcher/action_controller_dispatcher.rb +0 -379
  129. data/vendor/rails/actionwebservice/lib/action_web_service/invocation.rb +0 -202
  130. data/vendor/rails/actionwebservice/lib/action_web_service/protocol.rb +0 -4
  131. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/abstract.rb +0 -112
  132. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/discovery.rb +0 -37
  133. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/soap_protocol.rb +0 -176
  134. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/soap_protocol/marshaler.rb +0 -235
  135. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/xmlrpc_protocol.rb +0 -122
  136. data/vendor/rails/actionwebservice/lib/action_web_service/scaffolding.rb +0 -283
  137. data/vendor/rails/actionwebservice/lib/action_web_service/struct.rb +0 -68
  138. data/vendor/rails/actionwebservice/lib/action_web_service/support/class_inheritable_options.rb +0 -26
  139. data/vendor/rails/actionwebservice/lib/action_web_service/support/signature_types.rb +0 -226
  140. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/layout.erb +0 -65
  141. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/methods.erb +0 -6
  142. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/methods.rhtml +0 -0
  143. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/parameters.erb +0 -29
  144. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/parameters.rhtml +0 -0
  145. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/result.erb +0 -30
  146. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/result.rhtml +0 -0
  147. data/vendor/rails/actionwebservice/lib/action_web_service/test_invoke.rb +0 -110
  148. data/vendor/rails/actionwebservice/lib/action_web_service/version.rb +0 -9
  149. data/vendor/rails/actionwebservice/setup.rb +0 -1379
  150. data/vendor/rails/actionwebservice/test/abstract_client.rb +0 -183
  151. data/vendor/rails/actionwebservice/test/abstract_dispatcher.rb +0 -551
  152. data/vendor/rails/actionwebservice/test/abstract_unit.rb +0 -45
  153. data/vendor/rails/actionwebservice/test/api_test.rb +0 -102
  154. data/vendor/rails/actionwebservice/test/apis/auto_load_api.rb +0 -3
  155. data/vendor/rails/actionwebservice/test/apis/broken_auto_load_api.rb +0 -2
  156. data/vendor/rails/actionwebservice/test/base_test.rb +0 -42
  157. data/vendor/rails/actionwebservice/test/casting_test.rb +0 -86
  158. data/vendor/rails/actionwebservice/test/client_soap_test.rb +0 -153
  159. data/vendor/rails/actionwebservice/test/client_xmlrpc_test.rb +0 -152
  160. data/vendor/rails/actionwebservice/test/container_test.rb +0 -73
  161. data/vendor/rails/actionwebservice/test/dispatcher_action_controller_soap_test.rb +0 -137
  162. data/vendor/rails/actionwebservice/test/dispatcher_action_controller_xmlrpc_test.rb +0 -59
  163. data/vendor/rails/actionwebservice/test/fixtures/db_definitions/mysql.sql +0 -8
  164. data/vendor/rails/actionwebservice/test/fixtures/users.yml +0 -12
  165. data/vendor/rails/actionwebservice/test/gencov +0 -3
  166. data/vendor/rails/actionwebservice/test/invocation_test.rb +0 -185
  167. data/vendor/rails/actionwebservice/test/run +0 -6
  168. data/vendor/rails/actionwebservice/test/scaffolded_controller_test.rb +0 -146
  169. data/vendor/rails/actionwebservice/test/struct_test.rb +0 -52
  170. data/vendor/rails/actionwebservice/test/test_invoke_test.rb +0 -112
@@ -1,86 +0,0 @@
1
- module ActionWebService # :nodoc:
2
- module Container # :nodoc:
3
- module Delegated # :nodoc:
4
- class ContainerError < ActionWebServiceError # :nodoc:
5
- end
6
-
7
- def self.included(base) # :nodoc:
8
- base.extend(ClassMethods)
9
- base.send(:include, ActionWebService::Container::Delegated::InstanceMethods)
10
- end
11
-
12
- module ClassMethods
13
- # Declares a web service that will provide access to the API of the given
14
- # +object+. +object+ must be an ActionWebService::Base derivative.
15
- #
16
- # Web service object creation can either be _immediate_, where the object
17
- # instance is given at class definition time, or _deferred_, where
18
- # object instantiation is delayed until request time.
19
- #
20
- # ==== Immediate web service object example
21
- #
22
- # class ApiController < ApplicationController
23
- # web_service_dispatching_mode :delegated
24
- #
25
- # web_service :person, PersonService.new
26
- # end
27
- #
28
- # For deferred instantiation, a block should be given instead of an
29
- # object instance. This block will be executed in controller instance
30
- # context, so it can rely on controller instance variables being present.
31
- #
32
- # ==== Deferred web service object example
33
- #
34
- # class ApiController < ApplicationController
35
- # web_service_dispatching_mode :delegated
36
- #
37
- # web_service(:person) { PersonService.new(request.env) }
38
- # end
39
- def web_service(name, object=nil, &block)
40
- if (object && block_given?) || (object.nil? && block.nil?)
41
- raise(ContainerError, "either service, or a block must be given")
42
- end
43
- name = name.to_sym
44
- if block_given?
45
- info = { name => { :block => block } }
46
- else
47
- info = { name => { :object => object } }
48
- end
49
- write_inheritable_hash("web_services", info)
50
- call_web_service_definition_callbacks(self, name, info)
51
- end
52
-
53
- # Whether this service contains a service with the given +name+
54
- def has_web_service?(name)
55
- web_services.has_key?(name.to_sym)
56
- end
57
-
58
- def web_services # :nodoc:
59
- read_inheritable_attribute("web_services") || {}
60
- end
61
-
62
- def add_web_service_definition_callback(&block) # :nodoc:
63
- write_inheritable_array("web_service_definition_callbacks", [block])
64
- end
65
-
66
- private
67
- def call_web_service_definition_callbacks(container_class, web_service_name, service_info)
68
- (read_inheritable_attribute("web_service_definition_callbacks") || []).each do |block|
69
- block.call(container_class, web_service_name, service_info)
70
- end
71
- end
72
- end
73
-
74
- module InstanceMethods # :nodoc:
75
- def web_service_object(web_service_name)
76
- info = self.class.web_services[web_service_name.to_sym]
77
- unless info
78
- raise(ContainerError, "no such web service '#{web_service_name}'")
79
- end
80
- service = info[:block]
81
- service ? self.instance_eval(&service) : info[:object]
82
- end
83
- end
84
- end
85
- end
86
- end
@@ -1,69 +0,0 @@
1
- module ActionWebService # :nodoc:
2
- module Container # :nodoc:
3
- module Direct # :nodoc:
4
- class ContainerError < ActionWebServiceError # :nodoc:
5
- end
6
-
7
- def self.included(base) # :nodoc:
8
- base.extend(ClassMethods)
9
- end
10
-
11
- module ClassMethods
12
- # Attaches ActionWebService API +definition+ to the calling class.
13
- #
14
- # Action Controllers can have a default associated API, removing the need
15
- # to call this method if you follow the Action Web Service naming conventions.
16
- #
17
- # A controller with a class name of GoogleSearchController will
18
- # implicitly load <tt>app/apis/google_search_api.rb</tt>, and expect the
19
- # API definition class to be named <tt>GoogleSearchAPI</tt> or
20
- # <tt>GoogleSearchApi</tt>.
21
- #
22
- # ==== Service class example
23
- #
24
- # class MyService < ActionWebService::Base
25
- # web_service_api MyAPI
26
- # end
27
- #
28
- # class MyAPI < ActionWebService::API::Base
29
- # ...
30
- # end
31
- #
32
- # ==== Controller class example
33
- #
34
- # class MyController < ActionController::Base
35
- # web_service_api MyAPI
36
- # end
37
- #
38
- # class MyAPI < ActionWebService::API::Base
39
- # ...
40
- # end
41
- def web_service_api(definition=nil)
42
- if definition.nil?
43
- read_inheritable_attribute("web_service_api")
44
- else
45
- if definition.is_a?(Symbol)
46
- raise(ContainerError, "symbols can only be used for #web_service_api inside of a controller")
47
- end
48
- unless definition.respond_to?(:ancestors) && definition.ancestors.include?(ActionWebService::API::Base)
49
- raise(ContainerError, "#{definition.to_s} is not a valid API definition")
50
- end
51
- write_inheritable_attribute("web_service_api", definition)
52
- call_web_service_api_callbacks(self, definition)
53
- end
54
- end
55
-
56
- def add_web_service_api_callback(&block) # :nodoc:
57
- write_inheritable_array("web_service_api_callbacks", [block])
58
- end
59
-
60
- private
61
- def call_web_service_api_callbacks(container_class, definition)
62
- (read_inheritable_attribute("web_service_api_callbacks") || []).each do |block|
63
- block.call(container_class, definition)
64
- end
65
- end
66
- end
67
- end
68
- end
69
- end
@@ -1,2 +0,0 @@
1
- require 'action_web_service/dispatcher/abstract'
2
- require 'action_web_service/dispatcher/action_controller_dispatcher'
@@ -1,207 +0,0 @@
1
- require 'benchmark'
2
-
3
- module ActionWebService # :nodoc:
4
- module Dispatcher # :nodoc:
5
- class DispatcherError < ActionWebService::ActionWebServiceError # :nodoc:
6
- def initialize(*args)
7
- super
8
- set_backtrace(caller)
9
- end
10
- end
11
-
12
- def self.included(base) # :nodoc:
13
- base.class_inheritable_option(:web_service_dispatching_mode, :direct)
14
- base.class_inheritable_option(:web_service_exception_reporting, true)
15
- base.send(:include, ActionWebService::Dispatcher::InstanceMethods)
16
- end
17
-
18
- module InstanceMethods # :nodoc:
19
- private
20
- def invoke_web_service_request(protocol_request)
21
- invocation = web_service_invocation(protocol_request)
22
- if invocation.is_a?(Array) && protocol_request.protocol.is_a?(Protocol::XmlRpc::XmlRpcProtocol)
23
- xmlrpc_multicall_invoke(invocation)
24
- else
25
- web_service_invoke(invocation)
26
- end
27
- end
28
-
29
- def web_service_direct_invoke(invocation)
30
- @method_params = invocation.method_ordered_params
31
- arity = method(invocation.api_method.name).arity rescue 0
32
- if arity < 0 || arity > 0
33
- params = @method_params
34
- else
35
- params = []
36
- end
37
- web_service_filtered_invoke(invocation, params)
38
- end
39
-
40
- def web_service_delegated_invoke(invocation)
41
- web_service_filtered_invoke(invocation, invocation.method_ordered_params)
42
- end
43
-
44
- def web_service_filtered_invoke(invocation, params)
45
- cancellation_reason = nil
46
- return_value = invocation.service.perform_invocation(invocation.api_method.name, params) do |x|
47
- cancellation_reason = x
48
- end
49
- if cancellation_reason
50
- raise(DispatcherError, "request canceled: #{cancellation_reason}")
51
- end
52
- return_value
53
- end
54
-
55
- def web_service_invoke(invocation)
56
- case web_service_dispatching_mode
57
- when :direct
58
- return_value = web_service_direct_invoke(invocation)
59
- when :delegated, :layered
60
- return_value = web_service_delegated_invoke(invocation)
61
- end
62
- web_service_create_response(invocation.protocol, invocation.protocol_options, invocation.api, invocation.api_method, return_value)
63
- end
64
-
65
- def xmlrpc_multicall_invoke(invocations)
66
- responses = []
67
- invocations.each do |invocation|
68
- if invocation.is_a?(Hash)
69
- responses << [invocation, nil]
70
- next
71
- end
72
- begin
73
- case web_service_dispatching_mode
74
- when :direct
75
- return_value = web_service_direct_invoke(invocation)
76
- when :delegated, :layered
77
- return_value = web_service_delegated_invoke(invocation)
78
- end
79
- api_method = invocation.api_method
80
- if invocation.api.has_api_method?(api_method.name)
81
- response_type = (api_method.returns ? api_method.returns[0] : nil)
82
- return_value = api_method.cast_returns(return_value)
83
- else
84
- response_type = ActionWebService::SignatureTypes.canonical_signature_entry(return_value.class, 0)
85
- end
86
- responses << [return_value, response_type]
87
- rescue Exception => e
88
- responses << [{ 'faultCode' => 3, 'faultString' => e.message }, nil]
89
- end
90
- end
91
- invocation = invocations[0]
92
- invocation.protocol.encode_multicall_response(responses, invocation.protocol_options)
93
- end
94
-
95
- def web_service_invocation(request, level = 0)
96
- public_method_name = request.method_name
97
- invocation = Invocation.new
98
- invocation.protocol = request.protocol
99
- invocation.protocol_options = request.protocol_options
100
- invocation.service_name = request.service_name
101
- if web_service_dispatching_mode == :layered
102
- case invocation.protocol
103
- when Protocol::Soap::SoapProtocol
104
- soap_action = request.protocol_options[:soap_action]
105
- if soap_action && soap_action =~ /^\/\w+\/(\w+)\//
106
- invocation.service_name = $1
107
- end
108
- when Protocol::XmlRpc::XmlRpcProtocol
109
- if request.method_name =~ /^([^\.]+)\.(.*)$/
110
- public_method_name = $2
111
- invocation.service_name = $1
112
- end
113
- end
114
- end
115
- if invocation.protocol.is_a? Protocol::XmlRpc::XmlRpcProtocol
116
- if public_method_name == 'multicall' && invocation.service_name == 'system'
117
- if level > 0
118
- raise(DispatcherError, "Recursive system.multicall invocations not allowed")
119
- end
120
- multicall = request.method_params.dup
121
- unless multicall.is_a?(Array) && multicall[0].is_a?(Array)
122
- raise(DispatcherError, "Malformed multicall (expected array of Hash elements)")
123
- end
124
- multicall = multicall[0]
125
- return multicall.map do |item|
126
- raise(DispatcherError, "Multicall elements must be Hash") unless item.is_a?(Hash)
127
- raise(DispatcherError, "Multicall elements must contain a 'methodName' key") unless item.has_key?('methodName')
128
- method_name = item['methodName']
129
- params = item.has_key?('params') ? item['params'] : []
130
- multicall_request = request.dup
131
- multicall_request.method_name = method_name
132
- multicall_request.method_params = params
133
- begin
134
- web_service_invocation(multicall_request, level + 1)
135
- rescue Exception => e
136
- {'faultCode' => 4, 'faultMessage' => e.message}
137
- end
138
- end
139
- end
140
- end
141
- case web_service_dispatching_mode
142
- when :direct
143
- invocation.api = self.class.web_service_api
144
- invocation.service = self
145
- when :delegated, :layered
146
- invocation.service = web_service_object(invocation.service_name)
147
- invocation.api = invocation.service.class.web_service_api
148
- end
149
- if invocation.api.nil?
150
- raise(DispatcherError, "no API attached to #{invocation.service.class}")
151
- end
152
- invocation.protocol.register_api(invocation.api)
153
- request.api = invocation.api
154
- if invocation.api.has_public_api_method?(public_method_name)
155
- invocation.api_method = invocation.api.public_api_method_instance(public_method_name)
156
- else
157
- if invocation.api.default_api_method.nil?
158
- raise(DispatcherError, "no such method '#{public_method_name}' on API #{invocation.api}")
159
- else
160
- invocation.api_method = invocation.api.default_api_method_instance
161
- end
162
- end
163
- if invocation.service.nil?
164
- raise(DispatcherError, "no service available for service name #{invocation.service_name}")
165
- end
166
- unless invocation.service.respond_to?(invocation.api_method.name)
167
- raise(DispatcherError, "no such method '#{public_method_name}' on API #{invocation.api} (#{invocation.api_method.name})")
168
- end
169
- request.api_method = invocation.api_method
170
- begin
171
- invocation.method_ordered_params = invocation.api_method.cast_expects(request.method_params.dup)
172
- rescue
173
- logger.warn "Casting of method parameters failed" unless logger.nil?
174
- invocation.method_ordered_params = request.method_params
175
- end
176
- request.method_params = invocation.method_ordered_params
177
- invocation.method_named_params = {}
178
- invocation.api_method.param_names.inject(0) do |m, n|
179
- invocation.method_named_params[n] = invocation.method_ordered_params[m]
180
- m + 1
181
- end
182
- invocation
183
- end
184
-
185
- def web_service_create_response(protocol, protocol_options, api, api_method, return_value)
186
- if api.has_api_method?(api_method.name)
187
- return_type = api_method.returns ? api_method.returns[0] : nil
188
- return_value = api_method.cast_returns(return_value)
189
- else
190
- return_type = ActionWebService::SignatureTypes.canonical_signature_entry(return_value.class, 0)
191
- end
192
- protocol.encode_response(api_method.public_name + 'Response', return_value, return_type, protocol_options)
193
- end
194
-
195
- class Invocation # :nodoc:
196
- attr_accessor :protocol
197
- attr_accessor :protocol_options
198
- attr_accessor :service_name
199
- attr_accessor :api
200
- attr_accessor :api_method
201
- attr_accessor :method_ordered_params
202
- attr_accessor :method_named_params
203
- attr_accessor :service
204
- end
205
- end
206
- end
207
- end
@@ -1,379 +0,0 @@
1
- require 'benchmark'
2
- require 'builder/xmlmarkup'
3
-
4
- module ActionWebService # :nodoc:
5
- module Dispatcher # :nodoc:
6
- module ActionController # :nodoc:
7
- def self.included(base) # :nodoc:
8
- class << base
9
- include ClassMethods
10
- alias_method_chain :inherited, :action_controller
11
- end
12
- base.class_eval do
13
- alias_method :web_service_direct_invoke_without_controller, :web_service_direct_invoke
14
- end
15
- base.add_web_service_api_callback do |klass, api|
16
- if klass.web_service_dispatching_mode == :direct
17
- klass.class_eval 'def api; dispatch_web_service_request; end'
18
- end
19
- end
20
- base.add_web_service_definition_callback do |klass, name, info|
21
- if klass.web_service_dispatching_mode == :delegated
22
- klass.class_eval "def #{name}; dispatch_web_service_request; end"
23
- elsif klass.web_service_dispatching_mode == :layered
24
- klass.class_eval 'def api; dispatch_web_service_request; end'
25
- end
26
- end
27
- base.send(:include, ActionWebService::Dispatcher::ActionController::InstanceMethods)
28
- end
29
-
30
- module ClassMethods # :nodoc:
31
- def inherited_with_action_controller(child)
32
- inherited_without_action_controller(child)
33
- child.send(:include, ActionWebService::Dispatcher::ActionController::WsdlAction)
34
- end
35
- end
36
-
37
- module InstanceMethods # :nodoc:
38
- private
39
- def dispatch_web_service_request
40
- method = request.method.to_s.upcase
41
- allowed_methods = self.class.web_service_api ? (self.class.web_service_api.allowed_http_methods || []) : [ :post ]
42
- allowed_methods = allowed_methods.map{|m| m.to_s.upcase }
43
- if !allowed_methods.include?(method)
44
- render_text("#{method} not supported", "500 #{method} not supported")
45
- return
46
- end
47
- exception = nil
48
- begin
49
- ws_request = discover_web_service_request(request)
50
- rescue Exception => e
51
- exception = e
52
- end
53
- if ws_request
54
- ws_response = nil
55
- exception = nil
56
- bm = Benchmark.measure do
57
- begin
58
- ws_response = invoke_web_service_request(ws_request)
59
- rescue Exception => e
60
- exception = e
61
- end
62
- end
63
- log_request(ws_request, request.raw_post)
64
- if exception
65
- log_error(exception) unless logger.nil?
66
- send_web_service_error_response(ws_request, exception)
67
- else
68
- send_web_service_response(ws_response, bm.real)
69
- end
70
- else
71
- exception ||= DispatcherError.new("Malformed SOAP or XML-RPC protocol message")
72
- log_error(exception) unless logger.nil?
73
- send_web_service_error_response(ws_request, exception)
74
- end
75
- rescue Exception => e
76
- log_error(e) unless logger.nil?
77
- send_web_service_error_response(ws_request, e)
78
- end
79
-
80
- def send_web_service_response(ws_response, elapsed=nil)
81
- log_response(ws_response, elapsed)
82
- options = { :type => ws_response.content_type, :disposition => 'inline' }
83
- send_data(ws_response.body, options)
84
- end
85
-
86
- def send_web_service_error_response(ws_request, exception)
87
- if ws_request
88
- unless self.class.web_service_exception_reporting
89
- exception = DispatcherError.new("Internal server error (exception raised)")
90
- end
91
- api_method = ws_request.api_method
92
- public_method_name = api_method ? api_method.public_name : ws_request.method_name
93
- return_type = ActionWebService::SignatureTypes.canonical_signature_entry(Exception, 0)
94
- ws_response = ws_request.protocol.encode_response(public_method_name + 'Response', exception, return_type, ws_request.protocol_options)
95
- send_web_service_response(ws_response)
96
- else
97
- if self.class.web_service_exception_reporting
98
- message = exception.message
99
- backtrace = "\nBacktrace:\n#{exception.backtrace.join("\n")}"
100
- else
101
- message = "Exception raised"
102
- backtrace = ""
103
- end
104
- render_text("Internal protocol error: #{message}#{backtrace}", "500 Internal Protocol Error")
105
- end
106
- end
107
-
108
- def web_service_direct_invoke(invocation)
109
- invocation.method_named_params.each do |name, value|
110
- params[name] = value
111
- end
112
- web_service_direct_invoke_without_controller(invocation)
113
- end
114
-
115
- def log_request(ws_request, body)
116
- unless logger.nil?
117
- name = ws_request.method_name
118
- api_method = ws_request.api_method
119
- params = ws_request.method_params
120
- if api_method && api_method.expects
121
- params = api_method.expects.zip(params).map{ |type, param| "#{type.name}=>#{param.inspect}" }
122
- else
123
- params = params.map{ |param| param.inspect }
124
- end
125
- service = ws_request.service_name
126
- logger.debug("\nWeb Service Request: #{name}(#{params.join(", ")}) Entrypoint: #{service}")
127
- logger.debug(indent(body))
128
- end
129
- end
130
-
131
- def log_response(ws_response, elapsed=nil)
132
- unless logger.nil?
133
- elapsed = (elapsed ? " (%f):" % elapsed : ":")
134
- logger.debug("\nWeb Service Response" + elapsed + " => #{ws_response.return_value.inspect}")
135
- logger.debug(indent(ws_response.body))
136
- end
137
- end
138
-
139
- def indent(body)
140
- body.split(/\n/).map{|x| " #{x}"}.join("\n")
141
- end
142
- end
143
-
144
- module WsdlAction # :nodoc:
145
- XsdNs = 'http://www.w3.org/2001/XMLSchema'
146
- WsdlNs = 'http://schemas.xmlsoap.org/wsdl/'
147
- SoapNs = 'http://schemas.xmlsoap.org/wsdl/soap/'
148
- SoapEncodingNs = 'http://schemas.xmlsoap.org/soap/encoding/'
149
- SoapHttpTransport = 'http://schemas.xmlsoap.org/soap/http'
150
-
151
- def wsdl
152
- case request.method
153
- when :get
154
- begin
155
- options = { :type => 'text/xml', :disposition => 'inline' }
156
- send_data(to_wsdl, options)
157
- rescue Exception => e
158
- log_error(e) unless logger.nil?
159
- end
160
- when :post
161
- render_text('POST not supported', '500 POST not supported')
162
- end
163
- end
164
-
165
- private
166
- def base_uri
167
- host = request.host_with_port
168
- relative_url_root = request.relative_url_root
169
- scheme = request.ssl? ? 'https' : 'http'
170
- '%s://%s%s/%s/' % [scheme, host, relative_url_root, self.class.controller_path]
171
- end
172
-
173
- def to_wsdl
174
- xml = ''
175
- dispatching_mode = web_service_dispatching_mode
176
- global_service_name = wsdl_service_name
177
- namespace = wsdl_namespace || 'urn:ActionWebService'
178
- soap_action_base = "/#{controller_name}"
179
-
180
- marshaler = ActionWebService::Protocol::Soap::SoapMarshaler.new(namespace)
181
- apis = {}
182
- case dispatching_mode
183
- when :direct
184
- api = self.class.web_service_api
185
- web_service_name = controller_class_name.sub(/Controller$/, '').underscore
186
- apis[web_service_name] = [api, register_api(api, marshaler)]
187
- when :delegated, :layered
188
- self.class.web_services.each do |web_service_name, info|
189
- service = web_service_object(web_service_name)
190
- api = service.class.web_service_api
191
- apis[web_service_name] = [api, register_api(api, marshaler)]
192
- end
193
- end
194
- custom_types = []
195
- apis.values.each do |api, bindings|
196
- bindings.each do |b|
197
- custom_types << b unless custom_types.include?(b)
198
- end
199
- end
200
-
201
- xm = Builder::XmlMarkup.new(:target => xml, :indent => 2)
202
- xm.instruct!
203
- xm.definitions('name' => wsdl_service_name,
204
- 'targetNamespace' => namespace,
205
- 'xmlns:typens' => namespace,
206
- 'xmlns:xsd' => XsdNs,
207
- 'xmlns:soap' => SoapNs,
208
- 'xmlns:soapenc' => SoapEncodingNs,
209
- 'xmlns:wsdl' => WsdlNs,
210
- 'xmlns' => WsdlNs) do
211
- # Generate XSD
212
- if custom_types.size > 0
213
- xm.types do
214
- xm.xsd(:schema, 'xmlns' => XsdNs, 'targetNamespace' => namespace) do
215
- custom_types.each do |binding|
216
- case
217
- when binding.type.array?
218
- xm.xsd(:complexType, 'name' => binding.type_name) do
219
- xm.xsd(:complexContent) do
220
- xm.xsd(:restriction, 'base' => 'soapenc:Array') do
221
- xm.xsd(:attribute, 'ref' => 'soapenc:arrayType',
222
- 'wsdl:arrayType' => binding.element_binding.qualified_type_name('typens') + '[]')
223
- end
224
- end
225
- end
226
- when binding.type.structured?
227
- xm.xsd(:complexType, 'name' => binding.type_name) do
228
- xm.xsd(:all) do
229
- binding.type.each_member do |name, type|
230
- b = marshaler.register_type(type)
231
- xm.xsd(:element, 'name' => name, 'type' => b.qualified_type_name('typens'))
232
- end
233
- end
234
- end
235
- end
236
- end
237
- end
238
- end
239
- end
240
-
241
- # APIs
242
- apis.each do |api_name, values|
243
- api = values[0]
244
- api.api_methods.each do |name, method|
245
- gen = lambda do |msg_name, direction|
246
- xm.message('name' => message_name_for(api_name, msg_name)) do
247
- sym = nil
248
- if direction == :out
249
- returns = method.returns
250
- if returns
251
- binding = marshaler.register_type(returns[0])
252
- xm.part('name' => 'return', 'type' => binding.qualified_type_name('typens'))
253
- end
254
- else
255
- expects = method.expects
256
- expects.each do |type|
257
- binding = marshaler.register_type(type)
258
- xm.part('name' => type.name, 'type' => binding.qualified_type_name('typens'))
259
- end if expects
260
- end
261
- end
262
- end
263
- public_name = method.public_name
264
- gen.call(public_name, :in)
265
- gen.call("#{public_name}Response", :out)
266
- end
267
-
268
- # Port
269
- port_name = port_name_for(global_service_name, api_name)
270
- xm.portType('name' => port_name) do
271
- api.api_methods.each do |name, method|
272
- xm.operation('name' => method.public_name) do
273
- xm.input('message' => "typens:" + message_name_for(api_name, method.public_name))
274
- xm.output('message' => "typens:" + message_name_for(api_name, "#{method.public_name}Response"))
275
- end
276
- end
277
- end
278
-
279
- # Bind it
280
- binding_name = binding_name_for(global_service_name, api_name)
281
- xm.binding('name' => binding_name, 'type' => "typens:#{port_name}") do
282
- xm.soap(:binding, 'style' => 'rpc', 'transport' => SoapHttpTransport)
283
- api.api_methods.each do |name, method|
284
- xm.operation('name' => method.public_name) do
285
- case web_service_dispatching_mode
286
- when :direct
287
- soap_action = soap_action_base + "/api/" + method.public_name
288
- when :delegated, :layered
289
- soap_action = soap_action_base \
290
- + "/" + api_name.to_s \
291
- + "/" + method.public_name
292
- end
293
- xm.soap(:operation, 'soapAction' => soap_action)
294
- xm.input do
295
- xm.soap(:body,
296
- 'use' => 'encoded',
297
- 'namespace' => namespace,
298
- 'encodingStyle' => SoapEncodingNs)
299
- end
300
- xm.output do
301
- xm.soap(:body,
302
- 'use' => 'encoded',
303
- 'namespace' => namespace,
304
- 'encodingStyle' => SoapEncodingNs)
305
- end
306
- end
307
- end
308
- end
309
- end
310
-
311
- # Define it
312
- xm.service('name' => "#{global_service_name}Service") do
313
- apis.each do |api_name, values|
314
- port_name = port_name_for(global_service_name, api_name)
315
- binding_name = binding_name_for(global_service_name, api_name)
316
- case web_service_dispatching_mode
317
- when :direct, :layered
318
- binding_target = 'api'
319
- when :delegated
320
- binding_target = api_name.to_s
321
- end
322
- xm.port('name' => port_name, 'binding' => "typens:#{binding_name}") do
323
- xm.soap(:address, 'location' => "#{base_uri}#{binding_target}")
324
- end
325
- end
326
- end
327
- end
328
- end
329
-
330
- def port_name_for(global_service, service)
331
- "#{global_service}#{service.to_s.camelize}Port"
332
- end
333
-
334
- def binding_name_for(global_service, service)
335
- "#{global_service}#{service.to_s.camelize}Binding"
336
- end
337
-
338
- def message_name_for(api_name, message_name)
339
- mode = web_service_dispatching_mode
340
- if mode == :layered || mode == :delegated
341
- api_name.to_s + '-' + message_name
342
- else
343
- message_name
344
- end
345
- end
346
-
347
- def register_api(api, marshaler)
348
- bindings = {}
349
- traverse_custom_types(api, marshaler, bindings) do |binding|
350
- bindings[binding] = nil unless bindings.has_key?(binding)
351
- element_binding = binding.element_binding
352
- bindings[element_binding] = nil if element_binding && !bindings.has_key?(element_binding)
353
- end
354
- bindings.keys
355
- end
356
-
357
- def traverse_custom_types(api, marshaler, bindings, &block)
358
- api.api_methods.each do |name, method|
359
- expects, returns = method.expects, method.returns
360
- expects.each{ |type| traverse_type(marshaler, type, bindings, &block) if type.custom? } if expects
361
- returns.each{ |type| traverse_type(marshaler, type, bindings, &block) if type.custom? } if returns
362
- end
363
- end
364
-
365
- def traverse_type(marshaler, type, bindings, &block)
366
- binding = marshaler.register_type(type)
367
- return if bindings.has_key?(binding)
368
- bindings[binding] = nil
369
- yield binding
370
- if type.array?
371
- yield marshaler.register_type(type.element_type)
372
- type = type.element_type
373
- end
374
- type.each_member{ |name, type| traverse_type(marshaler, type, bindings, &block) } if type.structured?
375
- end
376
- end
377
- end
378
- end
379
- end