rsence 2.0.0.6.pre → 2.0.0.7.pre

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,300 +6,305 @@
6
6
  # with this software package. If not, contact licensing@riassence.com
7
7
  ##
8
8
 
9
- ## = Abstract
10
- ## The Plugin class is the base class for extending server logic.
11
- ## A single Plugin instance serves the requests of all sessions,
12
- ## which makes them very cpu and memory efficient compared to systems,
13
- ## where the server classes are constructed and destructed for each
14
- ## request.
15
- ##
16
- ## Plugins are designed to be contained in a plugin directory bundle and
17
- ## to be loaded by the +PluginManager+, which is also responsible for
18
- ## delegating the events and other calls throughout the system.
19
- ##
20
- ## == Anatomy of a plugin bundle
21
- ## The plugin bundle contains all data needed to run the plugin. Design
22
- ## your plugin without any hard-coded paths, remember that it's intended
23
- ## to be deployed by "dropping" the whole plugin into one of the server's
24
- ## plugins directories.
25
- ##
26
- ## The +PluginManager+ looks for such bundles and evaluates them into an
27
- ## anonymous +Module+ namespace. The content of the ruby source file
28
- ## is then responsible for including its libraries, constructing an
29
- ## instance of itself and registering itself as a part of the system.
30
- ##
31
- ## It's advised to use the +GUIPlugin+ class for plugins that handle
32
- ## user interfaces. Usage of the +Plugin+ bundle is advised to use
33
- ## for plugins that provide extra functionality, value responders
34
- ## and other utilities that supplement the user interface.
35
- ##
36
- ## You must call the +#register+ method after the class is constructed.
37
- ## Otherwise, the class is not connected to the system and just discarded
38
- ## and then garbage collected.
39
- ##
40
- ## == Messages
41
- ## As a side effect of having single instances of plugins serve the requests
42
- ## of all sessions, the request/response/session messaging is implemented
43
- ## as messaging objects. These objects contain or delegate all the necessary
44
- ## hooks required by the complete request/response cycle.
45
- ##
46
- ## The naming convention of the +Message+ instance is +msg+ and it's
47
- ## given as the first parameter of methods needing it.
48
- ##
49
- ## Use +msg.ses_id+ to identify the session's serial number and +msg.user_id+
50
- ## to identify the user's identity.
51
- ##
52
- ## Use the +msg.session+ +Hash+ to store any persistent data
53
- ## associated with the user's session, preferably using the name of the
54
- ## plugin or its registered name as the primary key entry in the Hash.
55
- ## The session data is persistent; it's stored in the session database
56
- ## by +SessionStorage+ automatically.
57
- ##
58
- ## The +msg+ instance also provides access to the +Request+ and +Response+
59
- ## objects as +msg.request+ and +msg.response+, respectively.
60
- ##
61
- ## Use the +msg.run+ method to call other plugins.
62
- ##
63
- ## To append js source code to be evaluated in the client, use the +msg.reply+
64
- ## call. The +msg.console+ call appends messages to the browser's js console.
65
- ##
66
- ##
67
- ## == Session -related event methods
68
- ## The +#get_ses+ method returns (or creates and returns) the entry in
69
- ## the session based on the name your plugin is registered as. It's advised
70
- ## to use this call instead of manually managing +msg.session+ in most cases.
71
- ##
72
- ## The +#idle+ method is called each time a client performs a data
73
- ## synchronization or "idle poll" request.
74
- ##
75
- ## The +#init_ses+ method is called once in the same request a new session
76
- ## is created. A new session is created, when a user enters accesses the
77
- ## server the first time, or the first time after the previous session is
78
- ## expired.
79
- ##
80
- ## The +#init_ui+ method is called by the "main" plugin after the client has
81
- ## booted successfully. The +GUIPlugin+ class extends this method to
82
- ## automatically load and initialize the user interface from a data structure.
83
- ##
84
- ## The +#restore_ses+ method is called once in the same request an old
85
- ## session is restored. A session is restored, when the user returns to
86
- ## the page or reloads the page before the session is expired.
87
- ##
88
- ## === When the server is configured to restore previous sessions (default):
89
- ## If the user accesses the same page using the same browser (in different
90
- ## tabs or windows), only the most recently restored one is valid, while
91
- ## the previous ones are immediately invalidated.
92
- ## If your application is intended to support several sessions per browser,
93
- ## enable session cloning in the configuration file.
94
- ##
95
- ## === When the server is configured to restore and clone previous sessions:
96
- ## When sessions are cloned, the previous session is not invalidated and
97
- ## exists until timing out as a result of the web browser window being closed
98
- ## or client computer losing network connectivity for a certain (configurable)
99
- ## time frame.
100
- ##
101
- ## The +#cloned_target+ method is like +#restore_ses+, but called when
102
- ## the session is a clone of a previous session.
103
- ##
104
- ## The +#cloned_source+ method is called on the next request of the previous
105
- ## session after it has been cloned.
106
- ##
107
- ## == Server event methods
108
- ## Extend the +#init+ method to invoke constructor functionality that
109
- ## depends on the plugin to be constructed and registered as a part of
110
- ## the system.
111
- ##
112
- ## Extend the +#open+, +#flush+ and +#close+ methods to open, flush and close
113
- ## streams or other similar functionality.
114
- ##
115
- ## == Data handling
116
- ## The data exchange system exists to support bi-directional
117
- ## data synchronization between the browser and the plugin. The values
118
- ## are stored in the session as +HValue+ instances.
119
- ##
120
- ## Values support Hashes, Arrays, Strings, Numbers, Booleans and
121
- ## combinations of them. The data is automatically converted between
122
- ## ruby objects (server) and json objects (client).
123
- ##
124
- ## Each instance may be bound to plugin methods that are used as
125
- ## value change notification responders.
126
- ##
127
- ## When a method is bound to the value, the method is called as an
128
- ## event notification whenever the client has changed the value and
129
- ## synchronizes it to the server. The responders act as validators
130
- ## by default.
131
- ##
132
- ## Values are also bound in the client to classes implementing the
133
- ## HValueResponder interface, like any derivate of HControl. See the
134
- ## client documentation for instructions about using them.
135
- ##
136
- ## To define a value responder method, it needs to respond to exactly
137
- ## two parameters: the +Message+ instance +msg+ and the HValue object
138
- ## (in that order). The method's return value must be either +true+
139
- ## or +false+. When the method returns +false+, the change is discarded
140
- ## and the previously server-set value is sent back to the client.
141
- ##
142
- ## A minimal value responder method is defined like this:
143
- ##
144
- ## def my_value_responder( msg, my_value )
145
- ## return true
146
- ## end
147
- ##
148
- ## To access the content of the value, use the +HValue#data+ attribute.
149
- ##
150
- ## def int_between_100_and_200( msg, value )
151
- ## data = value.data.to_i
152
- ## return ( data >= 100 and data <= 200 )
153
- ## end
154
- ##
155
- ## To change the content of the value, use the +HValue#set+ method.
156
- ##
157
- ## def int_between_100_and_200( msg, value )
158
- ## data = value.data.to_i
159
- ## value.set( msg, 100 ) if data < 100
160
- ## value.set( msg, 200 ) if data > 200
161
- ## return true
162
- ## end
163
- ##
164
- ## == Defining values
165
- ## The simplest and recommended way of defining the values is to define
166
- ## the value configuration file +values.yaml+. Its configuration is then
167
- ## applied to sessions automatically.
168
- ##
169
- ##
170
- ## === Syntax reference of the contents of a +values.yaml+ file:
171
- ##
172
- ## # The name of the value (:value_name).
173
- ## # A hash key in the yaml syntax
174
- ## :value_name:
175
- ##
176
- ## # All of these keys are optional!
177
- ##
178
- ## # Default value, a string "Foo" here.
179
- ## # Defaults to 0
180
- ## :value: Foo
181
- ##
182
- ## # A plugin method to call to define the default value
183
- ## # instead of the one defined in :value
184
- ## :value_call:
185
- ## :plugin: plugin_name # defaults to the plugin where defined
186
- ##
187
- ## # Mandatory; name of the method to call
188
- ## :method: method_name
189
- ##
190
- ## # Optional, list of parameter values for the :method
191
- ## :args:
192
- ## # three parameters: 1, 'foo', 3
193
- ## - 1
194
- ## - foo
195
- ## - 3
196
- ##
197
- ## # When false, doesn't pass the msg as the first parameter.
198
- ## # Defaults to true
199
- ## :uses_msg: true
200
- ##
201
- ## # Restore the default, when the session is restored; defaults to false
202
- ## :restore_default: false
203
- ##
204
- ## # List of value responder methods to bind.
205
- ## :responders:
206
- ## -
207
- ## # name of plugin to call, defaults to the plugin where defined:
208
- ## :plugin: plugin_name
209
- ##
210
- ## # mandatory, name of the method to call
211
- ## :method: method_name
212
- ##
213
- ## # Another responder, this one using the same plugin where defined:
214
- ## - :method: another_method
215
- ##
216
- ## # Another value, this one just defining the defaults
217
- ## # by supplying an empty Hash:
218
- ## # (value: 0, default restored, no responders or calls)
219
- ## :value_with_defaults: {}
220
- ##
221
- ## # This value defines a Number (123) and doesn't restore
222
- ## # the default, when restoring the session.
223
- ## :one_two_three:
224
- ## :value: 123
225
- ## :restore_default: false
226
- ##
227
- ## # This value gets a random string and specifies a responder,
228
- ## # that ensures it's unique, if changed in the client.
229
- ## :random_unique_string:
230
- ## :value_call:
231
- ## :method: get_unique_random_string
232
- ## :uses_msg: false
233
- ## :responders:
234
- ## - :method: ensure_unique_random_string
235
- ##
236
- ## = Examples
237
- ## More examples are available in the repository;
238
- ## http://svn.rsence.org/contrib/plugins
239
- ## ..as well as the standard "main" plugin in the "plugins" directory.
240
- ##
241
- ##
242
- ## == A minimal Plugin bundle
243
- ## The minimal active plugin bundle (named "name_of_plugin")
244
- ## is defined like this:
245
- ##
246
- ## [dir] name_of_plugin
247
- ## |
248
- ## +---[file] name_of_plugin.rb
249
- ##
250
- ## This sample Plugin doesn't do anything except construct itself and
251
- ## respond as 'name_of_plugin'.
252
- ##
253
- ## Plugin.new.register('name_of_plugin')
254
- ##
255
- ## However, this is not very useful in itself, so you'll need to extend
256
- ## its functionality to do anything useful.
257
- ##
258
- ## == A simple Plugin extension
259
- ## This plugin logs session events to the logs/session_log file.
260
- ##
261
- ## [dir] ses_logger
262
- ## |
263
- ## +---[file] ses_logger.rb
264
- ## |
265
- ## +---[dir] logs
266
- ## |
267
- ## +---[file] session_log
268
- ##
269
- ## == Contents of "ses_logger.rb"
270
- ##
271
- ## class SessionLogger < Plugin
272
- ## def init
273
- ## super
274
- ## @logfile = false
275
- ## end
276
- ## def open
277
- ## log_path = compose_plugin_path( 'session_log', 'logs' )
278
- ## @logfile = File.open( log_path, 'a' )
279
- ## end
280
- ## def close
281
- ## @logfile.close if @logfile
282
- ## @logfile = false
283
- ## end
284
- ## def flush
285
- ## @logfile.flush if @logfile
286
- ## end
287
- ## def init_ses( msg )
288
- ## super
289
- ## @logfile.write( "#{Time.new} -- Session id #{msg.ses_id} was created.\n" )
290
- ## end
291
- ## def restore_ses( msg )
292
- ## super
293
- ## @logfile.write( "#{Time.new} -- Session id #{msg.ses_id} was restored.\n" )
294
- ## end
295
- ## def idle( msg )
296
- ## @logfile.write( "#{Time.new} -- Client of session id #{msg.ses_id} connected.\n" )
297
- ## end
298
- ## end
299
- ## SessionLogger.new.register( 'ses_logger' )
300
- ##
301
9
  module ::RSence
