1
19
20 package com.liferay.portal.tools;
21
22 import com.liferay.portal.kernel.util.CharPool;
23 import com.liferay.portal.kernel.util.FileUtil;
24 import com.liferay.portal.kernel.util.StringPool;
25 import com.liferay.portal.kernel.util.StringUtil;
26 import com.liferay.portal.kernel.util.UnicodeFormatter;
27 import com.liferay.portal.tools.servicebuilder.ServiceBuilder;
28 import com.liferay.portal.util.InitUtil;
29
30 import java.io.File;
31
32 import java.util.HashMap;
33 import java.util.Map;
34
35 import org.apache.tools.ant.DirectoryScanner;
36
37
43 public class SeleneseToJavaBuilder {
44
45 public static void main(String[] args) throws Exception {
46 InitUtil.initWithSpring();
47
48 if (args.length == 1) {
49 new SeleneseToJavaBuilder(args[0]);
50 }
51 else {
52 throw new IllegalArgumentException();
53 }
54 }
55
56 public SeleneseToJavaBuilder(String basedir) throws Exception {
57 DirectoryScanner ds = new DirectoryScanner();
58
59 ds.setBasedir(basedir);
60 ds.setIncludes(new String[] {"**\\*.html"});
61
62 ds.scan();
63
64 String[] files = ds.getIncludedFiles();
65
66 for (int i = 0; i < files.length; i++) {
67
68
72
81
82 translate(basedir, files[i]);
83 }
84 }
85
86 protected String fixParam(String param) {
87 StringBuilder sb = new StringBuilder();
88
89 char[] array = param.toCharArray();
90
91 for (int i = 0; i < array.length; ++i) {
92 char c = array[i];
93
94 if (c == CharPool.BACK_SLASH) {
95 sb.append("\\\\");
96 }
97 else if (c == CharPool.QUOTE) {
98 sb.append("\\\"");
99 }
100 else if (Character.isWhitespace(c)) {
101 sb.append(c);
102 }
103 else if ((c < 0x0020) || (c > 0x007e)) {
104 sb.append("\\u");
105 sb.append(UnicodeFormatter.charToHex(c));
106 }
107 else {
108 sb.append(c);
109 }
110 }
111
112 return StringUtil.replace(
113 sb.toString(), _FIX_PARAM_OLD_SUBS, _FIX_PARAM_NEW_SUBS);
114 }
115
116 protected String[] getParams(String step) throws Exception {
117 String[] params = new String[3];
118
119 int x = 0;
120 int y = 0;
121
122 for (int i = 0; i < 3; i++) {
123 x = step.indexOf("<td>", x) + 4;
124 y = step.indexOf("\n", x);
125 y = step.lastIndexOf("</td>", y);
126
127 params[i] = step.substring(x, y);
128 }
129
130 return params;
131 }
132
133 protected void translate(String basedir, String file) throws Exception {
134 file = StringUtil.replace(
135 file, StringPool.BACK_SLASH, StringPool.SLASH);
136
137 int x = file.lastIndexOf(StringPool.SLASH);
138 int y = file.indexOf(StringPool.PERIOD);
139
140 String testPackagePath = StringUtil.replace(
141 file.substring(0, x), StringPool.SLASH, StringPool.PERIOD);
142 String testName = file.substring(x + 1, y);
143 String testMethodName =
144 "test" + testName.substring(0, testName.length() - 4);
145 String testFileName = basedir + "/" + file.substring(0, y) + ".java";
146
147 StringBuilder sb = new StringBuilder();
148
149 sb.append("package " + testPackagePath + ";\n\n");
150
151 sb.append("import com.liferay.portal.kernel.util.FileUtil;\n");
152 sb.append("import com.liferay.portal.kernel.util.StringPool;\n");
153 sb.append("import com.liferay.portalweb.portal.BaseTestCase;\n\n");
154 sb.append(
155 "import com.liferay.portalweb.portal.util.RuntimeVariables;\n\n");
156
157 sb.append("public class " + testName + " extends BaseTestCase {");
158
159 sb.append("public void " + testMethodName + "() throws Exception {");
160
161 String xml = FileUtil.read(basedir + "/" + file);
162
163 if ((xml.indexOf("<title>" + testName + "</title>") == -1) ||
164 (xml.indexOf("colspan=\"3\">" + testName + "</td>") == -1)) {
165
166 System.out.println(testName + " has an invalid test name");
167 }
168
169 if (xml.indexOf(""") != -1) {
170 xml = StringUtil.replace(xml, """, "\"");
171
172 FileUtil.write(basedir + "/" + file, xml);
173 }
174
175 x = xml.indexOf("<tbody>");
176 y = xml.indexOf("</tbody>");
177
178 xml = xml.substring(x, y + 8);
179
180 Map<String, String> labels = new HashMap<String, String>();
181
182 int labelCount = 1;
183
184 x = 0;
185 y = 0;
186
187 while (true) {
188 x = xml.indexOf("<tr>", x);
189 y = xml.indexOf("\n</tr>", x);
190
191 if ((x == -1) || (y == -1)) {
192 break;
193 }
194
195 x += 6;
196 y++;
197
198 String step = xml.substring(x, y);
199
200 String[] params = getParams(step);
201
202 String param1 = params[0];
203 String param2 = fixParam(params[1]);
204
205 if (param1.equals("label")) {
206 String label = labels.get(param2);
207
208 if (label == null) {
209 labelCount++;
210
211 label = labels.put(param2, String.valueOf(labelCount));
212 }
213 }
214 }
215
216 if (labels.size() > 0) {
217 sb.append("int label = 1;");
218
219 sb.append("while (label >= 1) {");
220 sb.append("switch (label) {");
221 sb.append("case 1:");
222 }
223
224 x = 0;
225 y = 0;
226
227 while (true) {
228 x = xml.indexOf("<tr>", x);
229 y = xml.indexOf("\n</tr>", x);
230
231 if ((x == -1) || (y == -1)) {
232 break;
233 }
234
235 x += 6;
236 y++;
237
238 String step = xml.substring(x, y);
239
240 String[] params = getParams(step);
241
242 String param1 = params[0];
243 String param2 = fixParam(params[1]);
244 String param3 = fixParam(params[2]);
245
246 if (param1.equals("addSelection") || param1.equals("select") ||
247 param1.equals("type") || param1.equals("typeKeys") ||
248 param1.equals("waitForPopUp")) {
249
250 sb.append("selenium.");
251 sb.append(param1);
252 sb.append("(\"");
253 sb.append(param2);
254 sb.append("\", RuntimeVariables.replace(\"");
255 sb.append(param3);
256 sb.append("\"));");
257 }
258 else if (param1.equals("assertAlert") ||
259 param1.equals("assertNotAlert")) {
260
261 if (param1.equals("assertAlert")) {
262 sb.append("assertEquals");
263 }
264 else if (param1.equals("assertNotAlert")) {
265 sb.append("assertNotEquals");
266 }
267
268 sb.append("(\"");
269 sb.append(param2);
270 sb.append("\", selenium.getAlert());");
271 }
272 else if (param1.equals("assertChecked") ||
273 param1.equals("assertNotChecked")) {
274
275 if (param1.equals("assertChecked")) {
276 sb.append("assertTrue");
277 }
278 else if (param1.equals("assertNotChecked")) {
279 sb.append("assertFalse");
280 }
281
282 sb.append("(selenium.isChecked(\"");
283 sb.append(param2);
284 sb.append("\"));");
285 }
286 else if (param1.equals("assertConfirmation")) {
287 param2 = StringUtil.replace(param2, "?", "[\\\\s\\\\S]");
288
289 sb.append("assertTrue(selenium.getConfirmation().matches(\"^");
290 sb.append(param2);
291 sb.append("$\"));");
292 }
293 else if (param1.equals("assertLocation") ||
294 param1.equals("assertNotLocation")) {
295
296 if (param1.equals("assertLocation")) {
297 sb.append("assertEquals");
298 }
299 else if (param1.equals("assertNotLocation")) {
300 sb.append("assertNotEquals");
301 }
302
303 sb.append("(\"");
304 sb.append(param2);
305 sb.append("\", selenium.getLocation());");
306 }
307 else if (param1.equals("assertElementNotPresent") ||
308 param1.equals("assertElementPresent")) {
309
310 if (param1.equals("assertElementNotPresent")) {
311 sb.append("assertFalse");
312 }
313 else if (param1.equals("assertElementPresent")) {
314 sb.append("assertTrue");
315 }
316
317 sb.append("(selenium.isElementPresent(\"");
318 sb.append(param2);
319 sb.append("\"));");
320 }
321 else if (param1.equals("assertNotText") ||
322 param1.equals("assertText")) {
323
324 if (param1.equals("assertNotText")) {
325 sb.append("assertNotEquals");
326 }
327 else if (param1.equals("assertText")) {
328 sb.append("assertEquals");
329 }
330
331 sb.append("(\"");
332 sb.append(param3);
333 sb.append("\", selenium.getText(\"");
334 sb.append(param2);
335 sb.append("\"));");
336 }
337 else if (param1.equals("assertNotValue") ||
338 param1.equals("assertValue")) {
339
340 if (param1.equals("assertNotValue")) {
341 sb.append("assertNotEquals");
342 }
343 else if (param1.equals("assertValue")) {
344 sb.append("assertEquals");
345 }
346
347 sb.append("(\"");
348 sb.append(param3);
349 sb.append("\", selenium.getValue(\"");
350 sb.append(param2);
351 sb.append("\"));");
352 }
353 else if (param1.equals("assertNotVisible") ||
354 param1.equals("assertVisible")) {
355
356 if (param1.equals("assertNotVisible")) {
357 sb.append("assertFalse");
358 }
359 else if (param1.equals("assertVisible")) {
360 sb.append("assertTrue");
361 }
362
363 sb.append("(");
364 sb.append("selenium.isVisible(\"");
365 sb.append(param2);
366 sb.append("\"));");
367 }
368 else if (param1.equals("assertSelectOptions")) {
369 String[] expectedArray = StringUtil.split(param3);
370
371 sb.append("String[] actualArray = ");
372 sb.append("selenium.getSelectOptions(\"");
373 sb.append(param2);
374 sb.append("\");");
375
376 sb.append("assertEquals(");
377 sb.append(expectedArray.length);
378 sb.append(", actualArray.length);");
379
380 for (int i = 0; i < expectedArray.length; i++) {
381 sb.append("assertEquals(\"");
382 sb.append(expectedArray[i]);
383 sb.append("\", actualArray[");
384 sb.append(i);
385 sb.append("]);");
386 }
387 }
388 else if (param1.equals("assertTextNotPresent") ||
389 param1.equals("assertTextPresent")) {
390
391 if (param1.equals("assertTextNotPresent")) {
392 sb.append("assertFalse");
393 }
394 else if (param1.equals("assertTextPresent")) {
395 sb.append("assertTrue");
396 }
397
398 sb.append("(selenium.isTextPresent(\"");
399 sb.append(param2);
400 sb.append("\"));");
401 }
402 else if (param1.equals("captureEntirePageScreenshot")) {
403 int pos = param2.lastIndexOf("\\");
404
405 String dirName = param2.substring(0, pos + 1);
406
407 sb.append("FileUtil.mkdirs(RuntimeVariables.replace(\"");
408 sb.append(dirName);
409 sb.append("\"));");
410 sb.append("selenium.captureEntirePageScreenshot(");
411 sb.append("RuntimeVariables.replace(\"");
412 sb.append(param2);
413 sb.append("\"), \"\");");
414 }
415 else if (param1.equals("check") || param1.equals("click") ||
416 param1.equals("mouseDown") || param1.equals("mouseUp") ||
417 param1.equals("open") || param1.equals("uncheck") ||
418 param1.equals("selectFrame") ||
419 param1.equals("selectWindow")) {
420
421 sb.append("selenium.");
422 sb.append(param1);
423 sb.append("(\"");
424 sb.append(param2);
425 sb.append("\");");
426 }
427 else if (param1.equals("clickAndWait")) {
428 sb.append("selenium.click(RuntimeVariables.replace(\"");
429 sb.append(param2);
430 sb.append("\"));");
431 sb.append("selenium.waitForPageToLoad(\"30000\");");
432 }
433 else if (param1.equals("close")) {
434 sb.append("selenium.");
435 sb.append(param1);
436 sb.append("();");
437 }
438 else if (param1.equals("dragAndDropToObject")) {
439 sb.append("selenium.");
440 sb.append("dragAndDropToObject(\"");
441 sb.append(param2);
442 sb.append("\", \"");
443 sb.append(param3);
444 sb.append("\");");
445 }
446 else if (param1.equals("gotoIf")) {
447 String conditional = StringUtil.replace(
448 param2, new String[] {"${", "}"}, new String[] {"", ""});
449
450 sb.append("if (");
451 sb.append(conditional);
452 sb.append(") {");
453 sb.append("label =");
454 sb.append(labels.get(param3));
455 sb.append(";");
456 sb.append("continue;");
457 sb.append("}");
458 }
459 else if (param1.equals("label")) {
460 String label = labels.get(param2);
461
462 sb.append("case ");
463 sb.append(label);
464 sb.append(":");
465 }
466 else if (param1.equals("pause")) {
467 sb.append("Thread.sleep(");
468 sb.append(param2);
469 sb.append(");");
470 }
471 else if (param1.equals("selectAndWait")) {
472 sb.append("selenium.select(\"");
473 sb.append(param2);
474 sb.append("\", \"");
475 sb.append(param3);
476 sb.append("\");");
477 sb.append("selenium.waitForPageToLoad(\"30000\");");
478 }
479 else if (param1.equals("store")) {
480 sb.append("boolean ");
481 sb.append(param3);
482 sb.append(" = ");
483
484 if (param2.startsWith("eval(")) {
485 String eval = param2.substring(5, param2.length() - 1);
486
487 eval = StringUtil.replace(eval, "'", "\"");
488
489 sb.append(eval);
490 }
491
492 sb.append(";");
493 }
494 else if (param1.equals("storeText")) {
495 sb.append("String ");
496 sb.append(param3);
497 sb.append(" = selenium.getText(\"");
498 sb.append(param2);
499 sb.append("\");");
500
501 sb.append("RuntimeVariables.setValue(\"");
502 sb.append(param3);
503 sb.append("\", ");
504 sb.append(param3);
505 sb.append(");");
506 }
507 else if (param1.equals("verifyElementNotPresent") ||
508 param1.equals("verifyElementPresent")) {
509
510 if (param1.equals("verifyElementNotPresent")) {
511 sb.append("verifyFalse");
512 }
513 else if (param1.equals("verifyElementPresent")) {
514 sb.append("verifyTrue");
515 }
516
517 sb.append("(selenium.isElementPresent(\"");
518 sb.append(param2);
519 sb.append("\"));");
520 }
521 else if (param1.equals("verifyTextNotPresent") ||
522 param1.equals("verifyTextPresent")) {
523
524 if (param1.equals("verifyTextNotPresent")) {
525 sb.append("verifyFalse");
526 }
527 else if (param1.equals("verifyTextPresent")) {
528 sb.append("verifyTrue");
529 }
530
531 sb.append("(selenium.isTextPresent(\"");
532 sb.append(param2);
533 sb.append("\"));");
534 }
535 else if (param1.equals("verifyTitle")) {
536 sb.append("verifyEquals(\"");
537 sb.append(param2);
538 sb.append("\", selenium.getTitle());");
539 }
540 else if (param1.equals("waitForElementNotPresent") ||
541 param1.equals("waitForElementPresent") ||
542 param1.equals("waitForTextNotPresent") ||
543 param1.equals("waitForTextPresent")) {
544
545 sb.append("for (int second = 0;; second++) {");
546 sb.append("if (second >= 60) {");
547 sb.append("fail(\"timeout\");");
548 sb.append("}");
549
550 sb.append("try {");
551 sb.append("if (");
552
553 if (param1.equals("waitForElementNotPresent") ||
554 param1.equals("waitForTextNotPresent")) {
555
556 sb.append("!");
557 }
558
559 sb.append("selenium.");
560
561 if (param1.equals("waitForElementNotPresent") ||
562 param1.equals("waitForElementPresent")) {
563
564 sb.append("isElementPresent");
565 }
566 else if (param1.equals("waitForTextNotPresent") ||
567 param1.equals("waitForTextPresent")) {
568
569 sb.append("isTextPresent");
570 }
571
572 sb.append("(\"");
573 sb.append(param2);
574 sb.append("\")) {");
575 sb.append("break;");
576 sb.append("}");
577 sb.append("}");
578 sb.append("catch (Exception e) {");
579 sb.append("}");
580
581 sb.append("Thread.sleep(1000);");
582 sb.append("}");
583 }
584 else if (param1.equals("waitForNotVisible") ||
585 param1.equals("waitForVisible")) {
586
587 sb.append("for (int second = 0;; second++) {");
588 sb.append("if (second >= 60) {");
589 sb.append("fail(\"timeout\");");
590 sb.append("}");
591
592 sb.append("try {");
593 sb.append("if (");
594
595 if (param1.equals("waitForNotVisible")) {
596 sb.append("!");
597 }
598
599 sb.append("selenium.isVisible");
600 sb.append("(\"");
601 sb.append(param2);
602 sb.append("\")) {");
603 sb.append("break;");
604 sb.append("}");
605 sb.append("}");
606 sb.append("catch (Exception e) {");
607 sb.append("}");
608
609 sb.append("Thread.sleep(1000);");
610 sb.append("}");
611 }
612 else if (param1.equals("waitForTable")) {
613 sb.append("for (int second = 0;; second++) {");
614 sb.append("if (second >= 60) {");
615 sb.append("fail(\"timeout\");");
616 sb.append("}");
617
618 sb.append("try {");
619 sb.append("if (StringPool.BLANK.equals(selenium.getTable(\"");
620 sb.append(param2);
621 sb.append("\"))) {");
622 sb.append("break;");
623 sb.append("}");
624 sb.append("}");
625 sb.append("catch (Exception e) {");
626 sb.append("}");
627
628 sb.append("Thread.sleep(1000);");
629 sb.append("}");
630 }
631 else {
632 System.out.println(param1 + " was not translated");
633 }
634 }
635
636 if (labels.size() > 0) {
637 sb.append("case 100:");
638 sb.append("label = -1;");
639 sb.append("}");
640 sb.append("}");
641 }
642
643 sb.append("}");
644 sb.append("}");
645
646 String content = sb.toString();
647
648 ServiceBuilder.writeFile(new File(testFileName), content);
649 }
650
651 private static final String[] _FIX_PARAM_OLD_SUBS = new String[] {
652 "\\\\n", "<br />"
653 };
654
655 private static final String[] _FIX_PARAM_NEW_SUBS = new String[] {
656 "\\n", "\\n"
657 };
658
659 }