spiderfw 0.5.9 → 0.5.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. data/apps/app_server/_init.rb +8 -0
  2. data/apps/app_server/app_server.rb +60 -0
  3. data/apps/app_server/config/options.rb +2 -0
  4. data/apps/app_server/controllers/app_server_controller.rb +20 -0
  5. data/apps/app_server/lib/app.rb +21 -0
  6. data/apps/app_server/lib/git_app.rb +22 -0
  7. data/apps/app_server/views/app_list.shtml +8 -0
  8. data/apps/app_server/views/app_server.layout.shtml +14 -0
  9. data/apps/cas_server/_init.rb +1 -1
  10. data/apps/config_editor/_init.rb +14 -0
  11. data/apps/config_editor/config_editor.appspec +3 -0
  12. data/apps/config_editor/controllers/config_editor_controller.rb +88 -0
  13. data/apps/config_editor/views/config_editor.layout.shtml +20 -0
  14. data/apps/config_editor/views/index.shtml +23 -0
  15. data/apps/config_editor/widgets/edit/edit.rb +13 -0
  16. data/apps/config_editor/widgets/edit/edit.shtml +4 -0
  17. data/apps/core/auth/models/group.rb +2 -2
  18. data/apps/core/components/public/js/jquery/plugins/jtree/jquery.jtree.1.0.js +187 -0
  19. data/apps/core/components/public/js/jquery/plugins/jtree/jquery.jtree.1.0.min.js +1 -0
  20. data/apps/core/components/public/js/jquery/plugins/jtree/jquery.jtree.spider.1.0.js +193 -0
  21. data/apps/core/components/widgets/table/table.rb +19 -9
  22. data/apps/core/components/widgets/table/table.shtml +2 -2
  23. data/apps/core/forms/widgets/inputs/subform/subform.rb +10 -0
  24. data/apps/core/forms/widgets/inputs/subform/subform.shtml +5 -0
  25. data/apps/hippo/script/converti_strutture.rb +335 -0
  26. data/apps/master/_init.rb +12 -0
  27. data/apps/master/controllers/master_controller.rb +110 -0
  28. data/apps/master/master.appspec +5 -0
  29. data/apps/master/models/customer.rb +13 -0
  30. data/apps/master/models/installation.rb +10 -0
  31. data/apps/master/models/resource.rb +10 -0
  32. data/apps/master/models/servant.rb +25 -0
  33. data/apps/master/views/customer.shtml +20 -0
  34. data/apps/master/views/customers.shtml +10 -0
  35. data/apps/master/views/index.shtml +4 -0
  36. data/apps/master/views/installation.shtml +36 -0
  37. data/apps/master/views/master.layout.shtml +14 -0
  38. data/apps/master/views/servant.shtml +26 -0
  39. data/apps/master/views/servants.shtml +7 -0
  40. data/apps/servant/_init.rb +5 -0
  41. data/apps/servant/bin/spider-servant.rb +47 -0
  42. data/apps/servant/lib/resource.rb +11 -0
  43. data/apps/servant/lib/resources/db/mysql.rb +31 -0
  44. data/apps/servant/lib/resources/db.rb +54 -0
  45. data/apps/servant/lib/servant.rb +82 -0
  46. data/apps/servant/servant.appspec +4 -0
  47. data/apps/servant/var/log/error.log +1 -0
  48. data/apps/worker/worker.rb +1 -1
  49. data/blueprints/install/config.ru +12 -0
  50. data/lib/spiderfw/app.rb +8 -0
  51. data/lib/spiderfw/cmd/cmd.rb +4 -2
  52. data/lib/spiderfw/cmd/commands/content.rb +33 -0
  53. data/lib/spiderfw/cmd/commands/{init.rb → create.rb} +4 -4
  54. data/lib/spiderfw/config/options/spider.rb +4 -0
  55. data/lib/spiderfw/controller/controller.rb +11 -1
  56. data/lib/spiderfw/controller/dispatcher.rb +2 -0
  57. data/lib/spiderfw/controller/home_controller.rb +7 -1
  58. data/lib/spiderfw/controller/mixins/static_content.rb +17 -3
  59. data/lib/spiderfw/controller/mixins/visual.rb +2 -2
  60. data/lib/spiderfw/controller/session.rb +2 -0
  61. data/lib/spiderfw/create.rb +2 -2
  62. data/lib/spiderfw/model/base_model.rb +11 -0
  63. data/lib/spiderfw/model/condition.rb +37 -7
  64. data/lib/spiderfw/model/mappers/db_mapper.rb +67 -71
  65. data/lib/spiderfw/model/mappers/mapper.rb +92 -31
  66. data/lib/spiderfw/model/model.rb +1 -0
  67. data/lib/spiderfw/model/query.rb +1 -3
  68. data/lib/spiderfw/model/query_funcs.rb +51 -0
  69. data/lib/spiderfw/model/storage/db/adapters/oci8.rb +4 -1
  70. data/lib/spiderfw/model/storage/db/db_schema.rb +15 -1
  71. data/lib/spiderfw/model/storage/db/db_storage.rb +8 -2
  72. data/lib/spiderfw/static_content.rb +84 -0
  73. data/lib/spiderfw/utils/monkey/date_time.rb +4 -0
  74. data/lib/spiderfw/utils/monkey/hpricot_compat.rb +0 -0
  75. data/lib/spiderfw/utils/monkey/object.rb +25 -0
  76. data/lib/spiderfw/utils/test_case.rb +24 -0
  77. metadata +54 -24
  78. data/apps/cms/models/content.rb +0 -16
  79. data/apps/cms/models/news_item.rb +0 -7
  80. data/apps/cms/models/translation.rb +0 -14
  81. data/apps/cms/views/admin/admin.shtml +0 -16
  82. data/apps/cms/views/admin/content.shtml +0 -4
  83. data/apps/core/acl/_init.rb +0 -10
  84. data/apps/core/acl/controllers/acl_controller.rb +0 -14
  85. data/apps/core/acl/models/permission.rb +0 -11
  86. data/apps/core/acl/views/acl.layout.shtml +0 -8
  87. data/apps/core/acl/views/index.shtml +0 -3
  88. data/apps/git_model_versioning/models/mixins/git_versioned.rb +0 -91
  89. data/apps/master/controllers/git.rb +0 -32
  90. data/apps/saml/_init.rb +0 -13
  91. data/apps/saml/controllers/saml2idp.rb +0 -18
  92. data/apps/saml/lib/bindings/http_redirect_binding.rb +0 -14
  93. data/apps/saml/lib/messages/authn_request.rb +0 -52
  94. data/apps/saml/lib/saml.rb +0 -10
  95. data/apps/soap/soap.gemspec +0 -10
  96. data/blueprints/model.rb +0 -15
  97. /data/blueprints/{install → home}/config/config.yml +0 -0
  98. /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
- @sort = params['sort'].to_sym
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
- if (@sort)
41
- if (@model.elements[@sort].model?)
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[@sort].model.each_element{ |el| s << "#{@sort}.#{el.name}" if el.type == String && !el.primary_key? }
44
- @sort = s
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
- @sort = session[:sort] if !@sort && session[:sort]
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
- @rows.order_by(*@sort) if @sort
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,10 @@
1
+ module Spider; module Forms
2
+
3
+ class SubForm < Input
4
+ tag 'subform'
5
+
6
+ i_attr_accessor :model
7
+
8
+ end
9
+
10
+ end; end
@@ -0,0 +1,5 @@
1
+ <div>
2
+ <div sp:if="!@value && !@shown">
3
+ Crea nuovo: <input type="checkbox" name="{ @name }[create]" value="true">
4
+ <forms:form id="form" model="@model" />
5
+ </div>
@@ -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'