5772f61 by Jos van den Oever at 2009-08-16 1
package mso.generator;
79224b0 by Jos van den Oever at 2009-08-16 2
3
import java.io.FileWriter;
4
import java.io.IOException;
5
import java.io.PrintWriter;
6
import java.util.regex.Matcher;
7
import java.util.regex.Pattern;
8
1971b94 by Jos van den Oever at 2011-08-06 9
import mso.generator.utils.Choice;
10
import mso.generator.utils.Limitation;
11
import mso.generator.utils.MSO;
12
import mso.generator.utils.Member;
13
import mso.generator.utils.Stream;
14
import mso.generator.utils.Struct;
15
import mso.generator.utils.TypeRegistry;
16
5772f61 by Jos van den Oever at 2009-08-16 17
public class JavaParserGenerator {
2c22c86 by Jos van den Oever at 2009-08-27 18
	void generate(MSO mso, String dir, String packagename, String classname)
79224b0 by Jos van den Oever at 2009-08-16 19
			throws IOException {
5772f61 by Jos van den Oever at 2009-08-16 20
		FileWriter fout = new FileWriter(dir + "/"
21
				+ packagename.replace('.', '/') + "/" + classname + ".java");
79224b0 by Jos van den Oever at 2009-08-16 22
		PrintWriter out = new PrintWriter(fout);
23
		out.println("package " + packagename + ";");
24
		out.println("import java.io.IOException;");
25
		out.println("public class " + classname + " {");
26
		out
6e4eb38 by Jos van den Oever at 2009-09-15 27
				.println("    Object parse(String key, LEInputStream in) throws IOException {");
2c22c86 by Jos van den Oever at 2009-08-27 28
		boolean first = true;
29
		for (Stream s : mso.streams) {
79224b0 by Jos van den Oever at 2009-08-16 30
			out.print("        ");
2c22c86 by Jos van den Oever at 2009-08-27 31
			if (first) {
32
				first = false;
33
			} else {
79224b0 by Jos van den Oever at 2009-08-16 34
				out.print("} else ");
35
			}
2c22c86 by Jos van den Oever at 2009-08-27 36
			out.println("if (\"" + s.key + "\".equals(key)) {"); // TODO: fix
37
			// for
79224b0 by Jos van den Oever at 2009-08-16 38
			// \001 and \005
39
			// prefix
6e4eb38 by Jos van den Oever at 2009-09-15 40
			out.println("            return parse" + s.type + "(in);");
79224b0 by Jos van den Oever at 2009-08-16 41
		}
42fca05 by Jos van den Oever at 2009-08-17 42
		out.println("        } else {");
6e4eb38 by Jos van den Oever at 2009-09-15 43
		out.println("            return parseTODOS(in);");
44
		out.println("        }");
45
		out.println("    }");
46
47
		out
48
				.println("    void serialize(String key, Object o, LEOutputStream out) throws IOException {");
49
		first = true;
50
		for (Stream s : mso.streams) {
51
			out.print("        ");
52
			if (first) {
53
				first = false;
54
			} else {
55
				out.print("} else ");
56
			}
57
			out.println("if (\"" + s.key + "\".equals(key)) {"); // TODO: fix
58
			// for
59
			// \001 and \005
60
			// prefix
61
			out.println("            write((" + s.type + ")o, out);");
62
		}
63
		out.println("        } else {");
64
		out.println("            write((TODOS)o, out);");
79224b0 by Jos van den Oever at 2009-08-16 65
		out.println("        }");
66
		out.println("    }");
67
2c22c86 by Jos van den Oever at 2009-08-27 68
		for (Struct s : mso.structs) {
69
			printStructureParser(out, s);
6e4eb38 by Jos van den Oever at 2009-09-15 70
			printStructureWriter(out, s);
79224b0 by Jos van den Oever at 2009-08-16 71
		}
72
73
		out.println("}");
74
2c22c86 by Jos van den Oever at 2009-08-27 75
		for (Struct s : mso.structs) {
76
			printStructureClass(out, s);
79224b0 by Jos van den Oever at 2009-08-16 77
		}
78
79
		out.close();
80
		fout.close();
81
	}
82
2c22c86 by Jos van den Oever at 2009-08-27 83
	void printStructureParser(PrintWriter out, Struct s) {
84
		out.println("    " + s.name + " parse" + s.name
79224b0 by Jos van den Oever at 2009-08-16 85
				+ "(LEInputStream in) throws IOException  {");
2c22c86 by Jos van den Oever at 2009-08-27 86
		out.println("        " + s.name + " _s = new " + s.name + "();");
6d9a57d by Jos van den Oever at 2009-09-12 87
		if (s.containsKnownLengthArrayMember) {
79224b0 by Jos van den Oever at 2009-08-16 88
			out.println("        int _c;");
89
		}
812ed49 by Jos van den Oever at 2011-08-01 90
		boolean variableArray = false;
91
		for (Member m : s.members) {
92
			if (m.isArray && m.count == null && m.size == null) {
93
				variableArray = s.containsUnknownLengthArrayMember;
94
			}
95
		}
96
		if (s.containsOptionalMember || variableArray
9aad1f9 by Jos van den Oever at 2010-01-27 97
				|| s.containsChoice) {
7b75457 by Jos van den Oever at 2009-08-16 98
			out.println("        Object _m;");
99
		}
812ed49 by Jos van den Oever at 2011-08-01 100
		if (variableArray) {
700ccda by Jos van den Oever at 2009-09-14 101
			out.println("        boolean _atend;");
102
		}
2c22c86 by Jos van den Oever at 2009-08-27 103
		for (Member m : s.members) {
104
			printStructureMemberParser(out, m);
79224b0 by Jos van den Oever at 2009-08-16 105
		}
2c22c86 by Jos van den Oever at 2009-08-27 106
		if (s.name.contains("RecordHeader")) {
14636bd by Jos van den Oever at 2009-08-20 107
			out.println("System.out.println(in.getPosition()+\" \"+_s);");
84d4cfb by Jos van den Oever at 2009-08-17 108
		}
79224b0 by Jos van den Oever at 2009-08-16 109
		out.println("        return _s;");
110
		out.println("    }");
111
	}
112
6e4eb38 by Jos van den Oever at 2009-09-15 113
	void printStructureWriter(PrintWriter out, Struct s) {
114
		out.println("    void write(" + s.name
115
				+ " _s, LEOutputStream out) throws IOException  {");
116
		for (Member m : s.members) {
117
			printStructureMemberWriter(out, m);
118
		}
119
		out.println("    }");
120
	}
121
122
	void printStructureMemberWriter(PrintWriter out, Member m) {
123
		String s = "        ";
124
		if (m.condition != null) {
125
			out.println("        if (" + getExpression("_s", m.condition)
126
					+ ") {");
127
			s = s + "    ";
128
		}
45c451d by Jos van den Oever at 2010-01-27 129
		if (m.isChoice) {
6e4eb38 by Jos van den Oever at 2009-09-15 130
			boolean first = true;
2ff50d9 by Jos van den Oever at 2010-01-27 131
			Choice c = (Choice) m.type();
132
			for (String t : c.getChoiceNames()) {
6e4eb38 by Jos van den Oever at 2009-09-15 133
				out.print(s);
134
				if (!first) {
135
					out.print("} else ");
136
				}
137
				first = false;
138
				out.println("if (_s." + m.name + " instanceof " + t + ") {");
139
				out
140
						.println(s + "    write((" + t + ")_s." + m.name
141
								+ ", out);");
142
			}
143
			out.println(s + "}");
144
		} else if (m.isArray) {
145
			String t = getTypeName(m);
146
			out.println(s + "for (" + t + " _i: _s." + m.name + ") {");
45c451d by Jos van den Oever at 2010-01-27 147
			if (m.isStruct) {
6e4eb38 by Jos van den Oever at 2009-09-15 148
				out.println(s + "    write(_i, out);");
149
			} else {
2ff50d9 by Jos van den Oever at 2010-01-27 150
				out.println(s + "    out.write" + m.type().name + "(_i);");
6e4eb38 by Jos van den Oever at 2009-09-15 151
			}
152
			out.println(s + "}");
45c451d by Jos van den Oever at 2010-01-27 153
		} else if (m.isStruct) {
6e4eb38 by Jos van den Oever at 2009-09-15 154
			out.print(s);
155
			if (m.isOptional) {
156
				out.print("if (_s." + m.name + " != null) ");
157
			}
158
			out.println("write(_s." + m.name + ", out);");
159
		} else {
2ff50d9 by Jos van den Oever at 2010-01-27 160
			out.println(s + "out.write" + m.type().name + "(_s." + m.name
161
					+ ");");
6e4eb38 by Jos van den Oever at 2009-09-15 162
		}
163
		if (m.condition != null) {
164
			out.println("        }");
165
		}
166
	}
167
2c22c86 by Jos van den Oever at 2009-08-27 168
	String getTypeName(Member m) {
2ff50d9 by Jos van den Oever at 2010-01-27 169
		final TypeRegistry.Type t = m.type();
d2d3f42 by Jos van den Oever at 2010-01-30 170
		final TypeRegistry r = m.registry;
2ff50d9 by Jos van den Oever at 2010-01-27 171
		if (t instanceof Struct) {
172
			return m.type().name;
173
		} else if (t instanceof Choice) {
174
			return "Object";
175
		} else if (t == r.bit) {
84d4cfb by Jos van den Oever at 2009-08-17 176
			return "boolean";
2ff50d9 by Jos van den Oever at 2010-01-27 177
		} else if (t == r.uint2 || t == r.uint3 || t == r.uint4 || t == r.uint5
178
				|| t == r.uint6 || t == r.uint7 || t == r.uint8) {
79224b0 by Jos van den Oever at 2009-08-16 179
			return "byte";
c1d8729 by Jos van den Oever at 2010-09-27 180
		} else if (t == r.uint9 || t == r.uint12 || t == r.uint13
181
				|| t == r.uint14 || t == r.uint15
182
				|| t == r.int16) {
79224b0 by Jos van den Oever at 2009-08-16 183
			return "short";
2ff50d9 by Jos van den Oever at 2010-01-27 184
		} else if (t == r.uint16 || t == r.uint20 || t == r.uint30
185
				|| t == r.uint32 || t == r.int32) {
79224b0 by Jos van den Oever at 2009-08-16 186
			return "int";
187
		}
2ff50d9 by Jos van den Oever at 2010-01-27 188
		return t.name;
79224b0 by Jos van den Oever at 2009-08-16 189
	}
190
2c22c86 by Jos van den Oever at 2009-08-27 191
	String getMemberDeclaration(Member m) {
192
		if (m.isArray) {
193
			if (m.count == null) {
2ff50d9 by Jos van den Oever at 2010-01-27 194
				return "final java.util.List<" + m.type().name + "> " + m.name
195
						+ " = new java.util.ArrayList<" + m.type().name + ">()";
2c22c86 by Jos van den Oever at 2009-08-27 196
			} else {
197
				return getTypeName(m) + "[] " + m.name;
79224b0 by Jos van den Oever at 2009-08-16 198
			}
199
		} else {
2c22c86 by Jos van den Oever at 2009-08-27 200
			return getTypeName(m) + " " + m.name;
79224b0 by Jos van den Oever at 2009-08-16 201
		}
202
	}
203
2c22c86 by Jos van den Oever at 2009-08-27 204
	void printStructureClass(PrintWriter out, Struct s) {
205
		out.println("class " + s.name + " {");
206
		for (Member m : s.members) {
207
			String d = getMemberDeclaration(m);
208
			out.println("    " + d + ";");
79224b0 by Jos van den Oever at 2009-08-16 209
		}
210
211
		// function toString
212
		out.println("    public String toString() {");
2c22c86 by Jos van den Oever at 2009-08-27 213
		out.println("        String _s = \"" + s.name + ":\";");
214
		for (Member m : s.members) {
215
			out.print("        _s = _s + \"" + m.name
216
					+ ": \" + String.valueOf(" + m.name + ") + \"");
217
			if (m.isInteger && !m.isArray) {
218
				out.print("(\" + Integer.toHexString(" + m.name
219
						+ ").toUpperCase() + \")");
79224b0 by Jos van den Oever at 2009-08-16 220
			}
2c22c86 by Jos van den Oever at 2009-08-27 221
			out.println(", \";");
79224b0 by Jos van den Oever at 2009-08-16 222
		}
223
		out.println("        return _s;");
224
		out.println("    }");
225
		out.println("}");
226
227
	}
228
e18fe86 by Jos van den Oever at 2009-08-16 229
	String prependStructureToExpression(String expression, String structureName) {
230
		if (expression.length() > 0) {
79224b0 by Jos van den Oever at 2009-08-16 231
			Pattern p = Pattern.compile("([^.\\w])([.a-zA-Z])");
e18fe86 by Jos van den Oever at 2009-08-16 232
			Matcher m = p.matcher(expression);
233
			expression = m.replaceAll("$1" + structureName + ".$2");
79224b0 by Jos van den Oever at 2009-08-16 234
			p = Pattern.compile("^([a-zA-Z])");
e18fe86 by Jos van den Oever at 2009-08-16 235
			m = p.matcher(expression);
236
			expression = m.replaceAll(structureName + ".$1");
79224b0 by Jos van den Oever at 2009-08-16 237
		}
e18fe86 by Jos van den Oever at 2009-08-16 238
		return expression;
79224b0 by Jos van den Oever at 2009-08-16 239
	}
240
2c22c86 by Jos van den Oever at 2009-08-27 241
	void printStructureMemberParser(PrintWriter out, Member m) {
79224b0 by Jos van den Oever at 2009-08-16 242
		String s = "        ";
2c22c86 by Jos van den Oever at 2009-08-27 243
		String condition = null;
244
		if (m.condition != null) {
245
			condition = prependStructureToExpression(m.condition, "_s");
79224b0 by Jos van den Oever at 2009-08-16 246
			s = s + "    ";
247
			out.println("        if (" + condition + ") {");
248
		}
2c22c86 by Jos van den Oever at 2009-08-27 249
		String count = null;
250
		if (m.count != null) {
251
			count = prependStructureToExpression(m.count, "_s");
252
		}
79224b0 by Jos van den Oever at 2009-08-16 253
		String parse;
45c451d by Jos van den Oever at 2010-01-27 254
		if (m.isStruct) {
2ff50d9 by Jos van den Oever at 2010-01-27 255
			parse = "parse" + m.type().name + "(in);";
79224b0 by Jos van den Oever at 2009-08-16 256
		} else {
2ff50d9 by Jos van den Oever at 2010-01-27 257
			parse = "in.read" + m.type().name + "();";
79224b0 by Jos van den Oever at 2009-08-16 258
		}
259
45c451d by Jos van den Oever at 2010-01-27 260
		if (m.isChoice) {
2c22c86 by Jos van den Oever at 2009-08-27 261
			printChoiceParser(out, s, m);
79224b0 by Jos van den Oever at 2009-08-16 262
			return;
263
		}
2c22c86 by Jos van den Oever at 2009-08-27 264
		if (m.isArray && m.count == null) {
5edd5c0 by Jos van den Oever at 2009-09-16 265
			if (m.size != null) {
266
				printFixedSizeArrayParser(out, s, m);
267
			} else {
268
				// array for which no size is given: parse items until one fails
269
				printVariableArrayParser(out, s, m);
270
			}
79224b0 by Jos van den Oever at 2009-08-16 271
			return;
272
		}
2c22c86 by Jos van den Oever at 2009-08-27 273
		if (m.isOptional) {
274
			printOptionalMemberParser(out, s, m);
7b75457 by Jos van den Oever at 2009-08-16 275
			return;
276
		}
2c22c86 by Jos van den Oever at 2009-08-27 277
		if (count != null) {
79224b0 by Jos van den Oever at 2009-08-16 278
			out.println(s + "_c = " + count + ";");
279
		}
2c22c86 by Jos van den Oever at 2009-08-27 280
		out.print(s + "_s." + m.name + " = ");
281
		if (count != null) {
d2d3f42 by Jos van den Oever at 2010-01-30 282
			if (m.type() == m.registry.uint8) {
1a51da9 by Jos van den Oever at 2009-10-20 283
				out.println("in.readBytes(_c);");
284
			} else {
285
				out.println("new " + getTypeName(m) + "[_c];");
6e8ee0e by Jos van den Oever at 2010-02-04 286
				out.println(s + "for (int _j=0; _j<_c; ++_j) {");
287
				out.println(s + "    _s." + m.name + "[_j] = " + parse);
1a51da9 by Jos van den Oever at 2009-10-20 288
				printLimitationCheck(out, "            ", "_s." + m.name
6e8ee0e by Jos van den Oever at 2010-02-04 289
						+ "[_j]", m);
1a51da9 by Jos van den Oever at 2009-10-20 290
				out.println(s + "}");
291
			}
79224b0 by Jos van den Oever at 2009-08-16 292
		} else {
293
			out.println(parse);
2c22c86 by Jos van den Oever at 2009-08-27 294
			printLimitationCheck(out, "        ", "_s." + m.name, m);
79224b0 by Jos van den Oever at 2009-08-16 295
		}
2c22c86 by Jos van den Oever at 2009-08-27 296
		if (condition != null) {
79224b0 by Jos van den Oever at 2009-08-16 297
			out.println("        }");
298
		}
299
	}
300
2c22c86 by Jos van den Oever at 2009-08-27 301
	void printChoiceParser(PrintWriter out, String s, Member m) {
79224b0 by Jos van den Oever at 2009-08-16 302
		String closing = "";
303
		String exception = "_x";
267ecf8 by Jos van den Oever at 2009-09-29 304
		out.println(s + "_m = in.setMark();");
2ff50d9 by Jos van den Oever at 2010-01-27 305
		Choice c = (Choice) m.type();
306
		String choices[] = c.getChoiceNames();
4c82fdb by Jos van den Oever at 2009-10-19 307
		int length = (m.isOptional) ? choices.length : choices.length - 1;
267ecf8 by Jos van den Oever at 2009-09-29 308
		for (int i = 0; i < length; ++i) {
79224b0 by Jos van den Oever at 2009-08-16 309
			out.println(s + "try {");
4c82fdb by Jos van den Oever at 2009-10-19 310
			out.println(s + "    _s." + m.name + " = parse" + choices[i]
2c22c86 by Jos van den Oever at 2009-08-27 311
					+ "(in);");
5edd5c0 by Jos van den Oever at 2009-09-16 312
			out.println(s + "} catch (IOException " + exception + ") {");
313
			out.println(s + "    if (!(" + exception
314
					+ " instanceof IncorrectValueException) && !(" + exception
315
					+ " instanceof java.io.EOFException)) throw " + exception
316
					+ ";");
2ff50d9 by Jos van den Oever at 2010-01-27 317
			// out
318
			// .println(s
319
			// + "    if (in.distanceFromMark(_m) > 16) throw new IOException("
320
			// + exception + ");//onlyfordebug");
79224b0 by Jos van den Oever at 2009-08-16 321
			out.println(s + "    in.rewind(_m);");
322
			exception = exception + "x";
323
			closing = closing + "}";
324
		}
267ecf8 by Jos van den Oever at 2009-09-29 325
		if (!m.isOptional) {
326
			out.println(s + "    _s." + m.name + " = parse"
4c82fdb by Jos van den Oever at 2009-10-19 327
					+ choices[choices.length - 1] + "(in);");
267ecf8 by Jos van den Oever at 2009-09-29 328
		}
79224b0 by Jos van den Oever at 2009-08-16 329
		out.println(s + closing + " finally {");
330
		out.println(s + "    in.releaseMark(_m);");
331
		out.println(s + "}");
332
	}
333
5edd5c0 by Jos van den Oever at 2009-09-16 334
	void printFixedSizeArrayParser(PrintWriter out, String s, Member m) {
335
		out.println(s + "int _startPos = in.getPosition();");
336
		out.println(s + "while (in.getPosition() - _startPos < "
337
				+ getExpression("_s", m.size) + ") {");
2ff50d9 by Jos van den Oever at 2010-01-27 338
		out.println(s + "    " + m.type().name + " _t = parse" + m.type().name
339
				+ "(in);");
5edd5c0 by Jos van den Oever at 2009-09-16 340
		out.println(s + "    _s." + m.name + ".add(_t);");
341
		out.println(s + "}");
342
	}
343
2c22c86 by Jos van den Oever at 2009-08-27 344
	void printVariableArrayParser(PrintWriter out, String s, Member m) {
700ccda by Jos van den Oever at 2009-09-14 345
		out.println(s + "_atend = false;");
79224b0 by Jos van den Oever at 2009-08-16 346
		out.println(s + "while (!_atend) {");
2ff50d9 by Jos van den Oever at 2010-01-27 347
		// out
348
		// .println(s
349
		// +
350
		// "    System.out.println(\"round \"+(_i++) + \" \" + in.getPosition());");
14636bd by Jos van den Oever at 2009-08-20 351
		out.println(s + "    _m = in.setMark();");
79224b0 by Jos van den Oever at 2009-08-16 352
		out.println(s + "    try {");
2ff50d9 by Jos van den Oever at 2010-01-27 353
		out.println(s + "        " + m.type().name + " _t = parse"
354
				+ m.type().name + "(in);");
2c22c86 by Jos van den Oever at 2009-08-27 355
		out.println(s + "        _s." + m.name + ".add(_t);");
79224b0 by Jos van den Oever at 2009-08-16 356
		out.println(s + "    } catch(IncorrectValueException _e) {");
2ff50d9 by Jos van den Oever at 2010-01-27 357
		// out
358
		// .println(s
359
		// +
360
		// "    if (in.distanceFromMark(_m) > 16) throw new IOException(_e);//onlyfordebug");
79224b0 by Jos van den Oever at 2009-08-16 361
		out.println(s + "        _atend = true;");
362
		out.println(s + "        in.rewind(_m);");
363
		out.println(s + "    } catch(java.io.EOFException _e) {");
364
		out.println(s + "        _atend = true;");
365
		out.println(s + "        in.rewind(_m);");
366
		out.println(s + "    } finally {");
367
		out.println(s + "        in.releaseMark(_m);");
243f1e5 by Jos van den Oever at 2009-09-10 368
		out.println(s + "   }");
79224b0 by Jos van den Oever at 2009-08-16 369
		out.println(s + "}");
370
	}
371
2c22c86 by Jos van den Oever at 2009-08-27 372
	void printOptionalMemberParser(PrintWriter out, String s, Member m) {
7b75457 by Jos van den Oever at 2009-08-16 373
		out.println(s + "_m = in.setMark();");
374
		out.println(s + "try {");
2ff50d9 by Jos van den Oever at 2010-01-27 375
		out.println(s + "    _s." + m.name + " = parse" + m.type().name
376
				+ "(in);");
7b75457 by Jos van den Oever at 2009-08-16 377
		out.println(s + "} catch(IncorrectValueException _e) {");
84d4cfb by Jos van den Oever at 2009-08-17 378
		out
379
				.println(s
380
						+ "    if (in.distanceFromMark(_m) > 16) throw new IOException(_e);//onlyfordebug");
7b75457 by Jos van den Oever at 2009-08-16 381
		out.println(s + "    in.rewind(_m);");
382
		out.println(s + "} catch(java.io.EOFException _e) {");
383
		out.println(s + "    in.rewind(_m);");
384
		out.println(s + "} finally {");
385
		out.println(s + "    in.releaseMark(_m);");
386
		out.println(s + "}");
387
	}
388
2c22c86 by Jos van den Oever at 2009-08-27 389
	void printLimitationCheck(PrintWriter out, String s, String name, Member m) {
390
		for (Limitation l : m.limitations) {
391
			String mname = l.name;
7b75457 by Jos van den Oever at 2009-08-16 392
			if (!"".equals(mname)) {
393
				mname = name + "." + mname;
394
			} else {
395
				mname = name;
396
			}
2c22c86 by Jos van den Oever at 2009-08-27 397
			String condition;
398
			if (l.expression == null) {
399
				condition = getCondition(mname, l);
e18fe86 by Jos van den Oever at 2009-08-16 400
			} else {
2c22c86 by Jos van den Oever at 2009-08-27 401
				condition = getExpression(mname, l.expression);
e18fe86 by Jos van den Oever at 2009-08-16 402
			}
403
79224b0 by Jos van den Oever at 2009-08-16 404
			out.println(s + "if (!(" + condition + ")) {");
84d4cfb by Jos van den Oever at 2009-08-17 405
			String exceptionType = "IncorrectValueException";
406
			// if (!condition.contains(".recType")
407
			// && !condition.contains(".recVer")
408
			// && !condition.contains(".recInstance")) {
409
			// // special value for debugging: we only have recoverable
410
			// // exceptions in record headers, remove this in final code
411
			// exceptionType = "IOException";
412
			// }
14636bd by Jos van den Oever at 2009-08-20 413
			out.println(s + "    throw new " + exceptionType
414
					+ "(in.getPosition() + \"" + condition
415
					+ " for value \" + String.valueOf(" + name + ") );");
79224b0 by Jos van den Oever at 2009-08-16 416
			out.println(s + "}");
417
		}
418
	}
419
7b75457 by Jos van den Oever at 2009-08-16 420
	String getExpression(String structure, String expression) {
e18fe86 by Jos van den Oever at 2009-08-16 421
		if (Pattern.matches(".*[A-Za-z].*", expression)) {
422
			return prependStructureToExpression(expression, structure);
423
		}
424
		return structure + expression;
425
	}
426
2c22c86 by Jos van den Oever at 2009-08-27 427
	String getCondition(String name, Limitation l) {
428
		String value = l.value;
e18fe86 by Jos van den Oever at 2009-08-16 429
		String cmp = " == ";
430
		String cmb = " || ";
431
		if (value.startsWith("!")) {
432
			value = value.substring(1);
433
			cmp = " != ";
434
			cmb = " && ";
435
		}
79224b0 by Jos van den Oever at 2009-08-16 436
		if (value.contains("|")) {
437
			String values[] = value.split("\\|");
e18fe86 by Jos van den Oever at 2009-08-16 438
			String c = name + cmp + values[0];
79224b0 by Jos van den Oever at 2009-08-16 439
			for (int i = 1; i < values.length; ++i) {
e18fe86 by Jos van den Oever at 2009-08-16 440
				c = c + cmb + name + cmp + values[i];
79224b0 by Jos van den Oever at 2009-08-16 441
			}
442
			return c;
443
		}
2c22c86 by Jos van den Oever at 2009-08-27 444
		return name + cmp + value;
79224b0 by Jos van den Oever at 2009-08-16 445
	}
446
}