Orbjson 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/orbjson +81 -81
- data/dep/required/ruby-json/ruby-json-1.1.1.gem +0 -0
- data/lib/orbjson.rb +250 -250
- metadata +2 -2
data/bin/orbjson
CHANGED
@@ -1,81 +1,81 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'orbjson'
|
4
|
-
require 'ftools'
|
5
|
-
|
6
|
-
SKEL_DIR = File.join( Orbjson::LibPath, 'skeleton')
|
7
|
-
|
8
|
-
|
9
|
-
def usage
|
10
|
-
puts <<-USAGE
|
11
|
-
|
12
|
-
NAME
|
13
|
-
orbjson - creates a new Orbjson application
|
14
|
-
|
15
|
-
SYNOPSIS
|
16
|
-
orbjson create-cgi [full path]
|
17
|
-
orbjson create-webrick [full path]
|
18
|
-
|
19
|
-
DESCRIPTION
|
20
|
-
This will create some basic files to get you started fleshing out
|
21
|
-
your Orbjson server application.
|
22
|
-
|
23
|
-
create-cgi creates a simple Ruby file to execute a CGI call and process
|
24
|
-
JSON-RPC calls
|
25
|
-
|
26
|
-
create-webrick creates a Ruby WEBrick server script and servlet to
|
27
|
-
process JSON-RPC calls
|
28
|
-
|
29
|
-
|
30
|
-
EXAMPLE
|
31
|
-
|
32
|
-
orbjson create-cgi ~/my-orbjson-project
|
33
|
-
|
34
|
-
This will generate a new Orbjson CGI application in the ~/my-orbjson-project
|
35
|
-
folder.
|
36
|
-
USAGE
|
37
|
-
exit 1
|
38
|
-
end
|
39
|
-
|
40
|
-
|
41
|
-
def run
|
42
|
-
case command = ARGV[0] || usage()
|
43
|
-
when 'create-cgi'
|
44
|
-
path = ARGV[1] || usage()
|
45
|
-
path = File.expand_path(path)
|
46
|
-
|
47
|
-
if File.exists?(path)
|
48
|
-
STDERR.puts "ERROR: Path #{ path } already exists! Aborting!"
|
49
|
-
exit 1
|
50
|
-
end
|
51
|
-
|
52
|
-
src = File.join(SKEL_DIR, 'cgi')
|
53
|
-
File.makedirs path
|
54
|
-
File.makedirs File.join(path, 'script')
|
55
|
-
File.copy File.join( src, 'json-rpc.rb' ), path, true
|
56
|
-
File.copy File.join( SKEL_DIR, 'script', 'jsonrpc.js' ), File.join( path, 'script'), true
|
57
|
-
|
58
|
-
when 'create-webrick'
|
59
|
-
path = ARGV[1] || usage()
|
60
|
-
path = File.expand_path(path)
|
61
|
-
|
62
|
-
if File.exists?(path)
|
63
|
-
STDERR.puts "ERROR: Path #{ path } already exists! Aborting!"
|
64
|
-
exit 1
|
65
|
-
end
|
66
|
-
|
67
|
-
src = File.join(SKEL_DIR, 'webrick')
|
68
|
-
File.makedirs path
|
69
|
-
File.makedirs File.join(path, 'script')
|
70
|
-
File.copy File.join( src, 'server.rb' ), path, true
|
71
|
-
File.copy File.join( src, 'config.yml' ), path, true
|
72
|
-
File.copy File.join( SKEL_DIR, 'script', 'jsonrpc.js' ), File.join( path, 'script'), true
|
73
|
-
else
|
74
|
-
usage()
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
run
|
79
|
-
|
80
|
-
# This script is based on Michael Neumann's Wee creator script.
|
81
|
-
# Nice work, Mike!
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'orbjson'
|
4
|
+
require 'ftools'
|
5
|
+
|
6
|
+
SKEL_DIR = File.join( Orbjson::LibPath, 'skeleton')
|
7
|
+
|
8
|
+
|
9
|
+
def usage
|
10
|
+
puts <<-USAGE
|
11
|
+
|
12
|
+
NAME
|
13
|
+
orbjson - creates a new Orbjson application
|
14
|
+
|
15
|
+
SYNOPSIS
|
16
|
+
orbjson create-cgi [full path]
|
17
|
+
orbjson create-webrick [full path]
|
18
|
+
|
19
|
+
DESCRIPTION
|
20
|
+
This will create some basic files to get you started fleshing out
|
21
|
+
your Orbjson server application.
|
22
|
+
|
23
|
+
create-cgi creates a simple Ruby file to execute a CGI call and process
|
24
|
+
JSON-RPC calls
|
25
|
+
|
26
|
+
create-webrick creates a Ruby WEBrick server script and servlet to
|
27
|
+
process JSON-RPC calls
|
28
|
+
|
29
|
+
|
30
|
+
EXAMPLE
|
31
|
+
|
32
|
+
orbjson create-cgi ~/my-orbjson-project
|
33
|
+
|
34
|
+
This will generate a new Orbjson CGI application in the ~/my-orbjson-project
|
35
|
+
folder.
|
36
|
+
USAGE
|
37
|
+
exit 1
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
def run
|
42
|
+
case command = ARGV[0] || usage()
|
43
|
+
when 'create-cgi'
|
44
|
+
path = ARGV[1] || usage()
|
45
|
+
path = File.expand_path(path)
|
46
|
+
|
47
|
+
if File.exists?(path)
|
48
|
+
STDERR.puts "ERROR: Path #{ path } already exists! Aborting!"
|
49
|
+
exit 1
|
50
|
+
end
|
51
|
+
|
52
|
+
src = File.join(SKEL_DIR, 'cgi')
|
53
|
+
File.makedirs path
|
54
|
+
File.makedirs File.join(path, 'script')
|
55
|
+
File.copy File.join( src, 'json-rpc.rb' ), path, true
|
56
|
+
File.copy File.join( SKEL_DIR, 'script', 'jsonrpc.js' ), File.join( path, 'script'), true
|
57
|
+
|
58
|
+
when 'create-webrick'
|
59
|
+
path = ARGV[1] || usage()
|
60
|
+
path = File.expand_path(path)
|
61
|
+
|
62
|
+
if File.exists?(path)
|
63
|
+
STDERR.puts "ERROR: Path #{ path } already exists! Aborting!"
|
64
|
+
exit 1
|
65
|
+
end
|
66
|
+
|
67
|
+
src = File.join(SKEL_DIR, 'webrick')
|
68
|
+
File.makedirs path
|
69
|
+
File.makedirs File.join(path, 'script')
|
70
|
+
File.copy File.join( src, 'server.rb' ), path, true
|
71
|
+
File.copy File.join( src, 'config.yml' ), path, true
|
72
|
+
File.copy File.join( SKEL_DIR, 'script', 'jsonrpc.js' ), File.join( path, 'script'), true
|
73
|
+
else
|
74
|
+
usage()
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
run
|
79
|
+
|
80
|
+
# This script is based on Michael Neumann's Wee creator script.
|
81
|
+
# Nice work, Mike!
|
Binary file
|
data/lib/orbjson.rb
CHANGED
@@ -1,250 +1,250 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'logger'
|
3
|
-
require 'json/objects'
|
4
|
-
require 'json/lexer'
|
5
|
-
require 'yaml'
|
6
|
-
require 'needle'
|
7
|
-
require 'webrick'
|
8
|
-
|
9
|
-
class CGI
|
10
|
-
def raw_post
|
11
|
-
self.params.keys[0]
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
include WEBrick
|
16
|
-
|
17
|
-
def new_from_name( classname, *args)
|
18
|
-
cname = String.new( classname.untaint )
|
19
|
-
obj = nil
|
20
|
-
begin
|
21
|
-
obj = Object.const_get( cname ).new( *args )
|
22
|
-
rescue Exception
|
23
|
-
begin
|
24
|
-
require cname
|
25
|
-
obj = Object.const_get( cname ).new( *args )
|
26
|
-
rescue Exception
|
27
|
-
raise "Cannot create object #{cname}: #{$!}" unless obj
|
28
|
-
end
|
29
|
-
end
|
30
|
-
obj
|
31
|
-
end
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
module Orbjson
|
37
|
-
|
38
|
-
$roy_logger = Logger.new( "Orbjson.log" )
|
39
|
-
$roy_logger.level = Logger::DEBUG
|
40
|
-
|
41
|
-
Version = "0.1.1"
|
42
|
-
LibPath = File.dirname(__FILE__)
|
43
|
-
|
44
|
-
class System
|
45
|
-
@@registry = Needle::Registry.new()
|
46
|
-
|
47
|
-
def self.get_object( klass, *args )
|
48
|
-
return @@registry[ klass.intern ]
|
49
|
-
end
|
50
|
-
|
51
|
-
def self.put_object( klass, instance )
|
52
|
-
@@registry.register( klass ) { instance }
|
53
|
-
# @@cache[ klass ] = instance
|
54
|
-
end
|
55
|
-
|
56
|
-
def self.registered_classses
|
57
|
-
@@registry.keys.map{ |k| k.to_s.capitalize }
|
58
|
-
end
|
59
|
-
|
60
|
-
def listMethods
|
61
|
-
System.list_methods
|
62
|
-
end
|
63
|
-
|
64
|
-
def self.list_methods
|
65
|
-
mlist = []
|
66
|
-
|
67
|
-
System.registered_classses.each do |cls|
|
68
|
-
name = cls.to_s.downcase
|
69
|
-
begin
|
70
|
-
klass = eval(cls )
|
71
|
-
( klass.public_instance_methods -
|
72
|
-
Object.methods ).sort.each { |m|
|
73
|
-
mlist << "#{name}.#{m}"
|
74
|
-
}
|
75
|
-
rescue Exception
|
76
|
-
STDERR.puts( "System#list_methods error #{$!}" )
|
77
|
-
$roy_logger.error( "System#list_methods error #{$!}" )
|
78
|
-
end
|
79
|
-
end
|
80
|
-
mlist
|
81
|
-
end
|
82
|
-
|
83
|
-
|
84
|
-
# You configure the services list by passing in either a hash of file
|
85
|
-
# paths mapped to class names, or a YMAL string encoding the same, or
|
86
|
-
# the path to YAML file
|
87
|
-
def self.init( cfg, flush = true )
|
88
|
-
|
89
|
-
@@registry = Needle::Registry.new() if flush
|
90
|
-
STDERR.puts( "cfg starts as #{cfg}")
|
91
|
-
case cfg.class.to_s
|
92
|
-
when 'String'
|
93
|
-
if cfg =~ /^file:\/\//
|
94
|
-
cfg.gsub!( /^file:\/\//, '' )
|
95
|
-
STDERR.puts( "cfg is now #{cfg}")
|
96
|
-
config_hash = YAML::load( File.open( cfg ) )
|
97
|
-
else
|
98
|
-
STDERR.puts( "cfg is #{cfg}")
|
99
|
-
config_hash = YAML::load( cfg )
|
100
|
-
end
|
101
|
-
when 'Hash'
|
102
|
-
config_hash = cfg
|
103
|
-
else
|
104
|
-
raise "init was given unusable configuration data [ #{cfg.class}]: #{$!}"
|
105
|
-
end
|
106
|
-
|
107
|
-
config_hash.each do |src_file, class_list|
|
108
|
-
require src_file
|
109
|
-
class_list.each do |klass|
|
110
|
-
@@registry.register( klass ) { new_from_name( klass ) }
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
@@registry.register( :System ) { System.new }
|
115
|
-
@@registry.register( :system ) { System.new }
|
116
|
-
$roy_logger.debug( "Regist now has \n" + @@registry.keys.inspect )
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
module Common
|
121
|
-
def format_repsonse( result, error, id )
|
122
|
-
id.class == String ? quote = '"' : quote = ''
|
123
|
-
'{ "result" : ' + result.to_json + ', "error":"' +
|
124
|
-
error.to_s + '", "id": ' + quote + id.to_s +
|
125
|
-
quote + ' }'
|
126
|
-
end
|
127
|
-
|
128
|
-
def process( json )
|
129
|
-
json = "#{json}"
|
130
|
-
null=nil;
|
131
|
-
jsonobj = {}.from_json( JSON::Lexer.new(json ) )
|
132
|
-
klass, method = jsonobj[ 'method'].split( '.' )
|
133
|
-
$roy_logger.debug( "klass, method = #{klass}, #{method}" )
|
134
|
-
receiver = System.get_object( klass.capitalize )
|
135
|
-
begin
|
136
|
-
if ( jsonobj[ 'params'] && jsonobj[ 'params'] != 'nil' )
|
137
|
-
$roy_logger.debug( __LINE__ )
|
138
|
-
if jsonobj[ 'params'].size < 1
|
139
|
-
$roy_logger.debug( __LINE__ )
|
140
|
-
result = receiver.send( method )
|
141
|
-
else
|
142
|
-
$roy_logger.debug( __LINE__ )
|
143
|
-
result = receiver.send( method , *jsonobj[ 'params'] )
|
144
|
-
end
|
145
|
-
else
|
146
|
-
$roy_logger.debug( __LINE__ )
|
147
|
-
result = receiver.send( method )
|
148
|
-
end
|
149
|
-
error = null
|
150
|
-
rescue
|
151
|
-
result = null
|
152
|
-
error = $!.to_s
|
153
|
-
$roy_logger.error( "#{_LINE__}: #{$!}" )
|
154
|
-
end
|
155
|
-
format_repsonse( result, error, jsonobj['id'] || 'default' )
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
|
160
|
-
# Manages json-rpc requests sent as a post to a WEBrick servlet.
|
161
|
-
# Mount a path to WEBrick_JSON_RPC, and you should be set
|
162
|
-
class WEBrick_JSON_RPC < HTTPServlet::AbstractServlet
|
163
|
-
|
164
|
-
include Common
|
165
|
-
|
166
|
-
def process_request( req, res, json )
|
167
|
-
res.body = process( json )
|
168
|
-
res['Content-Type'] = "text/javascript"
|
169
|
-
end
|
170
|
-
|
171
|
-
# Delegates the call to process_request
|
172
|
-
def do_GET( request, response )
|
173
|
-
process_request( request, response, request.query_string )
|
174
|
-
end
|
175
|
-
|
176
|
-
# Delegates the call to process_request
|
177
|
-
def do_POST( request, response )
|
178
|
-
process_request( request, response, request.body )
|
179
|
-
end
|
180
|
-
|
181
|
-
|
182
|
-
end
|
183
|
-
|
184
|
-
|
185
|
-
# Manages json-rpc requests sent as a raw post to a CGI application.
|
186
|
-
class CGI_JSON_RPC
|
187
|
-
|
188
|
-
include Common
|
189
|
-
|
190
|
-
def initialize( cfg )
|
191
|
-
System.init( cfg )
|
192
|
-
end
|
193
|
-
|
194
|
-
def process_request( )
|
195
|
-
cgi = CGI.new
|
196
|
-
json = cgi.raw_post
|
197
|
-
process( json )
|
198
|
-
end
|
199
|
-
|
200
|
-
end
|
201
|
-
end
|
202
|
-
|
203
|
-
#
|
204
|
-
#
|
205
|
-
# TODO See specs at http://www.json-rpc.org/specs.xhtml
|
206
|
-
# 1.3 notification
|
207
|
-
# A notification is a special request which does not have a response.
|
208
|
-
# The notification is a single object serialized using JSON.
|
209
|
-
# It has the same properties as the request object with one exception.
|
210
|
-
#
|
211
|
-
# * id
|
212
|
-
# Muste be null.
|
213
|
-
#
|
214
|
-
# 2.2 JSON-RPC over HTTP
|
215
|
-
# With some limitations HTTP can be used for communicating to a service.
|
216
|
-
# A client may send one or more requests to a service.
|
217
|
-
# The requests must be sent as an HTTP POST containing all serialized request objects.
|
218
|
-
# The reply must contain the serialized response objects for all requests.
|
219
|
-
# Notifications may be sent by the client or the service.
|
220
|
-
#
|
221
|
-
# A non valid request must result in closing the connection.
|
222
|
-
# A non valid responses must raise an exception for all unanswered requests on the client.
|
223
|
-
# Closing a connection must raise an exception for all unanswered requests on the client.
|
224
|
-
#
|
225
|
-
# 3. JSON Class hinting?
|
226
|
-
# There are only simple data types defined in JSON.
|
227
|
-
# To overcome this problem in a JSON compatible way a special property for objects is introduced.
|
228
|
-
# {"jsonclass":["constructor", [param1, ], "prop1": ...}
|
229
|
-
# The object is then instanciated using the constructor passing the parameters.
|
230
|
-
# Once constructed the properties will be applied.
|
231
|
-
|
232
|
-
|
233
|
-
# Copyright (C) 2005 James Britt & Neurogami LLC
|
234
|
-
# Big thanks to Florian Franks for his ruby-json lib, and Jamis Buck for
|
235
|
-
# Needle
|
236
|
-
#
|
237
|
-
# This program is free software; you can redistribute it and/or
|
238
|
-
# modify it under the terms of the GNU General Public License,
|
239
|
-
# version 2, as published by the Free Software Foundation.
|
240
|
-
#
|
241
|
-
# This program is distributed in the hope that it will be
|
242
|
-
# useful, but WITHOUT ANY WARRANTY; without even the implied
|
243
|
-
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
244
|
-
# PURPOSE. See the GNU General Public License for more details.
|
245
|
-
#
|
246
|
-
# You should have received a copy of the GNU General Public
|
247
|
-
# License along with this program; if not, write to the Free
|
248
|
-
# Software Foundation, Inc., 59 Temple Place, Suite 330,
|
249
|
-
# Boston, MA 02111-1307 USA.
|
250
|
-
|
1
|
+
require 'rubygems'
|
2
|
+
require 'logger'
|
3
|
+
require 'json/objects'
|
4
|
+
require 'json/lexer'
|
5
|
+
require 'yaml'
|
6
|
+
require 'needle'
|
7
|
+
require 'webrick'
|
8
|
+
|
9
|
+
class CGI
|
10
|
+
def raw_post
|
11
|
+
self.params.keys[0]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
include WEBrick
|
16
|
+
|
17
|
+
def new_from_name( classname, *args)
|
18
|
+
cname = String.new( classname.untaint )
|
19
|
+
obj = nil
|
20
|
+
begin
|
21
|
+
obj = Object.const_get( cname ).new( *args )
|
22
|
+
rescue Exception
|
23
|
+
begin
|
24
|
+
require cname
|
25
|
+
obj = Object.const_get( cname ).new( *args )
|
26
|
+
rescue Exception
|
27
|
+
raise "Cannot create object #{cname}: #{$!}" unless obj
|
28
|
+
end
|
29
|
+
end
|
30
|
+
obj
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
module Orbjson
|
37
|
+
|
38
|
+
$roy_logger = Logger.new( "Orbjson.log" )
|
39
|
+
$roy_logger.level = Logger::DEBUG
|
40
|
+
|
41
|
+
Version = "0.1.1"
|
42
|
+
LibPath = File.dirname(__FILE__)
|
43
|
+
|
44
|
+
class System
|
45
|
+
@@registry = Needle::Registry.new()
|
46
|
+
|
47
|
+
def self.get_object( klass, *args )
|
48
|
+
return @@registry[ klass.intern ]
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.put_object( klass, instance )
|
52
|
+
@@registry.register( klass ) { instance }
|
53
|
+
# @@cache[ klass ] = instance
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.registered_classses
|
57
|
+
@@registry.keys.map{ |k| k.to_s.capitalize }
|
58
|
+
end
|
59
|
+
|
60
|
+
def listMethods
|
61
|
+
System.list_methods
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.list_methods
|
65
|
+
mlist = []
|
66
|
+
|
67
|
+
System.registered_classses.each do |cls|
|
68
|
+
name = cls.to_s.downcase
|
69
|
+
begin
|
70
|
+
klass = eval(cls )
|
71
|
+
( klass.public_instance_methods -
|
72
|
+
Object.methods ).sort.each { |m|
|
73
|
+
mlist << "#{name}.#{m}"
|
74
|
+
}
|
75
|
+
rescue Exception
|
76
|
+
STDERR.puts( "System#list_methods error #{$!}" )
|
77
|
+
$roy_logger.error( "System#list_methods error #{$!}" )
|
78
|
+
end
|
79
|
+
end
|
80
|
+
mlist
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
# You configure the services list by passing in either a hash of file
|
85
|
+
# paths mapped to class names, or a YMAL string encoding the same, or
|
86
|
+
# the path to YAML file
|
87
|
+
def self.init( cfg, flush = true )
|
88
|
+
|
89
|
+
@@registry = Needle::Registry.new() if flush
|
90
|
+
STDERR.puts( "cfg starts as #{cfg}")
|
91
|
+
case cfg.class.to_s
|
92
|
+
when 'String'
|
93
|
+
if cfg =~ /^file:\/\//
|
94
|
+
cfg.gsub!( /^file:\/\//, '' )
|
95
|
+
STDERR.puts( "cfg is now #{cfg}")
|
96
|
+
config_hash = YAML::load( File.open( cfg ) )
|
97
|
+
else
|
98
|
+
STDERR.puts( "cfg is #{cfg}")
|
99
|
+
config_hash = YAML::load( cfg )
|
100
|
+
end
|
101
|
+
when 'Hash'
|
102
|
+
config_hash = cfg
|
103
|
+
else
|
104
|
+
raise "init was given unusable configuration data [ #{cfg.class}]: #{$!}"
|
105
|
+
end
|
106
|
+
|
107
|
+
config_hash.each do |src_file, class_list|
|
108
|
+
require src_file
|
109
|
+
class_list.each do |klass|
|
110
|
+
@@registry.register( klass ) { new_from_name( klass ) }
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
@@registry.register( :System ) { System.new }
|
115
|
+
@@registry.register( :system ) { System.new }
|
116
|
+
$roy_logger.debug( "Regist now has \n" + @@registry.keys.inspect )
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
module Common
|
121
|
+
def format_repsonse( result, error, id )
|
122
|
+
id.class == String ? quote = '"' : quote = ''
|
123
|
+
'{ "result" : ' + result.to_json + ', "error":"' +
|
124
|
+
error.to_s + '", "id": ' + quote + id.to_s +
|
125
|
+
quote + ' }'
|
126
|
+
end
|
127
|
+
|
128
|
+
def process( json )
|
129
|
+
json = "#{json}"
|
130
|
+
null=nil;
|
131
|
+
jsonobj = {}.from_json( JSON::Lexer.new(json ) )
|
132
|
+
klass, method = jsonobj[ 'method'].split( '.' )
|
133
|
+
$roy_logger.debug( "klass, method = #{klass}, #{method}" )
|
134
|
+
receiver = System.get_object( klass.capitalize )
|
135
|
+
begin
|
136
|
+
if ( jsonobj[ 'params'] && jsonobj[ 'params'] != 'nil' )
|
137
|
+
$roy_logger.debug( __LINE__ )
|
138
|
+
if jsonobj[ 'params'].size < 1
|
139
|
+
$roy_logger.debug( __LINE__ )
|
140
|
+
result = receiver.send( method )
|
141
|
+
else
|
142
|
+
$roy_logger.debug( __LINE__ )
|
143
|
+
result = receiver.send( method , *jsonobj[ 'params'] )
|
144
|
+
end
|
145
|
+
else
|
146
|
+
$roy_logger.debug( __LINE__ )
|
147
|
+
result = receiver.send( method )
|
148
|
+
end
|
149
|
+
error = null
|
150
|
+
rescue
|
151
|
+
result = null
|
152
|
+
error = $!.to_s
|
153
|
+
$roy_logger.error( "#{_LINE__}: #{$!}" )
|
154
|
+
end
|
155
|
+
format_repsonse( result, error, jsonobj['id'] || 'default' )
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
|
160
|
+
# Manages json-rpc requests sent as a post to a WEBrick servlet.
|
161
|
+
# Mount a path to WEBrick_JSON_RPC, and you should be set
|
162
|
+
class WEBrick_JSON_RPC < HTTPServlet::AbstractServlet
|
163
|
+
|
164
|
+
include Common
|
165
|
+
|
166
|
+
def process_request( req, res, json )
|
167
|
+
res.body = process( json )
|
168
|
+
res['Content-Type'] = "text/javascript"
|
169
|
+
end
|
170
|
+
|
171
|
+
# Delegates the call to process_request
|
172
|
+
def do_GET( request, response )
|
173
|
+
process_request( request, response, request.query_string )
|
174
|
+
end
|
175
|
+
|
176
|
+
# Delegates the call to process_request
|
177
|
+
def do_POST( request, response )
|
178
|
+
process_request( request, response, request.body )
|
179
|
+
end
|
180
|
+
|
181
|
+
|
182
|
+
end
|
183
|
+
|
184
|
+
|
185
|
+
# Manages json-rpc requests sent as a raw post to a CGI application.
|
186
|
+
class CGI_JSON_RPC
|
187
|
+
|
188
|
+
include Common
|
189
|
+
|
190
|
+
def initialize( cfg )
|
191
|
+
System.init( cfg )
|
192
|
+
end
|
193
|
+
|
194
|
+
def process_request( )
|
195
|
+
cgi = CGI.new
|
196
|
+
json = cgi.raw_post
|
197
|
+
process( json )
|
198
|
+
end
|
199
|
+
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
#
|
204
|
+
#
|
205
|
+
# TODO See specs at http://www.json-rpc.org/specs.xhtml
|
206
|
+
# 1.3 notification
|
207
|
+
# A notification is a special request which does not have a response.
|
208
|
+
# The notification is a single object serialized using JSON.
|
209
|
+
# It has the same properties as the request object with one exception.
|
210
|
+
#
|
211
|
+
# * id
|
212
|
+
# Muste be null.
|
213
|
+
#
|
214
|
+
# 2.2 JSON-RPC over HTTP
|
215
|
+
# With some limitations HTTP can be used for communicating to a service.
|
216
|
+
# A client may send one or more requests to a service.
|
217
|
+
# The requests must be sent as an HTTP POST containing all serialized request objects.
|
218
|
+
# The reply must contain the serialized response objects for all requests.
|
219
|
+
# Notifications may be sent by the client or the service.
|
220
|
+
#
|
221
|
+
# A non valid request must result in closing the connection.
|
222
|
+
# A non valid responses must raise an exception for all unanswered requests on the client.
|
223
|
+
# Closing a connection must raise an exception for all unanswered requests on the client.
|
224
|
+
#
|
225
|
+
# 3. JSON Class hinting?
|
226
|
+
# There are only simple data types defined in JSON.
|
227
|
+
# To overcome this problem in a JSON compatible way a special property for objects is introduced.
|
228
|
+
# {"jsonclass":["constructor", [param1, ], "prop1": ...}
|
229
|
+
# The object is then instanciated using the constructor passing the parameters.
|
230
|
+
# Once constructed the properties will be applied.
|
231
|
+
|
232
|
+
|
233
|
+
# Copyright (C) 2005 James Britt & Neurogami LLC
|
234
|
+
# Big thanks to Florian Franks for his ruby-json lib, and Jamis Buck for
|
235
|
+
# Needle
|
236
|
+
#
|
237
|
+
# This program is free software; you can redistribute it and/or
|
238
|
+
# modify it under the terms of the GNU General Public License,
|
239
|
+
# version 2, as published by the Free Software Foundation.
|
240
|
+
#
|
241
|
+
# This program is distributed in the hope that it will be
|
242
|
+
# useful, but WITHOUT ANY WARRANTY; without even the implied
|
243
|
+
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
244
|
+
# PURPOSE. See the GNU General Public License for more details.
|
245
|
+
#
|
246
|
+
# You should have received a copy of the GNU General Public
|
247
|
+
# License along with this program; if not, write to the Free
|
248
|
+
# Software Foundation, Inc., 59 Temple Place, Suite 330,
|
249
|
+
# Boston, MA 02111-1307 USA.
|
250
|
+
|
metadata
CHANGED
@@ -3,7 +3,7 @@ rubygems_version: 0.8.6
|
|
3
3
|
specification_version: 1
|
4
4
|
name: Orbjson
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
6
|
+
version: 0.0.2
|
7
7
|
date: 2005-02-27
|
8
8
|
summary: Lib for creating JSON-RPC server applications.
|
9
9
|
require_paths:
|
@@ -30,8 +30,8 @@ files:
|
|
30
30
|
- README
|
31
31
|
- docs/todo.txt
|
32
32
|
- bin/orbjson
|
33
|
-
- lib/orbjson.rb
|
34
33
|
- lib/skeleton
|
34
|
+
- lib/orbjson.rb
|
35
35
|
- lib/skeleton/cgi
|
36
36
|
- lib/skeleton/script
|
37
37
|
- lib/skeleton/webrick
|