ginjo-rfm 3.0.9 → 3.0.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,30 +5,31 @@
5
5
 
6
6
  require 'net/https'
7
7
  require 'cgi'
8
+
8
9
  module Rfm
9
- # These have been moved to rfm.rb.
10
- # SaxParser.default_class = CaseInsensitiveHash
11
- # SaxParser.template_prefix = File.join(File.dirname(__FILE__), './sax/')
12
- # SaxParser.templates.merge!({
13
- # :fmpxmllayout => 'fmpxmllayout.yml',
14
- # :fmresultset => 'fmresultset.yml',
15
- # :fmpxmlresult => 'fmpxmlresult.yml',
16
- # :none => nil
17
- # })
18
-
10
+ # These have been moved to rfm.rb.
11
+ # SaxParser.default_class = CaseInsensitiveHash
12
+ # SaxParser.template_prefix = File.join(File.dirname(__FILE__), './sax/')
13
+ # SaxParser.templates.merge!({
14
+ # :fmpxmllayout => 'fmpxmllayout.yml',
15
+ # :fmresultset => 'fmresultset.yml',
16
+ # :fmpxmlresult => 'fmpxmlresult.yml',
17
+ # :none => nil
18
+ # })
19
+
19
20
  class Connection
20
- include Config
21
-
22
- def initialize(action, params, request_options={}, *args)
23
- config *args
24
-
21
+ include Config
22
+
23
+ def initialize(action, params, request_options={}, *args)
24
+ config(*args)
25
+
25
26
  # Action sent to FMS
26
27
  @action = action
27
28
  # Query params sent to FMS
28
29
  @params = params
29
30
  # Additional options sent to FMS
30
31
  @request_options = request_options
31
-
32
+
32
33
  @defaults = {
33
34
  :host => 'localhost',
34
35
  #:port => 80,
@@ -49,66 +50,73 @@ module Rfm
49
50
  :template => :fmresultset,
50
51
  :grammar => 'fmresultset'
51
52
  } #.merge(options)
52
-
53
53
  end
54
54
 
55
55
  def state(*args)
56
- @defaults.merge(super(*args))
56
+ @defaults.merge(super(*args))
57
+ end
58
+
59
+ def host_name
60
+ state[:host]
61
+ end
62
+
63
+ def scheme
64
+ state[:ssl] ? "https" : "http"
65
+ end
66
+
67
+ def port
68
+ state[:ssl] && state[:port].nil? ? 443 : state[:port]
57
69
  end
58
-
59
- def host_name; state[:host]; end
60
- def scheme; state[:ssl] ? "https" : "http"; end
61
- def port; state[:ssl] && state[:port].nil? ? 443 : state[:port]; end
62
70
 
63
71
  def connect(action=@action, params=@params, request_options = @request_options, account_name=state[:account_name], password=state[:password])
64
- grammar_option = request_options.delete(:grammar)
72
+ grammar_option = request_options.delete(:grammar)
65
73
  post = params.merge(expand_options(request_options)).merge({action => ''})
66
74
  grammar = select_grammar(post, :grammar=>grammar_option)
67
75
  http_fetch(host_name, port, "/fmi/xml/#{grammar}.xml", account_name, password, post)
68
76
  end
69
77
 
70
78
  def select_grammar(post, options={})
71
- grammar = state(options)[:grammar] || 'fmresultset'
72
- if grammar.to_s.downcase == 'auto'
73
- # TODO: Build grammar parser in new sax engine templates to handle FMPXMLRESULT.
74
- return "fmresultset"
75
- post.keys.find(){|k| %w(-find -findall -dbnames -layoutnames -scriptnames).include? k.to_s} ? "FMPXMLRESULT" : "fmresultset"
76
- else
77
- grammar
78
- end
79
+ grammar = state(options)[:grammar] || 'fmresultset'
80
+ if grammar.to_s.downcase == 'auto'
81
+ # TODO: Build grammar parser in new sax engine templates to handle FMPXMLRESULT.
82
+ return "fmresultset"
83
+ # post.keys.find(){|k| %w(-find -findall -dbnames -layoutnames -scriptnames).include? k.to_s} ? "FMPXMLRESULT" : "fmresultset"
84
+ else
85
+ grammar
86
+ end
79
87
  end
80
-
88
+
81
89
  def parse(template=nil, initial_object=nil, parser=nil, options={})
