killbill 1.0.15 → 1.0.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. data/Jarfile +4 -2
  2. data/VERSION +1 -1
  3. data/lib/killbill.rb +69 -13
  4. data/lib/killbill/creator.rb +16 -2
  5. data/lib/killbill/enum.rb +72 -0
  6. data/lib/killbill/gen/account.rb +43 -0
  7. data/lib/killbill/gen/account_data.rb +39 -0
  8. data/lib/killbill/gen/account_email.rb +25 -0
  9. data/lib/killbill/gen/audit_log.rb +28 -0
  10. data/lib/killbill/gen/blocking_state.rb +32 -0
  11. data/lib/killbill/gen/call_context.rb +29 -0
  12. data/lib/killbill/gen/call_origin.rb +34 -0
  13. data/lib/killbill/gen/currency.rb +34 -0
  14. data/lib/killbill/gen/custom_field.rb +27 -0
  15. data/lib/killbill/gen/date_time_zone.rb +35 -0
  16. data/lib/killbill/gen/ext_bus_event.rb +25 -0
  17. data/lib/killbill/gen/ext_bus_event_type.rb +34 -0
  18. data/lib/killbill/gen/invoice.rb +39 -0
  19. data/lib/killbill/gen/invoice_item.rb +37 -0
  20. data/lib/killbill/gen/invoice_payment.rb +31 -0
  21. data/lib/killbill/gen/invoice_payment_type.rb +34 -0
  22. data/lib/killbill/gen/object_type.rb +34 -0
  23. data/lib/killbill/gen/payment.rb +36 -0
  24. data/lib/killbill/gen/payment_attempt.rb +27 -0
  25. data/lib/killbill/gen/payment_info_plugin.rb +28 -0
  26. data/lib/killbill/gen/payment_method_info_plugin.rb +24 -0
  27. data/lib/killbill/gen/payment_method_kv_info.rb +21 -0
  28. data/lib/killbill/gen/payment_method_plugin.rb +36 -0
  29. data/lib/killbill/gen/payment_plugin_status.rb +34 -0
  30. data/lib/killbill/gen/refund.rb +29 -0
  31. data/lib/killbill/gen/refund_info_plugin.rb +27 -0
  32. data/lib/killbill/gen/refund_plugin_status.rb +34 -0
  33. data/lib/killbill/gen/require_gen.rb +38 -0
  34. data/lib/killbill/gen/subscription.rb +44 -0
  35. data/lib/killbill/gen/subscription_bundle.rb +27 -0
  36. data/lib/killbill/gen/subscription_source_type.rb +34 -0
  37. data/lib/killbill/gen/subscription_state.rb +34 -0
  38. data/lib/killbill/gen/tag.rb +26 -0
  39. data/lib/killbill/gen/tag_definition.rb +27 -0
  40. data/lib/killbill/gen/tenant_context.rb +21 -0
  41. data/lib/killbill/gen/user_type.rb +34 -0
  42. data/lib/killbill/gen/uuid.rb +22 -0
  43. data/lib/killbill/http_servlet.rb +10 -3
  44. data/lib/killbill/jconverter.rb +540 -0
  45. data/lib/killbill/jkillbill_api.rb +137 -0
  46. data/lib/killbill/jnotification.rb +0 -1
  47. data/lib/killbill/jpayment.rb +7 -19
  48. data/lib/killbill/jplugin.rb +27 -16
  49. data/lib/killbill/killbill_api.rb +28 -0
  50. data/lib/killbill/killbill_logger.rb +31 -8
  51. data/lib/killbill/notification.rb +0 -1
  52. data/lib/killbill/payment.rb +0 -5
  53. data/lib/killbill/plugin.rb +4 -46
  54. data/spec/killbill/base_plugin_spec.rb +2 -1
  55. data/spec/killbill/{jresponse/jconverter_spec.rb → jconverter_spec.rb} +46 -90
  56. data/spec/killbill/jnotification_spec.rb +2 -1
  57. data/spec/killbill/jpayment_spec.rb +17 -16
  58. data/spec/killbill/killbill_integration_spec.rb +1 -1
  59. data/spec/killbill/killbillapi_spec.rb +49 -0
  60. data/spec/killbill/payment_test.rb +5 -5
  61. data/spec/killbill/rack_handler_spec.rb +1 -2
  62. data/spec/spec_helper.rb +3 -0
  63. data/tools/java2ruby.rb +440 -0
  64. metadata +48 -26
  65. data/lib/killbill/jresponse/jconverter.rb +0 -126
  66. data/lib/killbill/jresponse/jevent.rb +0 -58
  67. data/lib/killbill/jresponse/jpayment_method_response.rb +0 -148
  68. data/lib/killbill/jresponse/jpayment_method_response_internal.rb +0 -54
  69. data/lib/killbill/jresponse/jpayment_response.rb +0 -74
  70. data/lib/killbill/jresponse/jrefund_response.rb +0 -68
  71. data/lib/killbill/response/event.rb +0 -18
  72. data/lib/killbill/response/payment_method_response.rb +0 -50
  73. data/lib/killbill/response/payment_method_response_internal.rb +0 -20
  74. data/lib/killbill/response/payment_response.rb +0 -26
  75. data/lib/killbill/response/payment_status.rb +0 -10
  76. data/lib/killbill/response/refund_response.rb +0 -25
  77. data/spec/killbill/jresponse/jevent_spec.rb +0 -18
  78. data/spec/killbill/jresponse/jpayment_method_response_internal_spec.rb +0 -34
  79. data/spec/killbill/jresponse/jpayment_method_response_spec.rb +0 -53
  80. data/spec/killbill/jresponse/jpayment_response_spec.rb +0 -41
  81. data/spec/killbill/jresponse/jrefund_response_spec.rb +0 -41
