omf_web 1.0.0 → 1.2.0
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/omf_web_server +18 -0
- data/example/bridge/README.md +7 -0
- data/example/bridge/data_sources/sensor-sqlite.rb +15 -15
- data/example/bridge/htdocs/graph/js/bridge.js +35 -45
- data/example/bridge/htdocs/graph/js/event_line_chart.js +20 -18
- data/example/bridge/htdocs/graph/js/event_table.js +26 -28
- data/example/bridge/viz_server.rb +5 -9
- data/example/demo/demo_viz_server.rb +2 -2
- data/example/demo/widgets/linked_graphs_tab.yaml +9 -32
- data/example/openflow-gec15/code_tab.yaml +7 -12
- data/example/openflow-gec15/dashboard_tab.yaml +11 -12
- data/example/openflow-gec15/exp_source.rb +26 -26
- data/example/openflow-gec15/of_viz_server.rb +7 -7
- data/example/simple/simple.yaml +2 -1
- data/example/simple/simple_dynamic.yaml +1 -1
- data/example/web_rtc/web_rtc.yaml +54 -0
- data/example/web_rtc/webrtc-exp_1381786573.sq3 +0 -0
- data/lib/omf-web/config.ru +1 -1
- data/lib/omf-web/content/content_proxy.rb +2 -2
- data/lib/omf-web/content/file_repository.rb +11 -53
- data/lib/omf-web/content/git_repository.rb +1 -1
- data/lib/omf-web/content/irods_repository.rb +1 -1
- data/lib/omf-web/content/repository.rb +5 -3
- data/lib/omf-web/content/static_repository.rb +25 -11
- data/lib/omf-web/data_source_proxy.rb +3 -3
- data/lib/omf-web/rack/content_handler.rb +2 -2
- data/lib/omf-web/rack/session_authenticator.rb +3 -3
- data/lib/omf-web/rack/tab_mapper.rb +2 -2
- data/lib/omf-web/rack/update_handler.rb +2 -2
- data/lib/omf-web/rack/websocket_handler.rb +3 -3
- data/lib/omf-web/rack/widget_mapper.rb +2 -2
- data/lib/omf-web/session_store.rb +2 -2
- data/lib/omf-web/theme/abstract_page.rb +15 -24
- data/lib/omf-web/theme/bright/code_renderer.rb +24 -30
- data/lib/omf-web/theme/bright/data_renderer.rb +7 -5
- data/lib/omf-web/theme/bright/page.rb +2 -1
- data/lib/omf-web/theme/bright/widget_chrome.rb +16 -14
- data/lib/omf-web/theme.rb +1 -1
- data/lib/omf-web/thin/logging.rb +18 -13
- data/lib/omf-web/thin/runner.rb +2 -2
- data/lib/omf-web/thin/server.rb +105 -27
- data/lib/omf-web/version.rb +1 -1
- data/lib/omf-web/widget/abstract_widget.rb +3 -3
- data/lib/omf-web/widget/data_widget.rb +1 -0
- data/lib/omf-web/widget/text/maruku.rb +1 -1
- data/lib/omf-web/widget.rb +22 -22
- data/lib/omf_web.rb +1 -1
- data/omf_web.gemspec +18 -15
- data/share/htdocs/graph/js/abstract_chart.js +69 -68
- data/share/htdocs/graph/js/abstract_nv_chart.js +35 -33
- data/share/htdocs/graph/js/abstract_widget.js +61 -62
- data/share/htdocs/graph/js/axis.js +30 -25
- data/share/htdocs/graph/js/barchart_brush.js +23 -21
- data/share/htdocs/graph/js/code_mirror.js +35 -33
- data/share/htdocs/graph/js/discrete_bar_chart.js +27 -30
- data/share/htdocs/graph/js/histogram2.js +37 -47
- data/share/htdocs/graph/js/line_chart3.js +36 -30
- data/share/htdocs/graph/js/line_chart_with_focus.js +10 -9
- data/share/htdocs/graph/js/multi_barchart.js +33 -30
- data/share/htdocs/graph/js/network2.js +98 -97
- data/share/htdocs/graph/js/pie_chart2.js +25 -23
- data/share/htdocs/graph/js/scatter_plot.js +38 -36
- data/share/htdocs/graph/js/table2.js +60 -54
- data/share/htdocs/js/app.js +43 -0
- data/share/htdocs/js/{data_source2.js → data_source3.js} +44 -73
- data/share/htdocs/js/data_source_repo.js +42 -0
- data/share/htdocs/require/nv_d3.js +2 -0
- data/share/htdocs/theme/abstract/abstract.js +4 -4
- data/share/htdocs/vendor/VERSION_MAP.yaml +2 -0
- data/share/htdocs/vendor/require-2.1.8/require.js +2053 -0
- data/share/htdocs/vendor/require-2.1.8/require.min.js +36 -0
- data/share/htdocs/vendor/require-css-0.0.7/.gitignore +1 -0
- data/share/htdocs/vendor/require-css-0.0.7/LICENSE +10 -0
- data/share/htdocs/vendor/require-css-0.0.7/README.md +231 -0
- data/share/htdocs/vendor/require-css-0.0.7/bower.json +5 -0
- data/share/htdocs/vendor/require-css-0.0.7/css-builder.js +251 -0
- data/share/htdocs/vendor/require-css-0.0.7/css.js +436 -0
- data/share/htdocs/vendor/require-css-0.0.7/normalize.js +138 -0
- data/share/htdocs/vendor/require-css-0.0.7/package.json +5 -0
- data/share/htdocs/vendor/spin/jquery.spin.js +6 -4
- metadata +100 -74
- checksums.yaml +0 -7
- data/bin/omf_web_demo +0 -3
- data/bin/omf_web_demo.sh +0 -7
- data/bin/omf_web_server.rb +0 -157
- data/lib/omf_common/lobject.rb +0 -187
- data/lib/omf_common/log4r_outputter.rb +0 -69
- data/sample.sq3 +0 -0
- data/share/htdocs/js/data_source.js +0 -173
- data/share/htdocs/js/require3.js +0 -292
|
@@ -6,14 +6,23 @@ module OMF::Web::Theme
|
|
|
6
6
|
class AbstractPage < Erector::Widget
|
|
7
7
|
|
|
8
8
|
depends_on :js, '/resource/vendor/stacktrace/stacktrace.js'
|
|
9
|
+
|
|
10
|
+
depends_on :js, '/resource/vendor/require/require.js'
|
|
11
|
+
depends_on :js, '/resource/js/app.js'
|
|
12
|
+
|
|
13
|
+
|
|
9
14
|
depends_on :js, '/resource/vendor/jquery/jquery.js'
|
|
10
|
-
#depends_on :js, '/resource/js/stacktrace.js'
|
|
11
15
|
depends_on :js, '/resource/vendor/underscore/underscore.js'
|
|
12
16
|
depends_on :js, '/resource/vendor/backbone/backbone.js'
|
|
13
|
-
depends_on :js, "/resource/js/require3.js"
|
|
14
17
|
|
|
18
|
+
# depends_on :js, "/resource/js/require3.js"
|
|
19
|
+
#
|
|
15
20
|
depends_on :js, "/resource/theme/abstract/abstract.js"
|
|
16
|
-
depends_on :js, "/resource/js/data_source2.js"
|
|
21
|
+
# depends_on :js, "/resource/js/data_source2.js"
|
|
22
|
+
depends_on :script, %{
|
|
23
|
+
// ABSTRACT PAGE
|
|
24
|
+
if (typeof(OML) == "undefined") OML = {};
|
|
25
|
+
}
|
|
17
26
|
|
|
18
27
|
attr_reader :opts
|
|
19
28
|
|
|
@@ -29,15 +38,6 @@ module OMF::Web::Theme
|
|
|
29
38
|
end
|
|
30
39
|
|
|
31
40
|
def content
|
|
32
|
-
javascript %{
|
|
33
|
-
if (typeof(LW) == "undefined") LW = {};
|
|
34
|
-
LW.session_id = OML.session_id = '#{Thread.current["sessionID"]}';
|
|
35
|
-
|
|
36
|
-
//L.provide('jquery', ['vendor/jquery/jquery.js']);
|
|
37
|
-
L.already_loaded('/resource/vendor/jquery/jquery.js');
|
|
38
|
-
//L.provide('jquery.periodicalupdater', ['vendor/jquery/jquery.periodicalupdater.js']);
|
|
39
|
-
//L.provide('jquery.ui', ['vendor/jquery-ui/js/jquery-ui.min.js']);
|
|
40
|
-
}
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
def render_flash
|
|
@@ -82,28 +82,19 @@ module OMF::Web::Theme
|
|
|
82
82
|
data_source_widgets.each do |w|
|
|
83
83
|
w.collect_data_sources(dss)
|
|
84
84
|
end
|
|
85
|
-
#puts ">>>>>>>>>>> #{dss.inspect}"
|
|
86
|
-
# dsh = {}
|
|
87
|
-
# dss.each do |ds|
|
|
88
|
-
# name = ds[:name].to_s
|
|
89
|
-
# dsh[name] = ds.merge(dsh[name] || {})
|
|
90
|
-
# end
|
|
91
|
-
|
|
92
|
-
#puts ">>>> #{dsh.inspect}"
|
|
93
85
|
return if dss.empty?
|
|
94
86
|
|
|
95
87
|
js = dss.map do |ds|
|
|
96
88
|
render_data_source(ds)
|
|
97
89
|
end
|
|
98
90
|
|
|
99
|
-
# js = dsh.values.to_a.collect do |ds|
|
|
100
|
-
# render_data_source(ds)
|
|
101
|
-
# end
|
|
102
91
|
# Calling 'javascript' doesn't seem to work here. No idea why, so let's do it by hand
|
|
103
92
|
%{
|
|
104
93
|
<script type="text/javascript">
|
|
105
94
|
// <![CDATA[
|
|
106
|
-
|
|
95
|
+
require(['omf/data_source_repo'], function(ds) {
|
|
96
|
+
#{js.join("\n")}
|
|
97
|
+
});
|
|
107
98
|
// ]]>
|
|
108
99
|
</script>
|
|
109
100
|
}
|
|
@@ -5,16 +5,16 @@ require 'omf-web/theme/abstract_page'
|
|
|
5
5
|
module OMF::Web::Theme
|
|
6
6
|
|
|
7
7
|
class CodeRenderer < Erector::Widget
|
|
8
|
-
|
|
8
|
+
|
|
9
9
|
#depends_on :css, "/resource/css/coderay.css"
|
|
10
|
-
|
|
10
|
+
|
|
11
11
|
# This maps the content's mime type to a different mode supported
|
|
12
12
|
# CodeMirror
|
|
13
13
|
#
|
|
14
14
|
MODE_MAPPER = {
|
|
15
15
|
:markup => :markdown
|
|
16
16
|
}
|
|
17
|
-
|
|
17
|
+
|
|
18
18
|
def initialize(widget, content, mode, opts)
|
|
19
19
|
super opts
|
|
20
20
|
@widget = widget
|
|
@@ -22,9 +22,9 @@ module OMF::Web::Theme
|
|
|
22
22
|
@mode = MODE_MAPPER[mode.to_sym] || mode
|
|
23
23
|
@opts = opts
|
|
24
24
|
end
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
def content()
|
|
27
|
-
|
|
27
|
+
|
|
28
28
|
base_id = "cm#{self.object_id}"
|
|
29
29
|
edit_id = base_id + '_e'
|
|
30
30
|
mode = @mode
|
|
@@ -35,16 +35,16 @@ module OMF::Web::Theme
|
|
|
35
35
|
opts.delete :top_level
|
|
36
36
|
opts.delete :priority
|
|
37
37
|
opts.merge!(
|
|
38
|
-
:base_el => "#" + base_id,
|
|
39
|
-
:edit_el => '#' + edit_id,
|
|
40
|
-
:content => @content.to_s,
|
|
38
|
+
:base_el => "#" + base_id,
|
|
39
|
+
:edit_el => '#' + edit_id,
|
|
40
|
+
:content => @content.to_s,
|
|
41
41
|
:mode => mode,
|
|
42
42
|
:content_id => @widget.content_id,
|
|
43
43
|
:save_url => @widget.update_url
|
|
44
44
|
)
|
|
45
45
|
|
|
46
46
|
div :id => base_id, :class => "codemirror_widget" do
|
|
47
|
-
|
|
47
|
+
|
|
48
48
|
js_toolbar = []
|
|
49
49
|
div :class => "codemirror_toolbar_container widget-toolbar" do
|
|
50
50
|
ol :class => "codemirror_toolbar" do
|
|
@@ -60,53 +60,47 @@ module OMF::Web::Theme
|
|
|
60
60
|
OML.widgets.#{base_id}.on_#{name}_pressed();
|
|
61
61
|
return false;
|
|
62
62
|
});
|
|
63
|
-
}
|
|
63
|
+
}
|
|
64
64
|
end
|
|
65
65
|
end
|
|
66
66
|
end
|
|
67
|
-
|
|
67
|
+
|
|
68
68
|
['codemirror', 'util/dialog'].each do |f|
|
|
69
|
-
link :href => "/resource/vendor/codemirror/lib/#{f}.css",
|
|
69
|
+
link :href => "/resource/vendor/codemirror/lib/#{f}.css",
|
|
70
70
|
:media => "all", :rel => "stylesheet", :type => "text/css"
|
|
71
71
|
end
|
|
72
72
|
|
|
73
73
|
['codemirror', 'util/dialog', 'util/searchcursor', 'util/search', 'util/loadmode'].each do |f|
|
|
74
74
|
script :src => "/resource/vendor/codemirror/lib/#{f}.js"
|
|
75
75
|
end
|
|
76
|
-
|
|
76
|
+
|
|
77
77
|
#script :src => "/resource/vendor/codemirror/mode/xml/xml.js"
|
|
78
78
|
#script :src => "/resource/vendor/codemirror/mode/#{mode}/#{mode}.js"
|
|
79
79
|
|
|
80
80
|
# Div where the text should go
|
|
81
81
|
div :id => edit_id, :class => "codemirror_edit" #, :style => 'height:100%'
|
|
82
|
-
|
|
82
|
+
|
|
83
83
|
render_widget_creation(base_id, opts)
|
|
84
84
|
javascript(%{
|
|
85
85
|
#{js_toolbar.join("\n");}
|
|
86
86
|
})
|
|
87
|
-
|
|
88
|
-
end
|
|
87
|
+
|
|
88
|
+
end
|
|
89
89
|
end
|
|
90
|
-
|
|
90
|
+
|
|
91
91
|
def render_widget_creation(base_id, opts)
|
|
92
|
-
link :href => "/resource/theme/bright/css/codemirror.css",
|
|
92
|
+
link :href => "/resource/theme/bright/css/codemirror.css",
|
|
93
93
|
:media => "all", :rel => "stylesheet", :type => "text/css"
|
|
94
|
-
|
|
94
|
+
|
|
95
95
|
javascript(%{
|
|
96
|
-
|
|
97
|
-
OML.widgets.#{base_id} = new
|
|
96
|
+
require(['graph/code_mirror'], function(Graph) {
|
|
97
|
+
var w = OML.widgets.#{base_id} = new Graph(#{opts.to_json});
|
|
98
|
+
var i = 0;
|
|
98
99
|
});
|
|
99
100
|
})
|
|
101
|
+
|
|
100
102
|
end
|
|
101
103
|
|
|
102
|
-
# def content2()
|
|
103
|
-
# link :href => "/resource/css/coderay.css",
|
|
104
|
-
# :media => "all", :rel => "stylesheet", :type => "text/css"
|
|
105
|
-
# div :class => "oml_code CodeRay" do
|
|
106
|
-
# rawtext(@content.html :line_numbers => :inline, :tab_width => 2, :wrap => :div)
|
|
107
|
-
# end
|
|
108
|
-
# end
|
|
109
|
-
|
|
110
104
|
end
|
|
111
|
-
|
|
105
|
+
|
|
112
106
|
end
|
|
@@ -3,24 +3,26 @@ require 'omf-web/theme/abstract_page'
|
|
|
3
3
|
module OMF::Web::Theme
|
|
4
4
|
|
|
5
5
|
class DataRenderer < Erector::Widget
|
|
6
|
-
|
|
6
|
+
|
|
7
7
|
def initialize(widget, opts)
|
|
8
8
|
super opts
|
|
9
9
|
@base_id = widget.dom_id
|
|
10
10
|
@js_class = opts[:js_class]
|
|
11
11
|
@js_url = opts[:js_url]
|
|
12
|
+
@js_module = opts[:js_module]
|
|
12
13
|
@wopts = opts.dup
|
|
13
|
-
end
|
|
14
|
+
end
|
|
14
15
|
|
|
15
16
|
def content()
|
|
16
17
|
div :id => @base_id, :class => "#{@js_class.gsub('.', '_').downcase}" do
|
|
17
18
|
javascript(%{
|
|
18
|
-
|
|
19
|
-
OML.widgets.#{@base_id} = new
|
|
19
|
+
require(['#@js_module'], function(Graph) {
|
|
20
|
+
var w = OML.widgets.#{@base_id} = new Graph(#{@wopts.to_json});
|
|
21
|
+
var i = 0;
|
|
20
22
|
});
|
|
21
23
|
})
|
|
22
24
|
end
|
|
23
25
|
end
|
|
24
|
-
|
|
26
|
+
|
|
25
27
|
end
|
|
26
28
|
end
|
|
@@ -8,7 +8,8 @@ module OMF::Web::Theme
|
|
|
8
8
|
depends_on :css, "/resource/theme/bright/css/bright.css"
|
|
9
9
|
|
|
10
10
|
depends_on :script, %{
|
|
11
|
-
OML
|
|
11
|
+
if (typeof(OML) == "undefined") OML = {};
|
|
12
|
+
//OML.session_id = '#{Thread.current["sessionID"]}'
|
|
12
13
|
OML.show_widget = function(opts) {
|
|
13
14
|
var prefix = opts.inner_class;
|
|
14
15
|
var index = opts.index;
|
|
@@ -2,22 +2,22 @@ require 'omf-web/theme/abstract_page'
|
|
|
2
2
|
|
|
3
3
|
module OMF::Web::Theme
|
|
4
4
|
class WidgetChrome < Erector::Widget
|
|
5
|
-
|
|
5
|
+
|
|
6
6
|
def initialize(widget, inside_component, opts)
|
|
7
7
|
super opts
|
|
8
8
|
@widget = widget
|
|
9
9
|
@inside_component = inside_component
|
|
10
10
|
@opts = opts
|
|
11
|
-
end
|
|
12
|
-
|
|
11
|
+
end
|
|
12
|
+
|
|
13
13
|
def render_card_body
|
|
14
14
|
rawtext @widget.content.to_html
|
|
15
15
|
end
|
|
16
|
-
|
|
16
|
+
|
|
17
17
|
def content
|
|
18
18
|
render_widget(@widget)
|
|
19
19
|
end
|
|
20
|
-
|
|
20
|
+
|
|
21
21
|
def render_widget(widget)
|
|
22
22
|
wid = "w#{widget.object_id}_c"
|
|
23
23
|
div :class => :widget_container, :id => wid do
|
|
@@ -28,7 +28,7 @@ module OMF::Web::Theme
|
|
|
28
28
|
render_widget_info(widget)
|
|
29
29
|
render_widget_body(widget)
|
|
30
30
|
render_widget_footer(widget)
|
|
31
|
-
end
|
|
31
|
+
end
|
|
32
32
|
end
|
|
33
33
|
end
|
|
34
34
|
|
|
@@ -41,7 +41,7 @@ module OMF::Web::Theme
|
|
|
41
41
|
|
|
42
42
|
def render_tools_menu
|
|
43
43
|
menu = @opts[:menu] || {}
|
|
44
|
-
span :class => 'widget_tools_menu', :style => 'float:right' do
|
|
44
|
+
span :class => 'widget_tools_menu', :style => 'float:right' do
|
|
45
45
|
ol :class => :widget_tools_menu do
|
|
46
46
|
menu.each do |m|
|
|
47
47
|
lopts = {}
|
|
@@ -57,17 +57,19 @@ module OMF::Web::Theme
|
|
|
57
57
|
a :id => "w#{object_id}_info_a", :href => "#" do
|
|
58
58
|
span 'Info' , :class => :widget_tools_menu
|
|
59
59
|
end
|
|
60
|
-
end
|
|
61
|
-
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
62
|
end
|
|
63
|
-
js = menu.map do |m|
|
|
63
|
+
js = menu.map do |m|
|
|
64
64
|
%{
|
|
65
65
|
$('\##{m[:id]}_a').click(function(){
|
|
66
66
|
return #{m[:js_function]}(#{m.to_json});
|
|
67
67
|
});
|
|
68
|
-
}
|
|
68
|
+
}
|
|
69
69
|
end
|
|
70
|
-
javascript
|
|
70
|
+
javascript %{
|
|
71
|
+
#{js.join("\n")}
|
|
72
|
+
}
|
|
71
73
|
end
|
|
72
74
|
|
|
73
75
|
def render_widget_info(widget)
|
|
@@ -75,7 +77,7 @@ module OMF::Web::Theme
|
|
|
75
77
|
wp = "w#{object_id}"
|
|
76
78
|
div :id => "#{wp}_info", :class => 'widget_info', :style => 'display:none' do
|
|
77
79
|
text widget_info
|
|
78
|
-
end
|
|
80
|
+
end
|
|
79
81
|
javascript %{
|
|
80
82
|
$('\##{wp}_info_a').click(function(){
|
|
81
83
|
$('\##{wp}_info').slideToggle("slow");
|
|
@@ -95,7 +97,7 @@ module OMF::Web::Theme
|
|
|
95
97
|
|
|
96
98
|
def render_widget_footer(widget)
|
|
97
99
|
# NOTHING
|
|
98
|
-
end
|
|
100
|
+
end
|
|
99
101
|
|
|
100
102
|
end # class widget
|
|
101
103
|
end # OMF::Web::Theme
|
data/lib/omf-web/theme.rb
CHANGED
data/lib/omf-web/thin/logging.rb
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'omf_base/lobject'
|
|
2
2
|
|
|
3
3
|
module Thin
|
|
4
|
-
# Overwrite thin's logging mix-in to work more nicely
|
|
4
|
+
# Overwrite thin's logging mix-in to work more nicely
|
|
5
5
|
# with log4r
|
|
6
6
|
#
|
|
7
7
|
module Logging
|
|
8
8
|
class << self
|
|
9
9
|
attr_writer :trace, :debug, :silent
|
|
10
|
-
|
|
10
|
+
|
|
11
11
|
def trace?; !@silent && @trace end
|
|
12
12
|
def debug?; !@silent && @debug end
|
|
13
13
|
def silent?; @silent end
|
|
14
14
|
end
|
|
15
|
-
|
|
15
|
+
|
|
16
16
|
# # Global silencer methods
|
|
17
17
|
# def silent
|
|
18
18
|
# Logging.silent?
|
|
@@ -20,33 +20,38 @@ module Thin
|
|
|
20
20
|
# def silent=(value)
|
|
21
21
|
# Logging.silent = value
|
|
22
22
|
# end
|
|
23
|
-
|
|
23
|
+
|
|
24
24
|
# Log a message to the console
|
|
25
25
|
def log(msg)
|
|
26
|
-
(@logger ||= OMF::
|
|
26
|
+
(@logger ||= OMF::Base::LObject.new(self.class)).info(msg)
|
|
27
27
|
end
|
|
28
28
|
module_function :log
|
|
29
29
|
public :log
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
# Log a message to the console if tracing is activated
|
|
32
32
|
def trace(msg=nil)
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
### DO NOT COMMIT!!!! Can't figure out where tracing is switched on
|
|
34
|
+
return
|
|
35
|
+
#####
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
return unless msg
|
|
39
|
+
(@logger ||= OMF::Base::LObject.new(self.class)).debug(msg)
|
|
35
40
|
end
|
|
36
41
|
module_function :trace
|
|
37
42
|
public :trace
|
|
38
|
-
|
|
43
|
+
|
|
39
44
|
# Log a message to the console if debugging is activated
|
|
40
45
|
def debug(msg=nil)
|
|
41
46
|
return unless msg
|
|
42
|
-
(@logger ||= OMF::
|
|
47
|
+
(@logger ||= OMF::Base::LObject.new(self.class)).debug(msg)
|
|
43
48
|
end
|
|
44
49
|
module_function :debug
|
|
45
50
|
public :debug
|
|
46
|
-
|
|
51
|
+
|
|
47
52
|
# Log an error backtrace if debugging is activated
|
|
48
53
|
def log_error(e = $!)
|
|
49
|
-
(@logger ||= OMF::
|
|
54
|
+
(@logger ||= OMF::Base::LObject.new(self.class)).error(e)
|
|
50
55
|
end
|
|
51
56
|
module_function :log_error
|
|
52
57
|
public :log_error
|
data/lib/omf-web/thin/runner.rb
CHANGED
|
@@ -15,7 +15,7 @@ end
|
|
|
15
15
|
|
|
16
16
|
module OMF::Web
|
|
17
17
|
class Runner < Thin::Runner
|
|
18
|
-
include OMF::
|
|
18
|
+
include OMF::Base::Loggable
|
|
19
19
|
|
|
20
20
|
@@instance = nil
|
|
21
21
|
|
|
@@ -89,7 +89,7 @@ module OMF::Web
|
|
|
89
89
|
# Change the name of the root logger so we can apply different logging
|
|
90
90
|
# policies depending on environment.
|
|
91
91
|
#
|
|
92
|
-
OMF::
|
|
92
|
+
OMF::Base::Loggable.set_environment @options[:environment]
|
|
93
93
|
|
|
94
94
|
if css = opts[:include_css]
|
|
95
95
|
require 'omf-web/theme'
|
data/lib/omf-web/thin/server.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
require 'json'
|
|
2
|
-
require '
|
|
2
|
+
require 'omf_base/lobject'
|
|
3
3
|
require 'omf_web'
|
|
4
4
|
|
|
5
5
|
module OMF::Web
|
|
@@ -9,17 +9,16 @@ module OMF::Web
|
|
|
9
9
|
# USAGE:
|
|
10
10
|
#
|
|
11
11
|
#
|
|
12
|
-
class Server < OMF::
|
|
12
|
+
class Server < OMF::Base::LObject
|
|
13
13
|
|
|
14
14
|
def self.start(server_name, description, top_dir, opts = {})
|
|
15
15
|
self.new(server_name, description, top_dir, opts)
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def initialize(server_name, description, top_dir, opts)
|
|
19
|
-
OMF::
|
|
20
|
-
|
|
19
|
+
OMF::Base::Loggable.init_log(server_name)
|
|
20
|
+
#OMF::Base::Loggable.init_log server_name
|
|
21
21
|
opts = {
|
|
22
|
-
static_dirs_pre: ["#{top_dir}/htdocs"],
|
|
23
22
|
handlers: {
|
|
24
23
|
pre_parse: lambda do |p, runner|
|
|
25
24
|
p.on("--config CONF_FILE", "File holding description of web site") {|f| runner.options[:omf_config_file] = f}
|
|
@@ -32,8 +31,10 @@ module OMF::Web
|
|
|
32
31
|
}
|
|
33
32
|
}.merge(opts)
|
|
34
33
|
|
|
34
|
+
@server_name = server_name
|
|
35
35
|
@top_dir = top_dir
|
|
36
36
|
@databases = {}
|
|
37
|
+
@omsp_endpoints = {}
|
|
37
38
|
|
|
38
39
|
OMF::Web.start(opts)
|
|
39
40
|
end
|
|
@@ -49,9 +50,15 @@ module OMF::Web
|
|
|
49
50
|
abort
|
|
50
51
|
end
|
|
51
52
|
|
|
52
|
-
@
|
|
53
|
+
@cfg_dir = File.dirname(cf)
|
|
54
|
+
opts[:static_dirs].insert(0, File.absolute_path(File.join(@cfg_dir, 'htdocs')))
|
|
55
|
+
@top_dir ||= @cfg_dir
|
|
53
56
|
cfg = _rec_sym_keys(YAML.load_file(cf))
|
|
54
57
|
|
|
58
|
+
if log_opts = cfg[:logging]
|
|
59
|
+
# TODO: Deal with custom logging option
|
|
60
|
+
end
|
|
61
|
+
|
|
55
62
|
(cfg[:server] || {}).each do |k, v|
|
|
56
63
|
k = k.to_sym
|
|
57
64
|
case k
|
|
@@ -82,29 +89,41 @@ module OMF::Web
|
|
|
82
89
|
puts "Missing id in datasource configuration"
|
|
83
90
|
abort
|
|
84
91
|
end
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
when 'file'
|
|
92
|
+
if config[:database]
|
|
93
|
+
load_database(id, config)
|
|
94
|
+
elsif config[:file]
|
|
89
95
|
load_datasource_file(id, config)
|
|
96
|
+
elsif config[:omsp]
|
|
97
|
+
load_omsp_endpoint(id, config)
|
|
90
98
|
else
|
|
91
|
-
abort "Unknown datasource type
|
|
99
|
+
abort "Unknown datasource type - #{config}"
|
|
92
100
|
end
|
|
93
101
|
end
|
|
94
102
|
|
|
95
|
-
def load_database(config)
|
|
96
|
-
unless table_name = config[:table]
|
|
97
|
-
puts "Missing 'table' in datasource configuration '#{id}'"
|
|
98
|
-
abort
|
|
99
|
-
end
|
|
103
|
+
def load_database(id, config)
|
|
100
104
|
unless db_cfg = config[:database]
|
|
101
|
-
puts "Missing database configuration in datasource '#{
|
|
105
|
+
puts "Missing database configuration in datasource '#{config}'"
|
|
102
106
|
abort
|
|
103
107
|
end
|
|
104
108
|
db = get_database(db_cfg)
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
109
|
+
if query_s = config[:query]
|
|
110
|
+
unless schema = config[:schema]
|
|
111
|
+
puts "Missing schema configuration in datasource '#{config}'"
|
|
112
|
+
abort
|
|
113
|
+
end
|
|
114
|
+
require 'omf_oml/schema'
|
|
115
|
+
config[:schema] = OMF::OML::OmlSchema.create(schema)
|
|
116
|
+
table = db.create_table(id, config)
|
|
117
|
+
else
|
|
118
|
+
unless table_name = config.delete(:table)
|
|
119
|
+
puts "Missing 'table' in datasource configuration '#{config}'"
|
|
120
|
+
abort
|
|
121
|
+
end
|
|
122
|
+
config[:name] = id
|
|
123
|
+
unless table = db.create_table(table_name, config)
|
|
124
|
+
puts "Can't find table '#{table_name}' in database '#{db_cfg}'"
|
|
125
|
+
abort
|
|
126
|
+
end
|
|
108
127
|
end
|
|
109
128
|
OMF::Web.register_datasource table, name: id
|
|
110
129
|
end
|
|
@@ -120,25 +139,30 @@ module OMF::Web
|
|
|
120
139
|
puts "Database '#{config}' not defined - (#{@databases.keys})"
|
|
121
140
|
abort
|
|
122
141
|
end
|
|
123
|
-
unless id = config
|
|
142
|
+
unless id = config.delete(:id)
|
|
124
143
|
puts "Missing id in database configuration"
|
|
125
144
|
abort
|
|
126
145
|
end
|
|
146
|
+
if db = @databases[id.to_s] # already known
|
|
147
|
+
return db
|
|
148
|
+
end
|
|
149
|
+
|
|
127
150
|
# unless id = config[:id]
|
|
128
151
|
# puts "Database '#{config}' not defined - (#{@databases.keys})"
|
|
129
152
|
# abort
|
|
130
153
|
# end
|
|
131
|
-
unless url = config
|
|
154
|
+
unless url = config.delete(:url)
|
|
132
155
|
puts "Missing URL for database '#{id}'"
|
|
133
156
|
abort
|
|
134
157
|
end
|
|
135
|
-
if url.start_with?('sqlite
|
|
158
|
+
if url.start_with?('sqlite:') && ! url.start_with?('sqlite:/')
|
|
136
159
|
# inject top dir
|
|
137
|
-
url.insert('sqlite
|
|
160
|
+
url.insert('sqlite:'.length, '//' + @cfg_dir + '/')
|
|
138
161
|
end
|
|
139
|
-
|
|
162
|
+
config[:check_interval] ||= 3.0
|
|
163
|
+
puts "URL: #{url} - #{config}"
|
|
140
164
|
begin
|
|
141
|
-
return @databases[id] = OMF::OML::OmlSqlSource.new(url,
|
|
165
|
+
return @databases[id] = OMF::OML::OmlSqlSource.new(url, config)
|
|
142
166
|
rescue Exception => ex
|
|
143
167
|
puts "Can't connect to database '#{id}' - #{ex}"
|
|
144
168
|
abort
|
|
@@ -174,6 +198,17 @@ module OMF::Web
|
|
|
174
198
|
OMF::Web.register_datasource ds, name: name
|
|
175
199
|
end
|
|
176
200
|
|
|
201
|
+
def load_omsp_endpoint(id, config)
|
|
202
|
+
oconfig = config[:omsp]
|
|
203
|
+
unless port = oconfig[:port]
|
|
204
|
+
puts "Need port in OMSP definition '#{oconfig}' - datasource '#{id}'"
|
|
205
|
+
abort
|
|
206
|
+
end
|
|
207
|
+
ep = @omsp_endpoints[port] ||= OmspEndpointProxy.new(port)
|
|
208
|
+
ep.add_datasource(id, config)
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
|
|
177
212
|
def load_repository(config)
|
|
178
213
|
unless id = config[:id]
|
|
179
214
|
puts "Missing id in respository configuration"
|
|
@@ -221,7 +256,7 @@ module OMF::Web
|
|
|
221
256
|
# This class simulates a DataSource to transfer a JSON file as a database with one row and column
|
|
222
257
|
|
|
223
258
|
|
|
224
|
-
class JSONDataSource < OMF::
|
|
259
|
+
class JSONDataSource < OMF::Base::LObject
|
|
225
260
|
|
|
226
261
|
def initialize(file)
|
|
227
262
|
raw = File.read(file)
|
|
@@ -251,5 +286,48 @@ module OMF::Web
|
|
|
251
286
|
# do nothing
|
|
252
287
|
end
|
|
253
288
|
end
|
|
289
|
+
|
|
290
|
+
# This class manages an OMSP Endpoint and all the related
|
|
291
|
+
# data sources
|
|
292
|
+
#
|
|
293
|
+
class OmspEndpointProxy < OMF::Base::LObject
|
|
294
|
+
def initialize(port)
|
|
295
|
+
@streams = {}
|
|
296
|
+
@sources = {}
|
|
297
|
+
@tables = {}
|
|
298
|
+
require 'omf_oml/endpoint'
|
|
299
|
+
@ep = OMF::OML::OmlEndpoint.new(port)
|
|
300
|
+
@ep.on_new_stream() do |name, stream|
|
|
301
|
+
_on_new_stream(name, stream)
|
|
302
|
+
end
|
|
303
|
+
Thread.new do # delay starting up endpoint, can't use EM yet
|
|
304
|
+
sleep 2
|
|
305
|
+
@ep.run(false)
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
def add_datasource(name, config)
|
|
310
|
+
stream_name = config[:omsp][:stream_name] || name
|
|
311
|
+
config.delete(:omsp)
|
|
312
|
+
(@sources[stream_name.to_s] ||= []) << config
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
def _on_new_stream(name, stream)
|
|
316
|
+
debug "New stream: #{name}-#{stream}"
|
|
317
|
+
(@sources[name] || []).each do |tdef|
|
|
318
|
+
puts "TDEF: #{tdef}"
|
|
319
|
+
tname = tdef.dup.delete(:id)
|
|
320
|
+
unless table = @tables[tname]
|
|
321
|
+
table = @tables[tname] = stream.create_table(tname, tdef)
|
|
322
|
+
OMF::Web.register_datasource table
|
|
323
|
+
puts "ADDED: #{table}"
|
|
324
|
+
else
|
|
325
|
+
warn "Looks like reconnection, should reconnect to table as well"
|
|
326
|
+
end
|
|
327
|
+
end
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
end # class OmspEndpointProxy
|
|
331
|
+
|
|
254
332
|
end # class
|
|
255
333
|
end # module
|
data/lib/omf-web/version.rb
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
|
|
2
2
|
require 'erector'
|
|
3
|
-
require '
|
|
3
|
+
require 'omf_base/lobject'
|
|
4
4
|
|
|
5
5
|
module OMF::Web::Widget
|
|
6
6
|
|
|
7
7
|
# Maintains the context for a particular code rendering within a specific session.
|
|
8
8
|
#
|
|
9
9
|
class AbstractWidget < Erector::Widget
|
|
10
|
-
extend OMF::
|
|
11
|
-
include OMF::
|
|
10
|
+
extend OMF::Base::Loggable
|
|
11
|
+
include OMF::Base::Loggable
|
|
12
12
|
|
|
13
13
|
attr_reader :widget_id, :widget_type, :name, :opts
|
|
14
14
|
|
|
@@ -25,6 +25,7 @@ module OMF::Web::Widget
|
|
|
25
25
|
raise "Missing widget option ':viz_type' for widget '#{name}' (#{opts.inspect})"
|
|
26
26
|
end
|
|
27
27
|
name = opts[:name] ||= 'Unknown'
|
|
28
|
+
opts[:js_module] = "graph/#{vizType}"
|
|
28
29
|
opts[:js_url] = "graph/js/#{vizType}.js"
|
|
29
30
|
opts[:js_class] = "OML.#{vizType}"
|
|
30
31
|
opts[:base_el] = "\##{dom_id}"
|