82
- template ||= state[:template]
83
- #(template = 'fmresultset.yml') unless template
84
- #(template = File.join(File.dirname(__FILE__), '../sax/', template)) if template.is_a? String
85
- Rfm::SaxParser.parse(connect.body, template, initial_object, parser, state(*options)).result
90
+ template ||= state[:template]
91
+ #(template = 'fmresultset.yml') unless template
92
+ #(template = File.join(File.dirname(__FILE__), '../sax/', template)) if template.is_a? String
93
+ Rfm::SaxParser.parse(connect.body, template, initial_object, parser, state(*options)).result
86
94
  end
87
95
 
88
96
 
89
97
 
90
98
 
91
- private
92
-
99
+ private
100
+
93
101
  def http_fetch(host_name, port, path, account_name, password, post_data, limit=10)
94
102
  raise Rfm::CommunicationError.new("While trying to reach the Web Publishing Engine, RFM was redirected too many times.") if limit == 0
95
-
103
+
96
104
  if state[:log_actions] == true
97
105
  #qs = post_data.collect{|key,val| "#{CGI::escape(key.to_s)}=#{CGI::escape(val.to_s)}"}.join("&")
98
106
  qs_unescaped = post_data.collect{|key,val| "#{key.to_s}=#{val.to_s}"}.join("&")
99
107
  #warn "#{@scheme}://#{@host_name}:#{@port}#{path}?#{qs}"
100
108
  log.info "#{scheme}://#{host_name}:#{port}#{path}?#{qs_unescaped}"
101
109
  end
102
-
110
+
103
111
  request = Net::HTTP::Post.new(path)
104
112
  request.basic_auth(account_name, password)
105
113
  request.set_form_data(post_data)
106
-
107
- if state[:proxy]
108
- connection = Net::HTTP::Proxy(*state[:proxy]).new(host_name, port)
109
- else
110
- connection = Net::HTTP.new(host_name, port)
111
- end
114
+
115
+ if state[:proxy]
116
+ connection = Net::HTTP::Proxy(*state[:proxy]).new(host_name, port)
117
+ else
118
+ connection = Net::HTTP.new(host_name, port)
119
+ end
112
120
  #ADDED LONG TIMEOUT TIMOTHY TING 05/12/2011
113
121
  connection.open_timeout = connection.read_timeout = state[:timeout]
114
122
  if state[:ssl]
@@ -120,20 +128,20 @@ module Rfm
120
128
  connection.verify_mode = OpenSSL::SSL::VERIFY_NONE
121
129
  end
122
130
  end
123
-
131
+
124
132
  response = connection.start { |http| http.request(request) }
125
133
  if state[:log_responses] == true
126
134
  response.to_hash.each { |key, value| log.info "#{key}: #{value}" }
127
135
  log.info response.body
128
136
  end
129
-
137
+
130
138
  case response
131
139
  when Net::HTTPSuccess
132
140
  response
133
141
  when Net::HTTPRedirection
134
142
  if state[:warn_on_redirect]
135
143
  log.warn "The web server redirected to " + response['location'] +
136
- ". You should revise your connection hostname or fix your server configuration if possible to improve performance."
144
+ ". You should revise your connection hostname or fix your server configuration if possible to improve performance."
137
145
  end
138
146
  newloc = URI.parse(response['location'])
139
147
  http_fetch(newloc.host, newloc.port, newloc.request_uri, account_name, password, post_data, limit - 1)
@@ -148,18 +156,18 @@ module Rfm
148
156
  raise Rfm::CommunicationError.new(msg)
149
157
  end
150
158
  end
151
-
159
+
152
160
  def expand_options(options)
153
161
  result = {}
154
162
  field_mapping = options.delete(:field_mapping) || {}
155
163
  options.each do |key,value|
156
164
  case key.to_sym
157
165
  when :max_portal_rows
158
- result['-relatedsets.max'] = value
159
- result['-relatedsets.filter'] = 'layout'
166
+ result['-relatedsets.max'] = value
167
+ result['-relatedsets.filter'] = 'layout'
160
168
  when :ignore_portals
161
- result['-relatedsets.max'] = 0
162
- result['-relatedsets.filter'] = 'layout'
169
+ result['-relatedsets.max'] = 0
170
+ result['-relatedsets.filter'] = 'layout'
163
171
  when :max_records
164
172
  result['-max'] = value
165
173
  when :skip_records
@@ -211,8 +219,8 @@ module Rfm
211
219
  end
212
220
  return result
213
221
  end
214
-
222
+
215
223
  end # Connection
216
224
 
217
-
218
- end # Rfm
225
+
226
+ end # Rfm
@@ -1,140 +1,140 @@
1
1
  require 'forwardable'
2
2
 
3
3
  Module.module_eval do
4
- # Adds ability to forward methods to other objects using 'def_delegator'
5
- include Forwardable
4
+ # Adds ability to forward methods to other objects using 'def_delegator'
5
+ include Forwardable
6
6
  end