@@ -0,0 +1,137 @@
1
+ require 'killbill/jconverter'
2
+
3
+
4
+ module Killbill
5
+ module Plugin
6
+
7
+ class JKillbillApi
8
+
9
+ attr_writer :account_user_api,
10
+ :analytics_sanity_api,
11
+ :analytics_user_api,
12
+ :catalog_user_api,
13
+ :entitlement_migration_api,
14
+ :entitlement_timeline_api,
15
+ :entitlement_transfer_api,
16
+ :entitlement_user_api,
17
+ :invoice_migration_api,
18
+ :invoice_payment_api,
19
+ :invoice_user_api,
20
+ :meter_user_api,
21
+ :overdue_user_api,
22
+ :payment_api,
23
+ :tenant_user_api,
24
+ :usage_user_api,
25
+ :audit_user_api,
26
+ :custom_field_user_api,
27
+ :export_user_api,
28
+ :tag_user_api
29
+
30
+
31
+ def initialize(plugin_name, services)
32
+ @plugin_name = plugin_name
33
+ @plugged_services = []
34
+ services.each do |service_name, service_instance|
35
+ begin
36
+ self.send("#{service_name}=", service_instance)
37
+ @plugged_services << service_instance
38
+ rescue NoMethodError
39
+ # Expected for non APIs (e.g. logger)
40
+ #warn "Ignoring unsupported service: #{service_name}"
41
+ end
42
+ end
43
+ end
44
+
45
+ def proxy_api(method_name, *args)
46
+ @plugged_services.each do |s|
47
+ if s.class.method_defined?(method_name)
48
+ puts "Found service #{s.to_s} : #{method_name}"
49
+ return do_call_handle_exception(s, method_name, *args)
50
+ end
51
+ end
52
+ raise APINotAvailableError.new("API #{method_name} is not available")
53
+ end
54
+
55
+ private
56
+
57
+ def do_call_handle_exception(delegate_service, method_name, *args)
58
+ begin
59
+ # STEPH TODO hack tenant_id
60
+ call_context = create_call_context(nil, nil, nil, nil)
61
+ #puts "INPUT ARGS = #{args}"
62
+ jargs = convert_args(method_name, args)
63
+ #puts "OUTPUT JARGS = #{jargs.collect { |e| e.class}.join(", ")}"
64
+ res = delegate_service.send(method_name, *jargs, call_context)
65
+ if res.java_kind_of? Java::com.ning.billing.account.api.Account
66
+ return JConverter.from_account(res)
67
+ elsif res.java_kind_of? Java::com.ning.billing.util.tag.TagDefinition
68
+ return JConverter.from_tag_definition(res)
69
+ elsif res.java_kind_of? Java::com.ning.billing.util.tag.Tag
70
+ return JConverter.from_tag(res)
71
+ else
72
+ return res
73
+ end
74
+
75
+ rescue Exception => e
76
+ wrap_and_throw_exception(method_name, e)
77
+ end
78
+ end
79
+
80
+ def wrap_and_throw_exception(api, e)
81
+
82
+ raise e
83
+
84
+ message = "#{api} failure: #{e}"
85
+ unless e.backtrace.nil?
86
+ message = "#{message}\n#{e.backtrace.join("\n")}"
87
+ end
88
+ raise ApiErrorException.new("#{api} failure : #{e.message}")
89
+ end
90
+
91
+ def convert_args(api, args)
92
+
93
+
94
+ args.collect! do |a|
95
+ if a.is_a? Killbill::Plugin::Model::Account
96
+ JConverter.to_account(a)
97
+ elsif a.is_a? Killbill::Plugin::Model::AccountData
98
+ JConverter.to_account_data(a)
99
+ elsif a.is_a? Killbill::Plugin::Model::UUID
100
+ JConverter.to_uuid(a)
101
+ elsif a.is_a? Killbill::Plugin::Model::ObjectType
102
+ JConverter.to_object_type(a)
103
+ else
104
+ a
105
+ end
106
+ end
107
+ end
108
+
109
+
110
+ def create_tenant_context(tenant_id)
111
+ Killbill::Plugin::Model::TenantContext.new(0)
112
+ end
113
+
114
+ def create_call_context(tenant_id, user_token, reason_code, comments)
115
+ user_token = user_token.nil? ? java.util.UUID.randomUUID() : to_uuid(user_token)
116
+ created_date = org.joda.time.DateTime.new(org.joda.time.DateTimeZone::UTC)
117
+ updated_date = created_date
118
+ Killbill::Plugin::Model::CallContext.new(tenant_id,
119
+ user_token,
120
+ @plugin_name,
121
+ Java::com.ning.billing.util.callcontext.CallOrigin::EXTERNAL,
122
+ Java::com.ning.billing.util.callcontext.UserType::SYSTEM,
123
+ reason_code,
124
+ comments,
125
+ created_date,
126
+ updated_date)
127
+ end
128
+
129
+ class ApiErrorException < Exception
130
+ end
131
+
132
+ class APINotAvailableError < NotImplementedError
133
+ end
134
+
135
+ end
136
+ end
137
+ end
@@ -4,7 +4,6 @@ require 'singleton'
4
4
 