302
10
  module Plugins
11
+
12
+ ## = Abstract
13
+ ##
14
+ ## The PluginTemplate is used to create a Plugin mimic class in
15
+ ## Plugins.bundle_loader using the Plugins.PluginWrapper mimic.
16
+ ##
17
+ ## The Plugin class is the base class for extending server logic.
18
+ ## A single Plugin instance serves the requests of all sessions,
19
+ ## which makes them very cpu and memory efficient compared to systems,
20
+ ## where the server classes are constructed and destructed for each
21
+ ## request.
22
+ ##
23
+ ## Plugins are designed to be contained in a plugin directory bundle and
24
+ ## to be loaded by the +PluginManager+, which is also responsible for
25
+ ## delegating the events and other calls throughout the system.
26
+ ##
27
+ ## == Anatomy of a plugin bundle
28
+ ## The plugin bundle contains all data needed to run the plugin. Design
29
+ ## your plugin without any hard-coded paths, remember that it's intended
30
+ ## to be deployed by "dropping" the whole plugin into one of the server's
31
+ ## plugins directories.
32
+ ##
33
+ ## The +PluginManager+ looks for such bundles and evaluates them into an
34
+ ## anonymous +Module+ namespace. The content of the ruby source file
35
+ ## is then responsible for including its libraries, constructing an
36
+ ## instance of itself and registering itself as a part of the system.
37
+ ##
38
+ ## It's advised to use the +GUIPlugin+ class for plugins that handle
39
+ ## user interfaces. Usage of the +Plugin+ bundle is advised to use
40
+ ## for plugins that provide extra functionality, value responders
41
+ ## and other utilities that supplement the user interface.
42
+ ##
43
+ ## You must call the +#register+ method after the class is constructed.
44
+ ## Otherwise, the class is not connected to the system and just discarded
45
+ ## and then garbage collected.
46
+ ##
47
+ ## == Messages
48
+ ## As a side effect of having single instances of plugins serve the requests
49
+ ## of all sessions, the request/response/session messaging is implemented
50
+ ## as messaging objects. These objects contain or delegate all the necessary
51
+ ## hooks required by the complete request/response cycle.
52
+ ##
53
+ ## The naming convention of the +Message+ instance is +msg+ and it's
54
+ ## given as the first parameter of methods needing it.
55
+ ##
56
+ ## Use +msg.ses_id+ to identify the session's serial number and +msg.user_id+
57
+ ## to identify the user's identity.
58
+ ##
59
+ ## Use the +msg.session+ +Hash+ to store any persistent data
60
+ ## associated with the user's session, preferably using the name of the
61
+ ## plugin or its registered name as the primary key entry in the Hash.
62
+ ## The session data is persistent; it's stored in the session database
63
+ ## by +SessionStorage+ automatically.
64
+ ##
65
+ ## The +msg+ instance also provides access to the +Request+ and +Response+
66
+ ## objects as +msg.request+ and +msg.response+, respectively.
67
+ ##
68
+ ## Use the +msg.run+ method to call other plugins.
69
+ ##
70
+ ## To append js source code to be evaluated in the client, use the +msg.reply+
71
+ ## call. The +msg.console+ call appends messages to the browser's js console.
72
+ ##
73
+ ##
74
+ ## == Session -related event methods
75
+ ## The +#get_ses+ method returns (or creates and returns) the entry in
76
+ ## the session based on the name your plugin is registered as. It's advised
77
+ ## to use this call instead of manually managing +msg.session+ in most cases.
78
+ ##
79
+ ## The +#idle+ method is called each time a client performs a data
80
+ ## synchronization or "idle poll" request.
81
+ ##
82
+ ## The +#init_ses+ method is called once in the same request a new session
83
+ ## is created. A new session is created, when a user enters accesses the
84
+ ## server the first time, or the first time after the previous session is
85
+ ## expired.
86
+ ##
87
+ ## The +#init_ui+ method is called by the "main" plugin after the client has
88
+ ## booted successfully. The +GUIPlugin+ class extends this method to
89
+ ## automatically load and initialize the user interface from a data structure.
90
+ ##
91
+ ## The +#restore_ses+ method is called once in the same request an old
92
+ ## session is restored. A session is restored, when the user returns to
93
+ ## the page or reloads the page before the session is expired.
94
+ ##
95
+ ## === When the server is configured to restore previous sessions (default):
96
+ ## If the user accesses the same page using the same browser (in different
97
+ ## tabs or windows), only the most recently restored one is valid, while
98
+ ## the previous ones are immediately invalidated.
99
+ ## If your application is intended to support several sessions per browser,
100
+ ## enable session cloning in the configuration file.
101
+ ##
102
+ ## === When the server is configured to restore and clone previous sessions:
103
+ ## When sessions are cloned, the previous session is not invalidated and
104
+ ## exists until timing out as a result of the web browser window being closed
105
+ ## or client computer losing network connectivity for a certain (configurable)
106
+ ## time frame.
107
+ ##
108
+ ## The +#cloned_target+ method is like +#restore_ses+, but called when
109
+ ## the session is a clone of a previous session.
110
+ ##
111
+ ## The +#cloned_source+ method is called on the next request of the previous
112
+ ## session after it has been cloned.
113
+ ##
114
+ ## == Server event methods
115
+ ## Extend the +#init+ method to invoke constructor functionality that
116
+ ## depends on the plugin to be constructed and registered as a part of
117
+ ## the system.
118
+ ##
119
+ ## Extend the +#open+, +#flush+ and +#close+ methods to open, flush and close
120
+ ## streams or other similar functionality.
121
+ ##
122
+ ## == Data handling
123
+ ## The data exchange system exists to support bi-directional
124
+ ## data synchronization between the browser and the plugin. The values
125
+ ## are stored in the session as +HValue+ instances.
126
+ ##
127
+ ## Values support Hashes, Arrays, Strings, Numbers, Booleans and
128
+ ## combinations of them. The data is automatically converted between
129
+ ## ruby objects (server) and json objects (client).
130
+ ##
131
+ ## Each instance may be bound to plugin methods that are used as
132
+ ## value change notification responders.
133
+ ##
134
+ ## When a method is bound to the value, the method is called as an
135
+ ## event notification whenever the client has changed the value and
136
+ ## synchronizes it to the server. The responders act as validators
137
+ ## by default.
138
+ ##
139
+ ## Values are also bound in the client to classes implementing the
140
+ ## HValueResponder interface, like any derivate of HControl. See the
141
+ ## client documentation for instructions about using them.
142
+ ##
143
+ ## To define a value responder method, it needs to respond to exactly
144
+ ## two parameters: the +Message+ instance +msg+ and the HValue object
145
+ ## (in that order). The method's return value must be either +true+
146
+ ## or +false+. When the method returns +false+, the change is discarded
147
+ ## and the previously server-set value is sent back to the client.
148
+ ##
149
+ ## A minimal value responder method is defined like this:
150
+ ##
151
+ ## def my_value_responder( msg, my_value )
152
+ ## return true
153
+ ## end
154
+ ##
155
+ ## To access the content of the value, use the +HValue#data+ attribute.
156
+ ##
157
+ ## def int_between_100_and_200( msg, value )
158
+ ## data = value.data.to_i
159
+ ## return ( data >= 100 and data <= 200 )
160
+ ## end
161
+ ##
162
+ ## To change the content of the value, use the +HValue#set+ method.
163
+ ##
164
+ ## def int_between_100_and_200( msg, value )
165
+ ## data = value.data.to_i
166
+ ## value.set( msg, 100 ) if data < 100
167
+ ## value.set( msg, 200 ) if data > 200
168
+ ## return true
169
+ ## end
170
+ ##
171
+ ## == Defining values
172
+ ## The simplest and recommended way of defining the values is to define
173
+ ## the value configuration file +values.yaml+. Its configuration is then
174
+ ## applied to sessions automatically.
175
+ ##
176
+ ##
177
+ ## === Syntax reference of the contents of a +values.yaml+ file:
178
+ ##
179
+ ## # The name of the value (:value_name).
180
+ ## # A hash key in the yaml syntax
181
+ ## :value_name:
182
+ ##
183
+ ## # All of these keys are optional!
184
+ ##
185
+ ## # Default value, a string "Foo" here.
186
+ ## # Defaults to 0
187
+ ## :value: Foo
188
+ ##
189
+ ## # A plugin method to call to define the default value
190
+ ## # instead of the one defined in :value
191
+ ## :value_call:
192
+ ## :plugin: plugin_name # defaults to the plugin where defined
193
+ ##
194
+ ## # Mandatory; name of the method to call
195
+ ## :method: method_name
196
+ ##
197
+ ## # Optional, list of parameter values for the :method
198
+ ## :args:
199
+ ## # three parameters: 1, 'foo', 3
200
+ ## - 1
201
+ ## - foo
202
+ ## - 3
203
+ ##
204
+ ## # When false, doesn't pass the msg as the first parameter.
205
+ ## # Defaults to true
206
+ ## :uses_msg: true
207
+ ##
208
+ ## # Restore the default, when the session is restored; defaults to false
209
+ ## :restore_default: false
210
+ ##
211
+ ## # List of value responder methods to bind.
212
+ ## :responders:
213
+ ## -
214
+ ## # name of plugin to call, defaults to the plugin where defined:
215
+ ## :plugin: plugin_name
216
+ ##
217
+ ## # mandatory, name of the method to call
218
+ ## :method: method_name
219
+ ##
220
+ ## # Another responder, this one using the same plugin where defined:
221
+ ## - :method: another_method
222
+ ##
223
+ ## # Another value, this one just defining the defaults
224
+ ## # by supplying an empty Hash:
225
+ ## # (value: 0, default restored, no responders or calls)
226
+ ## :value_with_defaults: {}
227
+ ##
228
+ ## # This value defines a Number (123) and doesn't restore
229
+ ## # the default, when restoring the session.
230
+ ## :one_two_three:
231
+ ## :value: 123
232
+ ## :restore_default: false
233
+ ##
234
+ ## # This value gets a random string and specifies a responder,
235
+ ## # that ensures it's unique, if changed in the client.
236
+ ## :random_unique_string:
237
+ ## :value_call:
238
+ ## :method: get_unique_random_string
239
+ ## :uses_msg: false
240
+ ## :responders:
241
+ ## - :method: ensure_unique_random_string
242
+ ##
243
+ ## = Examples
244
+ ## More examples are available in the repository;
245
+ ## http://svn.rsence.org/contrib/plugins
246
+ ## ..as well as the standard "main" plugin in the "plugins" directory.
247
+ ##
248
+ ##
249
+ ## == A minimal Plugin bundle
250
+ ## The minimal active plugin bundle (named "name_of_plugin")
251
+ ## is defined like this:
252
+ ##
253
+ ## [dir] name_of_plugin
254
+ ## |
255
+ ## +---[file] name_of_plugin.rb
256
+ ##
257
+ ## This sample Plugin doesn't do anything except construct itself and
258
+ ## respond as 'name_of_plugin'.
259
+ ##
260
+ ## Plugin.new.register('name_of_plugin')
261
+ ##
262
+ ## However, this is not very useful in itself, so you'll need to extend
263
+ ## its functionality to do anything useful.
264
+ ##
265
+ ## == A simple Plugin extension
266
+ ## This plugin logs session events to the logs/session_log file.
267
+ ##
268
+ ## [dir] ses_logger
269
+ ## |
270
+ ## +---[file] ses_logger.rb
271
+ ## |
272
+ ## +---[dir] logs
273
+ ## |
274
+ ## +---[file] session_log
275
+ ##
276
+ ## == Contents of "ses_logger.rb"
277
+ ##
278
+ ## class SessionLogger < Plugin
279
+ ## def init
280
+ ## super
281
+ ## @logfile = false
282
+ ## end
283
+ ## def open
284
+ ## log_path = bundle_path( 'session_log', 'logs' )
285
+ ## @logfile = File.open( log_path, 'a' )
286
+ ## end
287
+ ## def close
288
+ ## @logfile.close if @logfile
289
+ ## @logfile = false
290
+ ## end
291
+ ## def flush
292
+ ## @logfile.flush if @logfile
293
+ ## end
294
+ ## def init_ses( msg )
295
+ ## super
296
+ ## @logfile.write( "#{Time.new} -- Session id #{msg.ses_id} was created.\n" )
297
+ ## end
298
+ ## def restore_ses( msg )
299
+ ## super
300
+ ## @logfile.write( "#{Time.new} -- Session id #{msg.ses_id} was restored.\n" )
301
+ ## end
302
+ ## def idle( msg )
303
+ ## @logfile.write( "#{Time.new} -- Client of session id #{msg.ses_id} connected.\n" )
304
+ ## end
305
+ ## end
306
+ ## SessionLogger.new.register( 'ses_logger' )
307
+ ##
303
308
  class PluginTemplate
