1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portal.tools;
24  
25  import com.liferay.portal.kernel.util.CharPool;
26  import com.liferay.portal.kernel.util.FileUtil;
27  import com.liferay.portal.kernel.util.StringPool;
28  import com.liferay.portal.kernel.util.StringUtil;
29  import com.liferay.portal.kernel.util.UnicodeFormatter;
30  import com.liferay.portal.tools.servicebuilder.ServiceBuilder;
31  import com.liferay.portal.util.InitUtil;
32  
33  import java.io.File;
34  
35  import java.util.HashMap;
36  import java.util.Map;
37  
38  import org.apache.tools.ant.DirectoryScanner;
39  
40  /**
41   * <a href="SeleneseToJavaBuilder.java.html"><b><i>View Source</i></b></a>
42   *
43   * @author Brian Wing Shun Chan
44   *
45   */
46  public class SeleneseToJavaBuilder {
47  
48      public static void main(String[] args) throws Exception {
49          InitUtil.initWithSpring();
50  
51          if (args.length == 1) {
52              new SeleneseToJavaBuilder(args[0]);
53          }
54          else {
55              throw new IllegalArgumentException();
56          }
57      }
58  
59      public SeleneseToJavaBuilder(String basedir) throws Exception {
60          DirectoryScanner ds = new DirectoryScanner();
61  
62          ds.setBasedir(basedir);
63          ds.setIncludes(new String[] {"**\\*.html"});
64  
65          ds.scan();
66  
67          String[] files = ds.getIncludedFiles();
68  
69          for (int i = 0; i < files.length; i++) {
70  
71              // I would have preferred to use XlateHtmlSeleneseToJava, but it
72              // is horribly out of sync with Selenium IDE and generates incorrect
73              // code.
74  
75              /*File file = new File(basedir + "/" + files[i]);
76  
77              String input = StringUtil.replace(file.toString(), "\\", "/");
78  
79              XlateHtmlSeleneseToJava.main(
80                  new String[] {
81                      "test", "-silent", input
82                  }
83              );*/
84  
85              translate(basedir, files[i]);
86          }
87      }
88  
89      protected String fixParam(String param) {
90          StringBuilder sb = new StringBuilder();
91  
92          char[] array = param.toCharArray();
93  
94          for (int i = 0; i < array.length; ++i) {
95              char c = array[i];
96  
97              if (c == CharPool.BACK_SLASH) {
98                  sb.append("\\\\");
99              }
100             else if (c == CharPool.QUOTE) {
101                 sb.append("\\\"");
102             }
103             else if (Character.isWhitespace(c)) {
104                 sb.append(c);
105             }
106             else if ((c < 0x0020) || (c > 0x007e)) {
107                 sb.append("\\u");
108                 sb.append(UnicodeFormatter.charToHex(c));
109             }
110             else {
111                 sb.append(c);
112             }
113         }
114 
115         return StringUtil.replace(
116             sb.toString(), _FIX_PARAM_OLD_SUBS, _FIX_PARAM_NEW_SUBS);
117     }
118 
119     protected String[] getParams(String step) throws Exception {
120         String[] params = new String[3];
121 
122         int x = 0;
123         int y = 0;
124 
125         for (int i = 0; i < 3; i++) {
126             x = step.indexOf("<td>", x) + 4;
127             y = step.indexOf("\n", x);
128             y = step.lastIndexOf("</td>", y);
129 
130             params[i] = step.substring(x, y);
131         }
132 
133         return params;
134     }
135 
136     protected void translate(String basedir, String file) throws Exception {
137         file = StringUtil.replace(
138             file, StringPool.BACK_SLASH, StringPool.SLASH);
139 
140         int x = file.lastIndexOf(StringPool.SLASH);
141         int y = file.indexOf(StringPool.PERIOD);
142 
143         String testPackagePath = StringUtil.replace(
144             file.substring(0, x), StringPool.SLASH, StringPool.PERIOD);
145         String testName = file.substring(x + 1, y);
146         String testMethodName =
147             "test" + testName.substring(0, testName.length() - 4);
148         String testFileName = basedir + "/" + file.substring(0, y) + ".java";
149 
150         StringBuilder sb = new StringBuilder();
151 
152         sb.append("package " + testPackagePath + ";\n\n");
153 
154         sb.append("import com.liferay.portal.kernel.util.FileUtil;\n");
155         sb.append("import com.liferay.portal.kernel.util.StringPool;\n");
156         sb.append("import com.liferay.portalweb.portal.BaseTestCase;\n\n");
157         sb.append(
158             "import com.liferay.portalweb.portal.util.RuntimeVariables;\n\n");
159 
160         sb.append("public class " + testName + " extends BaseTestCase {");
161 
162         sb.append("public void " + testMethodName + "() throws Exception {");
163 
164         String xml = FileUtil.read(basedir + "/" + file);
165 
166         if ((xml.indexOf("<title>" + testName + "</title>") == -1) ||
167             (xml.indexOf("colspan=\"3\">" + testName + "</td>") == -1)) {
168 
169             System.out.println(testName + " has an invalid test name");
170         }
171 
172         if (xml.indexOf("&quot;") != -1) {
173             xml = StringUtil.replace(xml, "&quot;", "\"");
174 
175             FileUtil.write(basedir + "/" + file, xml);
176         }
177 
178         x = xml.indexOf("<tbody>");
179         y = xml.indexOf("</tbody>");
180 
181         xml = xml.substring(x, y + 8);
182 
183         Map<String, String> labels = new HashMap<String, String>();
184 
185         int labelCount = 1;
186 
187         x = 0;
188         y = 0;
189 
190         while (true) {
191             x = xml.indexOf("<tr>", x);
192             y = xml.indexOf("\n</tr>", x);
193 
194             if ((x == -1) || (y == -1)) {
195                 break;
196             }
197 
198             x += 6;
199             y++;
200 
201             String step = xml.substring(x, y);
202 
203             String[] params = getParams(step);
204 
205             String param1 = params[0];
206             String param2 = fixParam(params[1]);
207 
208             if (param1.equals("label")) {
209                 String label = labels.get(param2);
210 
211                 if (label == null) {
212                     labelCount++;
213 
214                     label = labels.put(param2, String.valueOf(labelCount));
215                 }
216             }
217         }
218 
219         if (labels.size() > 0) {
220             sb.append("int label = 1;");
221 
222             sb.append("while (label >= 1) {");
223             sb.append("switch (label) {");
224             sb.append("case 1:");
225         }
226 
227         x = 0;
228         y = 0;
229 
230         while (true) {
231             x = xml.indexOf("<tr>", x);
232             y = xml.indexOf("\n</tr>", x);
233 
234             if ((x == -1) || (y == -1)) {
235                 break;
236             }
237 
238             x += 6;
239             y++;
240 
241             String step = xml.substring(x, y);
242 
243             String[] params = getParams(step);
244 
245             String param1 = params[0];
246             String param2 = fixParam(params[1]);
247             String param3 = fixParam(params[2]);
248 
249             if (param1.equals("addSelection") || param1.equals("keyPress") ||
250                 param1.equals("select") || param1.equals("type") ||
251                 param1.equals("typeKeys") || param1.equals("waitForPopUp")) {
252 
253                 sb.append("selenium.");
254                 sb.append(param1);
255                 sb.append("(\"");
256                 sb.append(param2);
257                 sb.append("\", RuntimeVariables.replace(\"");
258                 sb.append(param3);
259                 sb.append("\"));");
260             }
261             else if (param1.equals("assertAlert") ||
262                      param1.equals("assertNotAlert")) {
263 
264                 if (param1.equals("assertAlert")) {
265                     sb.append("assertEquals");
266                 }
267                 else if (param1.equals("assertNotAlert")) {
268                     sb.append("assertNotEquals");
269                 }
270 
271                 sb.append("(\"");
272                 sb.append(param2);
273                 sb.append("\", selenium.getAlert());");
274             }
275             else if (param1.equals("assertChecked") ||
276                      param1.equals("assertNotChecked")) {
277 
278                 if (param1.equals("assertChecked")) {
279                     sb.append("assertTrue");
280                 }
281                 else if (param1.equals("assertNotChecked")) {
282                     sb.append("assertFalse");
283                 }
284 
285                 sb.append("(selenium.isChecked(\"");
286                 sb.append(param2);
287                 sb.append("\"));");
288             }
289             else if (param1.equals("assertConfirmation")) {
290                 param2 = StringUtil.replace(param2, "?", "[\\\\s\\\\S]");
291 
292                 sb.append("assertTrue(selenium.getConfirmation().matches(\"^");
293                 sb.append(param2);
294                 sb.append("$\"));");
295             }
296             else if (param1.equals("assertLocation") ||
297                      param1.equals("assertNotLocation")) {
298 
299                 if (param1.equals("assertLocation")) {
300                     sb.append("assertEquals");
301                 }
302                 else if (param1.equals("assertNotLocation")) {
303                     sb.append("assertNotEquals");
304                 }
305 
306                 sb.append("(\"");
307                 sb.append(param2);
308                 sb.append("\", selenium.getLocation());");
309             }
310             else if (param1.equals("assertElementNotPresent") ||
311                      param1.equals("assertElementPresent")) {
312 
313                 if (param1.equals("assertElementNotPresent")) {
314                     sb.append("assertFalse");
315                 }
316                 else if (param1.equals("assertElementPresent")) {
317                     sb.append("assertTrue");
318                 }
319 
320                 sb.append("(selenium.isElementPresent(\"");
321                 sb.append(param2);
322                 sb.append("\"));");
323             }
324             else if (param1.equals("assertNotPartialText") ||
325                      param1.equals("assertPartialText")) {
326 
327                 if (param1.equals("assertNotPartialText")) {
328                     sb.append("assertFalse");
329                 }
330                 else if (param1.equals("assertPartialText")) {
331                     sb.append("assertTrue");
332                 }
333 
334                 sb.append("(selenium.isPartialText(\"");
335                 sb.append(param2);
336                 sb.append("\", ");
337 
338                 if (param3.startsWith("${")) {
339                     sb.append("RuntimeVariables.getValue(\"");
340 
341                     String text = param3.substring(2, param3.length() - 1);
342 
343                     sb.append(text);
344                     sb.append("\")");
345                 }
346                 else {
347                     sb.append("\"");
348                     sb.append(param3);
349                     sb.append("\"");
350                 }
351 
352                 sb.append("));");
353             }
354             else if (param1.equals("assertNotText") ||
355                      param1.equals("assertText")) {
356 
357                 if (param1.equals("assertNotText")) {
358                     sb.append("assertNotEquals");
359                 }
360                 else if (param1.equals("assertText")) {
361                     sb.append("assertEquals");
362                 }
363 
364                 sb.append("(RuntimeVariables.replace(\"");
365                 sb.append(param3);
366                 sb.append("\"), selenium.getText(\"");
367                 sb.append(param2);
368                 sb.append("\"));");
369             }
370             else if (param1.equals("assertNotValue") ||
371                      param1.equals("assertValue")) {
372 
373                 if (param1.equals("assertNotValue")) {
374                     sb.append("assertNotEquals");
375                 }
376                 else if (param1.equals("assertValue")) {
377                     sb.append("assertEquals");
378                 }
379 
380                 sb.append("(\"");
381                 sb.append(param3);
382                 sb.append("\", selenium.getValue(\"");
383                 sb.append(param2);
384                 sb.append("\"));");
385             }
386             else if (param1.equals("assertNotVisible") ||
387                      param1.equals("assertVisible")) {
388 
389                 if (param1.equals("assertNotVisible")) {
390                     sb.append("assertFalse");
391                 }
392                 else if (param1.equals("assertVisible")) {
393                     sb.append("assertTrue");
394                 }
395 
396                 sb.append("(");
397                 sb.append("selenium.isVisible(\"");
398                 sb.append(param2);
399                 sb.append("\"));");
400             }
401             else if (param1.equals("assertSelectOptions")) {
402                 String[] expectedArray = StringUtil.split(param3);
403 
404                 sb.append("String[] actualArray = ");
405                 sb.append("selenium.getSelectOptions(\"");
406                 sb.append(param2);
407                 sb.append("\");");
408 
409                 sb.append("assertEquals(");
410                 sb.append(expectedArray.length);
411                 sb.append(", actualArray.length);");
412 
413                 for (int i = 0; i < expectedArray.length; i++) {
414                     sb.append("assertEquals(\"");
415                     sb.append(expectedArray[i]);
416                     sb.append("\", actualArray[");
417                     sb.append(i);
418                     sb.append("]);");
419                 }
420             }
421             else if (param1.equals("assertTextNotPresent") ||
422                      param1.equals("assertTextPresent")) {
423 
424                 if (param1.equals("assertTextNotPresent")) {
425                     sb.append("assertFalse");
426                 }
427                 else if (param1.equals("assertTextPresent")) {
428                     sb.append("assertTrue");
429                 }
430 
431                 sb.append("(selenium.isTextPresent(\"");
432                 sb.append(param2);
433                 sb.append("\"));");
434             }
435             else if (param1.equals("captureEntirePageScreenshot")) {
436                 int pos = param2.lastIndexOf("\\");
437 
438                 String dirName = param2.substring(0, pos + 1);
439 
440                 sb.append("FileUtil.mkdirs(RuntimeVariables.replace(\"");
441                 sb.append(dirName);
442                 sb.append("\"));");
443                 sb.append("selenium.captureEntirePageScreenshot(");
444                 sb.append("RuntimeVariables.replace(\"");
445                 sb.append(param2);
446                 sb.append("\"), \"\");");
447             }
448             else if (param1.equals("check") || param1.equals("click") ||
449                      param1.equals("mouseDown") || param1.equals("mouseUp") ||
450                      param1.equals("open") || param1.equals("uncheck") ||
451                      param1.equals("selectFrame") ||
452                      param1.equals("selectWindow")) {
453 
454                 sb.append("selenium.");
455                 sb.append(param1);
456                 sb.append("(\"");
457                 sb.append(param2);
458                 sb.append("\");");
459             }
460             else if (param1.equals("clickAndWait")) {
461                 sb.append("selenium.click(RuntimeVariables.replace(\"");
462                 sb.append(param2);
463                 sb.append("\"));");
464                 sb.append("selenium.waitForPageToLoad(\"30000\");");
465             }
466             else if (param1.equals("close") || param1.equals("refresh")) {
467                 sb.append("selenium.");
468                 sb.append(param1);
469                 sb.append("();");
470             }
471             else if (param1.equals("dragAndDropToObject")) {
472                 sb.append("selenium.");
473                 sb.append("dragAndDropToObject(\"");
474                 sb.append(param2);
475                 sb.append("\", \"");
476                 sb.append(param3);
477                 sb.append("\");");
478             }
479             else if (param1.equals("echo")) {
480                 sb.append("System.out.println(\"");
481                 sb.append(param2);
482                 sb.append("\");");
483             }
484             else if (param1.equals("gotoIf")) {
485                 String conditional = StringUtil.replace(
486                     param2, new String[] {"${", "}"}, new String[] {"", ""});
487 
488                 sb.append("if (");
489                 sb.append(conditional);
490                 sb.append(") {");
491                 sb.append("label =");
492                 sb.append(labels.get(param3));
493                 sb.append(";");
494                 sb.append("continue;");
495                 sb.append("}");
496             }
497             else if (param1.equals("keyPressAndWait")) {
498                 sb.append("selenium.keyPress(\"");
499                 sb.append(param2);
500                 sb.append("\", RuntimeVariables.replace(\"");
501                 sb.append(param3);
502                 sb.append("\"));");
503                 sb.append("selenium.waitForPageToLoad(\"30000\");");
504             }
505             else if (param1.equals("label")) {
506                 String label = labels.get(param2);
507 
508                 sb.append("case ");
509                 sb.append(label);
510                 sb.append(":");
511             }
512             else if (param1.equals("pause")) {
513                 sb.append("Thread.sleep(");
514                 sb.append(param2);
515                 sb.append(");");
516             }
517             else if (param1.equals("refreshAndWait")) {
518                 sb.append("selenium.refresh();");
519                 sb.append("selenium.waitForPageToLoad(\"30000\");");
520             }
521             else if (param1.equals("selectAndWait")) {
522                 sb.append("selenium.select(\"");
523                 sb.append(param2);
524                 sb.append("\", \"");
525                 sb.append(param3);
526                 sb.append("\");");
527                 sb.append("selenium.waitForPageToLoad(\"30000\");");
528             }
529             else if (param1.equals("store")) {
530                 sb.append("boolean ");
531                 sb.append(param3);
532                 sb.append(" = ");
533 
534                 if (param2.startsWith("eval(")) {
535                     String eval = param2.substring(5, param2.length() - 1);
536 
537                     eval = StringUtil.replace(eval, "'", "\"");
538 
539                     sb.append(eval);
540                 }
541 
542                 sb.append(";");
543             }
544             else if (param1.equals("storeIncrementedText")) {
545                 sb.append("String ");
546                 sb.append(param3);
547                 sb.append(" = selenium.getIncrementedText(\"");
548                 sb.append(param2);
549                 sb.append("\");");
550 
551                 sb.append("RuntimeVariables.setValue(\"");
552                 sb.append(param3);
553                 sb.append("\", ");
554                 sb.append(param3);
555                 sb.append(");");
556             }
557             else if (param1.equals("storeText")) {
558                 sb.append("String ");
559                 sb.append(param3);
560                 sb.append(" = selenium.getText(\"");
561                 sb.append(param2);
562                 sb.append("\");");
563 
564                 sb.append("RuntimeVariables.setValue(\"");
565                 sb.append(param3);
566                 sb.append("\", ");
567                 sb.append(param3);
568                 sb.append(");");
569             }
570             else if (param1.equals("verifyElementNotPresent") ||
571                      param1.equals("verifyElementPresent")) {
572 
573                 if (param1.equals("verifyElementNotPresent")) {
574                     sb.append("verifyFalse");
575                 }
576                 else if (param1.equals("verifyElementPresent")) {
577                     sb.append("verifyTrue");
578                 }
579 
580                 sb.append("(selenium.isElementPresent(\"");
581                 sb.append(param2);
582                 sb.append("\"));");
583             }
584             else if (param1.equals("verifyTextNotPresent") ||
585                      param1.equals("verifyTextPresent")) {
586 
587                 if (param1.equals("verifyTextNotPresent")) {
588                     sb.append("verifyFalse");
589                 }
590                 else if (param1.equals("verifyTextPresent")) {
591                     sb.append("verifyTrue");
592                 }
593 
594                 sb.append("(selenium.isTextPresent(\"");
595                 sb.append(param2);
596                 sb.append("\"));");
597             }
598             else if (param1.equals("verifyTitle")) {
599                 sb.append("verifyEquals(\"");
600                 sb.append(param2);
601                 sb.append("\", selenium.getTitle());");
602             }
603             else if (param1.equals("waitForElementNotPresent") ||
604                      param1.equals("waitForElementPresent") ||
605                      param1.equals("waitForNotPartialText") ||
606                      param1.equals("waitForPartialText") ||
607                      param1.equals("waitForTextNotPresent") ||
608                      param1.equals("waitForTextPresent")) {
609 
610                 sb.append("for (int second = 0;; second++) {");
611                 sb.append("if (second >= 60) {");
612                 sb.append("fail(\"timeout\");");
613                 sb.append("}");
614 
615                 sb.append("try {");
616                 sb.append("if (");
617 
618                 if (param1.equals("waitForElementNotPresent") ||
619                     param1.equals("waitForNotPartialText") ||
620                     param1.equals("waitForTextNotPresent")) {
621 
622                     sb.append("!");
623                 }
624 
625                 sb.append("selenium.");
626 
627                 if (param1.equals("waitForElementNotPresent") ||
628                     param1.equals("waitForElementPresent")) {
629 
630                     sb.append("isElementPresent");
631                     sb.append("(\"");
632                     sb.append(param2);
633                     sb.append("\")");
634                 }
635                 else if (param1.equals("waitForTextNotPresent") ||
636                          param1.equals("waitForTextPresent")) {
637 
638                     sb.append("isTextPresent");
639                     sb.append("(\"");
640                     sb.append(param2);
641                     sb.append("\")");
642                 }
643                 else if (param1.equals("waitForNotPartialText") ||
644                          param1.equals("waitForPartialText")) {
645 
646                     sb.append("isPartialText(\"");
647                     sb.append(param2);
648                     sb.append("\", ");
649 
650                     if (param3.startsWith("${")) {
651                         sb.append("RuntimeVariables.getValue(\"");
652 
653                         String text = param3.substring(2, param3.length() - 1);
654 
655                         sb.append(text);
656                         sb.append("\")");
657                     }
658                     else {
659                         sb.append("\"");
660                         sb.append(param3);
661                         sb.append("\"");
662                     }
663 
664                     sb.append(")");
665                 }
666 
667                 sb.append(") {");
668                 sb.append("break;");
669                 sb.append("}");
670                 sb.append("}");
671                 sb.append("catch (Exception e) {");
672                 sb.append("}");
673 
674                 sb.append("Thread.sleep(1000);");
675                 sb.append("}");
676             }
677             else if (param1.equals("waitForNotVisible") ||
678                      param1.equals("waitForVisible")) {
679 
680                 sb.append("for (int second = 0;; second++) {");
681                 sb.append("if (second >= 60) {");
682                 sb.append("fail(\"timeout\");");
683                 sb.append("}");
684 
685                 sb.append("try {");
686                 sb.append("if (");
687 
688                 if (param1.equals("waitForNotVisible")) {
689                     sb.append("!");
690                 }
691 
692                 sb.append("selenium.isVisible");
693                 sb.append("(\"");
694                 sb.append(param2);
695                 sb.append("\")) {");
696                 sb.append("break;");
697                 sb.append("}");
698                 sb.append("}");
699                 sb.append("catch (Exception e) {");
700                 sb.append("}");
701 
702                 sb.append("Thread.sleep(1000);");
703                 sb.append("}");
704             }
705             else if (param1.equals("waitForTable")) {
706                 sb.append("for (int second = 0;; second++) {");
707                 sb.append("if (second >= 60) {");
708                 sb.append("fail(\"timeout\");");
709                 sb.append("}");
710 
711                 sb.append("try {");
712                 sb.append("if (StringPool.BLANK.equals(selenium.getTable(\"");
713                 sb.append(param2);
714                 sb.append("\"))) {");
715                 sb.append("break;");
716                 sb.append("}");
717                 sb.append("}");
718                 sb.append("catch (Exception e) {");
719                 sb.append("}");
720 
721                 sb.append("Thread.sleep(1000);");
722                 sb.append("}");
723             }
724             else {
725                 System.out.println(param1 + " was not translated");
726             }
727         }
728 
729         if (labels.size() > 0) {
730             sb.append("case 100:");
731             sb.append("label = -1;");
732             sb.append("}");
733             sb.append("}");
734         }
735 
736         sb.append("}");
737         sb.append("}");
738 
739         String content = sb.toString();
740 
741         ServiceBuilder.writeFile(new File(testFileName), content);
742     }
743 
744     private static final String[] _FIX_PARAM_OLD_SUBS = new String[] {
745         "\\\\n", "<br />"
746     };
747 
748     private static final String[] _FIX_PARAM_NEW_SUBS = new String[] {
749         "\\n", "\\n"
750     };
751 
752 }