5
5
  require 'killbill/creator'
6
6
  require 'killbill/plugin'
7
- require 'killbill/jresponse/jevent'
8
7
 
9
8
  include Java
10
9
 
@@ -4,21 +4,10 @@ require 'singleton'
4
4
 
5
5
  require 'killbill/creator'
6
6
  require 'killbill/plugin'
7
- require 'killbill/jresponse/jpayment_response'
8
- require 'killbill/jresponse/jrefund_response'
9
- require 'killbill/jresponse/jpayment_method_response'
10
- require 'killbill/jresponse/jpayment_method_response_internal'
7
+ require 'killbill/jconverter'
11
8
 
12
9
  include Java
13
10
 
14
- class String
15
- def snake_case
16
- return downcase if match(/\A[A-Z]+\z/)
17
- gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
18
- gsub(/([a-z])([A-Z])/, '\1_\2').
19
- downcase
20
- end
21
- end
22
11
 
23
12
  module Killbill
24
13
  module Plugin
@@ -26,7 +15,6 @@ module Killbill
26
15
  java_package 'com.ning.billing.payment.plugin.api'
27
16
  class JPayment < JPlugin
28
17
 
29
- # java_implements com.ning.billing.payment.plugin.api.PaymentPluginApi
30
18
  include com.ning.billing.payment.plugin.api.PaymentPluginApi
31
19
 
32
20
  def initialize(real_class_name, services = {})
@@ -36,21 +24,21 @@ module Killbill
36
24
  java_signature 'com.ning.billing.payment.plugin.api.PaymentInfoPlugin processPayment(java.util.UUID, java.util.UUID, java.util.UUID, java.lang.BigDecimal, com.ning.billing.catalog.api.Currency, com.ning.billing.util.callcontext.CallContext)'
