spiderfw 0.5.9 → 0.5.10
Sign up to get free protection for your applications and to get access to all the features.
- data/apps/app_server/_init.rb +8 -0
- data/apps/app_server/app_server.rb +60 -0
- data/apps/app_server/config/options.rb +2 -0
- data/apps/app_server/controllers/app_server_controller.rb +20 -0
- data/apps/app_server/lib/app.rb +21 -0
- data/apps/app_server/lib/git_app.rb +22 -0
- data/apps/app_server/views/app_list.shtml +8 -0
- data/apps/app_server/views/app_server.layout.shtml +14 -0
- data/apps/cas_server/_init.rb +1 -1
- data/apps/config_editor/_init.rb +14 -0
- data/apps/config_editor/config_editor.appspec +3 -0
- data/apps/config_editor/controllers/config_editor_controller.rb +88 -0
- data/apps/config_editor/views/config_editor.layout.shtml +20 -0
- data/apps/config_editor/views/index.shtml +23 -0
- data/apps/config_editor/widgets/edit/edit.rb +13 -0
- data/apps/config_editor/widgets/edit/edit.shtml +4 -0
- data/apps/core/auth/models/group.rb +2 -2
- data/apps/core/components/public/js/jquery/plugins/jtree/jquery.jtree.1.0.js +187 -0
- data/apps/core/components/public/js/jquery/plugins/jtree/jquery.jtree.1.0.min.js +1 -0
- data/apps/core/components/public/js/jquery/plugins/jtree/jquery.jtree.spider.1.0.js +193 -0
- data/apps/core/components/widgets/table/table.rb +19 -9
- data/apps/core/components/widgets/table/table.shtml +2 -2
- data/apps/core/forms/widgets/inputs/subform/subform.rb +10 -0
- data/apps/core/forms/widgets/inputs/subform/subform.shtml +5 -0
- data/apps/hippo/script/converti_strutture.rb +335 -0
- data/apps/master/_init.rb +12 -0
- data/apps/master/controllers/master_controller.rb +110 -0
- data/apps/master/master.appspec +5 -0
- data/apps/master/models/customer.rb +13 -0
- data/apps/master/models/installation.rb +10 -0
- data/apps/master/models/resource.rb +10 -0
- data/apps/master/models/servant.rb +25 -0
- data/apps/master/views/customer.shtml +20 -0
- data/apps/master/views/customers.shtml +10 -0
- data/apps/master/views/index.shtml +4 -0
- data/apps/master/views/installation.shtml +36 -0
- data/apps/master/views/master.layout.shtml +14 -0
- data/apps/master/views/servant.shtml +26 -0
- data/apps/master/views/servants.shtml +7 -0
- data/apps/servant/_init.rb +5 -0
- data/apps/servant/bin/spider-servant.rb +47 -0
- data/apps/servant/lib/resource.rb +11 -0
- data/apps/servant/lib/resources/db/mysql.rb +31 -0
- data/apps/servant/lib/resources/db.rb +54 -0
- data/apps/servant/lib/servant.rb +82 -0
- data/apps/servant/servant.appspec +4 -0
- data/apps/servant/var/log/error.log +1 -0
- data/apps/worker/worker.rb +1 -1
- data/blueprints/install/config.ru +12 -0
- data/lib/spiderfw/app.rb +8 -0
- data/lib/spiderfw/cmd/cmd.rb +4 -2
- data/lib/spiderfw/cmd/commands/content.rb +33 -0
- data/lib/spiderfw/cmd/commands/{init.rb → create.rb} +4 -4
- data/lib/spiderfw/config/options/spider.rb +4 -0
- data/lib/spiderfw/controller/controller.rb +11 -1
- data/lib/spiderfw/controller/dispatcher.rb +2 -0
- data/lib/spiderfw/controller/home_controller.rb +7 -1
- data/lib/spiderfw/controller/mixins/static_content.rb +17 -3
- data/lib/spiderfw/controller/mixins/visual.rb +2 -2
- data/lib/spiderfw/controller/session.rb +2 -0
- data/lib/spiderfw/create.rb +2 -2
- data/lib/spiderfw/model/base_model.rb +11 -0
- data/lib/spiderfw/model/condition.rb +37 -7
- data/lib/spiderfw/model/mappers/db_mapper.rb +67 -71
- data/lib/spiderfw/model/mappers/mapper.rb +92 -31
- data/lib/spiderfw/model/model.rb +1 -0
- data/lib/spiderfw/model/query.rb +1 -3
- data/lib/spiderfw/model/query_funcs.rb +51 -0
- data/lib/spiderfw/model/storage/db/adapters/oci8.rb +4 -1
- data/lib/spiderfw/model/storage/db/db_schema.rb +15 -1
- data/lib/spiderfw/model/storage/db/db_storage.rb +8 -2
- data/lib/spiderfw/static_content.rb +84 -0
- data/lib/spiderfw/utils/monkey/date_time.rb +4 -0
- data/lib/spiderfw/utils/monkey/hpricot_compat.rb +0 -0
- data/lib/spiderfw/utils/monkey/object.rb +25 -0
- data/lib/spiderfw/utils/test_case.rb +24 -0
- metadata +54 -24
- data/apps/cms/models/content.rb +0 -16
- data/apps/cms/models/news_item.rb +0 -7
- data/apps/cms/models/translation.rb +0 -14
- data/apps/cms/views/admin/admin.shtml +0 -16
- data/apps/cms/views/admin/content.shtml +0 -4
- data/apps/core/acl/_init.rb +0 -10
- data/apps/core/acl/controllers/acl_controller.rb +0 -14
- data/apps/core/acl/models/permission.rb +0 -11
- data/apps/core/acl/views/acl.layout.shtml +0 -8
- data/apps/core/acl/views/index.shtml +0 -3
- data/apps/git_model_versioning/models/mixins/git_versioned.rb +0 -91
- data/apps/master/controllers/git.rb +0 -32
- data/apps/saml/_init.rb +0 -13
- data/apps/saml/controllers/saml2idp.rb +0 -18
- data/apps/saml/lib/bindings/http_redirect_binding.rb +0 -14
- data/apps/saml/lib/messages/authn_request.rb +0 -52
- data/apps/saml/lib/saml.rb +0 -10
- data/apps/soap/soap.gemspec +0 -10
- data/blueprints/model.rb +0 -15
- /data/blueprints/{install → home}/config/config.yml +0 -0
- /data/blueprints/{install → home}/init.rb +0 -0
@@ -0,0 +1,193 @@
|
|
1
|
+
// JavaScript Document
|
2
|
+
(function($) {
|
3
|
+
|
4
|
+
$.fn.jTree = function(options) {
|
5
|
+
var opts = $.extend({}, $.fn.jTree.defaults, options);
|
6
|
+
var cur = 0, curOff = 0, off =0, h =0, w=0, hover = 0;
|
7
|
+
var str='<li class="jTreePlacement" style="background:'+opts.pBg+';border:'+opts.pBorder+';color:'+opts.pColor+';height:'+opts.pHeight+'"></li>';
|
8
|
+
var container = this;
|
9
|
+
$("body").append(str);
|
10
|
+
$(".jTreePlacement").hide();
|
11
|
+
//events are written here
|
12
|
+
$(this).find("li").draggable({
|
13
|
+
start: function(){
|
14
|
+
|
15
|
+
}
|
16
|
+
})
|
17
|
+
$(this).find("li").mousedown(function(e){
|
18
|
+
if ($("#jTreeHelper").is(":not(:animated)") && e.button !=2) {
|
19
|
+
// append jTreePlacement to body and hides
|
20
|
+
|
21
|
+
//get the current li and append to helper
|
22
|
+
$(this).clone().appendTo("#jTreeHelper");
|
23
|
+
|
24
|
+
// get initial state, cur and offset
|
25
|
+
cur = this;
|
26
|
+
curOff = $(cur).offset();
|
27
|
+
$(cur).hide();
|
28
|
+
// show initial helper
|
29
|
+
$("#jTreeHelper").css ({
|
30
|
+
position: "absolute",
|
31
|
+
top: e.pageY + 5,
|
32
|
+
left: e.pageX + 5,
|
33
|
+
background: opts.hBg,
|
34
|
+
opacity: opts.hOpacity
|
35
|
+
}).show();
|
36
|
+
$("#jTreeHelper *").css ({
|
37
|
+
color: opts.hColor,
|
38
|
+
background: opts.hBg
|
39
|
+
});
|
40
|
+
// start binding events to use
|
41
|
+
// prevent text selection
|
42
|
+
$(document).bind("selectstart", doNothing);
|
43
|
+
|
44
|
+
// doubleclick is destructive, better disable
|
45
|
+
$(container).find("li").bind("dblclick", doNothing);
|
46
|
+
|
47
|
+
// in single li calculate the offset, width height of hovered block
|
48
|
+
$(container).find("li").bind("mouseover", getInitial);
|
49
|
+
|
50
|
+
// in single li put placement in correct places, also move the helper around
|
51
|
+
$(container).find("li").bind("mousemove", putPlacement);
|
52
|
+
|
53
|
+
// handle mouse movement outside our container
|
54
|
+
$(document).bind("mousemove", helperPosition);
|
55
|
+
}
|
56
|
+
//prevent bubbling of mousedown
|
57
|
+
return false;
|
58
|
+
});
|
59
|
+
|
60
|
+
// in single li or in container, snap into placement if present then destroy placement
|
61
|
+
// and helper then show snapped in object/li
|
62
|
+
// also destroys events
|
63
|
+
$(this).find("li").andSelf().mouseup(function(e){
|
64
|
+
// if placementBox is detected
|
65
|
+
if ($(".jTreePlacement").is(":visible")) {
|
66
|
+
$(cur).insertBefore(".jTreePlacement").show();
|
67
|
+
}
|
68
|
+
$(cur).show();
|
69
|
+
// remove helper and placement box
|
70
|
+
$(container).find("ul:empty").remove();
|
71
|
+
$("#jTreeHelper").empty().hide();
|
72
|
+
$(".jTreePlacement").remove();
|
73
|
+
|
74
|
+
// remove bindings
|
75
|
+
destroyBindings();
|
76
|
+
|
77
|
+
return false;
|
78
|
+
});
|
79
|
+
|
80
|
+
$(document).mouseup(function(e){
|
81
|
+
if (cur!=0) {
|
82
|
+
$("#jTreeHelper").animate({
|
83
|
+
top: curOff.top,
|
84
|
+
left: curOff.left
|
85
|
+
}, opts.snapBack, function(){
|
86
|
+
$("#jTreeHelper").empty().hide();
|
87
|
+
$(".jTreePlacement").remove();
|
88
|
+
$(cur).show();
|
89
|
+
}
|
90
|
+
);
|
91
|
+
destroyBindings();
|
92
|
+
}
|
93
|
+
cur = 0;
|
94
|
+
return false;
|
95
|
+
});
|
96
|
+
//functions are written here
|
97
|
+
var doNothing = function(){
|
98
|
+
return false;
|
99
|
+
};
|
100
|
+
|
101
|
+
var destroyBindings = function(){
|
102
|
+
$(document).unbind("selectstart", doNothing);
|
103
|
+
$(container).find("li").unbind("dblclick", doNothing);
|
104
|
+
$(container).find("li").unbind("mouseover", getInitial);
|
105
|
+
$(container).find("li").unbind("mousemove", putPlacement);
|
106
|
+
$(document).unbind("mousemove", helperPosition);
|
107
|
+
};
|
108
|
+
|
109
|
+
var helperPosition = function(e) {
|
110
|
+
$("#jTreeHelper").css ({
|
111
|
+
top: e.pageY + 5,
|
112
|
+
left: e.pageX + 5
|
113
|
+
});
|
114
|
+
|
115
|
+
$(".jTreePlacement").remove();
|
116
|
+
};
|
117
|
+
|
118
|
+
var getInitial = function(e){
|
119
|
+
off = $(this).offset();
|
120
|
+
h = $(this).height();
|
121
|
+
w = $(this).width();
|
122
|
+
hover = this;
|
123
|
+
return false;
|
124
|
+
};
|
125
|
+
|
126
|
+
var putPlacement = function(e){
|
127
|
+
$(cur).hide();
|
128
|
+
$("#jTreeHelper").css ({
|
129
|
+
top: e.pageY + 5,
|
130
|
+
left: e.pageX + 5
|
131
|
+
});
|
132
|
+
|
133
|
+
//inserting before
|
134
|
+
if ( e.pageY >= off.top && e.pageY < (off.top + h/2 - 1) ) {
|
135
|
+
if (!$(this).prev().hasClass("jTreePlacement")) {
|
136
|
+
$(".jTreePlacement").remove();
|
137
|
+
$(this).before(str);
|
138
|
+
}
|
139
|
+
}
|
140
|
+
//inserting after
|
141
|
+
else if (e.pageY >(off.top + h/2) && e.pageY <= (off.top + h) ) {
|
142
|
+
// as a sibling
|
143
|
+
if (e.pageY > off.left && e.pageX < off.left + opts.childOff) {
|
144
|
+
if (!$(this).next().hasClass("jTreePlacement")) {
|
145
|
+
$(".jTreePlacement").remove();
|
146
|
+
$(this).after(str);
|
147
|
+
}
|
148
|
+
}
|
149
|
+
// as a child
|
150
|
+
else if (e.pageX > off.left + opts.childOff) {
|
151
|
+
|
152
|
+
$(".jTreePlacement").remove();
|
153
|
+
if ($(this).find("ul").length == 0)
|
154
|
+
$(this).append('<ul>'+str+'</ul>');
|
155
|
+
else
|
156
|
+
$(this).find("ul").prepend(str);
|
157
|
+
}
|
158
|
+
}
|
159
|
+
return false;
|
160
|
+
};
|
161
|
+
|
162
|
+
var lockIn = function(e) {
|
163
|
+
// if placement box is present, insert before placement box
|
164
|
+
if ($(".jTreePlacement").length==1) {
|
165
|
+
$(cur).insertBefore(".jTreePlacement");
|
166
|
+
}
|
167
|
+
$(cur).show();
|
168
|
+
|
169
|
+
// remove helper and placement box
|
170
|
+
$("#jTreeHelper").empty().hide();
|
171
|
+
|
172
|
+
$(".jTreePlacement").remove();;
|
173
|
+
};
|
174
|
+
|
175
|
+
}; // end jTree
|
176
|
+
|
177
|
+
|
178
|
+
$.fn.jTree.defaults = {
|
179
|
+
showHelper: false,
|
180
|
+
hOpacity: 0.5,
|
181
|
+
hBg: "#FCC",
|
182
|
+
hColor: "#222",
|
183
|
+
pBorder: "1px dashed #CCC",
|
184
|
+
pBg: "#EEE",
|
185
|
+
pColor: "#222",
|
186
|
+
pHeight: "20px",
|
187
|
+
childOff: 20,
|
188
|
+
snapBack: 1000
|
189
|
+
};
|
190
|
+
|
191
|
+
})(jQuery);
|
192
|
+
|
193
|
+
|
@@ -28,7 +28,8 @@ module Spider; module Components
|
|
28
28
|
def prepare(action='')
|
29
29
|
@model ||= @queryset.model
|
30
30
|
if params['sort']
|
31
|
-
@
|
31
|
+
@sort_el = params['sort'].keys.first.to_sym
|
32
|
+
@sort_dir = params['sort'].values.first.to_sym
|
32
33
|
@page = 1
|
33
34
|
end
|
34
35
|
if (@attributes[:paginate])
|
@@ -37,16 +38,21 @@ module Spider; module Components
|
|
37
38
|
@page = @page.to_i
|
38
39
|
@offset = ((@page - 1) * @attributes[:row_limit])
|
39
40
|
end
|
40
|
-
|
41
|
-
|
41
|
+
@sort_el, @sort_dir = session[:sort] if !@sort_el && session[:sort]
|
42
|
+
session[:sort] = [@sort_el, @sort_dir] if @sort_el
|
43
|
+
@scene.sorted = {}
|
44
|
+
@scene.sorted[@sort_el] = @sort_dir if @sort_el
|
45
|
+
if (@sort_el)
|
46
|
+
if (@model.elements[@sort_el].model?)
|
42
47
|
s = []
|
43
|
-
@model.elements[@
|
44
|
-
@
|
48
|
+
element = @model.elements[@sort_el]
|
49
|
+
@model.elements[@sort_el].model.each_element do |el|
|
50
|
+
s << "#{@sort_el}.#{el.name}" if (el.type == String && !el.primary_key? && element.model.mapper.mapped?(el) )
|
51
|
+
end
|
52
|
+
@sort_el = s
|
45
53
|
end
|
46
54
|
end
|
47
|
-
@
|
48
|
-
session[:sort] = @sort if @sort
|
49
|
-
@sort = [@sort] if @sort && !@sort.is_a?(Array)
|
55
|
+
@sort_el = [@sort_el] if @sort_el && !@sort_el.is_a?(Array)
|
50
56
|
@scene.link_el = @attributes[:link_el]
|
51
57
|
@scene.link = @attributes[:link]
|
52
58
|
super
|
@@ -86,7 +92,11 @@ module Spider; module Components
|
|
86
92
|
@scene.paginate_first = [@page-5, 1].max
|
87
93
|
@scene.paginate = true
|
88
94
|
end
|
89
|
-
|
95
|
+
if @sort_el
|
96
|
+
@sort_el.each do |el|
|
97
|
+
@rows.order_by(el, @sort_dir)
|
98
|
+
end
|
99
|
+
end
|
90
100
|
@rows.load
|
91
101
|
@scene.rows = prepare_rows(@rows)
|
92
102
|
@scene.data = @rows
|
@@ -7,8 +7,8 @@
|
|
7
7
|
<table sp:if="@rows && @rows.length > 0" class="{ @widget[:css_class] }">
|
8
8
|
<thead>
|
9
9
|
<tr class="heading_row">
|
10
|
-
<th sp:each="@elements |element|">
|
11
|
-
<a sp:tag-if="@sortable[element]" href="{ @request[:path] }?_w{ @widget[:param] }[sort]={ element }">
|
10
|
+
<th sp:each="@elements |element|" class="{ (@sorted[element] ? 'sorted-'+@sorted[element].to_s : '') }">
|
11
|
+
<a sp:tag-if="@sortable[element]" href="{ @request[:path] }?_w{ @widget[:param] }[sort][{ element }]={ @sorted[element] == :asc ? 'desc' : 'asc' }">
|
12
12
|
{ @labels[element] }
|
13
13
|
</a>
|
14
14
|
</th>
|
@@ -0,0 +1,335 @@
|
|
1
|
+
require 'spiderfw'
|
2
|
+
require 'optparse'
|
3
|
+
require 'ostruct'
|
4
|
+
require 'rexml/document'
|
5
|
+
require 'iconv'
|
6
|
+
require 'tsort'
|
7
|
+
|
8
|
+
|
9
|
+
|
10
|
+
class ConvertiStrutture
|
11
|
+
include TSort
|
12
|
+
|
13
|
+
def tsort_each_node(&block)
|
14
|
+
@structs.each_key(&block)
|
15
|
+
end
|
16
|
+
|
17
|
+
def tsort_each_child(node, &block)
|
18
|
+
$stdout << "Doing #{node}\n"
|
19
|
+
return unless @structs[node]
|
20
|
+
return unless @structs[node][:dipendenze]
|
21
|
+
@structs[node][:dipendenze].each(&block)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.base_types
|
25
|
+
{
|
26
|
+
'text' => String,
|
27
|
+
'longText' => Spider::DataTypes::Text,
|
28
|
+
'dateTime' => DateTime,
|
29
|
+
'int' => Fixnum,
|
30
|
+
'order' => Fixnum,
|
31
|
+
'bool' => Spider::DataTypes::Bool,
|
32
|
+
'real' => Float,
|
33
|
+
'password' => Spider::DataTypes::Password,
|
34
|
+
'money' => Float,
|
35
|
+
'file' => String,
|
36
|
+
'html' => Spider::DataTypes::Text,
|
37
|
+
'richText' => Spider::DataTypes::Text
|
38
|
+
}
|
39
|
+
end
|
40
|
+
|
41
|
+
def initialize
|
42
|
+
@ns_mappings = {}
|
43
|
+
@ic = Iconv.new('UTF-8//IGNORE', 'UTF-8')
|
44
|
+
end
|
45
|
+
|
46
|
+
def parse_arguments(args)
|
47
|
+
opts = OptionParser.new
|
48
|
+
opts.on('-n', '--namespace NS_MAP') { |val|
|
49
|
+
ns, app = val.split('=')
|
50
|
+
@ns_mappings[ns] = app
|
51
|
+
}
|
52
|
+
opts.parse!(args)
|
53
|
+
@cartella_destinazione = args.pop.sub(/\/+$/, '') unless args.empty?
|
54
|
+
@applicazione = args.pop
|
55
|
+
list_cartelle_origine = args.pop
|
56
|
+
unless @cartella_destinazione && @applicazione && list_cartelle_origine
|
57
|
+
output_usage
|
58
|
+
exit 0
|
59
|
+
end
|
60
|
+
@cartelle_origine = list_cartelle_origine.split(',')
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
def output_usage
|
65
|
+
puts "Uso: converti_strutture.rb cartella_origine ModuleDestinazione cartella_destinazione\n\n"
|
66
|
+
end
|
67
|
+
|
68
|
+
def run
|
69
|
+
@structs = {}
|
70
|
+
@cartelle_origine.each do |cartella_origine|
|
71
|
+
$stderr << "Cartella #{cartella_origine}\n"
|
72
|
+
cartella_origine.sub!(/\/+$/, '')
|
73
|
+
Dir.new(cartella_origine).each do |entry|
|
74
|
+
next if entry[0].chr == '.'
|
75
|
+
next unless entry =~ /\.xml$/
|
76
|
+
$stderr << "Parsing #{cartella_origine+'/'+entry}\n"
|
77
|
+
str = parse_struct(cartella_origine+'/'+entry, File.basename(File.dirname(cartella_origine)))
|
78
|
+
@structs[str[:name]] = str
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# res = tsort
|
83
|
+
@structs.each do |name, str|
|
84
|
+
str[:elements].each do |el_name, el|
|
85
|
+
Spider::Logger.debug(el)
|
86
|
+
str[:requires] << struct_file_name(el[:type]) unless el[:type].is_a?(Hash) || self.class.base_types[el[:type]]
|
87
|
+
end
|
88
|
+
if str[:extends]
|
89
|
+
str[:requires] << struct_file_name(str[:extends])
|
90
|
+
end
|
91
|
+
write_struct(str)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def write_struct(struct)
|
96
|
+
struct[:name] = struct[:name][1..-1] if struct[:name][0].chr == '_'
|
97
|
+
name = struct[:name]
|
98
|
+
if name =~ /(.+)::(.+)$/
|
99
|
+
name = $2
|
100
|
+
ns = $1
|
101
|
+
end
|
102
|
+
model_name = Spider::Inflector.camelize(name)
|
103
|
+
|
104
|
+
code = ""
|
105
|
+
struct[:requires].uniq!
|
106
|
+
Spider::Logger.debug("REQUIRES:")
|
107
|
+
Spider::Logger.debug(struct[:requires])
|
108
|
+
struct[:requires].each do |req|
|
109
|
+
if (req =~ /(.+)\/(.+)/)
|
110
|
+
dest = "#{@cartella_destinazione}/#{$2}"
|
111
|
+
else
|
112
|
+
dest = "apps/hippo/models/#{req}"
|
113
|
+
end
|
114
|
+
code += "require '#{dest}'\n"
|
115
|
+
end
|
116
|
+
code += "\n" if struct[:requires].length > 0
|
117
|
+
code += "module #{@applicazione}\n"
|
118
|
+
superclass = struct[:data] ? 'Spider::Model::InlineModel' : 'Spider::Model::Managed'
|
119
|
+
code += " class #{model_name} < #{superclass}\n"
|
120
|
+
code += " include Hippo::HippoStruct\n"
|
121
|
+
if (struct[:extends])
|
122
|
+
code += " extend_model #{convert_type(struct[:extends])}\n"
|
123
|
+
end
|
124
|
+
code += "\n"
|
125
|
+
# code += " define_elements do\n"
|
126
|
+
struct[:elements_order].each do |el|
|
127
|
+
next unless struct[:elements][el[:name]]
|
128
|
+
code += write_element(el, " ")
|
129
|
+
end
|
130
|
+
# code += " end\n"
|
131
|
+
code += "\n"
|
132
|
+
if struct[:binding]
|
133
|
+
code += " use_storage 'hippo'\n"
|
134
|
+
code += " binding (#{struct[:binding].inspect})\n"
|
135
|
+
end
|
136
|
+
code += " data (#{struct[:data].inspect})\n" if struct[:data]
|
137
|
+
code += " end\n"
|
138
|
+
code += "end\n"
|
139
|
+
model_name = $1 if (model_name =~ /::(.+)$/)
|
140
|
+
file_name = Spider::Inflector.underscore(model_name)+'.rb'
|
141
|
+
File.open(@cartella_destinazione+'/'+file_name, 'w') do |f|
|
142
|
+
f << code
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def write_element(el, ws)
|
147
|
+
code = ws
|
148
|
+
type = convert_type(el[:type])
|
149
|
+
#type = ":\"#{type}\"" unless el[:type].is_a?(Hash) || self.class.base_types[el[:type]]
|
150
|
+
code += "element :#{convert_element_name(el[:name])}, #{type}"
|
151
|
+
code += ", :required => true" if (el[:required])
|
152
|
+
code += ", :multiple => true" if (el[:multiple])
|
153
|
+
code += ", :label => #{el[:label].inspect}" if (el[:label] && !el[:label].empty?)
|
154
|
+
code += ", :add_multiple_reverse => :#{el[:add_multiple_reverse]}" if el[:add_multiple_reverse]
|
155
|
+
code += ", :add_reverse => :#{el[:add_reverse]}" if el[:add_reverse]
|
156
|
+
if (el[:extend])
|
157
|
+
code += " do\n"
|
158
|
+
el[:extend].each do |ext|
|
159
|
+
code += write_element(ext, ws+" ")
|
160
|
+
end
|
161
|
+
code += ws+"end\n"
|
162
|
+
else
|
163
|
+
code += "\n"
|
164
|
+
end
|
165
|
+
return code
|
166
|
+
end
|
167
|
+
|
168
|
+
def parse_struct(struct_path, namespace='base')
|
169
|
+
file = File.new(struct_path)
|
170
|
+
xml = REXML::Document.new(file)
|
171
|
+
struct = {
|
172
|
+
:name => namespace+'::'+xml.root.attributes['name'],
|
173
|
+
:elements => {},
|
174
|
+
:elements_order => [],
|
175
|
+
:requires => [],
|
176
|
+
:dipendenze => []
|
177
|
+
}
|
178
|
+
xml.root.elements.each do |el|
|
179
|
+
type = el.attributes['type']
|
180
|
+
case el.name
|
181
|
+
when 'element'
|
182
|
+
el_hash = parse_element(el)
|
183
|
+
struct[:elements][el_hash[:name]] = el_hash
|
184
|
+
struct[:elements_order].push(el_hash)
|
185
|
+
unless type == 'inline' || self.class.base_types[type] || type == struct[:name]
|
186
|
+
dip_type = el.attributes['type']
|
187
|
+
found = false
|
188
|
+
if (@structs[dip_type])
|
189
|
+
@structs[dip_type][:elements].values.each do |oth_struct_el|
|
190
|
+
if (oth_struct_el[:type] == struct[:name])
|
191
|
+
found = oth_struct_el
|
192
|
+
break
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
if (found)
|
197
|
+
if (found[:extend]) # choose theirs
|
198
|
+
struct[:elements].delete(el_hash[:name])
|
199
|
+
if (el_hash[:multiple])
|
200
|
+
found[:add_multiple_reverse] = el_hash[:name]
|
201
|
+
else
|
202
|
+
found[:add_reverse] = el_hash[:name]
|
203
|
+
end
|
204
|
+
else
|
205
|
+
@structs[dip_type][:elements].delete(found[:name])
|
206
|
+
if (found[:multiple])
|
207
|
+
el_hash[:add_multiple_reverse] = found[:name]
|
208
|
+
else
|
209
|
+
el_hash[:add_reverse] = found[:name]
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
214
|
+
when 'extends'
|
215
|
+
struct[:extends] = el.text
|
216
|
+
when 'extend'
|
217
|
+
element_name = el.attributes['element']
|
218
|
+
struct[:elements][element_name][:extend] = []
|
219
|
+
el.elements.each do |ext_el|
|
220
|
+
struct[:elements][element_name][:extend] << parse_element(ext_el)
|
221
|
+
end
|
222
|
+
when 'data'
|
223
|
+
h = {}
|
224
|
+
el.elements.each do |row|
|
225
|
+
k = row.elements[1].text
|
226
|
+
k = k.to_i if k =~ /^\d+$/
|
227
|
+
h[k] = @ic.iconv(row.elements[2].text)
|
228
|
+
end
|
229
|
+
struct[:data] = h
|
230
|
+
end
|
231
|
+
end
|
232
|
+
struct[:binding] = parse_binding(struct_path)
|
233
|
+
return struct
|
234
|
+
end
|
235
|
+
|
236
|
+
def parse_binding(struct_path)
|
237
|
+
struct_name = File.basename(struct_path, 'xml')[0..-2]
|
238
|
+
folder = File.dirname(struct_path)
|
239
|
+
binding_file = folder+'/bindings/'+struct_name+'-db.xml'
|
240
|
+
return nil unless File.exist?(binding_file)
|
241
|
+
f = File.new(binding_file)
|
242
|
+
xml = REXML::Document.new(f)
|
243
|
+
#return nil if xml.root.attributes['autogen']
|
244
|
+
binding = {
|
245
|
+
:table => xml.elements['binding/table'][0].to_s,
|
246
|
+
:elements => {}
|
247
|
+
}
|
248
|
+
xml.elements.each('binding/bind') do |el|
|
249
|
+
el_name = convert_element_name(el.attributes['element'])
|
250
|
+
binding[:elements][el_name] = {:field => el.attributes['dbField']}
|
251
|
+
end
|
252
|
+
xml.elements.each('binding/mmbind') do |el|
|
253
|
+
el_name = convert_element_name(el.attributes['element'])
|
254
|
+
binding[:elements][el_name] = {
|
255
|
+
:type => 'mmbind',
|
256
|
+
:table => el.attributes['table'],
|
257
|
+
:local_id => el.attributes['local_id'],
|
258
|
+
:remote_id => el.attributes['remote_id']
|
259
|
+
}
|
260
|
+
end
|
261
|
+
xml.elements.each('binding/parentRef') do |el|
|
262
|
+
binding[:parent_ref] = {
|
263
|
+
:struct => el.attributes['struct'],
|
264
|
+
:table => el.attributes['table'],
|
265
|
+
:child_id => el.attributes['child_id'],
|
266
|
+
:parent_id => el.attributes['parent_id']
|
267
|
+
}
|
268
|
+
end
|
269
|
+
return binding
|
270
|
+
end
|
271
|
+
|
272
|
+
|
273
|
+
|
274
|
+
def parse_element(xml_element)
|
275
|
+
type = xml_element.attributes['type']
|
276
|
+
if (type == 'inline')
|
277
|
+
h = {}
|
278
|
+
xml_element.elements['data'].elements.each do |row|
|
279
|
+
k = row.elements[1].text
|
280
|
+
k = k.to_i if k =~ /^\d+$/
|
281
|
+
h[k] = row.elements[2].text
|
282
|
+
end
|
283
|
+
type = h
|
284
|
+
end
|
285
|
+
el = {
|
286
|
+
:name => xml_element.attributes['name'],
|
287
|
+
:type => type,
|
288
|
+
:required => xml_element.attributes['required'],
|
289
|
+
:label => @ic.iconv(xml_element.attributes['label']),
|
290
|
+
:multiple => xml_element.attributes['maxOccurs'] ? true : false
|
291
|
+
}
|
292
|
+
end
|
293
|
+
|
294
|
+
def convert_element_name(name)
|
295
|
+
return Spider::Inflector.underscore(name)
|
296
|
+
end
|
297
|
+
|
298
|
+
def struct_file_name(struct)
|
299
|
+
struct = struct[1..-1] if struct[0].chr == '_'
|
300
|
+
#struct = $1 if struct =~ /::(.+)$/
|
301
|
+
model_name = Spider::Inflector.camelize(struct)
|
302
|
+
file_name = Spider::Inflector.underscore(model_name)+'.rb'
|
303
|
+
end
|
304
|
+
|
305
|
+
|
306
|
+
def convert_type(type)
|
307
|
+
return type.inspect if (type.is_a?(Hash))
|
308
|
+
|
309
|
+
return self.class.base_types[type] if (self.class.base_types[type])
|
310
|
+
return convert_struct_name(type)
|
311
|
+
end
|
312
|
+
|
313
|
+
def convert_struct_name(struct_name)
|
314
|
+
ns, local = struct_name.split('::')
|
315
|
+
unless local
|
316
|
+
local = ns
|
317
|
+
ns = 'hippo'
|
318
|
+
end
|
319
|
+
local = local[1..-1] if local[0].chr == '_'
|
320
|
+
if @ns_mappings[ns]
|
321
|
+
app = @ns_mappings[ns]
|
322
|
+
else
|
323
|
+
app = Spider::Inflector.camelize(ns)
|
324
|
+
end
|
325
|
+
model_name = Spider::Inflector.camelize(local)
|
326
|
+
return "#{app}::#{model_name}"
|
327
|
+
end
|
328
|
+
|
329
|
+
|
330
|
+
end
|
331
|
+
|
332
|
+
|
333
|
+
conv = ConvertiStrutture.new
|
334
|
+
conv.parse_arguments(ARGV)
|
335
|
+
conv.run
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Spider
|
2
|
+
module Master
|
3
|
+
include Spider::App
|
4
|
+
@controller = :MasterController
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
require 'apps/master/models/customer'
|
10
|
+
require 'apps/master/models/servant'
|
11
|
+
require 'apps/master/controllers/master_controller'
|
12
|
+
require 'apps/app_server/app_server'
|