304
309
  include PluginUtil
305
310
  def self.bundle_type; :Plugin; end
@@ -394,7 +399,7 @@ module ::RSence
394
399
  #
395
400
  # These definitions are accessible as the +@values+ attribute.
396
401
  def init_values
397
- values_path = compose_plugin_path( 'values.yaml' )
402
+ values_path = bundle_path( 'values.yaml' )
398
403
  return yaml_read( values_path )
399
404
  end
400
405
 
@@ -418,7 +423,7 @@ module ::RSence
418
423
  # Returns the source code of the javascript file +name+ in the 'js'
419
424
  # subdirectory of the plugin bundle.
420
425
  def read_js( js_name )
421
- file_read( compose_plugin_path( js_name, 'js', '.js' ) )
426
+ file_read( bundle_path( js_name, 'js', '.js' ) )
422
427
  end
423
428
 
424
429
  # Deprecated name of +#read_js+
@@ -435,7 +440,7 @@ module ::RSence
435
440
  if not ses.has_key?(:deps)
436
441
  ses[:deps] = []
437
442
  end
438
- path = compose_plugin_path( js_name, 'js', '.js' )
443
+ path = bundle_path( js_name, 'js', '.js' )
439
444
  unless ses[:deps].include?( path )
440
445
  ses[:deps].push( path )
441
446
  return file_read( path )