KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jruby > evaluator > ValueConverter


1 /***** BEGIN LICENSE BLOCK *****
2  * Version: CPL 1.0/GPL 2.0/LGPL 2.1
3  *
4  * The contents of this file are subject to the Common Public
5  * License Version 1.0 (the "License"); you may not use this file
6  * except in compliance with the License. You may obtain a copy of
7  * the License at http://www.eclipse.org/legal/cpl-v10.html
8  *
9  * Software distributed under the License is distributed on an "AS
10  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
11  * implied. See the License for the specific language governing
12  * rights and limitations under the License.
13  *
14  * Copyright (C) 2002 Jan Arne Petersen <jpetersen@uni-bonn.de>
15  * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de>
16  *
17  * Alternatively, the contents of this file may be used under the terms of
18  * either of the GNU General Public License Version 2 or later (the "GPL"),
19  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
20  * in which case the provisions of the GPL or the LGPL are applicable instead
21  * of those above. If you wish to allow use of your version of this file only
22  * under the terms of either the GPL or the LGPL, and not to allow others to
23  * use your version of this file under the terms of the CPL, indicate your
24  * decision by deleting the provisions above and replace them with the notice
25  * and other provisions required by the GPL or the LGPL. If you do not delete
26  * the provisions above, a recipient may use your version of this file under
27  * the terms of any one of the CPL, the GPL or the LGPL.
28  ***** END LICENSE BLOCK *****/

29 package org.jruby.evaluator;
30
31 import org.jruby.Ruby;
32 import org.jruby.RubyArray;
33 import org.jruby.runtime.builtin.IRubyObject;
34
35 /**
36  *
37  * @author jpetersen
38  */

39 public final class ValueConverter {
40     private Ruby runtime;
41
42     public ValueConverter(Ruby runtime) {
43         this.runtime = runtime;
44     }
45
46     public RubyArray singleToArray(IRubyObject value) {
47         if (value == null || value.isNil()) {
48             return runtime.newArray(0);
49         } else if (value instanceof RubyArray) {
50             if (((RubyArray)value).getLength() == 1) {
51                 return (RubyArray) value;
52             }
53             return runtime.newArray(value);
54         } else {
55             return toArray(value);
56         }
57     }
58     
59     public IRubyObject arrayToSingle(IRubyObject value, boolean useUndefined) {
60         if (!(value instanceof RubyArray)) {
61             value = toArray(value);
62         }
63         switch (((RubyArray)value).getLength()) {
64             case 0:
65                 return useUndefined ? null : runtime.getNil();
66             case 1:
67                 return ((RubyArray)value).eltInternal(0);
68             default:
69                 return value;
70         }
71     }
72
73     public RubyArray singleToMultiple(IRubyObject value) {
74         if (value == null || value.isNil()) {
75             return runtime.newArray(0);
76         } else if (value instanceof RubyArray) {
77             return (RubyArray) value;
78         } else {
79             return toArray(value);
80         }
81     }
82
83     public IRubyObject multipleToSingle(IRubyObject value) {
84         if (!(value instanceof RubyArray)) {
85             value = toArray(value);
86         }
87         switch (((RubyArray)value).getLength()) {
88             case 0:
89                 return runtime.getNil();
90             case 1:
91                 if (!(((RubyArray)value).eltInternal(0) instanceof RubyArray)) {
92                     return ((RubyArray)value).eltInternal(0);
93                 }
94             default:
95                 return value;
96         }
97     }
98
99     private RubyArray toArray(IRubyObject value) {
100         if (value.isNil()) {
101             return runtime.newArray(0);
102         } else if (value instanceof RubyArray) {
103             return (RubyArray)value;
104         }
105         if (value.respondsTo("to_ary")) {
106             return (RubyArray)value.convertType(RubyArray.class, "Array", "to_ary");
107         }
108         return runtime.newArray(value);
109     }
110 }
111
Popular Tags