7
7
 
8
8
  class Object
9
9
 
10
- #extend Forwardable
10
+ #extend Forwardable
11
11
 
12
- # Adds methods to put instance variables in rfm_metaclass, plus getter/setters
13
- # This is useful to hide instance variables in objects that would otherwise show "too much" information.
12
+ # Adds methods to put instance variables in rfm_metaclass, plus getter/setters
13
+ # This is useful to hide instance variables in objects that would otherwise show "too much" information.
14
14
  def self.meta_attr_accessor(*names)
15
- meta_attr_reader(*names)
16
- meta_attr_writer(*names)
15
+ meta_attr_reader(*names)
16
+ meta_attr_writer(*names)
17
17
  end
18
-
18
+
19
19
  def self.meta_attr_reader(*names)
20
20
  names.each do |n|
21
21
  define_method(n.to_s) {rfm_metaclass.instance_variable_get("@#{n}")}
22
22
  end
23
23
  end
24
-
24
+
25
25
  def self.meta_attr_writer(*names)
26
26
  names.each do |n|
27
27
  define_method(n.to_s + "=") {|val| rfm_metaclass.instance_variable_set("@#{n}", val)}
28
28
  end
29
29
  end
30
-
30
+
31
31
  # Wrap an object in Array, if not already an Array,
32
- # since XmlMini doesn't know which will be returnd for any particular element.
33
- # See Rfm Layout & Record where this is used.
34
- def rfm_force_array
35
- return [] if self.nil?
36
- self.is_a?(Array) ? self : [self]
37
- end
38
-
39
- # Just testing this functionality
40
- def rfm_local_methods
41
- self.methods - self.class.superclass.methods
42
- end
43
-
44
- private
45
-
46
- # Like singleton_method or 'metaclass' from ActiveSupport.
47
- def rfm_metaclass
48
- class << self
49
- self
50
- end
51
- end
52
-
32
+ # since XmlMini doesn't know which will be returnd for any particular element.
33
+ # See Rfm Layout & Record where this is used.
34
+ def rfm_force_array
35
+ return [] if self.nil?
36
+ self.is_a?(Array) ? self : [self]
37
+ end
38
+
39
+ # Just testing this functionality
40
+ def rfm_local_methods
41
+ self.methods - self.class.superclass.methods
42
+ end
43
+
44
+ private
45
+
46
+ # Like singleton_method or 'metaclass' from ActiveSupport.
47
+ def rfm_metaclass
48
+ class << self
49
+ self
50
+ end
51
+ end
52
+
53
53
  # Get the superclass object of self.
54
54
  def rfm_super
55
55
  SuperProxy.new(self)
56
56
  end
57
-
57
+
58
58
  end # Object
59
59
 
60
60
 
61
61
  class Array
62
- # Taken from ActiveSupport extract_options!.
63
- def rfm_extract_options!
64
- last.is_a?(::Hash) ? pop : {}
65
- end
66
-
67
- # These methods allow dynamic extension of array members with other modules.
68
- # These methods also carry the @root object for reference, when you don't have the
69
- # root object explicity referenced anywhere.
70
- #
71
- # These methods might slow down array traversal, as
72
- # they add interpreted code to methods that were otherwise pure C.
62
+ # Taken from ActiveSupport extract_options!.
63
+ def rfm_extract_options!
64
+ last.is_a?(::Hash) ? pop : {}
65
+ end
66
+
67
+ # These methods allow dynamic extension of array members with other modules.
68
+ # These methods also carry the @root object for reference, when you don't have the
69
+ # root object explicity referenced anywhere.
70
+ #
71
+ # These methods might slow down array traversal, as
72
+ # they add interpreted code to methods that were otherwise pure C.
73
73
  def rfm_extend_members(klass, caller=nil)
74
- @parent = caller
74
+ @parent = caller
75
75
  @root = caller.instance_variable_get(:@root)
76
- @member_extension = klass
77
- self.instance_eval do
78
- class << self
79
- attr_accessor :parent
80
-
81
- alias_method 'old_reader', '[]'
82
- def [](*args)
83
- member = old_reader(*args)
76
+ @member_extension = klass
77
+ self.instance_eval do
78
+ class << self
79
+ attr_accessor :parent
80
+
81
+ alias_method 'old_reader', '[]'
82
+ def [](*args)
83
+ member = old_reader(*args)
84
84
  rfm_extend_member(member, @member_extension, args[0]) if args[0].is_a? Integer
