rsence 2.0.0.0.pre
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/INSTALL.rdoc +295 -0
- data/LICENSE +622 -0
- data/README.rdoc +24 -0
- data/VERSION +1 -0
- data/bin/build_client.rb +254 -0
- data/bin/help +6 -0
- data/bin/launch.rb +120 -0
- data/bin/rdoc.sh +2 -0
- data/bin/restart +6 -0
- data/bin/rsence +120 -0
- data/bin/run +6 -0
- data/bin/run.rb +6 -0
- data/bin/save +6 -0
- data/bin/start +6 -0
- data/bin/status +6 -0
- data/bin/stop +6 -0
- data/conf/config.ru +5 -0
- data/conf/default_conf.yaml +337 -0
- data/conf/default_strings.yaml +77 -0
- data/conf/local_conf.yaml +14 -0
- data/conf/unicorn.conf +78 -0
- data/js/comm/comm/autosync/autosync.js +18 -0
- data/js/comm/comm/autosync/js.inc +0 -0
- data/js/comm/comm/comm.js +195 -0
- data/js/comm/comm/js.inc +0 -0
- data/js/comm/comm/queue/js.inc +0 -0
- data/js/comm/comm/queue/queue.js +183 -0
- data/js/comm/comm/session/js.inc +0 -0
- data/js/comm/comm/session/session.js +51 -0
- data/js/comm/comm/sessionwatcher/js.inc +0 -0
- data/js/comm/comm/sessionwatcher/sessionwatcher.js +43 -0
- data/js/comm/comm/transporter/js.inc +0 -0
- data/js/comm/comm/transporter/transporter.js +257 -0
- data/js/comm/comm/urlresponder/js.inc +0 -0
- data/js/comm/comm/urlresponder/urlresponder.js +148 -0
- data/js/comm/comm/values/js.inc +0 -0
- data/js/comm/comm/values/values.js +432 -0
- data/js/comm/jsloader/js.inc +0 -0
- data/js/comm/jsloader/jsloader.js +114 -0
- data/js/comm/reloadapp/js.inc +0 -0
- data/js/comm/reloadapp/reloadapp.js +150 -0
- data/js/comm/reloadapp/themes/default/reloadapp_warning-ie6.gif +0 -0
- data/js/comm/reloadapp/themes/default/reloadapp_warning.png +0 -0
- data/js/comm/sha/js.inc +0 -0
- data/js/comm/sha/sha.js +432 -0
- data/js/comm/values/value/js.inc +0 -0
- data/js/comm/values/value/value.js +182 -0
- data/js/comm/values/valuematrix/js.inc +0 -0
- data/js/comm/values/valuematrix/valuematrix.js +138 -0
- data/js/controls/button/button.js +57 -0
- data/js/controls/button/js.inc +0 -0
- data/js/controls/button/themes/bright/button.css +89 -0
- data/js/controls/button/themes/bright/button.html +7 -0
- data/js/controls/button/themes/bright/button_parts1-ie6.gif +0 -0
- data/js/controls/button/themes/bright/button_parts1.png +0 -0
- data/js/controls/button/themes/default/button.css +89 -0
- data/js/controls/button/themes/default/button.html +7 -0
- data/js/controls/button/themes/default/button_parts1-ie6.gif +0 -0
- data/js/controls/button/themes/default/button_parts1.png +0 -0
- data/js/controls/checkbox/checkbox.js +47 -0
- data/js/controls/checkbox/js.inc +0 -0
- data/js/controls/checkbox/themes/default/checkbox.css +69 -0
- data/js/controls/checkbox/themes/default/checkbox.html +5 -0
- data/js/controls/checkbox/themes/default/checkbox_parts1-ie6.gif +0 -0
- data/js/controls/checkbox/themes/default/checkbox_parts1.png +0 -0
- data/js/controls/datetime/calendar/calendar.js +197 -0
- data/js/controls/datetime/calendar/js.inc +0 -0
- data/js/controls/datetime/calendar/themes/default/calendar.css +108 -0
- data/js/controls/datetime/calendar/themes/default/calendar.html +9 -0
- data/js/controls/datetime/calendar/themes/default/calendar_arrows-ie6.gif +0 -0
- data/js/controls/datetime/calendar/themes/default/calendar_arrows.png +0 -0
- data/js/controls/datetime/datetimevalue/datetimevalue.js +246 -0
- data/js/controls/datetime/datetimevalue/js.inc +0 -0
- data/js/controls/datetime/timesheet/js.inc +0 -0
- data/js/controls/datetime/timesheet/themes/default/timesheet.css +30 -0
- data/js/controls/datetime/timesheet/themes/default/timesheet.html +2 -0
- data/js/controls/datetime/timesheet/timesheet.js +182 -0
- data/js/controls/datetime/timesheet_item/js.inc +0 -0
- data/js/controls/datetime/timesheet_item/themes/default/timesheet_item.css +42 -0
- data/js/controls/datetime/timesheet_item/themes/default/timesheet_item.html +8 -0
- data/js/controls/datetime/timesheet_item/timesheet_item.js +247 -0
- data/js/controls/datetime/timesheet_item_edit/js.inc +0 -0
- data/js/controls/datetime/timesheet_item_edit/timesheet_item_edit.js +274 -0
- data/js/controls/dialogs/alert_sheet/alert_sheet.js +62 -0
- data/js/controls/dialogs/alert_sheet/js.inc +0 -0
- data/js/controls/dialogs/confirm_sheet/confirm_sheet.js +36 -0
- data/js/controls/dialogs/confirm_sheet/js.inc +0 -0
- data/js/controls/dialogs/sheet/js.inc +0 -0
- data/js/controls/dialogs/sheet/sheet.js +83 -0
- data/js/controls/dialogs/sheet/themes/default/sheet.css +64 -0
- data/js/controls/dialogs/sheet/themes/default/sheet.html +14 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_bg-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_bg.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_dim-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_dim.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts1-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts1.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts2-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts2.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_warning-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_warning.png +0 -0
- data/js/controls/imageview/imageview.js +108 -0
- data/js/controls/imageview/js.inc +0 -0
- data/js/controls/imageview/themes/default/blank.gif +0 -0
- data/js/controls/lists/checkboxlist/checkboxlist.js +170 -0
- data/js/controls/lists/checkboxlist/js.inc +0 -0
- data/js/controls/lists/listitems/js.inc +0 -0
- data/js/controls/lists/listitems/listitems.js +65 -0
- data/js/controls/lists/radiobuttonlist/js.inc +0 -0
- data/js/controls/lists/radiobuttonlist/radiobuttonlist.js +126 -0
- data/js/controls/passwordcontrol/js.inc +0 -0
- data/js/controls/passwordcontrol/passwordcontrol.js +22 -0
- data/js/controls/passwordcontrol/themes/default/passwordcontrol.css +0 -0
- data/js/controls/passwordcontrol/themes/default/passwordcontrol.html +18 -0
- data/js/controls/progress/progressbar/js.inc +0 -0
- data/js/controls/progress/progressbar/progressbar.js +36 -0
- data/js/controls/progress/progressbar/themes/default/progressbar.css +16 -0
- data/js/controls/progress/progressbar/themes/default/progressbar.html +2 -0
- data/js/controls/progress/progressindicator/js.inc +0 -0
- data/js/controls/progress/progressindicator/progressindicator.js +43 -0
- data/js/controls/radiobutton/js.inc +0 -0
- data/js/controls/radiobutton/radiobutton.js +41 -0
- data/js/controls/radiobutton/themes/default/radiobutton.css +69 -0
- data/js/controls/radiobutton/themes/default/radiobutton.html +5 -0
- data/js/controls/radiobutton/themes/default/radiobutton_parts1-ie6.gif +0 -0
- data/js/controls/radiobutton/themes/default/radiobutton_parts1.png +0 -0
- data/js/controls/sliders/slider/js.inc +0 -0
- data/js/controls/sliders/slider/slider.js +356 -0
- data/js/controls/sliders/slider/themes/default/hslider_tracks-ie6.gif +0 -0
- data/js/controls/sliders/slider/themes/default/hslider_tracks.png +0 -0
- data/js/controls/sliders/slider/themes/default/slider.css +108 -0
- data/js/controls/sliders/slider/themes/default/slider.html +5 -0
- data/js/controls/sliders/slider/themes/default/slider_thumbs-ie6.gif +0 -0
- data/js/controls/sliders/slider/themes/default/slider_thumbs.png +0 -0
- data/js/controls/sliders/vslider/js.inc +0 -0
- data/js/controls/sliders/vslider/themes/default/vslider.css +52 -0
- data/js/controls/sliders/vslider/themes/default/vslider.html +5 -0
- data/js/controls/sliders/vslider/themes/default/vslider_tracks-ie6.gif +0 -0
- data/js/controls/sliders/vslider/themes/default/vslider_tracks.png +0 -0
- data/js/controls/sliders/vslider/vslider.js +40 -0
- data/js/controls/stepper/js.inc +0 -0
- data/js/controls/stepper/stepper.js +212 -0
- data/js/controls/stepper/themes/default/stepper-ie6.gif +0 -0
- data/js/controls/stepper/themes/default/stepper.css +14 -0
- data/js/controls/stepper/themes/default/stepper.html +2 -0
- data/js/controls/stepper/themes/default/stepper.png +0 -0
- data/js/controls/stringview/js.inc +0 -0
- data/js/controls/stringview/stringview.js +49 -0
- data/js/controls/stringview/themes/default/stringview.css +8 -0
- data/js/controls/stringview/themes/default/stringview.html +1 -0
- data/js/controls/tab/js.inc +0 -0
- data/js/controls/tab/tab.js +276 -0
- data/js/controls/tab/themes/bright/tab.css +76 -0
- data/js/controls/tab/themes/bright/tab.html +6 -0
- data/js/controls/tab/themes/bright/tab_bg_color-ie6.gif +0 -0
- data/js/controls/tab/themes/bright/tab_bg_color.png +0 -0
- data/js/controls/tab/themes/bright/tab_border_pattern-ie6.gif +0 -0
- data/js/controls/tab/themes/bright/tab_border_pattern.png +0 -0
- data/js/controls/tab/themes/bright/tab_parts1-ie6.gif +0 -0
- data/js/controls/tab/themes/bright/tab_parts1.png +0 -0
- data/js/controls/tab/themes/default/tab.css +77 -0
- data/js/controls/tab/themes/default/tab.html +6 -0
- data/js/controls/tab/themes/default/tab_bg_color-ie6.gif +0 -0
- data/js/controls/tab/themes/default/tab_bg_color.png +0 -0
- data/js/controls/tab/themes/default/tab_border_pattern-ie6.gif +0 -0
- data/js/controls/tab/themes/default/tab_border_pattern.png +0 -0
- data/js/controls/tab/themes/default/tab_parts1-ie6.gif +0 -0
- data/js/controls/tab/themes/default/tab_parts1.png +0 -0
- data/js/controls/textarea/js.inc +0 -0
- data/js/controls/textarea/textarea.js +23 -0
- data/js/controls/textarea/themes/default/textarea.css +21 -0
- data/js/controls/textarea/themes/default/textarea.html +18 -0
- data/js/controls/textcontrol/js.inc +0 -0
- data/js/controls/textcontrol/textcontrol.js +372 -0
- data/js/controls/textcontrol/themes/default/textcontrol.css +107 -0
- data/js/controls/textcontrol/themes/default/textcontrol.html +18 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts1-ie6.gif +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts1.png +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts2-ie6.gif +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts2.png +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts3-ie6.gif +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts3.png +0 -0
- data/js/controls/uploader/js.inc +0 -0
- data/js/controls/uploader/themes/default/upload_progress.gif +0 -0
- data/js/controls/uploader/themes/default/uploader.css +108 -0
- data/js/controls/uploader/themes/default/uploader.html +27 -0
- data/js/controls/uploader/uploader.js +153 -0
- data/js/controls/validatorview/js.inc +0 -0
- data/js/controls/validatorview/themes/default/validator-ie6.gif +0 -0
- data/js/controls/validatorview/themes/default/validator.png +0 -0
- data/js/controls/validatorview/themes/default/validatorview.css +0 -0
- data/js/controls/validatorview/themes/default/validatorview.html +0 -0
- data/js/controls/validatorview/validatorview.js +55 -0
- data/js/controls/window/js.inc +0 -0
- data/js/controls/window/themes/default/window.css +219 -0
- data/js/controls/window/themes/default/window.html +17 -0
- data/js/controls/window/themes/default/window_bg_active-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_bg_active.png +0 -0
- data/js/controls/window/themes/default/window_bg_inactive-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_bg_inactive.png +0 -0
- data/js/controls/window/themes/default/window_buttons-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_buttons.png +0 -0
- data/js/controls/window/themes/default/window_parts1-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_parts1.png +0 -0
- data/js/controls/window/themes/default/window_parts2-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_parts2.png +0 -0
- data/js/controls/window/window.js +284 -0
- data/js/core/class/class.js +317 -0
- data/js/core/class/js.inc +0 -0
- data/js/core/elem/elem.js +1376 -0
- data/js/core/elem/js.inc +0 -0
- data/js/core/event/event.js +1021 -0
- data/js/core/event/js.inc +0 -0
- data/js/core/iefix/ie_css_element.htc +5 -0
- data/js/core/iefix/ie_css_style.htc +5 -0
- data/js/core/iefix/iefix.js +359 -0
- data/js/core/iefix/js.inc +0 -0
- data/js/debugg/debugg.js +43 -0
- data/js/debugg/js.inc +0 -0
- data/js/foundation/application/application.js +209 -0
- data/js/foundation/application/js.inc +0 -0
- data/js/foundation/control/control.js +342 -0
- data/js/foundation/control/controldefaults/controldefaults.js +59 -0
- data/js/foundation/control/controldefaults/js.inc +0 -0
- data/js/foundation/control/dummyvalue/dummyvalue.js +50 -0
- data/js/foundation/control/dummyvalue/js.inc +0 -0
- data/js/foundation/control/dyncontrol/dyncontrol.js +494 -0
- data/js/foundation/control/dyncontrol/js.inc +0 -0
- data/js/foundation/control/dyncontrol/themes/default/dyncontrol.css +0 -0
- data/js/foundation/control/dyncontrol/themes/default/dyncontrol.html +0 -0
- data/js/foundation/control/eventresponder/eventresponder.js +713 -0
- data/js/foundation/control/eventresponder/js.inc +0 -0
- data/js/foundation/control/js.inc +0 -0
- data/js/foundation/control/valueresponder/js.inc +0 -0
- data/js/foundation/control/valueresponder/valueresponder.js +77 -0
- data/js/foundation/geom/point/js.inc +0 -0
- data/js/foundation/geom/point/point.js +202 -0
- data/js/foundation/geom/rect/js.inc +0 -0
- data/js/foundation/geom/rect/rect.js +610 -0
- data/js/foundation/json_renderer/js.inc +0 -0
- data/js/foundation/json_renderer/json_renderer.js +231 -0
- data/js/foundation/system/js.inc +0 -0
- data/js/foundation/system/system.js +369 -0
- data/js/foundation/thememanager/js.inc +0 -0
- data/js/foundation/thememanager/thememanager.js +387 -0
- data/js/foundation/view/js.inc +0 -0
- data/js/foundation/view/markupview/js.inc +0 -0
- data/js/foundation/view/markupview/markupview.js +113 -0
- data/js/foundation/view/morphanimation/js.inc +0 -0
- data/js/foundation/view/morphanimation/morphanimation.js +236 -0
- data/js/foundation/view/view.js +1804 -0
- data/js/foundation/view/viewdefaults/js.inc +0 -0
- data/js/foundation/view/viewdefaults/viewdefaults.js +25 -0
- data/js/views/centerview/centerview.js +45 -0
- data/js/views/centerview/js.inc +0 -0
- data/js/views/inlineview/inlineview.js +14 -0
- data/js/views/inlineview/js.inc +0 -0
- data/js/views/scrollview/js.inc +0 -0
- data/js/views/scrollview/scrollview.js +39 -0
- data/lib/conf/default.rb +220 -0
- data/lib/conf/wizard.rb +303 -0
- data/lib/daemon/daemon.rb +293 -0
- data/lib/http/broker.rb +102 -0
- data/lib/http/rackup.rb +88 -0
- data/lib/http/request.rb +69 -0
- data/lib/http/response.rb +63 -0
- data/lib/plugins/gui_plugin.rb +129 -0
- data/lib/plugins/guiparser.rb +114 -0
- data/lib/plugins/plugin.rb +652 -0
- data/lib/plugins/plugin_plugins.rb +47 -0
- data/lib/plugins/plugin_sqlite_db.rb +72 -0
- data/lib/plugins/plugin_util.rb +96 -0
- data/lib/plugins/pluginmanager.rb +517 -0
- data/lib/plugins/servlet.rb +69 -0
- data/lib/session/msg.rb +291 -0
- data/lib/session/sessionmanager.rb +491 -0
- data/lib/session/sessionstorage.rb +314 -0
- data/lib/transporter/transporter.rb +254 -0
- data/lib/util/gzstring.rb +5 -0
- data/lib/values/hvalue.rb +323 -0
- data/lib/values/valuemanager.rb +152 -0
- data/plugins/client_pkg/client_pkg.rb +186 -0
- data/plugins/client_pkg/info.yaml +25 -0
- data/plugins/client_pkg/lib/client_pkg_build.rb +569 -0
- data/plugins/client_pkg/lib/client_pkg_cache.rb +50 -0
- data/plugins/client_pkg/lib/client_pkg_serve.rb +210 -0
- data/plugins/client_pkg/log/build_log +0 -0
- data/plugins/index_html/img/loading.gif +0 -0
- data/plugins/index_html/img/riassence.gif +0 -0
- data/plugins/index_html/index_html.rb +150 -0
- data/plugins/index_html/tmpl/index.html +22 -0
- data/plugins/index_html/tmpl/startup_index.html +29 -0
- data/plugins/legacy/disabled +0 -0
- data/plugins/legacy/disabled- +0 -0
- data/plugins/legacy/info.yaml +22 -0
- data/plugins/legacy/legacy.rb +15 -0
- data/plugins/main/js/riassence_ns.js +87 -0
- data/plugins/main/main.rb +234 -0
- data/plugins/main/values.yaml +8 -0
- data/plugins/ticketservices/lib/common.rb +300 -0
- data/plugins/ticketservices/lib/favicon.rb +38 -0
- data/plugins/ticketservices/lib/file.rb +58 -0
- data/plugins/ticketservices/lib/img.rb +50 -0
- data/plugins/ticketservices/lib/objblob.rb +66 -0
- data/plugins/ticketservices/lib/rsrc.rb +34 -0
- data/plugins/ticketservices/lib/upload.rb +206 -0
- data/plugins/ticketservices/ticketservices.rb +268 -0
- data/var/db/.git_include +0 -0
- data/var/log/.git_include +0 -0
- data/var/run/.git_include +0 -0
- metadata +390 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
## Riassence Framework
|
|
2
|
+
# Copyright 2010 Riassence Inc.
|
|
3
|
+
# http://riassence.com/
|
|
4
|
+
#
|
|
5
|
+
# You should have received a copy of the GNU General Public License along
|
|
6
|
+
# with this software package. If not, contact licensing@riassence.com
|
|
7
|
+
##
|
|
8
|
+
|
|
9
|
+
## Interface to enable plugins in a plugin. Just include this in your subclass of Plugin.
|
|
10
|
+
module PluginPlugins
|
|
11
|
+
def init
|
|
12
|
+
super
|
|
13
|
+
@plugin_plugins = RSence::PluginManager.new( [ bundle_path('plugins') ] )
|
|
14
|
+
end
|
|
15
|
+
def open
|
|
16
|
+
super
|
|
17
|
+
@plugin_plugins.delegate(:open)
|
|
18
|
+
end
|
|
19
|
+
def close
|
|
20
|
+
super
|
|
21
|
+
@plugin_plugins.delegate(:close)
|
|
22
|
+
end
|
|
23
|
+
def flush
|
|
24
|
+
super
|
|
25
|
+
@plugin_plugins.delegate(:flush)
|
|
26
|
+
end
|
|
27
|
+
def idle( msg )
|
|
28
|
+
super
|
|
29
|
+
@plugin_plugins.delegate(:idle,msg)
|
|
30
|
+
end
|
|
31
|
+
def init_ses( msg )
|
|
32
|
+
super
|
|
33
|
+
@plugin_plugins.delegate(:init_ses,msg)
|
|
34
|
+
end
|
|
35
|
+
def restore_ses( msg )
|
|
36
|
+
super
|
|
37
|
+
@plugin_plugins.delegate(:restore_ses,msg)
|
|
38
|
+
end
|
|
39
|
+
def cloned_target( msg, source_session )
|
|
40
|
+
super
|
|
41
|
+
@plugin_plugins.delegate(:cloned_target,msg,source_session)
|
|
42
|
+
end
|
|
43
|
+
def cloned_source( msg, target_session )
|
|
44
|
+
super
|
|
45
|
+
@plugin_plugins.delegate(:cloned_source,msg,target_session)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
## Riassence Framework
|
|
2
|
+
# Copyright 2009 Riassence Inc.
|
|
3
|
+
# http://riassence.com/
|
|
4
|
+
#
|
|
5
|
+
# You should have received a copy of the GNU General Public License along
|
|
6
|
+
# with this software package. If not, contact licensing@riassence.com
|
|
7
|
+
##
|
|
8
|
+
|
|
9
|
+
# Include this module in your plugin class to automatically
|
|
10
|
+
# create and connect/disconnect an sqllite database.
|
|
11
|
+
# The plugin instance will have a @db Sequel object refering
|
|
12
|
+
# to the sqlite database automatically created
|
|
13
|
+
module PluginSqliteDB
|
|
14
|
+
|
|
15
|
+
# First calls superclass, then creates database directory and database.
|
|
16
|
+
# Then calls init_db_tables.
|
|
17
|
+
def init
|
|
18
|
+
super
|
|
19
|
+
db_dir = File.join( @path, 'db' )
|
|
20
|
+
unless File.directory?( db_dir )
|
|
21
|
+
Dir.mkdir( db_dir )
|
|
22
|
+
end
|
|
23
|
+
@db_path = File.join( db_dir, "#{@name}.db" )
|
|
24
|
+
unless File.exist?( @db_path )
|
|
25
|
+
@db = Sequel.sqlite( @db_path )
|
|
26
|
+
create_db_tables
|
|
27
|
+
@db.disconnect
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Automatically opens the database connection, then calls update_db.
|
|
33
|
+
def open
|
|
34
|
+
@db = Sequel.sqlite( @db_path )
|
|
35
|
+
update_db
|
|
36
|
+
super
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Automatically closes (disconnects) the database. Calls flush_db before closing.
|
|
40
|
+
def close
|
|
41
|
+
flush_db
|
|
42
|
+
@db.disconnect
|
|
43
|
+
super
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Extend this method to do something immediately after the @db object is assigned.
|
|
47
|
+
# An usage scenario would be updating some tables or deleting some junk rows.
|
|
48
|
+
def update_db
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Extend this method to do something immediately before the @db object is disconnected.
|
|
52
|
+
# An usage scenario would be deleting some junk rows or writing some pending data in memory into the database.
|
|
53
|
+
def flush_db
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Extend this method to define tables or initial data for the tables.
|
|
57
|
+
# It's called once, when the database is created.
|
|
58
|
+
#
|
|
59
|
+
# NOTE: In a future reversion, tables might be defined from a configuration file.
|
|
60
|
+
#
|
|
61
|
+
# = Usage:
|
|
62
|
+
# @db.create_table :my_table do
|
|
63
|
+
# primary_key :id
|
|
64
|
+
# String :my_text_column
|
|
65
|
+
# end
|
|
66
|
+
# my_table = @db[:my_table]
|
|
67
|
+
# my_table.insert(:my_text_column => 'Some text')
|
|
68
|
+
#
|
|
69
|
+
def create_db_tables
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
|
|
2
|
+
module PluginUtil
|
|
3
|
+
|
|
4
|
+
include RSence
|
|
5
|
+
|
|
6
|
+
# Extend to do any initial configuration. Not doing anything by default.
|
|
7
|
+
def init
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# Extend this method to open objects like streams and database connections.
|
|
11
|
+
# It is called when everything is constructed after all plugins are loaded.
|
|
12
|
+
def open
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Extend to save your plugin state or store any data that needs to be
|
|
16
|
+
# persistent. It's always called before close, but doesn't necessarily mean
|
|
17
|
+
# a close call is imminent.
|
|
18
|
+
def flush
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Extend this method to close objects like streams and database connections.
|
|
22
|
+
# It's called when plugins are about to be destructed, so don't expect any
|
|
23
|
+
# calls after it has been called. When this method is called, it's the last
|
|
24
|
+
# chance to save persistent data before being destructed, so implement
|
|
25
|
+
# the +#flush+ method for primarily storing data.
|
|
26
|
+
def close
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Returns the contents of the file given as +path+.
|
|
30
|
+
#
|
|
31
|
+
# The plugin bundle's path is used as the prefix, unless +path+ starts with '/' or '..'
|
|
32
|
+
#
|
|
33
|
+
# If the file doesn't exist, it returns +false+.
|
|
34
|
+
def file_read( path )
|
|
35
|
+
path = bundle_path( path )
|
|
36
|
+
return false unless File.exist?( path )
|
|
37
|
+
return File.read( path )
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def yaml_read( path )
|
|
41
|
+
file_data = file_read( path )
|
|
42
|
+
if not file_data
|
|
43
|
+
return false
|
|
44
|
+
else
|
|
45
|
+
return YAML.load( file_data )
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def method_undefined?( *args )
|
|
50
|
+
puts "Method undefined: #{args.inspect}"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Writes the +data+ into the file +path+.
|
|
54
|
+
#
|
|
55
|
+
# The plugin bundle's path is used as the prefix, unless +path+ starts with '/' or '..'
|
|
56
|
+
#
|
|
57
|
+
# It returns a success code (+false+ for failure and +true+ for success).
|
|
58
|
+
def file_write( path, data )
|
|
59
|
+
path = bundle_path( path )
|
|
60
|
+
begin
|
|
61
|
+
datafile = File.open( path, 'wb' )
|
|
62
|
+
datafile.write( data )
|
|
63
|
+
datafile.close
|
|
64
|
+
return true
|
|
65
|
+
rescue => e
|
|
66
|
+
warn "file_write error for path #{path} #{e}"
|
|
67
|
+
return false
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
alias file_save file_write
|
|
71
|
+
|
|
72
|
+
# Makes a full path using the plugin bundle as the 'local path'.
|
|
73
|
+
# The (optional) +prefix+ is a subdirectory in the bundle,
|
|
74
|
+
# the +suffix+ is the file extension.
|
|
75
|
+
def bundle_path( path, prefix=false, suffix=false )
|
|
76
|
+
if suffix
|
|
77
|
+
path = "#{path}#{suffix}" unless path.end_with?(suffix)
|
|
78
|
+
end
|
|
79
|
+
if prefix
|
|
80
|
+
path = File.join( prefix, path )
|
|
81
|
+
end
|
|
82
|
+
if path[0].chr != '/' and path[0..1] != '..'
|
|
83
|
+
path = File.join( @path, path )
|
|
84
|
+
end
|
|
85
|
+
return path
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
alias compose_plugin_path bundle_path
|
|
89
|
+
|
|
90
|
+
# Helper method to return the time formatted according to the HTTP RFC
|
|
91
|
+
def httime(time=false)
|
|
92
|
+
time = Time.new unless time
|
|
93
|
+
return time.gmtime.strftime('%a, %d %b %Y %H:%M:%S %Z')
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
end
|
|
@@ -0,0 +1,517 @@
|
|
|
1
|
+
## Riassence Framework
|
|
2
|
+
# Copyright 2006 Riassence Inc.
|
|
3
|
+
# http://riassence.com/
|
|
4
|
+
#
|
|
5
|
+
# You should have received a copy of the GNU General Public License along
|
|
6
|
+
# with this software package. If not, contact licensing@riassence.com
|
|
7
|
+
##
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def bundle_loader( params )
|
|
11
|
+
src_path = params[:src_path]
|
|
12
|
+
mod = Module.new do |m|
|
|
13
|
+
@@bundle_path = params[:bundle_path ]
|
|
14
|
+
@@bundle_name = params[:bundle_name ]
|
|
15
|
+
@@bundle_info = params[:bundle_info ]
|
|
16
|
+
@@plugin_manager = params[:plugin_manager]
|
|
17
|
+
begin
|
|
18
|
+
if params[:bundle_info][:inits_self] == false
|
|
19
|
+
m::module_eval( File.read(src_path) )
|
|
20
|
+
elsif params[:bundle_info][:reloadable] == false
|
|
21
|
+
require src_path[0..-4]
|
|
22
|
+
else
|
|
23
|
+
load src_path
|
|
24
|
+
end
|
|
25
|
+
rescue => e
|
|
26
|
+
@@plugin_manager.plugin_error(
|
|
27
|
+
e,
|
|
28
|
+
'BundleLoaderError',
|
|
29
|
+
"An error occurred while loading the plugin bundle #{@@bundle_name}.",
|
|
30
|
+
@@bundle_path
|
|
31
|
+
)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
return mod
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
module RSence
|
|
39
|
+
|
|
40
|
+
# Contains the PluginUtil module which has common methods for the bundle classes
|
|
41
|
+
require 'plugins/plugin_util'
|
|
42
|
+
|
|
43
|
+
# plugin.rb contains the Plugin skeleton class
|
|
44
|
+
require 'plugins/plugin'
|
|
45
|
+
|
|
46
|
+
# guiparser.rb contains the Yaml serializer for gui trees.
|
|
47
|
+
# It uses JSONRenderer on the client to build user interfaces.
|
|
48
|
+
require 'plugins/guiparser'
|
|
49
|
+
|
|
50
|
+
# gui_plugin.rb is an extension of Plugin that uses
|
|
51
|
+
# GUIParser to init the gui automatically.
|
|
52
|
+
require 'plugins/gui_plugin'
|
|
53
|
+
|
|
54
|
+
# plugin_sqlite_db.rb contains automatic local sqlite database
|
|
55
|
+
# creation for a plugin that includes it.
|
|
56
|
+
require 'plugins/plugin_sqlite_db'
|
|
57
|
+
|
|
58
|
+
# servlet includes the Servlet class, for handling any requests / responses
|
|
59
|
+
require 'plugins/servlet'
|
|
60
|
+
|
|
61
|
+
# Interface for plugins in a plugin bundle
|
|
62
|
+
require 'plugins/plugin_plugins'
|
|
63
|
+
|
|
64
|
+
## = Abstract
|
|
65
|
+
## PluginManager is the service that loads and provides method delegation
|
|
66
|
+
## amongst all installed plugins.
|
|
67
|
+
##
|
|
68
|
+
## = Usage
|
|
69
|
+
## plugin_paths = [ 'plugins', '/home/me/rsence/plugins' ]
|
|
70
|
+
## myPluginManager = RSence::PluginManager.new( plugin_paths )
|
|
71
|
+
##
|
|
72
|
+
class PluginManager
|
|
73
|
+
|
|
74
|
+
attr_reader :transporter, :sessions
|
|
75
|
+
|
|
76
|
+
# Initialize with a list of directories as plugin_paths.
|
|
77
|
+
# It's an array containing all plugin directories to scan.
|
|
78
|
+
def initialize( plugin_paths, transporter=nil, autoreload=false )
|
|
79
|
+
if transporter
|
|
80
|
+
@transporter = transporter
|
|
81
|
+
@sessions = transporter.sessions
|
|
82
|
+
end
|
|
83
|
+
@plugin_paths = plugin_paths
|
|
84
|
+
puts "Loading plugins..."
|
|
85
|
+
scan_plugins
|
|
86
|
+
puts "Plugins loaded."
|
|
87
|
+
puts "Riassence Framework is online."
|
|
88
|
+
if autoreload
|
|
89
|
+
@thr = Thread.new do
|
|
90
|
+
Thread.pass
|
|
91
|
+
while true
|
|
92
|
+
begin
|
|
93
|
+
changed_plugins!
|
|
94
|
+
rescue => e
|
|
95
|
+
warn e.inspect
|
|
96
|
+
end
|
|
97
|
+
sleep 3
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def method_missing( sym, *args, &block )
|
|
104
|
+
if @registry.has_key?(sym)
|
|
105
|
+
if args == [] and block == nil
|
|
106
|
+
return @registry[sym]
|
|
107
|
+
elsif block == nil
|
|
108
|
+
call( sym, *args )
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def changed_plugins!
|
|
114
|
+
@plugin_paths.each do |path|
|
|
115
|
+
next unless File.directory? path
|
|
116
|
+
Dir.entries(path).each do |bundle_name|
|
|
117
|
+
next if bundle_name =~ /&\./
|
|
118
|
+
bundle_path = File.expand_path( File.join( path, bundle_name ) )
|
|
119
|
+
next unless File.directory?( bundle_path )
|
|
120
|
+
bundle_file = bundle_name+'.rb'
|
|
121
|
+
next unless File.exists?( File.join( bundle_path, bundle_file ) )
|
|
122
|
+
if File.exists?( File.join( bundle_path, 'disabled' ) )
|
|
123
|
+
if @registry.has_key?( bundle_name.to_sym )
|
|
124
|
+
puts "Disabling bundle #{bundle_name}..."
|
|
125
|
+
unload_bundle( bundle_name.to_sym )
|
|
126
|
+
if ARGV.include?('-say')
|
|
127
|
+
Thread.new do
|
|
128
|
+
Thread.pass
|
|
129
|
+
system(%{say "Unloaded #{bundle_name.to_s}."})
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
else
|
|
134
|
+
if not @registry.has_key?( bundle_name.to_sym )
|
|
135
|
+
puts "Loading bundle #{bundle_name}..."
|
|
136
|
+
load_bundle( bundle_path, bundle_name.to_sym, bundle_name+'.rb' )
|
|
137
|
+
call( bundle_name.to_sym, :open )
|
|
138
|
+
if ARGV.include?('-say')
|
|
139
|
+
Thread.new do
|
|
140
|
+
Thread.pass
|
|
141
|
+
system(%{say "Loaded #{bundle_name.to_s}."})
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
else
|
|
145
|
+
# puts "Checking if bundle #{bundle_name} is changed..."
|
|
146
|
+
info = @info[bundle_name.to_sym]
|
|
147
|
+
if info[:reloadable] and plugin_changed?( bundle_name.to_sym )
|
|
148
|
+
puts "Bundle #{bundle_name} has changed, reloading..."
|
|
149
|
+
unload_bundle( bundle_name.to_sym )
|
|
150
|
+
load_bundle( bundle_path, bundle_name.to_sym, bundle_name+'.rb' )
|
|
151
|
+
call( bundle_name.to_sym, :open )
|
|
152
|
+
if ARGV.include?('-say')
|
|
153
|
+
Thread.new do
|
|
154
|
+
Thread.pass
|
|
155
|
+
system(%{say "Reloaded #{bundle_name.to_s}."})
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def unload_bundle( bundle_name )
|
|
166
|
+
if @registry.has_key?( bundle_name )
|
|
167
|
+
call( bundle_name, :flush )
|
|
168
|
+
call( bundle_name, :close )
|
|
169
|
+
@registry.delete( bundle_name )
|
|
170
|
+
@aliases.each do |a_name,b_name|
|
|
171
|
+
if b_name == bundle_name
|
|
172
|
+
@aliases.delete( a_name )
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
if @servlets.include?( bundle_name )
|
|
176
|
+
@servlets.delete( bundle_name )
|
|
177
|
+
end
|
|
178
|
+
if @info.include?( bundle_name )
|
|
179
|
+
@info.delete( bundle_name )
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def plugin_changed?( plugin_name )
|
|
185
|
+
info = @info[plugin_name]
|
|
186
|
+
last_changed = info[:last_changed]
|
|
187
|
+
newest_change = most_recent( info[:path], last_changed )
|
|
188
|
+
return last_changed < newest_change
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# Top-level method for scanning all plugin directories.
|
|
192
|
+
# Clears previously loaded plugins.
|
|
193
|
+
def scan_plugins
|
|
194
|
+
@registry = {}
|
|
195
|
+
@info = {}
|
|
196
|
+
@aliases = {}
|
|
197
|
+
@servlets = []
|
|
198
|
+
# @types = {
|
|
199
|
+
# :gui => [],
|
|
200
|
+
# :plugin => [],
|
|
201
|
+
# :servlet => []
|
|
202
|
+
# }
|
|
203
|
+
@plugin_paths.each do |path|
|
|
204
|
+
next unless File.directory? path
|
|
205
|
+
scan_plugindir( path )
|
|
206
|
+
end
|
|
207
|
+
delegate( :open )
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def registry( plugin_name )
|
|
211
|
+
return @registry[ plugin_name ]
|
|
212
|
+
end
|
|
213
|
+
alias [] registry
|
|
214
|
+
|
|
215
|
+
# Scans a directory of plugins, calls +load_plugin+ for bundles that match
|
|
216
|
+
# the definition of a plugin bundle.
|
|
217
|
+
# - Skips bundles starting with a dot
|
|
218
|
+
# - Skips bundles without a ruby source file with the same
|
|
219
|
+
# name as the directory (plus '.rb').
|
|
220
|
+
# - Skips bundles containing a file or directory named 'disabled'
|
|
221
|
+
def scan_plugindir( path )
|
|
222
|
+
Dir.entries(path).each do |bundle_name|
|
|
223
|
+
# puts "bundle_name: #{bundle_name}"
|
|
224
|
+
next if bundle_name[0].chr == '.'
|
|
225
|
+
bundle_path = File.expand_path( File.join( path, bundle_name ) )
|
|
226
|
+
# puts "#{File.stat(bundle_path).inspect}"
|
|
227
|
+
next unless File.directory?( bundle_path )
|
|
228
|
+
bundle_file = bundle_name+'.rb'
|
|
229
|
+
if not File.exists?( File.join( bundle_path, bundle_file ) )
|
|
230
|
+
bundle_file = 'main.rb'
|
|
231
|
+
next unless File.exists?( File.join( bundle_path, bundle_file ) )
|
|
232
|
+
end
|
|
233
|
+
next if File.exists?( File.join( bundle_path, 'disabled' ) )
|
|
234
|
+
|
|
235
|
+
load_bundle( bundle_path, bundle_name.to_sym, bundle_file )
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
# Finds the most recent file in the path
|
|
240
|
+
def most_recent( bundle_path, newest_date=0 )
|
|
241
|
+
path_date = File.stat( bundle_path ).mtime.to_i
|
|
242
|
+
is_dir = File.directory?( bundle_path )
|
|
243
|
+
if path_date > newest_date and not is_dir
|
|
244
|
+
# puts "File is newer: #{bundle_path}"
|
|
245
|
+
newest_date = path_date
|
|
246
|
+
end
|
|
247
|
+
if is_dir
|
|
248
|
+
Dir.entries( bundle_path ).each do |entry_name|
|
|
249
|
+
next if entry_name[0].chr == '.'
|
|
250
|
+
full_path = File.join( bundle_path, entry_name )
|
|
251
|
+
unless File.directory?( full_path )
|
|
252
|
+
next unless entry_name.include?('.') and ['yaml','rb'].include?( entry_name.split('.')[-1] )
|
|
253
|
+
end
|
|
254
|
+
newest_date = most_recent( full_path, newest_date )
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
return newest_date
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
# Gets plugin information
|
|
261
|
+
def bundle_info( bundle_path )
|
|
262
|
+
|
|
263
|
+
bundle_name = File.split( bundle_path )[1]
|
|
264
|
+
|
|
265
|
+
# Default bundle information
|
|
266
|
+
info = {
|
|
267
|
+
# The human-readable product name of the package
|
|
268
|
+
:title => bundle_name.capitalize,
|
|
269
|
+
|
|
270
|
+
# The human-readable version of the package
|
|
271
|
+
:version => '0.0.0',
|
|
272
|
+
|
|
273
|
+
# A brief description of the package (rdoc formatting supported)
|
|
274
|
+
:description => 'No Description given',
|
|
275
|
+
|
|
276
|
+
# A flag (when false) prevents the plugin from automatically reload when changed.
|
|
277
|
+
:reloadable => true,
|
|
278
|
+
|
|
279
|
+
# A flag (when false) enables automatic construction
|
|
280
|
+
# of the Plugin and Servlet classes contained.
|
|
281
|
+
:inits_self => true,
|
|
282
|
+
|
|
283
|
+
# System version requirement.
|
|
284
|
+
:sys_version => '>= 1.0.0',
|
|
285
|
+
|
|
286
|
+
# Path to bundle
|
|
287
|
+
:path => bundle_path,
|
|
288
|
+
|
|
289
|
+
# Name of bundle
|
|
290
|
+
:name => bundle_name.to_sym,
|
|
291
|
+
|
|
292
|
+
# Last change
|
|
293
|
+
:last_changed => most_recent( bundle_path )
|
|
294
|
+
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
info_path = File.join( bundle_path, 'info.yaml' )
|
|
298
|
+
if File.exists?( info_path )
|
|
299
|
+
info_yaml = YAML.load( File.read( info_path ) )
|
|
300
|
+
info_yaml.each do |info_key,info_value|
|
|
301
|
+
info[ info_key.to_sym ] = info_value
|
|
302
|
+
end
|
|
303
|
+
end
|
|
304
|
+
return info
|
|
305
|
+
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
# Loads a plugin bundle.
|
|
309
|
+
def load_bundle( bundle_path, bundle_name, bundle_file )
|
|
310
|
+
|
|
311
|
+
if @registry.has_key?( bundle_name.to_sym )
|
|
312
|
+
warn "Warning: Bundle #{bundle_name} already loaded."
|
|
313
|
+
return
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
bundle_file_path = File.join( bundle_path, bundle_file )
|
|
317
|
+
|
|
318
|
+
bundle_info = bundle_info( bundle_path )
|
|
319
|
+
|
|
320
|
+
@info[bundle_name.to_sym] = bundle_info
|
|
321
|
+
|
|
322
|
+
bundle_src = File.read( bundle_file_path )
|
|
323
|
+
|
|
324
|
+
if RUBY_VERSION.to_f >= 1.9
|
|
325
|
+
puts "ruby 1.9.x"
|
|
326
|
+
puts "ruby version: #{RUBY_VERSION.inspect}"
|
|
327
|
+
src_path = bundle_file_path
|
|
328
|
+
plugin_manager = self
|
|
329
|
+
module_ns = Module.new do |m|
|
|
330
|
+
@@bundle_path = bundle_path
|
|
331
|
+
@@bundle_name = bundle_name
|
|
332
|
+
@@bundle_info = bundle_info
|
|
333
|
+
@@plugin_manager = plugin_manager
|
|
334
|
+
def m.bundle_path; @@bundle_path; end
|
|
335
|
+
# puts "using eval"
|
|
336
|
+
# m::module_eval( File.read(src_path) )
|
|
337
|
+
# puts "using require"
|
|
338
|
+
# require src_path[0..-4]
|
|
339
|
+
puts "using load"
|
|
340
|
+
load src_path
|
|
341
|
+
end
|
|
342
|
+
else
|
|
343
|
+
module_ns = bundle_loader( {
|
|
344
|
+
:bundle_path => bundle_path,
|
|
345
|
+
:bundle_name => bundle_name,
|
|
346
|
+
:bundle_info => bundle_info,
|
|
347
|
+
:plugin_manager => self,
|
|
348
|
+
:src_path => bundle_file_path,
|
|
349
|
+
:src => bundle_src
|
|
350
|
+
} )
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
unless bundle_info[:inits_self]
|
|
354
|
+
# puts "#{bundle_name}: #{module_ns.constants.inspect}"
|
|
355
|
+
module_ns.constants.each do |module_const_name|
|
|
356
|
+
module_const = module_ns.const_get( module_const_name )
|
|
357
|
+
if module_const.class == Class
|
|
358
|
+
# puts "is class"
|
|
359
|
+
module_const.ancestors.each do |ancestor|
|
|
360
|
+
# puts "ancestor: #{ancestor.to_s.inspect}"
|
|
361
|
+
if ancestor.to_s == "Servlet"
|
|
362
|
+
module_const.new
|
|
363
|
+
break
|
|
364
|
+
elsif ancestor.to_s == "Plugin"
|
|
365
|
+
puts "bundle_name: #{bundle_name}"
|
|
366
|
+
module_const.new.register( bundle_name )
|
|
367
|
+
break
|
|
368
|
+
elsif ancestor.to_s == "Object"
|
|
369
|
+
puts "Can't init class: #{module_const.to_s}"
|
|
370
|
+
break
|
|
371
|
+
end
|
|
372
|
+
end
|
|
373
|
+
end
|
|
374
|
+
end
|
|
375
|
+
end
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
def register_bundle( inst, bundle_name )
|
|
379
|
+
bundle_name = bundle_name.to_sym
|
|
380
|
+
if @registry.has_key?( bundle_name )
|
|
381
|
+
if registry[ bundle_name ] != inst
|
|
382
|
+
warn "Tried to register a conflicting bundle name: #{bundle_name.inspect}; ignoring"
|
|
383
|
+
else
|
|
384
|
+
warn "Use @plugins.register_alias to register more than one name per plugin."
|
|
385
|
+
register_alias( inst.name.to_sym, bundle_name )
|
|
386
|
+
end
|
|
387
|
+
else
|
|
388
|
+
inst.init if inst.respond_to? :init and not inst.inited
|
|
389
|
+
@registry[ bundle_name ] = inst
|
|
390
|
+
if inst.respond_to?( :match )
|
|
391
|
+
@servlets.push( bundle_name )
|
|
392
|
+
end
|
|
393
|
+
end
|
|
394
|
+
end
|
|
395
|
+
|
|
396
|
+
def register_alias( bundle_name, alias_name )
|
|
397
|
+
if @aliases.has_key?( alias_name.to_sym )
|
|
398
|
+
warn "Alias already taken: #{alias_name.inspect}"
|
|
399
|
+
else
|
|
400
|
+
@aliases[ alias_name ] = bundle_name.to_sym
|
|
401
|
+
end
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
def plugin_error( e, err_location, err_location_descr, eval_repl=false )
|
|
405
|
+
err_msg = [
|
|
406
|
+
"*"*40,
|
|
407
|
+
err_location,
|
|
408
|
+
err_location_descr,
|
|
409
|
+
"#{e.class.to_s}, #{e.message}",
|
|
410
|
+
"Backtrace:",
|
|
411
|
+
"\t"+e.backtrace.join("\n\t"),
|
|
412
|
+
"*"*40
|
|
413
|
+
].join("\n")+"\n"
|
|
414
|
+
puts
|
|
415
|
+
puts "eval repl: #{eval_repl}"
|
|
416
|
+
puts
|
|
417
|
+
if eval_repl
|
|
418
|
+
err_msg = err_msg.gsub('from (eval):',"from #{eval_repl}:")
|
|
419
|
+
end
|
|
420
|
+
$stderr.write( err_msg )
|
|
421
|
+
end
|
|
422
|
+
|
|
423
|
+
def match_servlet_uri( uri, req_type=:get )
|
|
424
|
+
match_score = {}
|
|
425
|
+
@servlets.each do | servlet_name |
|
|
426
|
+
servlet = @registry[ servlet_name ]
|
|
427
|
+
next unless servlet.respond_to?( req_type )
|
|
428
|
+
begin
|
|
429
|
+
if servlet.match( uri, req_type )
|
|
430
|
+
score = servlet.score
|
|
431
|
+
match_score[ score ] = [] unless match_score.has_key? score
|
|
432
|
+
match_score[ score ].push( servlet_name )
|
|
433
|
+
end
|
|
434
|
+
rescue => e
|
|
435
|
+
plugin_error(
|
|
436
|
+
e,
|
|
437
|
+
"RSence::PluginManager.match_servlet_uri",
|
|
438
|
+
"servlet: #{servlet_name.inspect}, req_type: #{req_type.inspect}, uri: #{uri.inspect}",
|
|
439
|
+
servlet_name
|
|
440
|
+
)
|
|
441
|
+
end
|
|
442
|
+
end
|
|
443
|
+
match_scores = match_score.keys.sort
|
|
444
|
+
if match_scores.empty?
|
|
445
|
+
return false
|
|
446
|
+
else
|
|
447
|
+
matches_order = []
|
|
448
|
+
matches_best = match_score[ match_scores[0] ]
|
|
449
|
+
if matches_best.size > 1
|
|
450
|
+
matches_best = matches_best[ rand( matches_best.size ) ]
|
|
451
|
+
else
|
|
452
|
+
matches_best = matches_best.first
|
|
453
|
+
end
|
|
454
|
+
matches_order.push( matches_best )
|
|
455
|
+
match_score.keys.sort.each do |match_n|
|
|
456
|
+
match_score[ match_n ].each do | match_name |
|
|
457
|
+
matches_order.push( match_name ) unless matches_order.include? match_name
|
|
458
|
+
end
|
|
459
|
+
end
|
|
460
|
+
return matches_order
|
|
461
|
+
end
|
|
462
|
+
end
|
|
463
|
+
|
|
464
|
+
def delegate( method_name, *args )
|
|
465
|
+
@registry.each do | plugin_name, plugin |
|
|
466
|
+
if plugin.respond_to?( method_name )
|
|
467
|
+
plugin.send( method_name, *args )
|
|
468
|
+
end
|
|
469
|
+
end
|
|
470
|
+
end
|
|
471
|
+
|
|
472
|
+
def shutdown
|
|
473
|
+
delegate( :flush )
|
|
474
|
+
delegate( :close )
|
|
475
|
+
end
|
|
476
|
+
|
|
477
|
+
def call( plugin_name, method_name, *args )
|
|
478
|
+
plugin_name = plugin_name.to_sym
|
|
479
|
+
if @registry.has_key?( plugin_name )
|
|
480
|
+
if @registry[ plugin_name ].respond_to?( method_name )
|
|
481
|
+
return @registry[ plugin_name ].send( method_name, *args )
|
|
482
|
+
else
|
|
483
|
+
puts "No method #{method_name.inspect} for plugin #{plugin_name.inspect}"
|
|
484
|
+
return false
|
|
485
|
+
end
|
|
486
|
+
else
|
|
487
|
+
puts "No such plugin: #{plugin_name.inspect}"
|
|
488
|
+
return false
|
|
489
|
+
end
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
alias run_plugin call
|
|
493
|
+
|
|
494
|
+
def match_servlet( req_type, req, resp, session )
|
|
495
|
+
req_uri = req.fullpath
|
|
496
|
+
matches_order = match_servlet_uri( req_uri, req_type )
|
|
497
|
+
return false unless matches_order
|
|
498
|
+
matches_order.each do |servlet_name|
|
|
499
|
+
begin
|
|
500
|
+
@registry[servlet_name].send( req_type, req, resp, session )
|
|
501
|
+
return true
|
|
502
|
+
rescue => e
|
|
503
|
+
plugin_error(
|
|
504
|
+
e,
|
|
505
|
+
"RSence::PluginManager.match_servlet",
|
|
506
|
+
"servlet_name: #{servlet_name.inspect}, req_type: #{req_type.inspect}",
|
|
507
|
+
servlet_name
|
|
508
|
+
)
|
|
509
|
+
next
|
|
510
|
+
end
|
|
511
|
+
end
|
|
512
|
+
return false
|
|
513
|
+
end
|
|
514
|
+
|
|
515
|
+
end
|
|
516
|
+
|
|
517
|
+
end
|