DistelliServiceFrameworkRails 1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,148 @@
1
+ require 'distelli/serviceinterface'
2
+ require 'distelli/servicemarshallers'
3
+
4
+ module DistelliServiceFrameworkRails
5
+
6
+ $xml_marshaller = Distelli::XmlMarshaller.new
7
+ $json_marshaller = Distelli::JsonMarshaller.new
8
+
9
+ def get_request_id()
10
+ request_id = request.headers[Distelli::ServiceConstants::REQUEST_ID_HEADER]
11
+ if request_id != nil
12
+ return request_id
13
+ end
14
+ params = request.parameters
15
+ request_id = params[Distelli::ServiceConstants::REQUEST_ID_PARAM]
16
+ if request_id != nil
17
+ return request_id
18
+ end
19
+
20
+ # Create a new request id
21
+ request_id = SecureRandom.uuid
22
+ request.headers[Distelli::ServiceConstants::REQUEST_ID_HEADER] = request_id
23
+ return request_id
24
+ end
25
+
26
+ def get_response_type()
27
+ response_type = request.headers[Distelli::ServiceConstants::RESPONSE_TYPE_HEADER]
28
+ if response_type != nil
29
+ return validate_response_type(response_type)
30
+ end
31
+
32
+ response_type = nil
33
+ params = request.parameters
34
+ if params != nil
35
+ response_type = params[Distelli::ServiceConstants::RESPONSE_TYPE_PARAM]
36
+ end
37
+ return validate_response_type(response_type)
38
+ end
39
+
40
+ def get_operation()
41
+ # First check to see if there is the operation header.
42
+ # If there is then thats the operation
43
+ # If not then check to see if there is the operation query param
44
+ # If it is then thats the operation
45
+ # else the operation is null
46
+ op_name = request.headers[Distelli::ServiceConstants::OPERATION_HEADER]
47
+ if op_name != nil
48
+ return op_name
49
+ end
50
+
51
+ params = request.parameters
52
+ if params == nil
53
+ return nil
54
+ end
55
+ return params[Distelli::ServiceConstants::OPERATION_PARAM]
56
+ end
57
+
58
+ # def handle_stuff(status, content_type, body)
59
+ # response.status = status
60
+ # response.headers["Content-Type"] = content_type
61
+ # # render :inline => body, :status => status
62
+ # self.response_body = "DistelliSFR Body: "+body
63
+ # end
64
+
65
+ def validate_response_type(response_type)
66
+ if response_type == nil
67
+ return Distelli::ServiceConstants::RESPONSE_TYPE_JSON
68
+ end
69
+ if response_type == Distelli::ServiceConstants::RESPONSE_TYPE_JSON
70
+ return response_type
71
+ elsif response_type == Distelli::ServiceConstants::RESPONSE_TYPE_XML
72
+ return response_type
73
+ else
74
+ # LOGGER.error("Invalid response type: "+response_type+" Defaulting to "+ServiceConstants::RESPONSE_TYPE_JSON)
75
+ return Distelli::ServiceConstants::RESPONSE_TYPE_JSON
76
+ end
77
+ end
78
+
79
+ def unmarshall_request()
80
+ content_type = request.headers[Distelli::ServiceConstants::CONTENT_TYPE_HEADER]
81
+ if content_type == Distelli::ServiceConstants::CONTENT_TYPE_JSON
82
+ return $json_marshaller.unmarshall(request.body)
83
+ elsif content_type == Distelli::ServiceConstants::CONTENT_TYPE_XML
84
+ return $xml_marshaller.unmarshall(request.body)
85
+ else
86
+ return request.body
87
+ end
88
+ end
89
+
90
+ def marshall_response(svc_response, extra_headers=nil, http_code=nil)
91
+ response_type = get_response_type()
92
+ if http_code != nil
93
+ response.status = http_code
94
+ end
95
+
96
+ headers_hash = Hash.new
97
+ headers_hash[Distelli::ServiceConstants::SERVER_HEADER] = "DistelliWS"
98
+ headers_hash[Distelli::ServiceConstants::REQUEST_ID_HEADER] = get_request_id()
99
+
100
+ if extra_headers != nil
101
+ headers_hash.update(extra_headers)
102
+ end
103
+
104
+ if response_type == Distelli::ServiceConstants::RESPONSE_TYPE_JSON
105
+ headers_hash[Distelli::ServiceConstants::CONTENT_TYPE_HEADER] = Distelli::ServiceConstants::CONTENT_TYPE_JSON
106
+ response.headers.update(headers_hash)
107
+ self.response_body = $json_marshaller.marshall(svc_response)
108
+ elsif response_type == Distelli::ServiceConstants::RESPONSE_TYPE_XML
109
+ headers_hash[Distelli::ServiceConstants::CONTENT_TYPE_HEADER] = Distelli::ServiceConstants::CONTENT_TYPE_XML
110
+ response.headers.update(headers_hash)
111
+ self.response_body = $xml_marshaller.marshall(svc_response)
112
+ else
113
+ raise StandardError.new("Invalid Response type: "+response_type)
114
+ end
115
+ end
116
+
117
+ def marshall_error(error)
118
+ response_type = get_response_type()
119
+ if error.is_a?(Distelli::BaseException)
120
+ response.status = error.http_code
121
+ else
122
+ error = Distelli::ServerError.new("Cannot marshall error of type "+error.class.name+" Defaulting to ServerError")
123
+ response.status = error.http_code
124
+ end
125
+
126
+ headers_hash = Hash.new
127
+ headers_hash[Distelli::ServiceConstants::SERVER_HEADER] = "DistelliWS"
128
+ headers_hash[Distelli::ServiceConstants::REQUEST_ID_HEADER] = get_request_id()
129
+
130
+ if response_type == Distelli::ServiceConstants::RESPONSE_TYPE_JSON
131
+ headers_hash[Distelli::ServiceConstants::CONTENT_TYPE_HEADER] = Distelli::ServiceConstants::CONTENT_TYPE_JSON
132
+ response.headers.update(headers_hash)
133
+ self.response_body = $json_marshaller.marshall_error(error)
134
+ elsif response_type == Distelli::ServiceConstants::RESPONSE_TYPE_XML
135
+ headers_hash[Distelli::ServiceConstants::CONTENT_TYPE_HEADER] = Distelli::ServiceConstants::CONTENT_TYPE_JSON
136
+ response.headers.update(headers_hash)
137
+ self.response_body = $xml_marshaller.marshall_error(error)
138
+ else
139
+ LOGGER.error("Invalid Response Type: "+response_type)
140
+ error = ServerError.new("Invalid response type: "+response_type)
141
+ response.status = error.http_code
142
+ headers_hash[Distelli::ServiceConstants::CONTENT_TYPE_HEADER] = Distelli::ServiceConstants::CONTENT_TYPE_JSON
143
+ response.headers.update(headers_hash)
144
+ self.response_body = $json_marshaller.marshall_error(error)
145
+ end
146
+ end
147
+
148
+ end
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: DistelliServiceFrameworkRails
3
+ version: !ruby/object:Gem::Version
4
+ version: '1.0'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Rahul Singh
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-10-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: DistelliServiceInterface
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: Distelli Service Framework for Ruby on Rails based servers
47
+ email: rsingh@distelli.com
48
+ executables: []
49
+ extensions: []
50
+ extra_rdoc_files: []
51
+ files:
52
+ - lib/distelli/serviceframeworkrails.rb
53
+ homepage: http://www.distelli.com/
54
+ licenses: []
55
+ post_install_message:
56
+ rdoc_options: []
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ required_rubygems_version: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ requirements: []
72
+ rubyforge_project:
73
+ rubygems_version: 1.8.23
74
+ signing_key:
75
+ specification_version: 3
76
+ summary: Distelli Service Framework classes for Rails
77
+ test_files: []