85
- member
86
- end
87
-
88
- alias_method 'old_each', 'each'
89
- def each
90
- i = -1
91
- old_each do |member|
92
- i = i + 1
93
- rfm_extend_member(member, @member_extension, i)
94
- yield(member)
95
- end
96
- end
97
- end
98
- end unless defined? old_reader
99
- self
100
- end
101
-
85
+ member
86
+ end
87
+
88
+ alias_method 'old_each', 'each'
89
+ def each
90
+ i = -1
91
+ old_each do |member|
92
+ i = i + 1
93
+ rfm_extend_member(member, @member_extension, i)
94
+ yield(member)
95
+ end
96
+ end
97
+ end
98
+ end unless defined? old_reader
99
+ self
100
+ end
101
+
102
102
  def rfm_extend_member(member, extension, i=nil)
103
- if member and extension
104
- unless member.instance_variable_get(:@root)
105
- member.instance_variable_set(:@root, @root)
106
- member.instance_variable_set(:@parent, self)
107
- member.instance_variable_set(:@index, i)
108
- member.instance_eval(){def root; @root; end}
109
- member.instance_eval(){def parent; @parent; end}
110
- member.instance_eval(){def get_index; @index; end}
111
- end
112
- member.extend(extension)
113
- end
103
+ if member and extension
104
+ unless member.instance_variable_get(:@root)
105
+ member.instance_variable_set(:@root, @root)
106
+ member.instance_variable_set(:@parent, self)
107
+ member.instance_variable_set(:@index, i)
108
+ member.instance_eval(){def root; @root; end}
109
+ member.instance_eval(){def parent; @parent; end}
110
+ member.instance_eval(){def get_index; @index; end}
111
+ end
112
+ member.extend(extension)
113
+ end
114
114
  end
115
115
 
116
116
  end # Array
117
117
 
118
118
  class Hash
119
- # TODO: Possibly deprecated, delete if not used.
120
- def rfm_only(*keepers)
121
- self.dup.each_key {|k| self.delete(k) if !keepers.include?(k)}
122
- end
123
-
124
- def rfm_filter(*args)
125
- options = args.rfm_extract_options!
126
- delete = options[:delete]
127
- self.dup.each_key do |k|
128
- self.delete(k) if (delete ? args.include?(k) : !args.include?(k))
129
- end
130
- end
131
-
132
- # Convert hash to Rfm::CaseInsensitiveHash
133
- def to_cih
134
- new = Rfm::CaseInsensitiveHash.new
135
- self.each{|k,v| new[k] = v}
136
- new
137
- end
119
+ # TODO: Possibly deprecated, delete if not used.
120
+ def rfm_only(*keepers)
121
+ self.dup.each_key {|k| self.delete(k) if !keepers.include?(k)}
122
+ end
123
+
124
+ def rfm_filter(*args)
125
+ options = args.rfm_extract_options!
126
+ delete = options[:delete]
127
+ self.dup.each_key do |k|
128
+ self.delete(k) if (delete ? args.include?(k) : !args.include?(k))
129
+ end
130
+ end
131
+
132
+ # Convert hash to Rfm::CaseInsensitiveHash
133
+ def to_cih
134
+ new = Rfm::CaseInsensitiveHash.new
135
+ self.each{|k,v| new[k] = v}
136
+ new
137
+ end
138
138
  end # Hash
139
139
 
140
140
  # Allows access to superclass object
@@ -150,27 +150,22 @@ end # SuperProxy
150
150
 
151
151
 
152
152
  class Time
153
- # Returns array of [date,time] in format suitable for FMP.
154
- def to_fm_components(reset_time_if_before_today=false)
155
- d = self.strftime('%m/%d/%Y')
156
- t = if (Date.parse(self.to_s) < Date.today) and reset_time_if_before_today==true
157
- "00:00:00"
158
- else
159
- self.strftime('%T')
160
- end
161
- [d,t]
162
- end
153
+ # Returns array of [date,time] in format suitable for FMP.
154
+ def to_fm_components(reset_time_if_before_today=false)
155
+ d = self.strftime('%m/%d/%Y')
156
+ t = if (Date.parse(self.to_s) < Date.today) and reset_time_if_before_today==true
157
+ "00:00:00"
158
+ else
159
+ self.strftime('%T')
160
+ end
161
+ [d,t]
162
+ end
163
163
  end # Time
164
164
 
165
165
  class String
166
- def title_case
167
- self.gsub(/\w+/) do |word|
168
- word.capitalize
169
- end
170
- end
166
+ def title_case
167
+ self.gsub(/\w+/) do |word|
168
+ word.capitalize
169
+ end
170
+ end
171
171
  end # String
172
-
173
-
174
-
175
-
176
-