001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.tools;
016    
017    import com.liferay.portal.kernel.util.CharPool;
018    import com.liferay.portal.kernel.util.FileUtil;
019    import com.liferay.portal.kernel.util.GetterUtil;
020    import com.liferay.portal.kernel.util.IntegerWrapper;
021    import com.liferay.portal.kernel.util.ObjectValuePair;
022    import com.liferay.portal.kernel.util.StringBundler;
023    import com.liferay.portal.kernel.util.StringComparator;
024    import com.liferay.portal.kernel.util.StringPool;
025    import com.liferay.portal.kernel.util.StringUtil;
026    import com.liferay.portal.kernel.util.UnicodeFormatter;
027    import com.liferay.portal.tools.servicebuilder.ServiceBuilder;
028    import com.liferay.portal.util.InitUtil;
029    
030    import jargs.gnu.CmdLineParser;
031    
032    import java.io.File;
033    
034    import java.util.ArrayList;
035    import java.util.Collections;
036    import java.util.Comparator;
037    import java.util.HashMap;
038    import java.util.List;
039    import java.util.Map;
040    import java.util.Set;
041    import java.util.TreeSet;
042    
043    import org.apache.tools.ant.DirectoryScanner;
044    
045    /**
046     * @author Brian Wing Shun Chan
047     */
048    public class SeleneseToJavaBuilder {
049    
050            public static void main(String[] args) throws Exception {
051                    InitUtil.initWithSpring();
052    
053                    new SeleneseToJavaBuilder(args);
054            }
055    
056            public SeleneseToJavaBuilder(String[] args) throws Exception {
057                    CmdLineParser cmdLineParser = new CmdLineParser();
058    
059                    CmdLineParser.Option basedirOption = cmdLineParser.addStringOption(
060                            "basedir");
061                    CmdLineParser.Option minimizeOption = cmdLineParser.addStringOption(
062                            "minimize");
063                    CmdLineParser.Option reportDuplicatesOption =
064                            cmdLineParser.addStringOption("reportDuplicates");
065    
066                    cmdLineParser.parse(args);
067    
068                    _basedir = (String)cmdLineParser.getOptionValue(basedirOption);
069    
070                    String minimizeTestFileName = (String)cmdLineParser.getOptionValue(
071                            minimizeOption);
072    
073                    minimizeTestFileName = normalizeFileName(minimizeTestFileName);
074    
075                    String minimizeTestContent = getNormalizedContent(minimizeTestFileName);
076    
077                    _reportDuplicates = GetterUtil.getBoolean(
078                            (String)cmdLineParser.getOptionValue(reportDuplicatesOption));
079    
080                    int testHtmlCount = 0;
081    
082                    Map<String, ObjectValuePair<String, IntegerWrapper>> testHtmlMap =
083                            new HashMap<String, ObjectValuePair<String, IntegerWrapper>>();
084    
085                    Set<String> fileNames = getFileNames();
086    
087                    for (String fileName : fileNames) {
088                            if (fileName.length() > 161) {
089                                    System.out.println(
090                                            "Exceeds 177 characters: portal-web/test/" + fileName);
091                            }
092    
093                            if (fileName.endsWith("Test.html")) {
094                                    testHtmlCount++;
095    
096                                    String content = getNormalizedContent(fileName);
097    
098                                    if ((content != null) && content.equals(minimizeTestContent)) {
099                                            minimizeTestCase(fileName, minimizeTestFileName);
100                                    }
101    
102                                    ObjectValuePair<String, IntegerWrapper> testHtmlOVP =
103                                            testHtmlMap.get(content);
104    
105                                    if (testHtmlOVP == null) {
106                                            testHtmlOVP = new ObjectValuePair<String, IntegerWrapper>(
107                                                    fileName, new IntegerWrapper());
108    
109                                            testHtmlMap.put(content, testHtmlOVP);
110                                    }
111                                    else {
112                                            IntegerWrapper integerWrapper = testHtmlOVP.getValue();
113    
114                                            integerWrapper.increment();
115                                    }
116    
117                                    translateTestCase(fileName);
118                            }
119                            else if (fileName.endsWith("Tests.html")) {
120                                    translateTestSuite(fileName);
121                            }
122                            else if (fileName.endsWith("Test.java") ||
123                                             fileName.endsWith("Tests.java")) {
124    
125                                    if (!fileNames.contains(
126                                                    fileName.substring(0, fileName.length() - 5) +
127                                                            ".html")) {
128    
129                                            System.out.println("Unused: " + fileName);
130                                    }
131                            }
132                    }
133    
134                    List<ObjectValuePair<String, IntegerWrapper>> testHtmlOVPs =
135                            new ArrayList<ObjectValuePair<String, IntegerWrapper>>();
136    
137                    int duplicateTestHtmlCount = 0;
138    
139                    for (Map.Entry<String, ObjectValuePair<String, IntegerWrapper>> entry :
140                                    testHtmlMap.entrySet()) {
141    
142                            ObjectValuePair<String, IntegerWrapper> testHtmlOVP =
143                                    entry.getValue();
144    
145                            testHtmlOVPs.add(testHtmlOVP);
146    
147                            IntegerWrapper integerWrapper = testHtmlOVP.getValue();
148    
149                            duplicateTestHtmlCount += integerWrapper.getValue();
150                    }
151    
152                    Collections.sort(testHtmlOVPs, new TestHtmlCountComparator());
153    
154                    StringBundler sb = new StringBundler();
155    
156                    for (ObjectValuePair<String, IntegerWrapper> testHtmlOVP :
157                                    testHtmlOVPs) {
158    
159                            String fileName = testHtmlOVP.getKey();
160                            IntegerWrapper integerWrapper = testHtmlOVP.getValue();
161    
162                            if (integerWrapper.getValue() > 0) {
163                                    sb.append(fileName);
164                                    sb.append(",");
165                                    sb.append(integerWrapper.getValue());
166                                    sb.append("\n");
167                            }
168                    }
169    
170                    if (_reportDuplicates && (sb.index() > 0)) {
171                            System.out.println(
172                                    "There are " + duplicateTestHtmlCount +
173                                            " duplicate tests out of " + testHtmlCount +
174                                                    ". See duplicate_selenium_tests.txt.");
175    
176                            FileUtil.write("duplicate_selenium_tests.txt", sb.toString());
177                    }
178            }
179    
180            protected String fixParam(String param) {
181                    StringBuilder sb = new StringBuilder();
182    
183                    char[] array = param.toCharArray();
184    
185                    for (int i = 0; i < array.length; ++i) {
186                            char c = array[i];
187    
188                            if (c == CharPool.BACK_SLASH) {
189                                    sb.append("\\\\");
190                            }
191                            else if (c == CharPool.QUOTE) {
192                                    sb.append("\\\"");
193                            }
194                            else if (Character.isWhitespace(c)) {
195                                    sb.append(c);
196                            }
197                            else if ((c < 0x0020) || (c > 0x007e)) {
198                                    sb.append("\\u");
199                                    sb.append(UnicodeFormatter.charToHex(c));
200                            }
201                            else {
202                                    sb.append(c);
203                            }
204                    }
205    
206                    return StringUtil.replace(
207                            sb.toString(), _FIX_PARAM_OLD_SUBS, _FIX_PARAM_NEW_SUBS);
208            }
209    
210            protected String formatTestSuite(String fileName, String oldContent)
211                    throws Exception {
212    
213                    if (!oldContent.contains("..")) {
214                            return oldContent;
215                    }
216    
217                    String newContent = oldContent;
218    
219                    int x = 0;
220                    int y = 0;
221    
222                    while (oldContent.indexOf("<a href=\"", x) != -1) {
223                            x = oldContent.indexOf("<a href=\"", x) + 9;
224                            y = oldContent.indexOf("\">", x);
225    
226                            String testCaseName = oldContent.substring(x, y);
227    
228                            if (!testCaseName.contains("..")) {
229                                    continue;
230                            }
231    
232                            int z = fileName.lastIndexOf(StringPool.SLASH);
233    
234                            String importClassName = fileName.substring(0, z);
235    
236                            if (!FileUtil.exists(
237                                            _basedir + "/" + importClassName + "/" + testCaseName)) {
238    
239                                    throw new IllegalArgumentException(
240                                            fileName + " has improper relative path");
241                            }
242    
243                            if (testCaseName.contains("../portalweb/")) {
244                                    continue;
245                            }
246    
247                            int count = StringUtil.count(testCaseName, "..");
248    
249                            for (int i = 0; i < count; i++) {
250                                    z = importClassName.lastIndexOf(StringPool.SLASH);
251    
252                                    importClassName = fileName.substring(0, z);
253                            }
254    
255                            z = testCaseName.lastIndexOf("../", z);
256    
257                            importClassName += testCaseName.substring(z + 2);
258    
259                            count = StringUtil.count(fileName, "/") - 2;
260    
261                            String relativePath = "" ;
262    
263                            for (int i = 0; i < count; i++) {
264                                    relativePath += "../";
265                            }
266    
267                            importClassName = StringUtil.replace(
268                                    importClassName, "com/liferay/", relativePath);
269    
270                            newContent = StringUtil.replace(
271                                    newContent, testCaseName, importClassName);
272                    }
273    
274                    if (!oldContent.equals(newContent)) {
275                            writeFile(fileName, newContent, false);
276                    }
277    
278                    return newContent;
279            }
280    
281            protected Set<String> getFileNames() throws Exception {
282                    DirectoryScanner directoryScanner = new DirectoryScanner();
283    
284                    directoryScanner.setBasedir(_basedir);
285                    directoryScanner.setExcludes(
286                            new String[] {
287                                    "**\\EvaluateLogTest.java", "**\\EvaluateUserCSVFileTest.java",
288                                    "**\\IterateThemeTest.java", "**\\StopSeleniumTest.java",
289                                    "**\\WaitForSystemShutdownTest.java"
290                            });
291                    directoryScanner.setIncludes(
292                            new String[] {
293                                    "**\\*Test.html", "**\\*Test.java", "**\\*Tests.html",
294                                    "**\\*Tests.java", "**\\*TestSuite.java"
295                            });
296    
297                    directoryScanner.scan();
298    
299                    Set<String> fileNames = new TreeSet<String>(
300                            new StringComparator() {
301    
302                                    @Override
303                                    public int compare(String s1, String s2) {
304                                            if (s1.endsWith("Test.html") && s2.contains("Tests.html")) {
305                                                    return -1;
306                                            }
307    
308                                            if (s1.endsWith("Tests.html") && s2.contains("Test.html")) {
309                                                    return 1;
310                                            }
311    
312                                            if (s1.endsWith(".html") && s2.contains(".java")) {
313                                                    return -1;
314                                            }
315    
316                                            if (s1.endsWith(".java") && s2.contains(".html")) {
317                                                    return 1;
318                                            }
319    
320                                            return super.compare(s1, s2);
321                                    }
322    
323                            });
324    
325                    for (String fileName : directoryScanner.getIncludedFiles()) {
326                            fileName = normalizeFileName(fileName);
327    
328                            fileNames.add(fileName);
329                    }
330    
331                    if (false) {
332                            StringBundler sb = new StringBundler();
333    
334                            for (String fileName : fileNames) {
335                                    sb.append(fileName);
336                                    sb.append("\n");
337                            }
338    
339                            writeFile("selenium_included_files.txt", sb.toString(), false);
340                    }
341    
342                    return fileNames;
343            }
344    
345            protected String getNormalizedContent(String fileName) throws Exception {
346                    String content = readFile(fileName);
347    
348                    if (content != null) {
349                            content = content.trim();
350                            content = StringUtil.replace(content, "\n", "");
351                            content = StringUtil.replace(content, "\r\n", "");
352                    }
353    
354                    return content;
355            }
356    
357            protected String[] getParams(String step) throws Exception {
358                    String[] params = new String[3];
359    
360                    int x = 0;
361                    int y = 0;
362    
363                    for (int i = 0; i < 3; i++) {
364                            x = step.indexOf("<td>", x) + 4;
365                            y = step.indexOf("\n", x);
366                            y = step.lastIndexOf("</td>", y);
367    
368                            params[i] = step.substring(x, y);
369                    }
370    
371                    return params;
372            }
373    
374            protected void minimizeTestCase(
375                            String fileName, String minimizeTestFileName)
376                    throws Exception {
377    
378                    int x = fileName.lastIndexOf(StringPool.SLASH);
379    
380                    String dirName = fileName.substring(0, x);
381    
382                    x = minimizeTestFileName.lastIndexOf(StringPool.SLASH);
383    
384                    String minimizeTestDirName = minimizeTestFileName.substring(0, x);
385    
386                    if (dirName.equals(minimizeTestDirName)) {
387                            return;
388                    }
389    
390                    String minimizeTestName = minimizeTestFileName.substring(x + 1);
391    
392                    x = fileName.indexOf("portalweb");
393    
394                    int count = StringUtil.count(fileName.substring(x), StringPool.SLASH);
395    
396                    String relativeMinimizeTestFileName = "";
397    
398                    while (count > 0) {
399                            relativeMinimizeTestFileName += "../";
400    
401                            count--;
402                    }
403    
404                    relativeMinimizeTestFileName += minimizeTestFileName.substring(
405                            minimizeTestFileName.lastIndexOf("/", x) + 1);
406    
407                    File minimizeTestFile = new File(
408                            _basedir + "/" + dirName + "/" + relativeMinimizeTestFileName);
409    
410                    if (!minimizeTestFile.exists()) {
411                            throw new IllegalArgumentException(
412                                    minimizeTestFile.toString() + " does not exist");
413                    }
414    
415                    String[] subfileNames = FileUtil.listFiles(_basedir + "/" + dirName);
416    
417                    for (String subfileName : subfileNames) {
418                            if (!subfileName.endsWith("Tests.html")) {
419                                    continue;
420                            }
421    
422                            File subfile = new File(
423                                    _basedir + "/" + dirName + "/" + subfileName);
424    
425                            String content = FileUtil.read(subfile);
426    
427                            content = StringUtil.replace(
428                                    content, "\"" + minimizeTestName + "\"",
429                                    "\"" + relativeMinimizeTestFileName + "\"");
430    
431                            FileUtil.write(subfile, content);
432                    }
433    
434                    FileUtil.delete(_basedir + "/" + fileName);
435                    FileUtil.delete(
436                            _basedir + "/" + fileName.substring(0, fileName.length() - 5) +
437                                    ".java");
438            }
439    
440            protected String normalizeFileName(String fileName) {
441                    return StringUtil.replace(
442                            fileName, StringPool.BACK_SLASH, StringPool.SLASH);
443            }
444    
445            protected String readFile(String fileName) throws Exception {
446                    return FileUtil.read(_basedir + "/" + fileName);
447            }
448    
449            protected void translateTestCase(String fileName) throws Exception {
450                    if (!FileUtil.exists(_basedir + "/" + fileName)) {
451                            return;
452                    }
453    
454                    int x = fileName.lastIndexOf(StringPool.SLASH);
455                    int y = fileName.indexOf(CharPool.PERIOD);
456    
457                    String testPackagePath = StringUtil.replace(
458                            fileName.substring(0, x), StringPool.SLASH, StringPool.PERIOD);
459                    String testName = fileName.substring(x + 1, y);
460                    String testMethodName =
461                            "test" + testName.substring(0, testName.length() - 4);
462                    String testFileName = fileName.substring(0, y) + ".java";
463    
464                    StringBundler sb = new StringBundler();
465    
466                    sb.append("package ");
467                    sb.append(testPackagePath);
468                    sb.append(";\n");
469    
470                    sb.append("import com.liferay.portal.kernel.util.FileUtil;\n");
471                    sb.append("import com.liferay.portal.kernel.util.StringPool;\n");
472                    sb.append("import com.liferay.portalweb.portal.BaseTestCase;\n");
473                    sb.append(
474                            "import com.liferay.portalweb.portal.util.BrowserCommands;\n");
475                    sb.append(
476                            "import com.liferay.portalweb.portal.util.RuntimeVariables;\n");
477    
478                    sb.append("public class ");
479                    sb.append(testName);
480                    sb.append(" extends BaseTestCase {");
481    
482                    sb.append("public void ");
483                    sb.append(testMethodName);
484                    sb.append("() throws Exception {");
485    
486                    String content = readFile(fileName);
487    
488                    if (!content.contains("<title>" + testName + "</title>") ||
489                            !content.contains("colspan=\"3\">" + testName + "</td>")) {
490    
491                            System.out.println(testName + " has an invalid test name");
492                    }
493    
494                    if (content.contains("&amp;")) {
495                            content = StringUtil.replace(content, "&amp;", "&");
496    
497                            writeFile(fileName, content, false);
498                    }
499    
500                    if (content.contains("&gt;")) {
501                            content = StringUtil.replace(content, "&gt;", ">");
502    
503                            writeFile(fileName, content, false);
504                    }
505    
506                    if (content.contains("&lt;")) {
507                            content = StringUtil.replace(content, "&lt;", "<");
508    
509                            writeFile(fileName, content, false);
510                    }
511    
512                    if (content.contains("&quot;")) {
513                            content = StringUtil.replace(content, "&quot;", "\"");
514    
515                            writeFile(fileName, content, false);
516                    }
517    
518                    x = content.indexOf("<tbody>");
519                    y = content.indexOf("</tbody>");
520    
521                    content = content.substring(x, y + 8);
522    
523                    Map<String, String> labels = new HashMap<String, String>();
524    
525                    int labelCount = 1;
526    
527                    Map<Integer, Boolean> takeScreenShots = new HashMap<Integer, Boolean>();
528    
529                    x = 0;
530                    y = 0;
531    
532                    while (true) {
533                            x = content.indexOf("<tr>", y);
534                            y = content.indexOf("\n</tr>", x);
535    
536                            if ((x == -1) || (y == -1)) {
537                                    break;
538                            }
539    
540                            x += 6;
541                            y++;
542    
543                            String step = content.substring(x, y);
544    
545                            String[] params = getParams(step);
546    
547                            String param1 = params[0];
548                            String param2 = fixParam(params[1]);
549    
550                            if (param1.equals("assertConfirmation")) {
551                                    int previousX = x - 6;
552    
553                                    previousX = content.lastIndexOf("<tr>", previousX - 1);
554                                    previousX += 6;
555    
556                                    takeScreenShots.put(previousX, Boolean.FALSE);
557                            }
558                            else if (param1.equals("label")) {
559                                    String label = labels.get(param2);
560    
561                                    if (label == null) {
562                                            labelCount++;
563    
564                                            label = labels.put(param2, String.valueOf(labelCount));
565                                    }
566                            }
567                    }
568    
569                    if (labels.size() > 0) {
570                            sb.append("int label = 1;");
571    
572                            sb.append("while (label >= 1) {");
573                            sb.append("switch (label) {");
574                            sb.append("case 1:");
575                    }
576    
577                    x = 0;
578                    y = 0;
579    
580                    sb.append("selenium.selectWindow(\"null\");");
581                    sb.append("selenium.selectFrame(\"relative=top\");");
582    
583                    while (true) {
584                            x = content.indexOf("<tr>", y);
585                            y = content.indexOf("\n</tr>", x);
586    
587                            if ((x == -1) || (y == -1)) {
588                                    break;
589                            }
590    
591                            x += 6;
592                            y++;
593    
594                            String step = content.substring(x, y);
595    
596                            String[] params = getParams(step);
597    
598                            String param1 = params[0];
599                            String param2 = fixParam(params[1]);
600                            String param3 = fixParam(params[2]);
601    
602                            if (param1.equals("addSelection") || param1.equals("clickAt") ||
603                                    param1.equals("doubleClickAt") || param1.equals("keyDown") ||
604                                    param1.equals("keyPress") || param1.equals("keyUp") ||
605                                    param1.equals("mouseMoveAt") || param1.equals("openWindow") ||
606                                    param1.equals("select") || param1.equals("sendKeys") ||
607                                    param1.equals("type") || param1.equals("typeFrame") ||
608                                    param1.equals("typeKeys") ||
609                                    param1.equals("uploadCommonFile") ||
610                                    param1.equals("uploadFile") ||
611                                    param1.equals("uploadTempFile") ||
612                                    param1.equals("waitForPopUp")) {
613    
614                                    sb.append("selenium.");
615                                    sb.append(param1);
616                                    sb.append("(");
617    
618                                    if (param2.startsWith("${")) {
619                                            sb.append("RuntimeVariables.getValue(\"");
620    
621                                            String text = param2.substring(2, param2.length() - 1);
622    
623                                            sb.append(text);
624                                            sb.append("\")");
625                                    }
626                                    else {
627                                            sb.append("\"");
628                                            sb.append(param2);
629                                            sb.append("\"");
630                                    }
631    
632                                    sb.append(", RuntimeVariables.replace(");
633    
634                                    if (param3.startsWith("${")) {
635                                            sb.append("RuntimeVariables.getValue(\"");
636    
637                                            String text = param3.substring(2, param3.length() - 1);
638    
639                                            sb.append(text);
640                                            sb.append("\")");
641                                    }
642                                    else if (param3.startsWith("value=${")) {
643                                            sb.append("\"value=\" + RuntimeVariables.getValue(\"");
644    
645                                            String text = param3.substring(8, param3.length() - 1);
646    
647                                            sb.append(text);
648                                            sb.append("\")");
649                                    }
650                                    else {
651                                            sb.append("\"");
652                                            sb.append(param3);
653                                            sb.append("\"");
654                                    }
655    
656                                    sb.append("));");
657                            }
658                            else if (param1.equals("assertAlert") ||
659                                             param1.equals("assertNotAlert")) {
660    
661                                    if (param1.equals("assertAlert")) {
662                                            sb.append("assertEquals");
663                                    }
664                                    else if (param1.equals("assertNotAlert")) {
665                                            sb.append("assertNotEquals");
666                                    }
667    
668                                    sb.append("(\"");
669                                    sb.append(param2);
670                                    sb.append("\", selenium.getAlert());");
671                            }
672                            else if (param1.equals("assertChecked") ||
673                                             param1.equals("assertNotChecked")) {
674    
675                                    if (param1.equals("assertChecked")) {
676                                            sb.append("assertTrue");
677                                    }
678                                    else if (param1.equals("assertNotChecked")) {
679                                            sb.append("assertFalse");
680                                    }
681    
682                                    sb.append("(selenium.isChecked(\"");
683                                    sb.append(param2);
684                                    sb.append("\"));");
685                            }
686                            else if (param1.equals("assertConfirmation")) {
687                                    param2 = StringUtil.replace(param2, "?", "[\\\\s\\\\S]");
688    
689                                    sb.append("assertTrue(selenium.getConfirmation().matches(\"^");
690                                    sb.append(param2);
691                                    sb.append("$\"));");
692                            }
693                            else if (param1.equals("assertLocation") ||
694                                             param1.equals("assertNotLocation")) {
695    
696                                    if (param1.equals("assertLocation")) {
697                                            sb.append("assertEquals");
698                                    }
699                                    else if (param1.equals("assertNotLocation")) {
700                                            sb.append("assertNotEquals");
701                                    }
702    
703                                    sb.append("(RuntimeVariables.replace(\"");
704                                    sb.append(param2);
705                                    sb.append("\"), selenium.getLocation());");
706                            }
707                            else if (param1.equals("assertElementNotPresent") ||
708                                             param1.equals("assertElementPresent")) {
709    
710                                    sb.append("assertTrue(selenium.");
711    
712                                    if (param1.equals("assertElementNotPresent")) {
713                                            sb.append("isElementNotPresent");
714                                    }
715                                    else if (param1.equals("assertElementPresent")) {
716                                            sb.append("isElementPresent");
717                                    }
718    
719                                    sb.append("(\"");
720                                    sb.append(param2);
721                                    sb.append("\"));");
722                            }
723                            else if (param1.equals("assertNotPartialText") ||
724                                             param1.equals("assertPartialText")) {
725    
726                                    if (param1.equals("assertNotPartialText")) {
727                                            sb.append("assertFalse");
728                                    }
729                                    else if (param1.equals("assertPartialText")) {
730                                            sb.append("assertTrue");
731                                    }
732    
733                                    sb.append("(selenium.isPartialText(\"");
734                                    sb.append(param2);
735                                    sb.append("\", ");
736    
737                                    if (param3.startsWith("${")) {
738                                            sb.append("RuntimeVariables.getValue(\"");
739    
740                                            String text = param3.substring(2, param3.length() - 1);
741    
742                                            sb.append(text);
743                                            sb.append("\")");
744                                    }
745                                    else {
746                                            sb.append("\"");
747                                            sb.append(param3);
748                                            sb.append("\"");
749                                    }
750    
751                                    sb.append("));");
752                            }
753                            else if (param1.equals("assertNotSelectedLabel") ||
754                                             param1.equals("assertSelectedLabel")) {
755    
756                                    if (param1.equals("assertNotSelectedLabel")) {
757                                            sb.append("assertNotEquals");
758                                    }
759                                    else if (param1.equals("assertSelectedLabel")) {
760                                            sb.append("assertEquals");
761                                    }
762    
763                                    sb.append("(");
764    
765                                    if (param3.startsWith("${")) {
766                                            sb.append("RuntimeVariables.getValue(\"");
767    
768                                            String text = param3.substring(2, param3.length() - 1);
769    
770                                            sb.append(text);
771                                            sb.append("\")");
772                                    }
773                                    else {
774                                            sb.append("\"");
775                                            sb.append(param3);
776                                            sb.append("\"");
777                                    }
778    
779                                    sb.append(", selenium.getSelectedLabel(\"");
780                                    sb.append(param2);
781                                    sb.append("\"));");
782                            }
783                            else if (param1.equals("assertNotSelectedLabels") ||
784                                             param1.equals("assertSelectedLabels")) {
785    
786                                    if (param1.equals("assertNotSelectedLabels")) {
787                                            sb.append("assertNotEquals");
788                                    }
789                                    else if (param1.equals("assertSelectedLabels")) {
790                                            sb.append("assertEquals");
791                                    }
792    
793                                    sb.append("(\"");
794                                    sb.append(param3);
795                                    sb.append("\", join(selenium.getSelectedLabels(\"");
796                                    sb.append(param2);
797                                    sb.append("\"), \',\'));");
798                            }
799                            else if (param1.equals("assertNotText") ||
800                                             param1.equals("assertText")) {
801    
802                                    if (param1.equals("assertNotText")) {
803                                            sb.append("assertNotEquals");
804                                    }
805                                    else if (param1.equals("assertText")) {
806                                            sb.append("assertEquals");
807                                    }
808    
809                                    sb.append("(RuntimeVariables.replace(\"");
810                                    sb.append(param3);
811                                    sb.append("\"), selenium.getText(\"");
812                                    sb.append(param2);
813                                    sb.append("\"));");
814                            }
815                            else if (param1.equals("assertNotValue") ||
816                                             param1.equals("assertValue")) {
817    
818                                    if (param1.equals("assertNotValue")) {
819                                            sb.append("assertNotEquals");
820                                    }
821                                    else if (param1.equals("assertValue")) {
822                                            sb.append("assertEquals");
823                                    }
824    
825                                    sb.append("(\"");
826                                    sb.append(param3);
827                                    sb.append("\", selenium.getValue(\"");
828                                    sb.append(param2);
829                                    sb.append("\"));");
830                            }
831                            else if (param1.equals("assertNotVisible") ||
832                                             param1.equals("assertVisible")) {
833    
834                                    if (param1.equals("assertNotVisible")) {
835                                            sb.append("assertFalse");
836                                    }
837                                    else if (param1.equals("assertVisible")) {
838                                            sb.append("assertTrue");
839                                    }
840    
841                                    sb.append("(");
842                                    sb.append("selenium.isVisible(\"");
843                                    sb.append(param2);
844                                    sb.append("\"));");
845                            }
846                            else if (param1.equals("assertSelectOptions")) {
847                                    String[] expectedArray = StringUtil.split(param3);
848    
849                                    sb.append("String[] actualArray = ");
850                                    sb.append("selenium.getSelectOptions(\"");
851                                    sb.append(param2);
852                                    sb.append("\");");
853    
854                                    sb.append("assertEquals(");
855                                    sb.append(expectedArray.length);
856                                    sb.append(", actualArray.length);");
857    
858                                    for (int i = 0; i < expectedArray.length; i++) {
859                                            sb.append("assertEquals(\"");
860                                            sb.append(expectedArray[i]);
861                                            sb.append("\", actualArray[");
862                                            sb.append(i);
863                                            sb.append("]);");
864                                    }
865                            }
866                            else if (param1.equals("assertTextNotPresent") ||
867                                             param1.equals("assertTextPresent")) {
868    
869                                    if (param1.equals("assertTextNotPresent")) {
870                                            sb.append("assertFalse");
871                                    }
872                                    else if (param1.equals("assertTextPresent")) {
873                                            sb.append("assertTrue");
874                                    }
875    
876                                    sb.append("(selenium.isTextPresent(\"");
877                                    sb.append(param2);
878                                    sb.append("\"));");
879                            }
880                            else if (param1.equals("captureEntirePageScreenshot")) {
881                                    int pos = param2.lastIndexOf("\\");
882    
883                                    String dirName = param2.substring(0, pos + 1);
884    
885                                    sb.append("FileUtil.mkdirs(RuntimeVariables.replace(\"");
886                                    sb.append(dirName);
887                                    sb.append("\"));");
888                                    sb.append("selenium.captureEntirePageScreenshot(");
889                                    sb.append("RuntimeVariables.replace(\"");
890                                    sb.append(param2);
891                                    sb.append("\"), \"\");");
892                            }
893                            else if (param1.equals("check") || param1.equals("click") ||
894                                             param1.equals("doubleClick") ||
895                                             param1.equals("downloadTempFile") ||
896                                             param1.equals("makeVisible") ||
897                                             param1.equals("mouseDown") || param1.equals("mouseMove") ||
898                                             param1.equals("mouseOver") || param1.equals("mouseUp") ||
899                                             param1.equals("open") || param1.equals("runScript") ||
900                                             param1.equals("selectFrame") ||
901                                             param1.equals("selectPopUp") ||
902                                             param1.equals("selectWindow") ||
903                                             param1.equals("setTimeout") ||
904                                             param1.equals("setTimeoutImplicit") ||
905                                             param1.equals("uncheck") ||
906                                             param1.equals("waitForConfirmation") ||
907                                             param1.equals("waitForElementPresent") ||
908                                             param1.equals("waitForElementNotPresent") ||
909                                             param1.equals("waitForNotVisible") ||
910                                             param1.equals("waitForTextNotPresent") ||
911                                             param1.equals("waitForTextPresent") ||
912                                             param1.equals("waitForVisible")) {
913    
914                                    if (param1.equals("downloadTempFile")) {
915                                            sb.append("BrowserCommands.");
916                                    }
917                                    else {
918                                            sb.append("selenium.");
919                                    }
920    
921                                    sb.append(param1);
922                                    sb.append("(");
923    
924                                    if (param2.startsWith("${")) {
925                                            sb.append("RuntimeVariables.getValue(\"");
926    
927                                            String text = param2.substring(2, param2.length() - 1);
928    
929                                            sb.append(text);
930                                            sb.append("\")");
931                                    }
932                                    else {
933                                            sb.append("\"");
934                                            sb.append(param2);
935                                            sb.append("\"");
936                                    }
937    
938                                    sb.append(");");
939                            }
940                            else if (param1.equals("clickAndWait")) {
941                                    sb.append("selenium.click(RuntimeVariables.replace(\"");
942                                    sb.append(param2);
943                                    sb.append("\"));");
944                                    sb.append("selenium.waitForPageToLoad(\"30000\");");
945                            }
946                            else if (param1.equals("clickAtAndWait") ||
947                                             param1.equals("keyDownAndWait") ||
948                                             param1.equals("keyPressAndWait") ||
949                                             param1.equals("keyUpAndWait") ||
950                                             param1.equals("selectAndWait")) {
951    
952                                    sb.append("selenium.");
953    
954                                    String text = param1.substring(0, param1.length() - 7);
955    
956                                    sb.append(text);
957                                    sb.append("(\"");
958                                    sb.append(param2);
959                                    sb.append("\", RuntimeVariables.replace(\"");
960                                    sb.append(param3);
961                                    sb.append("\"));");
962                                    sb.append("selenium.waitForPageToLoad(\"30000\");");
963                            }
964                            else if (param1.equals("close") || param1.equals("goBack") ||
965                                             param1.equals("refresh") ||
966                                             param1.equals("setBrowserOption") ||
967                                             param1.equals("setDefaultTimeout") ||
968                                             param1.equals("setDefaultTimeoutImplicit") ||
969                                             param1.equals("windowFocus") ||
970                                             param1.equals("windowMaximize")) {
971    
972                                    if (param1.equals("setBrowserOption")) {
973                                            sb.append("BrowserCommands.");
974                                    }
975                                    else {
976                                            sb.append("selenium.");
977                                    }
978    
979                                    sb.append(param1);
980                                    sb.append("();");
981                            }
982                            else if (param1.equals("dragAndDropToObject")) {
983                                    sb.append("selenium.");
984                                    sb.append("dragAndDropToObject(\"");
985                                    sb.append(param2);
986                                    sb.append("\", \"");
987                                    sb.append(param3);
988                                    sb.append("\");");
989                            }
990                            else if (param1.equals("echo")) {
991                                    sb.append("System.out.println(");
992    
993                                    if (param2.startsWith("${")) {
994                                            sb.append("RuntimeVariables.getValue(\"");
995    
996                                            String text = param2.substring(2, param2.length() - 1);
997    
998                                            sb.append(text);
999                                            sb.append("\")");
1000                                    }
1001                                    else {
1002                                            sb.append("\"");
1003                                            sb.append(param2);
1004                                            sb.append("\"");
1005                                    }
1006    
1007                                    sb.append(");");
1008                            }
1009                            else if (param1.equals("goBackAndWait") ||
1010                                             param1.equals("refreshAndWait") ||
1011                                             param1.equals("windowMaximizeAndWait")) {
1012    
1013                                    String text = param1.substring(0, param1.length() - 7);
1014    
1015                                    sb.append("selenium.");
1016                                    sb.append(text);
1017                                    sb.append("();");
1018                                    sb.append("selenium.waitForPageToLoad(\"30000\");");
1019                            }
1020                            else if (param1.equals("gotoIf")) {
1021                                    String conditional = StringUtil.replace(
1022                                            param2, new String[] {"${", "}"}, new String[] {"", ""});
1023    
1024                                    sb.append("if (");
1025                                    sb.append(conditional);
1026                                    sb.append(") {");
1027                                    sb.append("label =");
1028                                    sb.append(labels.get(param3));
1029                                    sb.append(";");
1030                                    sb.append("continue;");
1031                                    sb.append("}");
1032                            }
1033                            else if (param1.equals("label")) {
1034                                    String label = labels.get(param2);
1035    
1036                                    sb.append("case ");
1037                                    sb.append(label);
1038                                    sb.append(":");
1039                            }
1040                            else if (param1.equals("pause")) {
1041                                    sb.append("Thread.sleep(");
1042                                    sb.append(param2);
1043                                    sb.append(");");
1044                            }
1045                            else if (param1.equals("store")) {
1046                                    sb.append("boolean ");
1047                                    sb.append(param3);
1048                                    sb.append(" = ");
1049    
1050                                    if (param2.startsWith("eval(")) {
1051                                            String eval = param2.substring(5, param2.length() - 1);
1052    
1053                                            eval = StringUtil.replace(eval, "'", "\"");
1054    
1055                                            sb.append(eval);
1056                                    }
1057    
1058                                    sb.append(";");
1059                            }
1060                            else if (param1.equals("storeAttribute")) {
1061                                    sb.append("String ");
1062                                    sb.append(param3);
1063                                    sb.append(" = selenium.getAttribute(\"");
1064                                    sb.append(param2);
1065                                    sb.append("\");");
1066    
1067                                    sb.append("RuntimeVariables.setValue(\"");
1068                                    sb.append(param3);
1069                                    sb.append("\", ");
1070                                    sb.append(param3);
1071                                    sb.append(");");
1072                            }
1073                            else if (param1.equals("storeChecked")) {
1074                                    sb.append("boolean ");
1075                                    sb.append(param3);
1076                                    sb.append(" = selenium.isChecked(\"");
1077                                    sb.append(param2);
1078                                    sb.append("\");");
1079                            }
1080                            else if (param1.equals("storeCurrentDay")) {
1081                                    sb.append("String ");
1082                                    sb.append(param2);
1083                                    sb.append(" = selenium.getCurrentDay();");
1084    
1085                                    sb.append("RuntimeVariables.setValue(\"");
1086                                    sb.append(param2);
1087                                    sb.append("\", ");
1088                                    sb.append(param2);
1089                                    sb.append(");");
1090                            }
1091                            else if (param1.equals("storeCurrentMonth")) {
1092                                    sb.append("String ");
1093                                    sb.append(param2);
1094                                    sb.append(" = selenium.getCurrentMonth();");
1095    
1096                                    sb.append("RuntimeVariables.setValue(\"");
1097                                    sb.append(param2);
1098                                    sb.append("\", ");
1099                                    sb.append(param2);
1100                                    sb.append(");");
1101                            }
1102                            else if (param1.equals("storeCurrentYear")) {
1103                                    sb.append("String ");
1104                                    sb.append(param2);
1105                                    sb.append(" = selenium.getCurrentYear();");
1106    
1107                                    sb.append("RuntimeVariables.setValue(\"");
1108                                    sb.append(param2);
1109                                    sb.append("\", ");
1110                                    sb.append(param2);
1111                                    sb.append(");");
1112                            }
1113                            else if (param1.equals("storeElementPresent")) {
1114                                    sb.append("boolean ");
1115                                    sb.append(param3);
1116                                    sb.append(" = selenium.isElementPresent(\"");
1117                                    sb.append(param2);
1118                                    sb.append("\");");
1119                            }
1120                            else if (param1.equals("storeFirstNumber")) {
1121                                    sb.append("String ");
1122                                    sb.append(param3);
1123                                    sb.append(" = selenium.getFirstNumber(\"");
1124                                    sb.append(param2);
1125                                    sb.append("\");");
1126    
1127                                    sb.append("RuntimeVariables.setValue(\"");
1128                                    sb.append(param3);
1129                                    sb.append("\", ");
1130                                    sb.append(param3);
1131                                    sb.append(");");
1132                            }
1133                            else if (param1.equals("storeFirstNumberIncrement")) {
1134                                    sb.append("String ");
1135                                    sb.append(param3);
1136                                    sb.append(" = selenium.getFirstNumberIncrement(\"");
1137                                    sb.append(param2);
1138                                    sb.append("\");");
1139    
1140                                    sb.append("RuntimeVariables.setValue(\"");
1141                                    sb.append(param3);
1142                                    sb.append("\", ");
1143                                    sb.append(param3);
1144                                    sb.append(");");
1145                            }
1146                            else if (param1.equals("storeLocation")) {
1147                                    sb.append("String ");
1148                                    sb.append(param2);
1149                                    sb.append(" = selenium.getLocation();");
1150    
1151                                    sb.append("RuntimeVariables.setValue(\"");
1152                                    sb.append(param2);
1153                                    sb.append("\", ");
1154                                    sb.append(param2);
1155                                    sb.append(");");
1156                            }
1157                            else if (param1.equals("storeNumberIncrement")) {
1158                                    sb.append("String ");
1159                                    sb.append(param3);
1160                                    sb.append(" = selenium.getNumberIncrement(");
1161                                    sb.append("RuntimeVariables.getValue(\"");
1162    
1163                                    String expression = param2.substring(2, param2.length() - 1);
1164    
1165                                    sb.append(expression);
1166                                    sb.append("\"));");
1167    
1168                                    sb.append("RuntimeVariables.setValue(\"");
1169                                    sb.append(param3);
1170                                    sb.append("\", ");
1171                                    sb.append(param3);
1172                                    sb.append(");");
1173                            }
1174                            else if (param1.equals("storeNumberDecrement")) {
1175                                    sb.append("String ");
1176                                    sb.append(param3);
1177                                    sb.append(" = selenium.getNumberDecrement(");
1178                                    sb.append("RuntimeVariables.getValue(\"");
1179    
1180                                    String expression = param2.substring(2, param2.length() - 1);
1181    
1182                                    sb.append(expression);
1183                                    sb.append("\"));");
1184    
1185                                    sb.append("RuntimeVariables.setValue(\"");
1186                                    sb.append(param3);
1187                                    sb.append("\", ");
1188                                    sb.append(param3);
1189                                    sb.append(");");
1190                            }
1191                            else if (param1.equals("storeText")) {
1192                                    sb.append("String ");
1193                                    sb.append(param3);
1194                                    sb.append(" = selenium.getText(\"");
1195                                    sb.append(param2);
1196                                    sb.append("\");");
1197    
1198                                    sb.append("RuntimeVariables.setValue(\"");
1199                                    sb.append(param3);
1200                                    sb.append("\", ");
1201                                    sb.append(param3);
1202                                    sb.append(");");
1203                            }
1204                            else if (param1.equals("storeValue")) {
1205                                    sb.append("String ");
1206                                    sb.append(param3);
1207                                    sb.append(" = selenium.getValue(\"");
1208                                    sb.append(param2);
1209                                    sb.append("\");");
1210    
1211                                    sb.append("RuntimeVariables.setValue(\"");
1212                                    sb.append(param3);
1213                                    sb.append("\", ");
1214                                    sb.append(param3);
1215                                    sb.append(");");
1216                            }
1217                            else if (param1.equals("storeVisible")) {
1218                                    sb.append("boolean ");
1219                                    sb.append(param3);
1220                                    sb.append(" = selenium.isVisible(\"");
1221                                    sb.append(param2);
1222                                    sb.append("\");");
1223                            }
1224                            else if (param1.equals("verifyElementNotPresent") ||
1225                                             param1.equals("verifyElementPresent")) {
1226    
1227                                    if (param1.equals("verifyElementNotPresent")) {
1228                                            sb.append("verifyFalse");
1229                                    }
1230                                    else if (param1.equals("verifyElementPresent")) {
1231                                            sb.append("verifyTrue");
1232                                    }
1233    
1234                                    sb.append("(selenium.isElementPresent(\"");
1235                                    sb.append(param2);
1236                                    sb.append("\"));");
1237                            }
1238                            else if (param1.equals("verifyTextNotPresent") ||
1239                                             param1.equals("verifyTextPresent")) {
1240    
1241                                    if (param1.equals("verifyTextNotPresent")) {
1242                                            sb.append("verifyFalse");
1243                                    }
1244                                    else if (param1.equals("verifyTextPresent")) {
1245                                            sb.append("verifyTrue");
1246                                    }
1247    
1248                                    sb.append("(selenium.isTextPresent(\"");
1249                                    sb.append(param2);
1250                                    sb.append("\"));");
1251                            }
1252                            else if (param1.equals("verifyTitle")) {
1253                                    sb.append("verifyEquals(\"");
1254                                    sb.append(param2);
1255                                    sb.append("\", selenium.getTitle());");
1256                            }
1257                            else if (param1.equals("waitForNotPartialText") ||
1258                                             param1.equals("waitForNotSelectedLabel") ||
1259                                             param1.equals("waitForNotText") ||
1260                                             param1.equals("waitForNotValue") ||
1261                                             param1.equals("waitForPartialText") ||
1262                                             param1.equals("waitForSelectedLabel") ||
1263                                             param1.equals("waitForText") ||
1264                                             param1.equals("waitForValue")) {
1265    
1266                                    sb.append("selenium.");
1267                                    sb.append(param1);
1268                                    sb.append("(\"");
1269                                    sb.append(param2);
1270                                    sb.append("\",");
1271    
1272                                    if (param3.startsWith("${")) {
1273                                            sb.append("RuntimeVariables.getValue(\"");
1274    
1275                                            String text = param3.substring(2, param3.length() - 1);
1276    
1277                                            sb.append(text);
1278                                            sb.append("\")");
1279                                    }
1280                                    else {
1281                                            sb.append("\"");
1282                                            sb.append(param3);
1283                                            sb.append("\"");
1284                                    }
1285    
1286                                    sb.append(");");
1287                            }
1288                            else {
1289                                    System.out.println(
1290                                            testFileName + " has an unknown command " + param1);
1291                            }
1292                    }
1293    
1294                    if (labels.size() > 0) {
1295                            sb.append("case 100:");
1296                            sb.append("label = -1;");
1297                            sb.append("}");
1298                            sb.append("}");
1299                    }
1300    
1301                    sb.append("}");
1302                    sb.append("}");
1303    
1304                    writeFile(testFileName, sb.toString(), true);
1305            }
1306    
1307            protected void translateTestSuite(String fileName) throws Exception {
1308                    int x = fileName.lastIndexOf(StringPool.SLASH);
1309                    int y = fileName.indexOf(StringPool.PERIOD);
1310    
1311                    String testPackagePath = StringUtil.replace(
1312                            fileName.substring(0, x), StringPool.SLASH, StringPool.PERIOD);
1313                    String testName = fileName.substring(x + 1, y);
1314                    String testFileName = fileName.substring(0, y) + ".java";
1315    
1316                    StringBundler sb = new StringBundler();
1317    
1318                    sb.append("package ");
1319                    sb.append(testPackagePath);
1320                    sb.append(";\n");
1321    
1322                    sb.append("import com.liferay.portalweb.portal.BaseTestSuite;\n");
1323                    sb.append("import com.liferay.portalweb.portal.StopSeleniumTest;\n");
1324    
1325                    String content = readFile(fileName);
1326    
1327                    content = formatTestSuite(fileName, content);
1328    
1329                    x = 0;
1330                    y = 0;
1331    
1332                    while (content.indexOf("<a href=\"", x) != -1) {
1333                            x = content.indexOf("<a href=\"", x) + 9;
1334                            y = content.indexOf("\">", x);
1335    
1336                            String testCaseName = content.substring(x, y);
1337    
1338                            if (!testCaseName.contains("..")) {
1339                                    continue;
1340                            }
1341    
1342                            if (!testCaseName.contains("../portalweb/")) {
1343                                    throw new IllegalArgumentException(
1344                                            fileName + " has improper relative path");
1345                            }
1346    
1347                            testCaseName = StringUtil.replace(
1348                                    testCaseName, "../../portalweb/", "../");
1349    
1350                            int z = fileName.lastIndexOf(StringPool.SLASH);
1351    
1352                            String importClassName = fileName.substring(0, z);
1353    
1354                            int count = StringUtil.count(testCaseName, "..");
1355    
1356                            for (int i = 0; i < count; i++) {
1357                                    z = importClassName.lastIndexOf(StringPool.SLASH);
1358    
1359                                    importClassName = fileName.substring(0, z);
1360                            }
1361    
1362                            z = testCaseName.lastIndexOf("../", z);
1363    
1364                            importClassName += testCaseName.substring(
1365                                    z + 2, testCaseName.length() -5);
1366                            importClassName = StringUtil.replace(
1367                                    importClassName, StringPool.SLASH, StringPool.PERIOD);
1368    
1369                            sb.append("import ");
1370                            sb.append(importClassName);
1371                            sb.append(";\n");
1372                    }
1373    
1374                    sb.append("import junit.framework.Test;\n");
1375                    sb.append("import junit.framework.TestSuite;\n");
1376    
1377                    sb.append("public class ");
1378                    sb.append(testName);
1379                    sb.append(" extends BaseTestSuite {");
1380    
1381                    sb.append("public static Test suite() {");
1382    
1383                    sb.append("TestSuite testSuite = new TestSuite();");
1384    
1385                    x = content.indexOf("</b></td></tr>");
1386                    y = content.indexOf("</tbody>");
1387    
1388                    content = content.substring(x + 15, y);
1389    
1390                    x = 0;
1391                    y = 0;
1392    
1393                    while (true) {
1394                            x = content.indexOf("\">", x);
1395                            y = content.indexOf("</a>", x);
1396    
1397                            if ((x == -1) || (y == -1)) {
1398                                    break;
1399                            }
1400    
1401                            String className = content.substring(x + 2, y);
1402    
1403                            x += className.length();
1404    
1405                            sb.append("testSuite.addTestSuite(");
1406                            sb.append(className);
1407                            sb.append(".class);");
1408                    }
1409    
1410                    sb.append("return testSuite;");
1411                    sb.append("}");
1412                    sb.append("}");
1413    
1414                    writeFile(testFileName, sb.toString(), true);
1415            }
1416    
1417            protected void writeFile(String fileName, String content, boolean format)
1418                    throws Exception {
1419    
1420                    File file = new File(_basedir + "/" + fileName);
1421    
1422                    if (format) {
1423                            ServiceBuilder.writeFile(file, content);
1424                    }
1425                    else {
1426                            System.out.println("Writing " + file);
1427    
1428                            FileUtil.write(file, content);
1429                    }
1430            }
1431    
1432            private static final String[] _FIX_PARAM_NEW_SUBS = {"\\n", "\\n"};
1433    
1434            private static final String[] _FIX_PARAM_OLD_SUBS = {"\\\\n", "<br />"};
1435    
1436            private String _basedir;
1437            private boolean _reportDuplicates;
1438    
1439            private class TestHtmlCountComparator
1440                    implements Comparator<ObjectValuePair<String, IntegerWrapper>> {
1441    
1442                    @Override
1443                    public int compare(
1444                            ObjectValuePair<String, IntegerWrapper> object1,
1445                            ObjectValuePair<String, IntegerWrapper> object2) {
1446    
1447                            IntegerWrapper integerWrapper1 = object1.getValue();
1448                            IntegerWrapper integerWrapper2 = object2.getValue();
1449    
1450                            if (integerWrapper1.getValue() > integerWrapper2.getValue()) {
1451                                    return -1;
1452                            }
1453                            else if (integerWrapper1.getValue() < integerWrapper2.getValue()) {
1454                                    return 1;
1455                            }
1456                            else {
1457                                    return 0;
1458                            }
1459                    }
1460    
1461            }
1462    
1463    }