37
25
  def process_payment(*args)
38
26
  do_call_handle_exception(__method__, *args) do |res|
39
- return JPaymentResponse.new(res)
27
+ return JConverter.to_payment_info_plugin(res)
40
28
  end
41
29
  end
42
30
 
43
31
  java_signature 'Java::com.ning.billing.payment.plugin.api.PaymentInfoPlugin getPaymentInfo(java.util.UUID, java.util.UUID, Java::com.ning.billing.util.callcontext.TenantContext)'
44
32
  def get_payment_info(*args)
45
33
  do_call_handle_exception(__method__, *args) do |res|
46
- return JPaymentResponse.new(res)
34
+ return JConverter.to_payment_info_plugin(res)
47
35
  end
48
36
  end
49
37
 
50
38
  java_signature 'Java::com.ning.billing.payment.plugin.api.RefundInfoPlugin processRefund(java.util.UUID, java.util.UUID, java.lang.BigDecimal, com.ning.billing.catalog.api.Currency, Java::com.ning.billing.util.callcontext.CallContext)'
51
39
  def process_refund(*args)
52
40
  do_call_handle_exception(__method__, *args) do |res|
53
- return JRefundResponse.new(res)
41
+ return JConverter.to_refund_info_plugin(res)
54
42
  end
55
43
  end
56
44
 
@@ -59,7 +47,7 @@ module Killbill
59
47
  do_call_handle_exception(__method__, *args) do |res|
60
48
  array_res = java.util.ArrayList.new
61
49
  res.each do |el|
62
- array_res.add(JRefundResponse.new(el))
50
+ array_res.add(JConverter.to_refund_info_plugin(el))
63
51
  end
64
52
  return array_res
65
53
  end
@@ -82,7 +70,7 @@ module Killbill
82
70
  java_signature 'Java::com.ning.billing.payment.api.PaymentMethodPlugin getPaymentMethodDetail(java.util.UUID, java.util.UUID, Java::com.ning.billing.util.callcontext.TenantContext)'
83
71
  def get_payment_method_detail(*args)
84
72
  do_call_handle_exception(__method__, *args) do |res|
85
- return JPaymentMethodResponse.new(res)
73
+ return JConverter.to_payment_method_response(res)
86
74
  end
87
75
  end
88
76
 
@@ -98,7 +86,7 @@ module Killbill
98
86
  do_call_handle_exception(__method__, *args) do |res|
99
87
  array_res = java.util.ArrayList.new
100
88
  res.each do |el|
101
- array_res.add(JPaymentMethodResponseInternal.new(el))
89
+ array_res.add(JConverter.to_payment_method_info_plugin(el))
102
90
  end
103
91
  return array_res
104
92
  end
@@ -15,15 +15,20 @@ module Killbill
15
15
  module Plugin
16
16
  class JPlugin
17
17
 
18
- attr_reader :delegate_plugin
18
+
19
+ attr_reader :delegate_plugin,
20
+ # Called by the Killbill lifecycle to register the servlet
21
+ :rack_handler
19
22
 
20
23
  # Called by the Killbill lifecycle when initializing the plugin
21
24
  def start_plugin
22
25
  @delegate_plugin.start_plugin
26
+ configure_rack_handler
23
27
  end
24
28
 
25
29
  # Called by the Killbill lifecycle when stopping the plugin
26
30
  def stop_plugin
31
+ unconfigure_rack_handler
27
32
  @delegate_plugin.stop_plugin
28
33
  end
29
34
 
@@ -36,27 +41,29 @@ module Killbill
36
41
  @delegate_plugin = Creator.new(plugin_class_name).create(services)
37
42
  end
38
43
 
39
- # Called by the Killbill lifecycle to register the servlet
40
- def rack_handler
44
+ def logger
45
+ require 'logger'
46
+ @delegate_plugin.nil? ? ::Logger.new(STDOUT) : @delegate_plugin.logger
47
+ end
48
+
49
+ protected
50
+
51
+ def configure_rack_handler
41
52
  config_ru = Pathname.new("#{@delegate_plugin.root}/config.ru").expand_path
