1
2
24
25
46
47 import org.omus.data.MarshalledProperties;
48 import org.omus.data.Table;
49 import org.omus.data.TableDefinition;
50
51 import org.omus.util._Class;
52
53
65 class org.omus.data.DataTransformer
66 {
67
68
69
70
73 private static var _instance:DataTransformer;
74
75
76
77
78
81 private function DataTransformer()
82 {
83
84 }
85
86
87
88
89
93 public function toString():String
94 {
95 return "[Object DataTransformer]";
96 }
97
98
104 public function marshal_array (value:Object):String
105 {
106 var long = value.length;
107 var s = "#a";
108 s += long;
109 s += "#x";
110 for (var i = 0; i < long ; i++) {
111 var tp = typeof(value[i]);
112 if (tp == "function" || tp == "undefined" || tp == "null") continue;
113 s += marshal(value[i]);
114 }
115 s += "#z";
116 return s;
117 }
118
119
126 public function marshal_largeArray (value:Array):String
127 {
128 return marshal_array(value);
129 }
130
131
137 public function marshal_object (value:Object):String
138 {
139 var pref = "#o";
140
141 var clazz = _Class.getInstance();
142 var cl = clazz.getClassName(value);
143 if (cl != null) pref += cl;
144 pref += "#y";
145 var s = "#x";
146 var cnt = 0;
147 for (var each:String in value) {
148 var tp = typeof(value[each]);
149 if (tp == "function" || tp == "undefined" || tp == "null") continue;
150 s += this.escape(each);
151 s += "#y";
152 s += marshal(value[each]);
153 cnt++;
154 }
155 s += "#z";
156 return pref + cnt + s;
157 }
158
159
166 public function marshal_largeObject(value:Object):String
167 {
168 return marshal_object(value);
169 }
170
171
172
173
174
175
182 private function marshal (value:Object):String
183 {
184 var tp = typeof (value);
185
186 if (tp != "object")
187 {
188 return this["marshal_" + tp](value);
189 } else
190 {
191
192 if (value instanceof Array) return marshal_array(value);
193
194 if (value instanceof Date) return marshal_date(value);
195 if (value instanceof MarshalledProperties) return marshal_premarshalled(value);
196 if (value instanceof Table) return marshal_table(Table(value));
197 return marshal_object(value);
198 }
199 }
200
201
208 private function marshalType (value:Object, clazz:Object):String
209 {
210 if (typeof(clazz) == "string")
211 {
212 return this["marshal_" + clazz](value);
213 } else
214 {
215
216
217
218 if (clazz["prototype"] == Array.prototype) return marshal_array(value);
219
220 if (clazz["prototype"] == Date.prototype) return marshal_date(value);
221 if (clazz["prototype"] == Table.prototype) return marshal_table(Table(value));
222 return marshal_object(value);
223 }
224 }
225
226
232 private function marshal_boolean (value:Boolean):String
233 {
234 return "#b" + ((value) ? "1" : "0") + "#x";
235 }
236
237
243 private function marshal_counter (value:Object):String
244 {
245 return "#c" + value + "#x";
246 }
247
248
254 private function marshal_int (value:Number):String
255 {
256 return "#i" + value + "#x";
257 }
258
259
265 private function marshal_long (value:Number):String
266 {
267 return "#l" + value + "#x";
268 }
269
270
276 private function marshal_float (value:Number):String
277 {
278 return "#f" + value + "#x";
279 }
280
281
288 private function marshal_number(value:Number):String
289 {
290 return marshal_float(value);
291 }
292
293
299 private function marshal_string (value:String):String
300 {
301 return "#s" + this.escape(value) + "#y";
302 }
303
304
310 private function marshal_largeString(value:String):String
311 {
312 return marshal_string(value);
313 }
314
315
321 private function marshal_date (value:Object):String
322 {
323 return "#d" + value.getTime() + "#x";
324 }
325
326
332 private function marshal_premarshalled (value:Object):String
333 {
334 var pref = "#o#y";
335 var s = "#x";
336 var cnt = 0;
337 var ps = value.props;
338 for (var each:String in ps)
339 {
340 s += this.escape(each);
341 s += "#y";
342 var val = ps[each];
343 if (typeof(val) != "string")
344 {
345 s+= val.getMarshalledSequence();
346 } else
347 {
348 s+= val;
349 }
350 cnt++;
351 }
352 s += "#z";
353 return pref + cnt + s;
354 }
355
356
363 public function marshal_row (row:Object, def:TableDefinition):String
364 {
365 var pref = "#a";
366 var s = "#x";
367 var cnt = 0;
368 var cols = def.getColumnCount();
369 for (var i = 0; i < cols; i++) {
370 var name = def.getColumnName(i);
371 var type = def.getColumnType(i);
372 s += marshalType(row[name], type);
373 cnt++;
374 }
375 s += "#z";
376 return pref + cnt + s;
377 }
378
379
385 private function marshal_table (value:Table):String
386 {
387 var s = "#t";
388 var rowCnt = value.rowList.length;
389 s += rowCnt;
390 s += "#x";
391 s += value.nextRowID;
392 s += "#x";
393
394
395 var def = value.getDefinition();
396 var colCnt = def.getColumnCount();
397 var cols = def.getColumnNames();
398 s += colCnt;
399 s += "#x";
400 for (var i = 0; i < colCnt; i++)
401 {
402 s += "#";
403
404 var clazz = _Class.getInstance();
405 s += clazz.cellTypeToChar(def.getColumnType(i));
406 s += cols[i];
407 s += "#y";
408 }
409
410
411 var rl = value.rowList;
412 for (var j = 0; j < rowCnt; j++)
413 {
414 var row = rl[j];
415 s += "#r";
416 s += row.__rowID;
417 s += "#x";
418 for (var idx = 0; idx < colCnt; idx++)
419 {
420 var cell = row[cols[idx]];
421 var type = def.getColumnType(idx);
422
423 s += this["marshal_" + type](cell);
424 }
425 }
426 s += "#z";
427 return s;
428 }
429
430
437 private function marshal_largeTable (value:Table):String
438 {
439 return marshal_table(value);
440 }
441
442
448 private function escape (orig:String):String
449 {
450 var len = orig.length;
451 var clean = true;
452 var s:String;
453 for (var i = 1; i <= len; i++)
454 {
455
456 var c = orig.substr(i-1, 1);
457 if (c == "#") {
458 if (clean) {
459
460 s = "#e" + orig.substr(0, i-1);
461 clean = false;
462 }
463 s += "##";
464 } else {
465 s += c;
466 }
467 }
468 if (clean) return orig;
469 else return s;
470 }
471
472
473
474
475
479 public static function toLog():String
480 {
481 return "[Object DataTransformer]";
482 }
483
484
487 public static function getInstance():DataTransformer
488 {
489 if(_instance == undefined) _instance = new DataTransformer();
490 return _instance;
491 }
492 }
493