1 package cz.cuni.amis.pogamut.sposh.elements;
2
3 import cz.cuni.amis.pogamut.shady.ArgString;
4 import cz.cuni.amis.pogamut.sposh.executor.ParamInfo;
5 import java.lang.reflect.Array;
6 import java.util.regex.Matcher;
7 import java.util.regex.Pattern;
8
9
10
11
12
13
14
15
16
17
18
19
20 public class Result {
21
22
23
24
25
26
27
28
29 public static boolean isFalse(Object value) {
30 if (value == null) {
31 return true;
32 }
33 if (isBoolean(value)) {
34 return !getBoolean(value);
35 }
36 if (isNumber(value)) {
37 return getNumber(value).doubleValue() == 0;
38 }
39 if (value.getClass().isArray()) {
40 return Array.getLength(value) == 0;
41 }
42 return false;
43 }
44
45
46
47
48
49
50
51 public static boolean isTrue(Object value) {
52 return !isFalse(value);
53 }
54
55 public static boolean isNumber(Object value) {
56 return value instanceof Number;
57 }
58
59 public static Number getNumber(Object value) {
60 assert isNumber(value);
61 return (Number) value;
62 }
63
64
65
66
67
68
69
70 public static boolean isBoolean(Object value) {
71 return value instanceof Boolean;
72 }
73
74
75
76
77
78
79
80 public static boolean getBoolean(Object value) {
81 assert isBoolean(value);
82 return ((Boolean) value).booleanValue();
83 }
84
85
86
87
88
89
90
91
92
93 public static Object parseValue(String valueString) throws ParseException {
94
95 assert valueString != null;
96
97 if ("nil".equalsIgnoreCase(valueString)) {
98 return null;
99 }
100
101 if (valueString.equalsIgnoreCase(Boolean.TRUE.toString())) {
102 return Boolean.TRUE;
103 }
104
105 if (valueString.equalsIgnoreCase(Boolean.FALSE.toString())) {
106 return Boolean.FALSE;
107 }
108
109 try {
110 return Integer.parseInt(valueString);
111 } catch (NumberFormatException ex) {
112 }
113
114 try {
115 return Double.parseDouble(valueString);
116 } catch (NumberFormatException ex) {
117 }
118
119 if (valueString.length() >= 2 && valueString.startsWith("\"") && valueString.endsWith("\"")) {
120 String unquotedString = valueString.substring(1, valueString.length() - 1);
121 try {
122 return ArgString.unescape(unquotedString);
123 } catch (cz.cuni.amis.pogamut.shady.ParseException ex) {
124 throw new ParseException(ex.getMessage());
125 }
126 }
127 if (valueString.length() >= 2 && valueString.startsWith("'")) {
128 String enumString = valueString.substring(1);
129 if (!enumString.matches("[a-zA-Z_]([a-zA-Z_0-9])*(.[a-zA-Z_]([a-zA-Z_0-9])*)*")) {
130 throw new ParseException(enumString + " is not a valid enum name.");
131 }
132 return new EnumValue(enumString);
133 }
134 throw new ParseException("No good type from " + valueString);
135 }
136
137
138
139
140
141
142
143
144 public static double getNumerical(Object value) {
145 if (isBoolean(value)) {
146 return getBoolean(value) ? 1 : 0;
147 }
148
149 return getNumber(value).doubleValue();
150 }
151
152
153
154
155
156
157 public static boolean isNumerical(Object value) {
158 return isNumber(value) || isBoolean(value);
159 }
160
161
162
163
164
165
166
167
168
169 public static boolean equal(Object operand1, Object operand2) {
170
171 if (isNumerical(operand1) && isNumerical(operand2)) {
172 double op1 = getNumerical(operand1);
173 double op2 = getNumerical(operand2);
174 return op1 == op2;
175 }
176
177 return operand1 == null ? operand2 == null : operand1.equals(operand2);
178 }
179
180
181
182
183
184
185
186
187
188 public static int compare(Object operand1, Object operand2) {
189
190 if (isNumerical(operand1) && isNumerical(operand2)) {
191 double op1 = getNumerical(operand1);
192 double op2 = getNumerical(operand2);
193 int sig = (int) Math.signum(op1 - op2);
194 return sig;
195 }
196
197 if (operand1 == null) {
198 if (operand2 == null) {
199 return 0;
200 }
201
202 throw new IllegalArgumentException("I can't compare " + operand1 + " with " + operand2);
203 }
204
205 Comparable op1 = (Comparable) operand1;
206 Comparable op2 = (Comparable) operand2;
207
208 return op1.compareTo(op2);
209 }
210
211
212
213
214
215
216
217
218 public static String toLap(Object value) {
219 if (value == null) {
220 return "nil";
221 }
222 if (value instanceof Character) {
223 return "\"" + value.toString() + "\"";
224 }
225 if (value instanceof String) {
226 return "\"" + value.toString() + "\"";
227 }
228 if (value instanceof EnumValue) {
229 return '\'' + ((EnumValue) value).getName();
230 }
231
232 return value.toString();
233 }
234
235
236
237 public final static String variableNameRegexp = "\\$[a-zA-Z]([_\\-a-zA-Z0-9])*";
238
239
240
241
242
243
244
245
246
247 public static boolean isVariableName(String possibleVariableName) {
248 return possibleVariableName.matches(variableNameRegexp);
249 }
250 }