42
53
  if config_ru.file?
43
54
  logger.info "Found Rack configuration file at #{config_ru.to_s}"
44
- instance = Killbill::Plugin::RackHandler.instance
45
- instance.configure(logger, config_ru.to_s) unless instance.configured?
46
- instance
55
+ @rack_handler = Killbill::Plugin::RackHandler.instance
56
+ @rack_handler.configure(logger, config_ru.to_s) unless @rack_handler.configured?
47
57
  else
48
58
  logger.info "No Rack configuration file found at #{config_ru.to_s}"
49
59
  nil
50
60
  end
51
61
  end
52
62
 
53
- def logger
54
- require 'logger'
55
- @delegate_plugin.nil? ? ::Logger.new(STDOUT) : @delegate_plugin.logger
63
+ def unconfigure_rack_handler
64
+ @rack_handler.unconfigure unless @rack_handler.nil?
56
65
  end
57
66
 
58
- protected
59
-
60
67
  def do_call_handle_exception(method_name, *args)
61
68
  begin
62
69
  rargs = convert_args(method_name, args)
@@ -85,7 +92,8 @@ module Killbill
85
92
  elsif a.java_kind_of? java.util.UUID
86
93
  JConverter.from_uuid(a)
87
94
  elsif a.java_kind_of? java.math.BigDecimal
88
- JConverter.from_big_decimal(a)
95
+ # A bit fragile if what we recieve is not a price...
96
+ JConverter.from_big_decimal_with_cents_conversion(a)
89
97
  elsif a.java_kind_of? Java::com.ning.billing.catalog.api.Currency
90
98
  a.to_string
91
99
  elsif a.java_kind_of? Java::com.ning.billing.payment.api.PaymentMethodPlugin
@@ -110,15 +118,18 @@ module Killbill
110
118
  end
111
119
  end
112
120
  result
121
+ elsif a.java_kind_of? Java::com.ning.billing.util.callcontext.CallContext
122
+ JConverter.from_call_context(a)
123
+ elsif a.java_kind_of? Java::com.ning.billing.util.callcontext.TenantContext
124
+ JConverter.from_tenant_context(a)
113
125
  else
114
126
  # Since we don't pass the Context at this point, we can't raise any exceptions for unexpected types.
115
- #raise Java::com.ning.billing.payment.plugin.api.PaymentPluginApiException.new("#{api} failure", "Unexpected parameter type #{a.class}")
116
- nil
127
+ raise Java::com.ning.billing.payment.plugin.api.PaymentPluginApiException.new("#{api} failure", "Unexpected parameter type #{a.class}")
117
128
  end
118
129
  end
119
130
  # Remove last argument if this is null (it means we passed a context)
120
- args.delete_at(-1) if args[-1].nil?
121
- args
131
+ #args.delete_at(-1) if args[-1].nil?
132
+ #args
122
133
  end
123
134
 
124
135
  end
@@ -0,0 +1,28 @@
1
+
2
+
3
+ module Killbill
4
+ module Plugin
5
+
6
+ #
7
+ # Represents a subset of the Killbill Apis offered to the ruby plugins
8
+ #
9
+ class KillbillApi
10
+
11
+
12
+ def initialize(japi_proxy)
13
+ @japi_proxy = japi_proxy
14
+ EXPORT_KILLBILL_API.each do |api|
15
+
16
+ end
17
+ end
18
+
19
+ def method_missing(m, *args, &block)
20
+ # m being a symbol, to_s is required for Ruby 1.8
21
+ puts "Got missing method #{m.to_s}"
22
+ return @japi_proxy.proxy_api(m.to_s, *args) if EXPORT_KILLBILL_API.include? m.to_s
23
+ raise NoMethodError.new("undefined method `#{m}' for #{self}")
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -1,4 +1,6 @@
1
1
  # Plugin logger that will delegate to the OSGI LogService
2
+ # Used for regular logging for plugins, as well as Rack logger and Error Stream
3
+ # Methods to implement for rack are described here: http://rack.rubyforge.org/doc/SPEC.html
2
4
  module Killbill
3
5
  module Plugin
4
6
  class KillbillLogger
@@ -6,20 +8,41 @@ module Killbill
6
8
  @logger = delegate
