mappum 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/java-api/pom.xml +1 -1
- data/java-api/src/main/java/pl/ivmx/mappum/JavaMappumException.java +151 -0
- data/java-api/src/main/java/pl/ivmx/mappum/JavaTransform.java +36 -4
- data/java-api/src/main/java/pl/ivmx/mappum/TreeElement.java +1 -1
- data/java-api/src/test/java/iv/Client.java +8 -6
- data/java-api/src/test/java/pl/ivmx/mappum/MappumTest.java +84 -6
- data/java-api/src/test/resources/map/error_map.rb +17 -0
- data/java-api/src/test/resources/map/example_map.rb +5 -3
- data/lib/mappum/dsl.rb +37 -17
- data/lib/mappum/java_transform.rb +62 -9
- data/lib/mappum/map.rb +18 -8
- data/lib/mappum/map_space.rb +11 -0
- data/lib/mappum/mappum_exception.rb +14 -6
- data/lib/mappum/mapserver/mapgraph.rb +1 -1
- data/lib/mappum/mapserver/mapserver.rb +32 -25
- data/lib/mappum/mapserver/views/main.erb +1 -0
- data/lib/mappum/ruby_transform.rb +132 -80
- data/lib/mappum/xml_transform.rb +36 -10
- data/mappum.gemspec +9 -3
- data/sample/crm.rb +1 -1
- data/sample/crm_client.xsd +1 -0
- data/sample/erp.rb +1 -1
- data/sample/example_context.rb +89 -0
- data/sample/example_map.rb +4 -1
- data/sample/server/schema/crm_client.xsd +1 -0
- data/test/test_context.rb +58 -0
- data/test/test_example.rb +7 -3
- data/test/test_openstruct.rb +2 -2
- data/test/test_soap4r.rb +6 -3
- data/test/test_xml_any.rb +6 -2
- metadata +8 -2
data/lib/mappum/dsl.rb
CHANGED
@@ -19,10 +19,10 @@ module Mappum
|
|
19
19
|
def self.parse_caller(at)
|
20
20
|
if /^(.+?):(\d+)(?::in `(.*)')?/ =~ at
|
21
21
|
file = Regexp.last_match[1]
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
line = Regexp.last_match[2].to_i
|
23
|
+
method = Regexp.last_match[3]
|
24
|
+
[file, line, method]
|
25
|
+
end
|
26
26
|
end
|
27
27
|
class Map
|
28
28
|
attr_accessor :def
|
@@ -91,7 +91,7 @@ module Mappum
|
|
91
91
|
#
|
92
92
|
# Add comment to mapping.
|
93
93
|
#
|
94
|
-
def `(str)
|
94
|
+
def `(str) #for bad colorizers add:```
|
95
95
|
@comment ||= ""
|
96
96
|
@comment += str
|
97
97
|
end
|
@@ -126,8 +126,15 @@ module Mappum
|
|
126
126
|
def func
|
127
127
|
Mappum::DSL::Function.new
|
128
128
|
end
|
129
|
+
def const(cst)
|
130
|
+
Mappum::DSL::Constant.new(cst)
|
131
|
+
end
|
129
132
|
def tree(clazz)
|
130
|
-
return Field.new(nil, nil, clazz)
|
133
|
+
return Mappum::DSL::Field.new(nil, nil, clazz)
|
134
|
+
end
|
135
|
+
def context
|
136
|
+
fld = Mappum::DSL::Context.new
|
137
|
+
return fld
|
131
138
|
end
|
132
139
|
end
|
133
140
|
class RootMap < Map
|
@@ -205,7 +212,7 @@ module Mappum
|
|
205
212
|
end
|
206
213
|
@def.submap_alias = attr[0][1][:map] if attr[0].size > type_size
|
207
214
|
|
208
|
-
end
|
215
|
+
end
|
209
216
|
end
|
210
217
|
#Base class for all mapped elements eg. fields, constants
|
211
218
|
class Mappet
|
@@ -241,12 +248,10 @@ module Mappum
|
|
241
248
|
|
242
249
|
class Field < Mappet
|
243
250
|
def initialize(parent, name, clazz, placeholder = false, src_ref = nil)
|
244
|
-
@def
|
251
|
+
@def ||= Mappum::Field.new
|
245
252
|
@def.parent = parent
|
246
253
|
@def.name = name
|
247
254
|
@def.clazz = clazz
|
248
|
-
@def.is_array = false
|
249
|
-
@def.is_root = false
|
250
255
|
@def.is_root = false
|
251
256
|
@def.is_placeholder = placeholder
|
252
257
|
@def.src_ref = src_ref
|
@@ -279,19 +284,28 @@ module Mappum
|
|
279
284
|
if symbol == :[]
|
280
285
|
#empty [] is just indication that field is an array not function
|
281
286
|
if args.size == 0
|
282
|
-
@def.
|
287
|
+
@def.enum_type = Array
|
283
288
|
return self
|
284
289
|
end
|
285
|
-
#[n] indicates both mapping function and
|
286
|
-
if args.size == 1
|
287
|
-
@def.
|
290
|
+
#[n] indicates both mapping function and Hash
|
291
|
+
if args.size == 1
|
292
|
+
@def.enum_type = Hash
|
288
293
|
end
|
289
294
|
end
|
290
|
-
#this functions also indicate
|
295
|
+
#this functions also indicate enumerable -> element
|
291
296
|
if symbol == :find or symbol == :detect or symbol == :select
|
292
|
-
@def.
|
297
|
+
@def.enum_type = Array
|
298
|
+
end
|
299
|
+
arguments = args.clone.collect do |a|
|
300
|
+
ret = nil
|
301
|
+
if a.kind_of? Symbol
|
302
|
+
ret = ":'#{a}'"
|
303
|
+
elsif a.kind_of? String
|
304
|
+
ret = "'#{a}'"
|
305
|
+
else
|
306
|
+
ret = a
|
307
|
+
end
|
293
308
|
end
|
294
|
-
arguments = args.clone
|
295
309
|
unless block.nil?
|
296
310
|
arguments << "&mappum_block"
|
297
311
|
@def.block = block
|
@@ -304,5 +318,11 @@ module Mappum
|
|
304
318
|
return self
|
305
319
|
end
|
306
320
|
end
|
321
|
+
class Context < Field
|
322
|
+
def initialize
|
323
|
+
@def = Mappum::Context.new
|
324
|
+
@def.is_root
|
325
|
+
end
|
326
|
+
end
|
307
327
|
end
|
308
328
|
end
|
@@ -10,25 +10,78 @@ module Mappum
|
|
10
10
|
def initialize(*args)
|
11
11
|
super(*args)
|
12
12
|
end
|
13
|
-
|
13
|
+
def transform(from, map=nil, to=nil, options={})
|
14
|
+
begin
|
15
|
+
if map.kind_of?(Java::JavaUtil::Map)
|
16
|
+
options = map
|
17
|
+
map = nil
|
18
|
+
end
|
19
|
+
super(from, map, to, options)
|
20
|
+
rescue MappumException => me
|
21
|
+
jme = Java::pl::ivmx::mappum::JavaMappumException.new(me)
|
22
|
+
jme.from_name = me.from_name
|
23
|
+
jme.to_name = me.to_name
|
24
|
+
jme.from = me.from
|
25
|
+
jme.to = me.to
|
26
|
+
jme.from_root = me.from_root
|
27
|
+
jme.to_root = me.to_root
|
28
|
+
jme.mappum_backtrace = me.mappum_backtrace
|
29
|
+
|
30
|
+
raise jme
|
31
|
+
end
|
32
|
+
end
|
14
33
|
protected
|
34
|
+
def is_array?(obj)
|
35
|
+
return (obj.kind_of?(Array) or obj.kind_of?(ArrayJavaProxy) or obj.kind_of?(Set) or obj.kind_of?(Java::JavaUtil::Set))
|
36
|
+
end
|
15
37
|
|
16
|
-
def convert_to (to, field_def)
|
17
|
-
if to.kind_of? Array then
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
38
|
+
def convert_to (to, field_def, parent)
|
39
|
+
if to.kind_of? Array or to.kind_of? Hash or to.kind_of? Set then
|
40
|
+
param_type = nil
|
41
|
+
unless parent.nil?
|
42
|
+
jclass = parent.java_class
|
43
|
+
unless jclass.nil?
|
44
|
+
jmethod = jclass.declared_method_smart "set#{classify(field_def.name.to_s)}".to_sym
|
45
|
+
param_type = jmethod.parameter_types[0]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
if (param_type.nil? and to.kind_of? Array) or (not param_type.nil? and param_type.array?)
|
49
|
+
jtype = field_def.clazz
|
50
|
+
jtype ||= "String"
|
51
|
+
return to.to_java(jtype)
|
52
|
+
elsif (param_type.nil? and to.kind_of? Set) or (not param_type.nil? and param_type <= java.util.Set.java_class)
|
53
|
+
jset = java.util.LinkedHashSet.new to
|
54
|
+
unless param_type.class.kind_of? Module
|
55
|
+
jset = param_type.new to
|
56
|
+
end
|
57
|
+
return jset
|
58
|
+
elsif (param_type.nil? and to.kind_of? Hash) or (not param_type.nil? and param_type <= java.util.Map.java_class)
|
59
|
+
jmap = java.util.LinkedHashMap.new
|
60
|
+
unless param_type.class.kind_of? Module
|
61
|
+
jmap = param_type.new
|
62
|
+
end
|
63
|
+
jmap.put_all to
|
64
|
+
return jmap
|
65
|
+
else
|
66
|
+
raise "#{param_type} of enumerable not supported"
|
67
|
+
end
|
68
|
+
else
|
22
69
|
return to
|
23
70
|
end
|
24
71
|
end
|
25
72
|
def convert_from (from, field_def)
|
26
|
-
if from.kind_of?
|
73
|
+
if from.kind_of?(ArrayJavaProxy) then
|
27
74
|
return from.to_ary
|
28
|
-
|
75
|
+
elsif from.kind_of?(Java::JavaUtil::Set) then
|
76
|
+
return from.to_a
|
77
|
+
else
|
29
78
|
return from
|
30
79
|
end
|
31
80
|
end
|
81
|
+
private
|
82
|
+
def classify(string)
|
83
|
+
return string.gsub(/(^|_)(.)/) { $2.upcase }
|
84
|
+
end
|
32
85
|
end
|
33
86
|
class JavaApi < Java::pl.ivmx.mappum.MappumApi
|
34
87
|
def initialize
|
data/lib/mappum/map.rb
CHANGED
@@ -121,9 +121,7 @@ module Mappum
|
|
121
121
|
map_r2l.when_r2l, map_r2l.when_l2r = nil, nil
|
122
122
|
map_r2l.to_array_take = self.to_array_take_r2l
|
123
123
|
map_r2l.to_array_take_r2l, map_r2l.to_array_take_l2r = nil, nil
|
124
|
-
|
125
|
-
m.to.parent == map_r2l.to
|
126
|
-
end
|
124
|
+
|
127
125
|
|
128
126
|
map_r2l.dict = self.dict.invert unless self.dict.nil?
|
129
127
|
|
@@ -136,14 +134,18 @@ module Mappum
|
|
136
134
|
map_l2r.when_r2l, map_l2r.when_l2r = nil, nil
|
137
135
|
map_l2r.to_array_take = self.to_array_take_l2r
|
138
136
|
map_l2r.to_array_take_r2l, map_l2r.to_array_take_l2r = nil, nil
|
137
|
+
|
138
|
+
map_r2l.maps = self.maps.select do |m|
|
139
|
+
m.to.parent == map_r2l.to or m.to.parent.kind_of? Context
|
140
|
+
end
|
139
141
|
map_l2r.maps = self.maps.select do |m|
|
140
|
-
m.to.parent == map_l2r.to
|
142
|
+
m.to.parent == map_l2r.to or m.to.parent.kind_of? Context
|
141
143
|
end
|
142
144
|
|
143
145
|
[map_r2l, map_l2r]
|
144
146
|
else
|
145
147
|
[self]
|
146
|
-
end
|
148
|
+
end
|
147
149
|
end
|
148
150
|
def simple?
|
149
151
|
@func.nil? && @dict.nil? && @desc.nil? &&
|
@@ -164,15 +166,20 @@ module Mappum
|
|
164
166
|
end
|
165
167
|
end
|
166
168
|
class Field < Struct.new(:name, :clazz, :parent, :func, :block, :is_root, :is_placeholder, :src_ref)
|
167
|
-
#define
|
168
|
-
attr_accessor :
|
169
|
+
#define enum_type separetly to exclude it from equals
|
170
|
+
attr_accessor :enum_type
|
169
171
|
def array?
|
170
|
-
|
172
|
+
not enum_type.nil?
|
171
173
|
end
|
172
174
|
def placeholder?
|
173
175
|
is_placeholder
|
174
176
|
end
|
175
177
|
end
|
178
|
+
class Context < Field
|
179
|
+
def is_root
|
180
|
+
true
|
181
|
+
end
|
182
|
+
end
|
176
183
|
class Constant < Struct.new(:value,:parent)
|
177
184
|
def parent
|
178
185
|
nil
|
@@ -191,6 +198,9 @@ module Mappum
|
|
191
198
|
def func
|
192
199
|
nil
|
193
200
|
end
|
201
|
+
def name
|
202
|
+
nil
|
203
|
+
end
|
194
204
|
def value
|
195
205
|
nil
|
196
206
|
end
|
@@ -1,6 +1,14 @@
|
|
1
1
|
module Mappum
|
2
2
|
class MappumException < RuntimeError
|
3
|
-
attr_accessor :from_name, :to_name, :from, :to, :from_root, :to_root, :mappum_backtrace
|
3
|
+
attr_accessor :from_name, :to_name, :from, :to, :from_root, :to_root, :mappum_backtrace , :caused_by
|
4
|
+
|
5
|
+
def initialize(mess=nil)
|
6
|
+
super(mess)
|
7
|
+
if mess.kind_of? Exception
|
8
|
+
@caused_by = mess
|
9
|
+
set_backtrace(mess.backtrace)
|
10
|
+
end
|
11
|
+
end
|
4
12
|
def wrap(map, from, to)
|
5
13
|
|
6
14
|
if map != nil and map != @map #don't store same maps twice
|
@@ -8,9 +16,9 @@ module Mappum
|
|
8
16
|
from_suffix, to_suffix = "",""
|
9
17
|
|
10
18
|
add_to_mappum_backtrace(map)
|
11
|
-
from_suffix = "[]" if map.from.
|
19
|
+
from_suffix = "[]" if map.from.array?
|
12
20
|
add_from_name(map.from.name, from_suffix)
|
13
|
-
to_suffix = "[]" if map.to.
|
21
|
+
to_suffix = "[]" if map.to.array?
|
14
22
|
add_to_name(map.to.name, to_suffix)
|
15
23
|
end
|
16
24
|
@to = to if @to.nil?
|
@@ -29,10 +37,10 @@ module Mappum
|
|
29
37
|
def add_to_mappum_backtrace(map)
|
30
38
|
if @mappum_backtrace.nil?
|
31
39
|
@mappum_backtrace = []
|
32
|
-
@mappum_backtrace << map.from.src_ref
|
33
|
-
@mappum_backtrace << map.to.src_ref
|
40
|
+
@mappum_backtrace << map.from.src_ref if map.from.respond_to?(:src_ref)
|
41
|
+
@mappum_backtrace << map.to.src_ref if map.to.respond_to?(:src_ref)
|
34
42
|
end
|
35
|
-
@mappum_backtrace << map.src_ref
|
43
|
+
@mappum_backtrace << map.src_ref if map.respond_to?(:src_ref)
|
36
44
|
end
|
37
45
|
end
|
38
46
|
end
|
@@ -157,7 +157,7 @@ DOT
|
|
157
157
|
pname, path, level = get_name_and_path(element.parent, level)
|
158
158
|
end
|
159
159
|
path = "#{path}v#{name}".gsub(":","vv") unless name.nil?
|
160
|
-
name = "#{name}[]" if not name.nil? and element.
|
160
|
+
name = "#{name}[]" if not name.nil? and element.array?
|
161
161
|
return name, path, level
|
162
162
|
end
|
163
163
|
end
|
@@ -81,17 +81,24 @@ module Mappum
|
|
81
81
|
@catalogue = params[:splat][0] || "ROOT"
|
82
82
|
@catalogue = @catalogue[1..-1] if @catalogue[0..0] == "/"
|
83
83
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
84
|
+
map_name = nil
|
85
|
+
map_name = params["map"] unless params["map"].nil? or params["map"] == "auto_select"
|
86
|
+
from_qname_str = params["from_qname"] unless params["from_qname"].nil? or params["from_qname"] == "auto_select"
|
87
|
+
from_qname = nil
|
88
|
+
unless from_qname_str.nil? or from_qname_str==''
|
89
|
+
/^\{([^}]*)\}(.*)$/ =~ from_qname_str
|
90
|
+
from_qname = XSD::QName.new($1,$2)
|
91
|
+
end
|
92
|
+
force_openstruct = false
|
93
|
+
force_openstruct = params["ignore"] unless params["map"].nil?
|
94
|
+
|
95
|
+
rt = Mappum::XmlTransform.new(@catalogue, force_openstruct)
|
96
|
+
|
97
|
+
xml = params["doc"]
|
88
98
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
content = rt.transform(xml,map_name)
|
93
|
-
|
94
|
-
[200, {"Content-Type" => "text/xml"}, [content]]
|
99
|
+
content = rt.transform(xml,map_name, from_qname)
|
100
|
+
|
101
|
+
[200, {"Content-Type" => "text/xml"}, [content]]
|
95
102
|
end
|
96
103
|
post "*/transform-ws" do
|
97
104
|
@catalogue = params[:splat][0] || "ROOT"
|
@@ -173,31 +180,31 @@ module Mappum
|
|
173
180
|
@catalogue = @catalogue[1..-1] if @catalogue[0..0] == "/"
|
174
181
|
|
175
182
|
map_name = params["map"]
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
183
|
+
map = Mappum.catalogue(@catalogue).get_bidi_map(map_name)
|
184
|
+
map ||= Mappum.catalogue(@catalogue)[map_name]
|
185
|
+
return [404, {"Content-Type" => "text/html"}, ["No map '#{map_name}'"]] if map.nil?
|
186
|
+
graph = Mappum::MapServer::Graph.new(map)
|
187
|
+
[200, {"Content-Type" => "image/png"}, graph.getPng]
|
181
188
|
|
182
189
|
end
|
183
190
|
get "*/doc" do
|
184
191
|
@catalogue = params[:splat][0] || "ROOT"
|
185
192
|
@catalogue = @catalogue[1..-1] if @catalogue[0..0] == "/"
|
186
193
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
+
@map_name = params["map"]
|
195
|
+
@map = Mappum.catalogue(@catalogue).get_bidi_map(@map_name)
|
196
|
+
@map ||= Mappum.catalogue(@catalogue)[@map_name]
|
197
|
+
return [404, {"Content-Type" => "text/html"}, ["No map " + @map_name]] if @map.nil?
|
198
|
+
graph = Mappum::MapServer::Graph.new(@map)
|
199
|
+
@edge_maps = graph.edge_maps.keys.sort.collect{|k| [k, graph.edge_maps[k], explain(graph.edge_maps[k])]}
|
200
|
+
[200, {"Content-Type" => "text/html"}, [erb(:doc)]]
|
194
201
|
end
|
195
202
|
get "/" do
|
196
203
|
@catalogue = params["catalogue"] || "ROOT"
|
197
204
|
@catalogues = Mappum.catalogues
|
198
|
-
|
199
|
-
|
200
|
-
|
205
|
+
@bidi_maps_name_source = Mappum.catalogue(@catalogue).list_bidi_map_names.collect{|mn| [mn, Mappum.catalogue(@catalogue).get_bidi_map(mn).source] }
|
206
|
+
@maps_name_source = Mappum.catalogue(@catalogue).list_map_names.collect{|mn| [mn, Mappum.catalogue(@catalogue)[mn].source]}
|
207
|
+
[200, {"Content-Type" => "text/html"}, [erb(:main)]]
|
201
208
|
end
|
202
209
|
error do
|
203
210
|
@xml_convertor = Syntax::Convertors::HTML.for_syntax "xml"
|
@@ -18,6 +18,7 @@
|
|
18
18
|
<%end%>
|
19
19
|
</select>
|
20
20
|
<input type="checkbox" name="ignore" value="false">Ignore types</input>
|
21
|
+
<input type="text" name="from_qname"></input>
|
21
22
|
<br/>
|
22
23
|
<TEXTAREA name="doc" rows="20" cols="80"></TEXTAREA><br/>
|
23
24
|
<INPUT type="submit" value="Send"/><INPUT type="reset"/>
|
@@ -4,6 +4,8 @@ require 'mappum'
|
|
4
4
|
require 'ostruct'
|
5
5
|
require 'mappum/autoconv_catalogue'
|
6
6
|
require 'mappum/mappum_exception'
|
7
|
+
require 'mappum/map_space'
|
8
|
+
|
7
9
|
|
8
10
|
module Mappum
|
9
11
|
#
|
@@ -24,8 +26,18 @@ module Mappum
|
|
24
26
|
#
|
25
27
|
# Method for transforming from object using map to "to" object.
|
26
28
|
#
|
27
|
-
def transform(from, map=nil, to=nil)
|
29
|
+
def transform(from, map=nil, to=nil, options={})
|
28
30
|
begin
|
31
|
+
|
32
|
+
options ||= {}
|
33
|
+
|
34
|
+
map_space_added = false
|
35
|
+
if options["map_space"].nil?
|
36
|
+
map_space_added = true
|
37
|
+
options["map_space"] = Mappum::MapSpace.new
|
38
|
+
options["map_space"].context = get_context(options)
|
39
|
+
end
|
40
|
+
|
29
41
|
raise RuntimeError.new("Map catalogue is empty!") if @map_catalogue.nil?
|
30
42
|
|
31
43
|
map ||= @map_catalogue[from.class]
|
@@ -39,29 +51,31 @@ module Mappum
|
|
39
51
|
|
40
52
|
all_nils = true
|
41
53
|
map.maps.each do |sm|
|
42
|
-
|
54
|
+
begin
|
43
55
|
from_value, to_value = nil, nil
|
44
56
|
|
45
|
-
from_value = get(from, sm.from, map.from)
|
57
|
+
from_value = get(from, sm.from, map.from, options)
|
46
58
|
|
47
59
|
# skip to next mapping on false :map_when function
|
48
60
|
next unless sm.map_when.nil? or sm.map_when.call(from_value)
|
49
61
|
|
50
62
|
unless sm.func.nil? or (not sm.func_on_nil? and from_value.nil?)
|
51
|
-
from_value = sm.func
|
63
|
+
from_value = options["map_space"].instance_exec(from_value,&sm.func)
|
52
64
|
end
|
53
65
|
unless sm.from.func.nil? or from_value.nil?
|
54
66
|
mappum_block = sm.from.block
|
55
|
-
if from_value.kind_of?(Array)
|
56
|
-
|
57
|
-
#or (Module.constants.include? "ArrayJavaProxy" and from_value.kind_of?(Module.const_get(:ArrayJavaProxy)))
|
58
|
-
from_value = from_value.compact.instance_eval(sm.from.func)
|
67
|
+
if from_value.kind_of?(Array)
|
68
|
+
from_value = from_value.compact.instance_eval(sm.from.func)
|
59
69
|
else
|
70
|
+
# TODO Fix it for Java to make campact as well
|
71
|
+
#non real arrays
|
72
|
+
if is_array?(from_value)
|
73
|
+
from_value = convert_from(from_value,sm.from)
|
74
|
+
end
|
60
75
|
from_value = from_value.instance_eval(sm.from.func)
|
61
76
|
end
|
62
77
|
end
|
63
|
-
|
64
|
-
submaps = sm.maps
|
78
|
+
submaps = sm.maps
|
65
79
|
if sm.maps.empty?
|
66
80
|
unless sm.submap_alias.nil? or sm.submap_alias.empty?
|
67
81
|
submaps = @map_catalogue[sm.submap_alias].maps
|
@@ -81,63 +95,70 @@ module Mappum
|
|
81
95
|
unless submaps.empty? or from_value.nil?
|
82
96
|
#We should make some kind of test like this
|
83
97
|
#raise "Not an array: #{sm.from.name} inspect:" + from_value.inspect if sm.from.is_array and not from_value.kind_of?(Array)
|
84
|
-
if
|
85
|
-
(Module.constants.include? "ArrayJavaProxy" and from_value.kind_of?(Module.const_get(:ArrayJavaProxy)))
|
98
|
+
if is_array?(from_value)
|
86
99
|
sm_v = sm.clone
|
87
|
-
if sm_v.from.
|
100
|
+
if sm_v.from.array?
|
88
101
|
sm_v.from = sm.from.clone
|
89
|
-
sm_v.from.
|
102
|
+
sm_v.from.enum_type = nil
|
90
103
|
end
|
91
|
-
if sm_v.to.
|
104
|
+
if sm_v.to.array?
|
92
105
|
sm_v.to = sm.to.clone
|
93
|
-
sm_v.to.
|
106
|
+
sm_v.to.enum_type = nil
|
94
107
|
end
|
95
108
|
if sm_v.maps.empty?
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
109
|
+
sm_v.maps = submaps
|
110
|
+
sm_v.maps.each{|m| m.from.parent = sm_v.from}
|
111
|
+
#don't add parent we need separation
|
112
|
+
to_value = from_value.collect{|v| transform(v, sm_v, nil, pass_options(options))}
|
113
|
+
else
|
114
|
+
to_value = from_value.collect{|v| transform(add_parent(v, from), sm_v, nil, pass_options(options))}
|
115
|
+
end
|
103
116
|
else
|
104
117
|
to ||= map.to.clazz.new unless @force_open_struct or map.to.clazz.nil? or map.to.clazz.kind_of?(Symbol)
|
105
118
|
to ||= @default_struct_class.new
|
106
119
|
v_to = []
|
107
120
|
#array values are assigned after return
|
108
|
-
v_to << get(to, sm.to) unless sm.to.
|
121
|
+
v_to << get(to, sm.to, nil, options) unless sm.to.array? and not sm.from.array?
|
109
122
|
#nless one whants to update existing to array
|
110
123
|
if sm.to_array_take == :first
|
111
|
-
arr_v = get(to, sm.to)
|
124
|
+
arr_v = get(to, sm.to, nil, options)
|
112
125
|
v_to << arr_v[0] if not arr_v.nil?
|
113
126
|
end
|
114
127
|
if sm.to_array_take == :all
|
115
|
-
arr_v = get(to, sm.to)
|
128
|
+
arr_v = get(to, sm.to, nil, options)
|
116
129
|
v_to += arr_v if not arr_v.nil?
|
117
130
|
end
|
131
|
+
#array values are assigned after return
|
132
|
+
v_to = [nil] if sm.to.array? and not sm.from.array? and v_to.empty?
|
118
133
|
v_to.each do |v_t|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
134
|
+
sm_v = sm
|
135
|
+
if sm_v.maps.empty?
|
136
|
+
sm_v = sm.clone
|
137
|
+
sm_v.maps = submaps
|
138
|
+
sm_v.maps.each{|m| m.from.parent = sm_v.from}
|
139
|
+
#don't add parent we need separation
|
140
|
+
to_value = transform(from_value, sm_v, v_t, pass_options(options))
|
141
|
+
else
|
142
|
+
to_value = transform(add_parent(from_value, from), sm_v, v_t, pass_options(options))
|
143
|
+
end
|
144
|
+
end
|
130
145
|
end
|
131
146
|
|
132
147
|
end
|
133
148
|
unless sm.dict.nil?
|
134
149
|
to_value = sm.dict[to_value]
|
135
150
|
end
|
136
|
-
|
137
|
-
|
138
|
-
to_array
|
139
|
-
to_array
|
140
|
-
|
151
|
+
|
152
|
+
if sm.to.array? and not sm.from.array?
|
153
|
+
to_array = convert_from(get(to,sm.to,nil,options),sm.from)
|
154
|
+
to_array ||= sm.to.enum_type.new
|
155
|
+
to_array << to_value unless sm.to.enum_type != Array or sm.to_array_take == :first or sm.to_array_take == :all
|
156
|
+
#FIXME change array and hash to something sane!
|
157
|
+
if sm.to.enum_type == Hash and sm.to.func[0..6] == "self.[]"
|
158
|
+
bad_func = "self.[]=#{sm.to.func[7..-2]},to_value)"
|
159
|
+
to_array.instance_eval(bad_func)
|
160
|
+
end
|
161
|
+
|
141
162
|
if to_array.empty? and sm.strip_empty?
|
142
163
|
to_array = nil
|
143
164
|
end
|
@@ -147,9 +168,13 @@ module Mappum
|
|
147
168
|
if sm.to.name.nil?
|
148
169
|
to = convert_to(to_array, sm.to)
|
149
170
|
else
|
150
|
-
|
151
|
-
|
152
|
-
|
171
|
+
if sm.to.parent.kind_of? Context
|
172
|
+
get_context(options).send("#{sm.to.name}=", convert_to(to_array, sm.to, get_context(options))) unless to_array.nil?
|
173
|
+
else
|
174
|
+
to ||= map.to.clazz.new unless @force_open_struct or map.to.clazz.nil? or map.to.clazz.kind_of?(Symbol)
|
175
|
+
to ||= @default_struct_class.new
|
176
|
+
to.send("#{sm.to.name}=", convert_to(to_array, sm.to, to)) unless to_array.nil?
|
177
|
+
end
|
153
178
|
end
|
154
179
|
else
|
155
180
|
|
@@ -162,9 +187,13 @@ module Mappum
|
|
162
187
|
if sm.to.name.nil?
|
163
188
|
to ||= to_value
|
164
189
|
else
|
165
|
-
|
166
|
-
|
167
|
-
|
190
|
+
if sm.to.parent.kind_of? Context
|
191
|
+
get_context(options).send("#{sm.to.name}=", convert_to(to_value, sm.to, get_context(options))) unless to_value.nil?
|
192
|
+
else
|
193
|
+
to ||= map.to.clazz.new unless @force_open_struct or map.to.clazz.nil? or map.to.clazz.kind_of?(Symbol)
|
194
|
+
to ||= @default_struct_class.new
|
195
|
+
to.send("#{sm.to.name}=", convert_to(to_value, sm.to, to)) unless to_value.nil?
|
196
|
+
end
|
168
197
|
end
|
169
198
|
end
|
170
199
|
rescue Exception => e
|
@@ -173,6 +202,13 @@ module Mappum
|
|
173
202
|
raise e
|
174
203
|
end
|
175
204
|
end
|
205
|
+
if map_space_added
|
206
|
+
if options.respond_to? :delete
|
207
|
+
options.delete("map_space")
|
208
|
+
else
|
209
|
+
options["map_space"]=nil
|
210
|
+
end
|
211
|
+
end
|
176
212
|
if all_nils and map.strip_empty?
|
177
213
|
return nil
|
178
214
|
end
|
@@ -185,39 +221,44 @@ module Mappum
|
|
185
221
|
end
|
186
222
|
|
187
223
|
protected
|
188
|
-
|
189
|
-
|
190
|
-
if field.kind_of?(String) or field.kind_of?(Symbol)
|
191
|
-
field_name = field
|
192
|
-
else
|
193
|
-
unless field.respond_to?(:name)
|
194
|
-
return field.value
|
195
|
-
end
|
196
|
-
if field.name.nil? or object.nil?
|
197
|
-
return object
|
198
|
-
end
|
199
|
-
#for fields targeted at parents go up the tree
|
200
|
-
if (not parent_field.nil?) and field.parent != parent_field
|
201
|
-
if object.respond_to?(:_mpum_parent)
|
202
|
-
return get(object._mpum_parent, field, parent_field.parent)
|
203
|
-
else
|
204
|
-
raise "We hit an element with no parent: #{object.inspect}"
|
205
|
-
end
|
206
|
-
end
|
207
|
-
field_name = field.name
|
208
|
-
end
|
209
|
-
begin
|
210
|
-
return object.send(field_name)
|
211
|
-
rescue NoMethodError => e
|
212
|
-
#for open structures field will be defined later
|
213
|
-
if object.kind_of?(@default_struct_class)
|
214
|
-
return nil
|
215
|
-
else
|
216
|
-
raise e
|
217
|
-
end
|
218
|
-
end
|
224
|
+
def is_array?(obj)
|
225
|
+
return (obj.kind_of?(Array) or obj.kind_of?(Set) or obj.kind_of?(Hash))
|
219
226
|
end
|
220
|
-
def
|
227
|
+
def get(object, field, parent_field=nil,options={})
|
228
|
+
if field.kind_of?(String) or field.kind_of?(Symbol)
|
229
|
+
field_name = field
|
230
|
+
else
|
231
|
+
unless field.respond_to?(:name)
|
232
|
+
return field.value
|
233
|
+
end
|
234
|
+
if field.parent.kind_of?(Context)
|
235
|
+
object = get_context(options)
|
236
|
+
end
|
237
|
+
if field.name.nil? or object.nil?
|
238
|
+
return object
|
239
|
+
end
|
240
|
+
#for fields targeted at parents go up the tree
|
241
|
+
if (not parent_field.nil?) and (not parent_field.is_root) and field.parent != parent_field
|
242
|
+
if object.respond_to?(:_mpum_parent)
|
243
|
+
return get(object._mpum_parent, field, parent_field.parent, options)
|
244
|
+
else
|
245
|
+
raise "No parent for this object"
|
246
|
+
end
|
247
|
+
end
|
248
|
+
field_name = field.name
|
249
|
+
end
|
250
|
+
begin
|
251
|
+
return object.send(field_name)
|
252
|
+
rescue NoMethodError => e
|
253
|
+
#for open structures field will be defined later
|
254
|
+
if object.kind_of?(@default_struct_class)
|
255
|
+
return nil
|
256
|
+
else
|
257
|
+
raise e
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
261
|
+
def convert_to(to, field_def, parent)
|
221
262
|
return to
|
222
263
|
end
|
223
264
|
def convert_from(from, field_def)
|
@@ -232,6 +273,17 @@ module Mappum
|
|
232
273
|
value._mpum_parent = parent
|
233
274
|
return value
|
234
275
|
end
|
276
|
+
def pass_options(options)
|
277
|
+
return options
|
278
|
+
end
|
279
|
+
def get_context(options)
|
280
|
+
ctx = options[:context]
|
281
|
+
ctx ||= options["context"]
|
282
|
+
if ctx.nil?
|
283
|
+
ctx = @default_struct_class.new
|
284
|
+
end
|
285
|
+
return ctx
|
286
|
+
end
|
235
287
|
end
|
236
288
|
class OpenStruct < OpenStruct
|
237
289
|
def type(*attr)
|