p4b 0.0.1.pre11 → 0.0.1.pre18
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE +661 -0
- data/bin/p4b-bus +7 -0
- data/bin/p4b-db +3 -0
- data/bin/p4b-md +3 -0
- data/bin/p4b-web +2 -0
- data/bin/p4b-web-api +3 -0
- data/lib/p4b/bus.rb +73 -0
- data/lib/p4b/bus/implementation.rb +155 -0
- data/lib/p4b/bus/version.rb +9 -0
- data/lib/p4b/db.rb +1 -0
- data/lib/p4b/db/version.rb +9 -0
- data/lib/p4b/md.rb +1 -0
- data/lib/p4b/md/version.rb +9 -0
- data/lib/p4b/web.rb +1 -0
- data/lib/p4b/web/api.rb +1 -0
- data/lib/p4b/web/api/version.rb +9 -0
- data/lib/p4b/web/version.rb +9 -0
- data/share/p4b.css +1 -0
- data/share/p4b.html +20 -0
- data/share/p4b.js +286 -0
- metadata +30 -6
- data/LICENSE.LGPLv3 +0 -166
data/bin/p4b-bus
ADDED
data/bin/p4b-db
ADDED
data/bin/p4b-md
ADDED
data/bin/p4b-web
ADDED
data/bin/p4b-web-api
ADDED
data/lib/p4b/bus.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'drb'
|
4
|
+
|
5
|
+
require_relative 'bus/version'
|
6
|
+
|
7
|
+
# External interface for p4b-bus.
|
8
|
+
|
9
|
+
module P4B::Bus
|
10
|
+
|
11
|
+
class Service
|
12
|
+
|
13
|
+
include P4B::Error::Checking
|
14
|
+
|
15
|
+
# @param [DRbObject] srv
|
16
|
+
def initialize srv
|
17
|
+
_type DRbObject, srv
|
18
|
+
@server = srv
|
19
|
+
methods = srv.registered_methods
|
20
|
+
methods.each do |m|
|
21
|
+
define_singleton_method(m) { |*a, &b| @server.start(m, *a, &b).value }
|
22
|
+
pm = "start_#{m}".intern
|
23
|
+
define_singleton_method(pm) { |*a, &b| @server.start(m, *a, &b) }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# @see Object#send
|
28
|
+
# @param [Symbol] name
|
29
|
+
# @param [*Array<Object>] args
|
30
|
+
# @yield
|
31
|
+
def call name, *args, &block
|
32
|
+
_type Symbol, name
|
33
|
+
@server.start(name, *args, &block).value
|
34
|
+
end
|
35
|
+
|
36
|
+
# @param [Symbol] name
|
37
|
+
# @param [*Array<Object>] args
|
38
|
+
# @yield
|
39
|
+
# @return [DRbObject<Thread>]
|
40
|
+
def start name, *args, &block
|
41
|
+
_type Symbol, name
|
42
|
+
@server.start(name, *args, &block)
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
class << self
|
48
|
+
|
49
|
+
include P4B::Error::Checking
|
50
|
+
|
51
|
+
# @param [String] uri
|
52
|
+
# @param [Hash] opts
|
53
|
+
# @return [DRbObject]
|
54
|
+
def connect uri, opts = {}
|
55
|
+
_type String, uri
|
56
|
+
_type Hash, opts
|
57
|
+
DRb.start_service nil, nil, opts
|
58
|
+
@server = DRbObject.new nil, uri
|
59
|
+
end
|
60
|
+
|
61
|
+
# @param [Symbol] name
|
62
|
+
# @return [Service]
|
63
|
+
def get name
|
64
|
+
_type Symbol, name
|
65
|
+
@services ||= {}
|
66
|
+
@services[name] ||= Service.new(@server.get(name))
|
67
|
+
end
|
68
|
+
|
69
|
+
alias :[] :get
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'drb'
|
4
|
+
require 'drctrl'
|
5
|
+
|
6
|
+
require 'p4b'
|
7
|
+
|
8
|
+
require_relative 'version'
|
9
|
+
|
10
|
+
# Use in p4b-bus internal.
|
11
|
+
|
12
|
+
module P4B::Bus::Implementation
|
13
|
+
|
14
|
+
class Service
|
15
|
+
|
16
|
+
include DRbUndumped
|
17
|
+
include P4B::Error::Checking
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
@mutex = Mutex.new
|
21
|
+
@ids = 0
|
22
|
+
@objects = {}
|
23
|
+
@queue = []
|
24
|
+
@registered_methods = []
|
25
|
+
end
|
26
|
+
|
27
|
+
attr_reader :registered_methods
|
28
|
+
|
29
|
+
# @param [Object] object
|
30
|
+
# @param [*Array<Symbol>] methods
|
31
|
+
# @return [Fixnum]
|
32
|
+
def add_instance object, *methods
|
33
|
+
_type DRbObject, object
|
34
|
+
_type Symbol, *methods
|
35
|
+
@mutex.synchronize do
|
36
|
+
id = @ids += 1
|
37
|
+
@objects[id] = object
|
38
|
+
@queue.push id
|
39
|
+
@registered_methods.concat methods.compact
|
40
|
+
@registered_methods.uniq!
|
41
|
+
id
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# @param [Fixnum] id
|
46
|
+
# @return [Object, nil]
|
47
|
+
def remove_instance id
|
48
|
+
_type Fixnum, id
|
49
|
+
@mutex.synchronize do
|
50
|
+
value = @objects.delete id
|
51
|
+
@queue.delete id
|
52
|
+
value
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# @return [Boolean]
|
57
|
+
def empty?
|
58
|
+
@mutex.synchronize { @objects.empty? }
|
59
|
+
end
|
60
|
+
|
61
|
+
# @param [Symbol] method
|
62
|
+
# @param [*Array<Object>] args
|
63
|
+
# @yield
|
64
|
+
# @return [Thread]
|
65
|
+
def start method, *args, &block
|
66
|
+
_type Symbol, method
|
67
|
+
Thread.start method, args, block, &method(:do_call)
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
# @param [Symbol] method
|
73
|
+
# @param [Array<Object>] args
|
74
|
+
# @param [Proc] block
|
75
|
+
# @return [Object]
|
76
|
+
def do_call method, args, block
|
77
|
+
if empty?
|
78
|
+
# TODO: Error
|
79
|
+
end
|
80
|
+
sleep 1.0 until (id = @mutex.synchronize { @queue.shift })
|
81
|
+
obj = @mutex.synchronize { @objects[id] }
|
82
|
+
result = obj.send method, *args, &block
|
83
|
+
@mutex.synchronize { @queue.push(id) }
|
84
|
+
result
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
class << self
|
90
|
+
|
91
|
+
include DRbUndumped
|
92
|
+
include P4B::Error::Checking
|
93
|
+
|
94
|
+
# @param [Symbol] name
|
95
|
+
# @param [Object] object
|
96
|
+
# @param [*Array<Symbol>] methods
|
97
|
+
# @return [Fixnum]
|
98
|
+
def register name, object, *methods
|
99
|
+
_type Symbol, name
|
100
|
+
_type DRbObject, object
|
101
|
+
_type Symbol, *methods
|
102
|
+
@mutex ||= Mutex.new
|
103
|
+
@mutex.synchronize do
|
104
|
+
@services ||= {}
|
105
|
+
@services[nm] ||= Service.new
|
106
|
+
@services[nm].add_instance object, *methods
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
# @param [Symbol] name
|
111
|
+
# @param [Fixnum] id
|
112
|
+
# @return [Object]
|
113
|
+
def unregister name, id
|
114
|
+
_type Symbol, name
|
115
|
+
_type Fixnum, id
|
116
|
+
@mutex ||= Mutex.new
|
117
|
+
@mutex.synchronize do
|
118
|
+
@services ||= {}
|
119
|
+
@services[nm] ||= Service.new
|
120
|
+
@services[nm].remove_instance id
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
# @param [Symbol] name
|
125
|
+
# @return [Service]
|
126
|
+
def get name
|
127
|
+
_type Symbol, name
|
128
|
+
@mutex ||= Mutex.new
|
129
|
+
@mutex.synchronize do
|
130
|
+
@services ||= {}
|
131
|
+
@services[nm] ||= Service.new
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
alias :[] :get
|
136
|
+
|
137
|
+
# @param [String] uri
|
138
|
+
# @param [Hash] opts
|
139
|
+
# @return [DRbServer]
|
140
|
+
def start_service uri, opts = {}
|
141
|
+
_type String, uri
|
142
|
+
_type Hash, opts
|
143
|
+
DRCtrl.start_service
|
144
|
+
DRb.start_service uri, self, opts
|
145
|
+
end
|
146
|
+
|
147
|
+
# @return [void]
|
148
|
+
def wait
|
149
|
+
DRCtrl.wait
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
|
data/lib/p4b/db.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
|
data/lib/p4b/md.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
|
data/lib/p4b/web.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
|
data/lib/p4b/web/api.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
|
data/share/p4b.css
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
|
data/share/p4b.html
ADDED
data/share/p4b.js
ADDED
@@ -0,0 +1,286 @@
|
|
1
|
+
/* encoding: utf-8 */
|
2
|
+
|
3
|
+
var P4B = {};
|
4
|
+
|
5
|
+
window.P4B_SESSION = 0;
|
6
|
+
|
7
|
+
function init() {
|
8
|
+
|
9
|
+
function $method(func) {
|
10
|
+
return {
|
11
|
+
value: func,
|
12
|
+
writable: false,
|
13
|
+
enumerable: true,
|
14
|
+
configurable: false
|
15
|
+
};
|
16
|
+
};
|
17
|
+
function $hidden_method(func) {
|
18
|
+
return {
|
19
|
+
value: func,
|
20
|
+
writable: false,
|
21
|
+
enumerable: false,
|
22
|
+
configurable: false
|
23
|
+
};
|
24
|
+
}
|
25
|
+
function $methods_desc() {
|
26
|
+
var result = {};
|
27
|
+
for (var i = 0, l = arguments.length; i < l; i++) {
|
28
|
+
var func = arguments[i];
|
29
|
+
result[func.name] = $method(func);
|
30
|
+
}
|
31
|
+
return result;
|
32
|
+
}
|
33
|
+
function $hidden_methods_desc() {
|
34
|
+
var result = {};
|
35
|
+
for (var i = 0, l = arguments.length; i < l; i++) {
|
36
|
+
var func = arguments[i];
|
37
|
+
result[func.name] = $hidden_method(func);
|
38
|
+
}
|
39
|
+
return result;
|
40
|
+
}
|
41
|
+
|
42
|
+
function $property_desc(name, rw) {
|
43
|
+
var result = {};
|
44
|
+
var _name = '_' + name;
|
45
|
+
result[_name] = {
|
46
|
+
value: null,
|
47
|
+
writable: true,
|
48
|
+
enumerable: false,
|
49
|
+
configurable: false
|
50
|
+
};
|
51
|
+
var getter = function() { return this[_name]; };
|
52
|
+
var setter;
|
53
|
+
if (rw) {
|
54
|
+
setter = function(val) {
|
55
|
+
this[_name] = val;
|
56
|
+
if (this.modify) {
|
57
|
+
this.modify();
|
58
|
+
}
|
59
|
+
};
|
60
|
+
}
|
61
|
+
result[name] = {
|
62
|
+
get: getter,
|
63
|
+
set: setter,
|
64
|
+
enumerable: true,
|
65
|
+
configurable: false
|
66
|
+
}
|
67
|
+
return result;
|
68
|
+
}
|
69
|
+
function $rw_desc() {
|
70
|
+
var result = {};
|
71
|
+
for (var i = 0, l = arguments.length; i < l; i++) {
|
72
|
+
var name = arguments[i];
|
73
|
+
var _name = '_' + name;
|
74
|
+
var desc = $property_desc(name, true);
|
75
|
+
result[name] = desc[name];
|
76
|
+
result[_name] = desc[_name];
|
77
|
+
}
|
78
|
+
return result;
|
79
|
+
}
|
80
|
+
function $ro_desc() {
|
81
|
+
var result = {};
|
82
|
+
for (var i = 0, l = arguments.length; i < l; i++) {
|
83
|
+
var name = arguments[i];
|
84
|
+
var _name = '_' + name;
|
85
|
+
var desc = $property_desc(name, false);
|
86
|
+
result[name] = desc[name];
|
87
|
+
result[_name] = desc[_name];
|
88
|
+
}
|
89
|
+
return result;
|
90
|
+
}
|
91
|
+
|
92
|
+
Object.defineProperties(
|
93
|
+
Object.prototype,
|
94
|
+
{
|
95
|
+
$add_methods: $hidden_method(function $add_methods() {
|
96
|
+
Object.defineProperties(
|
97
|
+
this,
|
98
|
+
$methods_desc.apply(this, arguments)
|
99
|
+
);
|
100
|
+
}),
|
101
|
+
$add_hidden_methods: $hidden_method(function $add_hidden_methods() {
|
102
|
+
Object.defineProperties(
|
103
|
+
this,
|
104
|
+
$hidden_methods_desc.apply(this, arguments)
|
105
|
+
);
|
106
|
+
}),
|
107
|
+
$add_rw_properties: $hidden_method(function $add_rw_properties() {
|
108
|
+
Object.defineProperties(
|
109
|
+
this,
|
110
|
+
$rw_desc.apply(this, arguments)
|
111
|
+
);
|
112
|
+
}),
|
113
|
+
$add_ro_properties: $hidden_method(function $add_ro_properties() {
|
114
|
+
Object.defineProperties(
|
115
|
+
this,
|
116
|
+
$ro_desc.apply(this, arguments)
|
117
|
+
);
|
118
|
+
})
|
119
|
+
}
|
120
|
+
);
|
121
|
+
|
122
|
+
Function.prototype.$add_hidden_methods(function $inherit(ancestor) {
|
123
|
+
Object.defineProperty(
|
124
|
+
this,
|
125
|
+
'prototype',
|
126
|
+
{
|
127
|
+
writable: false,
|
128
|
+
enumerable: false,
|
129
|
+
configurable: false,
|
130
|
+
value: Object.create(ancestor.prototype, {
|
131
|
+
constructor: $hidden_method(this)
|
132
|
+
})
|
133
|
+
}
|
134
|
+
);
|
135
|
+
});
|
136
|
+
|
137
|
+
function lead(s, len) {
|
138
|
+
var res = s.toString();
|
139
|
+
while (res.length < len) {
|
140
|
+
res = '0' + res;
|
141
|
+
}
|
142
|
+
return res;
|
143
|
+
}
|
144
|
+
|
145
|
+
function user_id() {
|
146
|
+
return '00000000'; // placeholder, TODO!
|
147
|
+
}
|
148
|
+
|
149
|
+
function date_id() {
|
150
|
+
var now = new Date();
|
151
|
+
return [
|
152
|
+
lead(now.getUTCFullYear(), 4),
|
153
|
+
lead(now.getUTCMonth(), 2) + lead(now.getUTCDate(), 2),
|
154
|
+
lead(now.getUTCHours(), 2) + lead(now.getUTCMinutes(), 2)
|
155
|
+
].join('-');
|
156
|
+
}
|
157
|
+
|
158
|
+
var _seed = null;
|
159
|
+
function seed_id() {
|
160
|
+
if (!_seed) {
|
161
|
+
_seed = lead(Math.floor(Math.random() * 0x10000).toString(16), 4);
|
162
|
+
}
|
163
|
+
return _seed;
|
164
|
+
}
|
165
|
+
|
166
|
+
function date_uid (date) {
|
167
|
+
return lead(date.getUTCFullYear(), 4) + '-' +
|
168
|
+
lead(date.getUTCMonth(), 2) + lead(date.getUTCDate(), 2) + '-' +
|
169
|
+
lead(date.getUTCHours(), 2) + lead(date.getUTCMinutes(), 2);
|
170
|
+
}
|
171
|
+
|
172
|
+
var _guid = 0;
|
173
|
+
function guid() {
|
174
|
+
return [
|
175
|
+
user_id(),
|
176
|
+
date_id(),
|
177
|
+
seed_id() + lead((++_guid).toString(), 8)
|
178
|
+
].join('-');
|
179
|
+
}
|
180
|
+
|
181
|
+
function $guid(obj, data) {
|
182
|
+
var value = data['id'];
|
183
|
+
if (!value) {
|
184
|
+
obj._modified = true;
|
185
|
+
value = guid();
|
186
|
+
}
|
187
|
+
Object.defineProperty(
|
188
|
+
obj,
|
189
|
+
'guid',
|
190
|
+
{
|
191
|
+
writable: false,
|
192
|
+
enumerable: true,
|
193
|
+
configurable: false,
|
194
|
+
value: value
|
195
|
+
}
|
196
|
+
);
|
197
|
+
}
|
198
|
+
|
199
|
+
var _luid = 0;
|
200
|
+
function luid() {
|
201
|
+
return ++_luid;
|
202
|
+
}
|
203
|
+
|
204
|
+
function $luid(obj) {
|
205
|
+
Object.defineProperty(
|
206
|
+
obj,
|
207
|
+
'luid',
|
208
|
+
{
|
209
|
+
writable: false,
|
210
|
+
enumerable: true,
|
211
|
+
configurable: false,
|
212
|
+
value: luid()
|
213
|
+
}
|
214
|
+
);
|
215
|
+
}
|
216
|
+
|
217
|
+
var _list = {
|
218
|
+
guid: {},
|
219
|
+
luid: {}
|
220
|
+
};
|
221
|
+
function $list(obj) {
|
222
|
+
_list.guid[obj.guid] = obj;
|
223
|
+
_list.luid[obj.luid] = obj;
|
224
|
+
}
|
225
|
+
function $find(value) {
|
226
|
+
result = {
|
227
|
+
object: null,
|
228
|
+
guid: null,
|
229
|
+
luid: null
|
230
|
+
}
|
231
|
+
if (value instanceof Data) {
|
232
|
+
result.object = value;
|
233
|
+
result.guid = result.object.guid;
|
234
|
+
result.luid = result.object.luid;
|
235
|
+
} else if (typeof(value) === 'number') {
|
236
|
+
result = $find(_list.luid[value]);
|
237
|
+
} else if (typeof(value) === 'string') {
|
238
|
+
result = $find(_list.guid[value]);
|
239
|
+
}
|
240
|
+
return result;
|
241
|
+
}
|
242
|
+
|
243
|
+
function Data(data) {
|
244
|
+
data = data || {};
|
245
|
+
this._modified = false;
|
246
|
+
$guid(this, data);
|
247
|
+
$luid(this);
|
248
|
+
$list(this);
|
249
|
+
//
|
250
|
+
}
|
251
|
+
Data.$inherit(Object);
|
252
|
+
Data.prototype.$add_ro_properties('modified');
|
253
|
+
Data.prototype.$add_methods(function modify() { this._modified = true; });
|
254
|
+
|
255
|
+
function Item(data) {
|
256
|
+
Data.call(this, data);
|
257
|
+
//
|
258
|
+
}
|
259
|
+
Item.$inherit(Data);
|
260
|
+
|
261
|
+
function Group(data) {
|
262
|
+
Item.call(this, data);
|
263
|
+
//
|
264
|
+
}
|
265
|
+
Group.$inherit(Item);
|
266
|
+
|
267
|
+
function Element(data) {
|
268
|
+
Item.call(this, data);
|
269
|
+
//
|
270
|
+
}
|
271
|
+
Element.$inherit(Item);
|
272
|
+
|
273
|
+
P4B.$add_methods(Data, Item, Group, Element);
|
274
|
+
|
275
|
+
console.log(P4B);
|
276
|
+
e = new Element();
|
277
|
+
console.log(e);
|
278
|
+
console.log(e instanceof Data);
|
279
|
+
console.log(guid());
|
280
|
+
console.log(guid());
|
281
|
+
console.log(luid());
|
282
|
+
console.log(document.cookie);
|
283
|
+
|
284
|
+
}
|
285
|
+
|
286
|
+
|