7
9
  end
8
10
 
9
- def debug(msg)
10
- @logger.log(4, msg)
11
+ def debug(message, &block)
12
+ @logger.log(4, build_message(message, &block))
11
13
  end
12
14
 
13
- def info(msg)
14
- @logger.log(3, msg)
15
+ def info(message, &block)
16
+ @logger.log(3, build_message(message, &block))
15
17
  end
16
18
 
17
- def warn(msg)
18
- @logger.log(2, msg)
19
+ def warn(message, &block)
20
+ @logger.log(2, build_message(message, &block))
19
21
  end
20
22
 
21
- def error(msg)
22
- @logger.log(1, msg)
23
+ def error(message, &block)
24
+ @logger.log(1, build_message(message, &block))
25
+ end
26
+
27
+ # Rack Error stream
28
+ alias_method :puts, :warn
29
+ alias_method :write, :warn
30
+
31
+ def flush
32
+ end
33
+
34
+ def close
35
+ end
36
+
37
+ def build_message(message, &block)
38
+ if message.nil?
39
+ if block_given?
40
+ message = yield
41
+ else
42
+ message = "(nil)"
43
+ end
44
+ end
45
+ message.nil? ? "(nil)" : message.to_s
23
46
  end
24
47
 
25
48
  alias_method :fatal, :error
@@ -1,5 +1,4 @@
1
1
  require 'killbill/plugin'
2
- require 'killbill/response/event'
3
2
 
4
3
  module Killbill
5
4
  module Plugin
@@ -1,9 +1,4 @@
1
1
  require 'killbill/plugin'
2
- require 'killbill/response/payment_status'
3
- require 'killbill/response/payment_response'
4
- require 'killbill/response/refund_response'
5
- require 'killbill/response/payment_method_response'
6
- require 'killbill/response/payment_method_response_internal'
7
2
 
8
3
  module Killbill
9
4
  module Plugin
@@ -20,44 +20,18 @@ module Killbill
20
20
  @active = false
21
21
  end
22
22
 
23
- attr_writer :account_user_api,
24
- :analytics_sanity_api,
25
- :analytics_user_api,
26
- :catalog_user_api,
27
- :entitlement_migration_api,
28
- :entitlement_timeline_api,
29
- :entitlement_transfer_api,
30
- :entitlement_user_api,
31
- :invoice_migration_api,
32
- :invoice_payment_api,
33
- :invoice_user_api,
34
- :meter_user_api,
35
- :overdue_user_api,
36
- :payment_api,
37
- :tenant_user_api,
38
- :usage_user_api,
39
- :audit_user_api,
40
- :custom_field_user_api,
41
- :export_user_api,
42
- :tag_user_api
43
23
  # Extra services
44
24
  attr_accessor :root,
45
25
  :logger,
46
- :conf_dir
26
+ :conf_dir,
27
+ :kb_apis
47
28
 
48
29
  # Called by the Killbill lifecycle when instantiating the plugin
49
- def initialize(services = {})
30
+ def initialize()
50
31
  @active = false
51
-
52
- services.each do |service_name, service_instance|
53
- begin
54
- self.send("#{service_name}=", service_instance)
55
- rescue NoMethodError
56
- warn "Ignoring unsupported service: #{service_name}"
57
- end
58
- end
59
32
  end
60
33
 
34
+
61
35
  def logger=(logger)
62
36
  # logger is an OSGI LogService in the Killbill environment. For testing purposes,
63
37
  # allow delegation to a standard logger
@@ -72,22 +46,6 @@ module Killbill
72
46
  def after_request
73
47
  end
74
48
 
75
- class APINotAvailableError < NotImplementedError
76
- end
77
-
78
- def method_missing(m, *args, &block)
79
- # m being a symbol, to_s is required for Ruby 1.8
80
- if m.to_s =~ /_api$/
81
- api = self.instance_variable_get("@#{m.to_s}")
82
- if api.nil?
83
- raise APINotAvailableError.new("API #{m} is not available")
84
- else
85
- api
86
- end
87
- else
88
- raise NoMethodError.new("undefined method `#{m}' for #{self}")
89
- end
90
- end
91
49
  end
92
50
  end
93
51
  end